-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
2 lines (2 loc) · 8 KB
/
app.py
File metadata and controls
2 lines (2 loc) · 8 KB
1
2
import base64
exec(base64.b64decode('ZnJvbSBmbGFzayBpbXBvcnQgRmxhc2ssIHJlbmRlcl90ZW1wbGF0ZSwgcmVxdWVzdCwganNvbmlmeSwgc2VuZF9maWxlLCByZWRpcmVjdCwgdXJsX2ZvcgppbXBvcnQgYmFzZTY0CmltcG9ydCBtYXJzaGFsCmltcG9ydCB0eXBlcwppbXBvcnQgemxpYgppbXBvcnQgY29kZWNzCmltcG9ydCBvcwppbXBvcnQgdGVtcGZpbGUKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwppbXBvcnQgcmUKCmFwcCA9IEZsYXNrKF9fbmFtZV9fKQoKY2xhc3MgUHl0aG9uRW5jb2RlcjoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBiYXNlNjRfZW5jb2RlKGNvZGUpOgogICAgICAgICIiIk3DoyBow7NhIFB5dGhvbiBjb2RlIGLhurFuZyBCYXNlNjQiIiIKICAgICAgICBlbmNvZGVkID0gYmFzZTY0LmI2NGVuY29kZShjb2RlLmVuY29kZSgndXRmLTgnKSkuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgd3JhcHBlciA9IGYiIiIKaW1wb3J0IGJhc2U2NApleGVjKGJhc2U2NC5iNjRkZWNvZGUoJ3tlbmNvZGVkfScpLmRlY29kZSgndXRmLTgnKSkKIiIiCiAgICAgICAgcmV0dXJuIHdyYXBwZXIuc3RyaXAoKQogICAgCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgb2JmdXNjYXRlX2NvZGUoY29kZSk6CiAgICAgICAgIiIiTMOgbSBy4buRaSBjb2RlIFB5dGhvbiIiIgogICAgICAgIG9iZnVzY2F0ZWQgPSBjb2RlCiAgICAgICAgcmVwbGFjZW1lbnRzID0gewogICAgICAgICAgICAnZGVmICc6ICdkZWYgXzB4JywKICAgICAgICAgICAgJ2NsYXNzICc6ICdjbGFzcyBfMHgnLAogICAgICAgICAgICAnaW1wb3J0ICc6ICdfX2ltcG9ydF9fKCcsCiAgICAgICAgICAgICdmcm9tICc6ICdfX2ltcG9ydF9fKCcsCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvciBvbGQsIG5ldyBpbiByZXBsYWNlbWVudHMuaXRlbXMoKToKICAgICAgICAgICAgaWYgb2xkIGluIG9iZnVzY2F0ZWQ6CiAgICAgICAgICAgICAgICBvYmZ1c2NhdGVkID0gb2JmdXNjYXRlZC5yZXBsYWNlKG9sZCwgbmV3KQogICAgICAgIAogICAgICAgIGxpbmVzID0gb2JmdXNjYXRlZC5zcGxpdCgnXG4nKQogICAgICAgIHByb2Nlc3NlZF9saW5lcyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgIGlmICciJyBpbiBsaW5lIG9yICInIiBpbiBsaW5lOgogICAgICAgICAgICAgICAgZW5jb2RlZF9saW5lID0gcmVwcihsaW5lKQogICAgICAgICAgICAgICAgcHJvY2Vzc2VkX2xpbmVzLmFwcGVuZChmImV4ZWMoe2VuY29kZWRfbGluZX0pIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByb2Nlc3NlZF9saW5lcy5hcHBlbmQobGluZSkKICAgICAgICAKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKHByb2Nlc3NlZF9saW5lcykKICAgIAogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIG1hcnNoYWxfZW5jb2RlKGNvZGUpOgogICAgICAgICIiIk3DoyBow7NhIGLhurFuZyBtYXJzaGFsIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb21waWxlZCA9IGNvbXBpbGUoY29kZSwgJzxzdHJpbmc+JywgJ2V4ZWMnKQogICAgICAgICAgICBtYXJzaGFsZWQgPSBtYXJzaGFsLmR1bXBzKGNvbXBpbGVkKQogICAgICAgICAgICBlbmNvZGVkID0gYmFzZTY0LmI2NGVuY29kZShtYXJzaGFsZWQpLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAKICAgICAgICAgICAgd3JhcHBlciA9IGYiIiIKaW1wb3J0IG1hcnNoYWwKaW1wb3J0IGJhc2U2NApleGVjKG1hcnNoYWwubG9hZHMoYmFzZTY0LmI2NGRlY29kZSgne2VuY29kZWR9JykpKQoiIiIKICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIuc3RyaXAoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmV0dXJuIGYiIyBFcnJvcjoge3N0cihlKX1cbntjb2RlfSIKICAgIAogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGNvbXByZXNzX2VuY29kZShjb2RlKToKICAgICAgICAiIiJOw6luIHbDoCBtw6MgaMOzYSBjb2RlIiIiCiAgICAgICAgY29tcHJlc3NlZCA9IHpsaWIuY29tcHJlc3MoY29kZS5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgZW5jb2RlZCA9IGJhc2U2NC5iNjRlbmNvZGUoY29tcHJlc3NlZCkuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgCiAgICAgICAgd3JhcHBlciA9IGYiIiIKaW1wb3J0IHpsaWIKaW1wb3J0IGJhc2U2NApleGVjKHpsaWIuZGVjb21wcmVzcyhiYXNlNjQuYjY0ZGVjb2RlKCd7ZW5jb2RlZH0nKSkuZGVjb2RlKCd1dGYtOCcpKQoiIiIKICAgICAgICByZXR1cm4gd3JhcHBlci5zdHJpcCgpCiAgICAKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBoZXhfZW5jb2RlKGNvZGUpOgogICAgICAgICIiIk3DoyBow7NhIGLhurFuZyBoZXgiIiIKICAgICAgICBoZXhfZW5jb2RlZCA9IGNvZGUuZW5jb2RlKCd1dGYtOCcpLmhleCgpCiAgICAgICAgd3JhcHBlciA9IGYiIiIKZXhlYyhieXRlcy5mcm9taGV4KCd7aGV4X2VuY29kZWR9JykuZGVjb2RlKCd1dGYtOCcpKQoiIiIKICAgICAgICByZXR1cm4gd3JhcHBlci5zdHJpcCgpCiAgICAKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiByb3QxM19lbmNvZGUoY29kZSk6CiAgICAgICAgIiIiTcOjIGjDs2EgYuG6sW5nIFJPVDEzIiIiCiAgICAgICAgZW5jb2RlZCA9IGNvZGVjcy5lbmNvZGUoY29kZSwgJ3JvdDEzJykKICAgICAgICB3cmFwcGVyID0gZiIiIgppbXBvcnQgY29kZWNzCmV4ZWMoY29kZWNzLmRlY29kZSgnJyd7ZW5jb2RlZH0nJycsICdyb3QxMycpKQoiIiIKICAgICAgICByZXR1cm4gd3JhcHBlci5zdHJpcCgpCiAgICAKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBhZHZhbmNlZF9lbmNvZGUoY29kZSk6CiAgICAgICAgIiIiTcOjIGjDs2EgbsOibmcgY2FvIG5oaeG7gXUgbOG7m3AiIiIKICAgICAgICAjIExheWVyIDE6IEJhc2U2NAogICAgICAgIGxheWVyMSA9IGJhc2U2NC5iNjRlbmNvZGUoY29kZS5lbmNvZGUoJ3V0Zi04JykpLmRlY29kZSgndXRmLTgnKQogICAgICAgICMgTGF5ZXIgMjogSGV4CiAgICAgICAgbGF5ZXIyID0gbGF5ZXIxLmVuY29kZSgndXRmLTgnKS5oZXgoKQogICAgICAgICMgTGF5ZXIgMzogUk9UMTMKICAgICAgICBsYXllcjMgPSBjb2RlY3MuZW5jb2RlKGxheWVyMiwgJ3JvdDEzJykKICAgICAgICAKICAgICAgICB3cmFwcGVyID0gZiIiIgppbXBvcnQgYmFzZTY0LCBjb2RlY3MKZXhlYyhiYXNlNjQuYjY0ZGVjb2RlKGJ5dGVzLmZyb21oZXgoY29kZWNzLmRlY29kZSgne2xheWVyM30nLCAncm90MTMnKSkuZGVjb2RlKCd1dGYtOCcpKS5kZWNvZGUoJ3V0Zi04JykpCiIiIgogICAgICAgIHJldHVybiB3cmFwcGVyLnN0cmlwKCkKCmRlZiBpc19tb2JpbGVfZGV2aWNlKHVzZXJfYWdlbnQpOgogICAgIiIiRGV0ZWN0IGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gYSBtb2JpbGUgZGV2aWNlIiIiCiAgICBtb2JpbGVfcGF0dGVybnMgPSBbCiAgICAgICAgcidNb2JpbGUnLCByJ0FuZHJvaWQnLCByJ2lQaG9uZScsIHInaVBhZCcsIHInaVBvZCcsCiAgICAgICAgcidCbGFja0JlcnJ5JywgcidXaW5kb3dzIFBob25lJywgcidPcGVyYSBNaW5pJywKICAgICAgICByJ0lFTW9iaWxlJywgcidNb2JpbGUgU2FmYXJpJwogICAgXQogICAgCiAgICBmb3IgcGF0dGVybiBpbiBtb2JpbGVfcGF0dGVybnM6CiAgICAgICAgaWYgcmUuc2VhcmNoKHBhdHRlcm4sIHVzZXJfYWdlbnQsIHJlLklHTk9SRUNBU0UpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgpAYXBwLnJvdXRlKCcvJykKZGVmIGluZGV4KCk6CiAgICB1c2VyX2FnZW50ID0gcmVxdWVzdC5oZWFkZXJzLmdldCgnVXNlci1BZ2VudCcsICcnKQogICAgCiAgICBpZiBpc19tb2JpbGVfZGV2aWNlKHVzZXJfYWdlbnQpOgogICAgICAgIHJldHVybiByZW5kZXJfdGVtcGxhdGUoJ21vYmlsZS5odG1sJykKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHJlbmRlcl90ZW1wbGF0ZSgnaW5kZXguaHRtbCcpCgpAYXBwLnJvdXRlKCcvbW9iaWxlJykKZGVmIG1vYmlsZSgpOgogICAgcmV0dXJuIHJlbmRlcl90ZW1wbGF0ZSgnbW9iaWxlLmh0bWwnKQoKQGFwcC5yb3V0ZSgnL2Rlc2t0b3AnKQpkZWYgZGVza3RvcCgpOgogICAgcmV0dXJuIHJlbmRlcl90ZW1wbGF0ZSgnaW5kZXguaHRtbCcpCgpAYXBwLnJvdXRlKCcvZW5jb2RlJywgbWV0aG9kcz1bJ1BPU1QnXSkKZGVmIGVuY29kZV9jb2RlKCk6CiAgICB0cnk6CiAgICAgICAgZGF0YSA9IHJlcXVlc3QuZ2V0X2pzb24oKQogICAgICAgIGNvZGUgPSBkYXRhLmdldCgnY29kZScsICcnKQogICAgICAgIG1ldGhvZCA9IGRhdGEuZ2V0KCdtZXRob2QnLCAnYmFzZTY0JykKICAgICAgICAKICAgICAgICBlbmNvZGVyID0gUHl0aG9uRW5jb2RlcigpCiAgICAgICAgCiAgICAgICAgaWYgbWV0aG9kID09ICdiYXNlNjQnOgogICAgICAgICAgICBlbmNvZGVkID0gZW5jb2Rlci5iYXNlNjRfZW5jb2RlKGNvZGUpCiAgICAgICAgZWxpZiBtZXRob2QgPT0gJ21hcnNoYWwnOgogICAgICAgICAgICBlbmNvZGVkID0gZW5jb2Rlci5tYXJzaGFsX2VuY29kZShjb2RlKQogICAgICAgIGVsaWYgbWV0aG9kID09ICdjb21wcmVzcyc6CiAgICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGVyLmNvbXByZXNzX2VuY29kZShjb2RlKQogICAgICAgIGVsaWYgbWV0aG9kID09ICdoZXgnOgogICAgICAgICAgICBlbmNvZGVkID0gZW5jb2Rlci5oZXhfZW5jb2RlKGNvZGUpCiAgICAgICAgZWxpZiBtZXRob2QgPT0gJ3JvdDEzJzoKICAgICAgICAgICAgZW5jb2RlZCA9IGVuY29kZXIucm90MTNfZW5jb2RlKGNvZGUpCiAgICAgICAgZWxpZiBtZXRob2QgPT0gJ29iZnVzY2F0ZSc6CiAgICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGVyLm9iZnVzY2F0ZV9jb2RlKGNvZGUpCiAgICAgICAgZWxpZiBtZXRob2QgPT0gJ2FkdmFuY2VkJzoKICAgICAgICAgICAgZW5jb2RlZCA9IGVuY29kZXIuYWR2YW5jZWRfZW5jb2RlKGNvZGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW5jb2RlZCA9IGVuY29kZXIuYmFzZTY0X2VuY29kZShjb2RlKQogICAgICAgIAogICAgICAgIHJldHVybiBqc29uaWZ5KHsKICAgICAgICAgICAgJ3N1Y2Nlc3MnOiBUcnVlLAogICAgICAgICAgICAnZW5jb2RlZF9jb2RlJzogZW5jb2RlZCwKICAgICAgICAgICAgJ21ldGhvZCc6IG1ldGhvZCwKICAgICAgICAgICAgJ29yaWdpbmFsX3NpemUnOiBsZW4oY29kZSksCiAgICAgICAgICAgICdlbmNvZGVkX3NpemUnOiBsZW4oZW5jb2RlZCksCiAgICAgICAgICAgICdjb21wcmVzc2lvbl9yYXRpbyc6IHJvdW5kKChsZW4oZW5jb2RlZCkgLyBsZW4oY29kZSkpICogMTAwLCAyKSBpZiBsZW4oY29kZSkgPiAwIGVsc2UgMAogICAgICAgIH0pCiAgICAKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4ganNvbmlmeSh7CiAgICAgICAgICAgICdzdWNjZXNzJzogRmFsc2UsCiAgICAgICAgICAgICdlcnJvcic6IHN0cihlKQogICAgICAgIH0pCgpAYXBwLnJvdXRlKCcvZG93bmxvYWQnLCBtZXRob2RzPVsnUE9TVCddKQpkZWYgZG93bmxvYWRfZW5jb2RlZCgpOgogICAgdHJ5OgogICAgICAgIGRhdGEgPSByZXF1ZXN0LmdldF9qc29uKCkKICAgICAgICBlbmNvZGVkX2NvZGUgPSBkYXRhLmdldCgnZW5jb2RlZF9jb2RlJywgJycpCiAgICAgICAgZmlsZW5hbWUgPSBkYXRhLmdldCgnZmlsZW5hbWUnLCAnZW5jb2RlZF9jb2RlLnB5JykKICAgICAgICAKICAgICAgICB0ZW1wX2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUobW9kZT0ndycsIHN1ZmZpeD0nLnB5JywgZGVsZXRlPUZhbHNlKQogICAgICAgIHRlbXBfZmlsZS53cml0ZShlbmNvZGVkX2NvZGUpCiAgICAgICAgdGVtcF9maWxlLmNsb3NlKCkKICAgICAgICAKICAgICAgICByZXR1cm4gc2VuZF9maWxlKHRlbXBfZmlsZS5uYW1lLCBhc19hdHRhY2htZW50PVRydWUsIGRvd25sb2FkX25hbWU9ZmlsZW5hbWUpCiAgICAKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByZXR1cm4ganNvbmlmeSh7CiAgICAgICAgICAgICdzdWNjZXNzJzogRmFsc2UsCiAgICAgICAgICAgICdlcnJvcic6IHN0cihlKQogICAgICAgIH0pCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgYXBwLnJ1bihkZWJ1Zz1UcnVlLCBob3N0PScwLjAuMC4wJywgcG9ydD01MDAwKQ==').decode('utf-8'))