2016-02-15 1 views
0

Я пытаюсь декодировать следующее, я могу пройти первый шаг реального декодирования, я просто не понимаю второй раздел хэш-соответствия?Как использовать python для декодирования base64

exec("import re;import base64");exec((lambda p,y:(lambda o,b,f:re.sub(o,b,f))(r"([0-9a-f]+)",lambda m:p(m,y),base64.b64decode("NWEgMmNjLCBhOSwgYywgNTQsIDJjZiwgOTcsIGIwLCAxZGYsIDE0OCwgMTAwCjVhIDI0LCAzMSwgMTIyLCAxOTgsIDE1NSwgY2EsIDcyLCBmNSwgZmUsIDJkMQphMyAxM2YgNWEgNWYKYTMgMjg1LmVjLjI4NSA1YSAxMWIKYTMgMjg1LmVjLjIyYiA1YSAyMDQKCjE5OgoJYTMgMWU5IDVhIDE0MgoyNDAgMTY0OiAjIDIyMSAyLjQgMjJjCglhMyAyMTMgNWEgMjEzIDI2NSAxNDIKCgoKCjgzCQkJID0gJzc5Ljk2Ljc0Jwo4MAkJCSAgID0gYTkuMTFiKDE0ND04MykKMWY5CQkJID0gIjEuMC4zIgoxOWQJCSAgID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85My8nICsgODMpKQoxODgJCSAgPSAiNTYgOTQiCmUxCQkgID0gJzJmLzU2IDk0JwoxYTEJCQkJICAgPSAyZDEuODcoJzM2JykKMjVlCQkJCSAgID0gMmQxLjg3KCczNScpCjJhZAkJCQkgICA9IDJkMS44NygnMjI2JykKCjJhMwkJCSAgPSBjLjJjZSgpCjIyYgkJCQkgPSAyMDQoKQoKODQJCQkgPSAiMTQzOi8vOTIuMjBmLjFmZC8iCjhkCQkJPSA4NCArICI3YS0yYmYuMmE1IgoKYTYJCQkJID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85My8nICsgODMgKyAnLzE5ZS8yYjEvJykpCjIxNQkJCSAgPSAyY2MuMmE4KCcxMjovLzFiMicpCjIyZQkJCSAgPSAyY2MuMmE4KCcxMjovLzE4MicpOwoKMTAxCQkJPSBbJzc5Ljk2Ljc0JywnYmIuMTQ5LjI4NS5lYycsJzE3Ni45YSddCgo0YQkJCSAgPSBhNisnNGIuYTcnCjI2OQkJCQk9IGE2KycxYzMuYTcnCgojMTRhIDI2YiAxMWYgMWMKNjgJCSA9IGE2KycxMmMuYTcnCjM0CT0gYTYrJzE2OS5hNycKNjYJCSA9IGE2KycxZGMuYTcnCjQyCSAgPSBhNisnMjM2LTQ5LmE3Jwo0NAkgID0gYTYrJzIzMS0xNzMuYTcnCjdlCQkgICA9IGE2KycyNTcuYTcnCgojMWQxIDIyOQoxZDIJCQk9IDRmCgoKCgoxZSAyYmIoZSk6IDJjYy4yNjIoZSkKMWUgMjYxKGUpOiAyY2MuMjYyKCI2YSglZTYpIiAlIDE3KGUpKQoxZSAyODMoZSk6IDJjYy4yNjIoIjEzNyglZTYpIiAlIDE3KGUpKQoxZSAyODIoZSk6IDJjYy4yNjIoImZmKCVlNikiICUgMTcoZSkpCjFlIDI0NihlLGUyPSIxIixlMz0iIik6IDJjYy4yNjIoJ2ZmKCVlNiwiJWU2IiwiJWU2IiknICUgKDE3KGUpLDE3KGUyKSxlMykpOyAKMWUgMmFmKGEpOiAyY2MuMjYyKCIyMGIoJWU2KSIgJSAxNyhhKSkKMWUgMjc4KGEpOiAyY2MuMjYyKCIxZWYuMWQ4KDFjOD0lZTYpIiAlICgxNyhhKSkpCjFlIDI5YShhKTogMmNjLjI2MigiZjAoJWU2KSIgJSAoMTcoYSkpKQoxZSAyM2MoYSwyNmMpOiAyY2MuMjYyKCJmMCglZTYsJWU2KSIgJSAoMTcoYSksMTcoMjZjKSkpCjFlIDE2MihlKTogMmNjLjI2MigiMTg5KCVlNikiICUgMTcoZSkpCjFlIDI2NigpOiAyY2MuMjYyKCIxNmQiKQoxZSBiYygpOgoJM2YgJzJkMyAxNjggMWI1IDIxOCEnCgkKMTQ4LjEwNyhiYykKCiMgMWQ0IDI4MCAyNTYgMjMgYmUgMmEwIDIyNCAyYSBiYiAyOTknZTYKMWUgMTg1KCk6CgkyMmYgNjgsMzQsNjYsNDIsNDQsN2UsMmFkCgkjIDIxZSAxNiAyMTEgMmJlIDEzOSAyYSAyNTggMjZlCgkjIDEwYSA9ICIxNDM6Ly83NC4yMGYuMWZkLzFjMy85YS03YS0xYy4xOWMiCgkjIDE4MyA9IDJjYy4yYTgoMmNmLjE4My4xMzYoJzEyOi8vNGUvOTMnLCc4Yy8nKSkKCSMgNzIuMTBlKDEwYSwgMTgzICsgIi85YS03YS0xYy4xOWMiKQoJIyAxYyA9IDVmKCkKCSMgMWMuZmIoMTgzICsgIi85YS03YS0xYy4xOWMiKQoJIyA2OAkJID0gMTcoMWMuMjUoJzFjJywgJzE2YicpKQoJIyAzNAk9IDE3KDFjLjI1KCcxYycsICcxMDUnKSkKCSMgNjYJCSA9IDE3KDFjLjI1KCcxYycsICcxNjYnKSkKCSMgNDIJICA9IDE3KDFjLjI1KCcxYycsICcxMjUnKSkKCSMgNDQJICA9IDE3KDFjLjI1KCcxYycsICcxMWQnKSkKCSMgN2UJCSAgID0gMTcoMWMuMjUoJzFjJywgJzE4ZicpKQoJIyA0YQkJCSAgPSAxNygxYy4yNSgnMWMnLCAnNGInKSkKCTE2IDFhMT09IiIgM2EgMjVlPT0iIiAzYSAyYWQ9PSIyNGYiOgoJCTFkNSA9ICI1ZCAxMDcgMmM3IDFmMiAxZmMgMTQzOi8vOTIuMjBmLjFmZCAzYSAxODcgYWUgMjViIDM2IDNhIDM1IDIxIDJhIDdhIDZjIDIzOSAyMyBmYS4gIgoJCTFkMyA9ICIxN2IgMzcgMWFmIDIzIDE4NyBhZSAzNiAzYSAzNSAxNWE/IgoJCTY0PTJkMS45ZCgxODggKyAiIC0gMTI3IiwxZDUsMWQzKQoJCTJkMS4xNjUoJzIyNicsJzFhNicpCgkJMTYgNjQ6CgkJCTJkMS5kNCgpCgoJMTdjKCkKCiMgMjBjIDFiNgoxZSAxN2MoKToKCgk1YignMTI5IDU2Jyw4NCwyLDY4LDRhLCcnKQoJNWIoJ2MyJyw4NCwzLDM0LDRhLCcnKQoJNWIoJzFmNScsODQsOCw2Niw0YSwnJykKCTllKCdmMicsICcxM2QnKQoKIyAyMzUgMWI2CjFlIGU3KCk6CgoJMmNhID0gODkoOGQgKyAiPzk1PTE3OCZmZD0iICsgMWExICsgIiYxMWU9IiArIDg4KDI1ZSwxYTEpKQoJMjAgPSBmZS4xMTkoMmNhKQoKCTE1IDQ3IDIxIDIwOgoJCTViKDQ3Wyc1MCddICsgJyAtICcgKyA0N1snYjEnXSw0N1snMjQzJ10sNSw0N1snMjNhJ10sNGEsJycpCgkJOWUoJ2YyJywgJzEzZCcpCgojIGMyIGI4CjFlIGM4KCk6Cgk1YignMjNlIDMzJywnMmQnLDQsNDIsNGEsJycpCgk1YignMTdmIDI1MicsJzJkJyw2LDQ0LDRhLCcnKQoJNWIoJzI0OCBiYScsJzJkJyw3LDdlLDRhLCcnKQoJOWUoJ2YyJywgJzEzZCcpCgojIDI0YiBiYgoxZSBlOChkMSxiZik6CiAgMjRjIDEyZSgpOgoJZWE9MjVhCglhYj0xCgk5MD01CgkxZSAxYjMoNmQsKjI4NiwqKjIyMyk6CgkgIDJjYy4yNjIoIjZhKCVkKSIgJSAoNmQuZWEsICkpICMgMWNjIDJhIGRhIDIxYyBiZAoJICA2ZC4xOWI9Yy4yMWIoNmQuZWEpICMgMjUgYmQKCSAgMmNjLjExYygyYTcpICMgN2QgYmQgZjUgMjMgMTg0CgkgIDZkLmM2KCkKCTFlIGM2KDZkKToKCSAgNmQuMTliLmQ2KDZkLmFiKS4xYzAoZDEpICMgMTRhIGQxCgkgIDE5OiBmPTFjOShiZik7IGRhPWYuZmIoKQoJICAyNDA6IGRhPWJmCgkgIDZkLjE5Yi5kNig2ZC45MCkuMWU2KDE3KGRhKSkKCSAgMjgKICAxMmUoKQoKIyAyM2YgMmM4IGRhCjFlIDExMCgpOgoJZTgoMTg4LCdbOTg9MjIyXTFlZCAyMyA1NlsvOThdWzI3M11bMjczXScpCQkKCQojIDEyOSAxZmUKMWUgMTRkKDI2LDJkLDFkKToKCgkyY2MuMjYyKCAiNmEoNTUpIiApCgoJIyAxODYgMmEgMzYgM2EgMzUgMTRhIDIxIDJhIDdhCgljZSA9IDI4YygpCgkxYWEgPSA4ZCArICI/OTU9MWNmJjIzND0iICsgY2UgKyAiJjQ3PSIgKyAyZCArICImZmQ9IiArIDFhMSArICImMTFlPSIgKyA4OCgyNWUsMWExKQoJMmNhID0gODkoMWFhKQoJMjAgPSBmZS4xMTkoMmNhKQoJNDcgPSAxNygyMC4yNSgnNTAnKSkKCTI5ID0gMTcoMjAuMjUoJ2IxJykpCgoJIyAyMWUgMTYgMjExIDE1MCBhIDI5IDEzYQoJYzcgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLycsJzRlJykpCgk4NiA9IGM3ICsgJzI5LjJjMCcKCTg1ID0gMmNmLjE4My4xNTcoODYpCgk3NiA9IDVmKCkKCTc2LmZiKDg2KQoKCSMgMTg2IDJhIDI5IDE3NSAyYSA0NyAxZTEgMmEgMjA3IDE5NSAyOQoJMTYgODUgM2EgNzYuMjUoJzY3JywgJzI5JykgPT0gMjkgM2EgNzYuMjUoJzY3JywgJzQ3JykgPT0gNDc6CgkJMmEzID0gYy4yY2UoKQoJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJMmEzLjc3KDE4OCwgIjExMiAxZWMgMTUwIDJhIDI3YiAyMDggMjkiLCIiLCAxNyg3Ni4yNSgnNjcnLCAnNDcnKSkgKyAiICIgKyAxNyg3Ni4yNSgnNjcnLCAnMjknKSkpCgkyYjoKCgkJMTgzID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85MycsJzhjLycpKQoJCWUwID0gMmNmLjE4My4xNTcoMTgzKzJkKzI5KycuMTlhJykKCQk3YiA9IDJjZi4xODMuMTM2KDE4MysyZCsyOSsnLjE5YScpCgoJCTE2IGUwOgoJCQllZiA9IDdiCgkJCWQ4ID0gYy5hMigpCgkJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJCTNlID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScsJ2Y2JykpCgkJCTMyID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScpKQoJCQlmNS4xMWMoMikKCQkJZDguMTQ2KDE4OCwiZDcgIisgMjYsICI1ZCAxNWMuLi4iKQoJCQljYS4yMzAoZWYsMzIsZDgpCgkJCSMgOGEoM2UsIDMyKQoJCQkjIDI0LjJlKDNlKQoJCQlkOC4xNCgpCgkJCTgwLjZlKDE0ND0iMzYiLCBkNT0iIikKCQkJODAuNmUoMTQ0PSIzNSIsIGQ1PSIiKQoJCQkyYTMgPSBjLjJjZSgpCgkJCTJhMy43NygxODgsIDI2ICsgIiAxOTIgMTQ1IGVkIGEzIGFlIDFkNiA4YyIpCgkJCTJhMy43NygxODgsICIgIiwgIjE3MSAxYjcgMTMwIDM3IDE1YSAxYzYgMjMgMWEgMTQgMmYsIGRkIDFiMCAyMyAxYSAxNCAyZiIpCgkJCWMwKCkKCgkJMmI6CgoJCQkxNiAyMC4yNSgnMjg5Jyk6CgkJCQkyMjcgPSAyMC4yNSgnMjVjJykKCQkJCWQ5ID0gMjAuMjUoJzIxNycpCgkJCQkKCQkJCTE2IDIwLjI1KCcxNTgnKToKCQkJCQlkOSA9IDIwLjI1KCcxNTgnKQoJCQkJCgkJCQkzZiBkOQoKCQkJCWQ4ID0gYy5hMigpCgkJCQkyY2MuMjYyKCAiMmNlLjkxKDU1KSIgKQoKCQkJCSMgMTYgY2UgPT0gIjdmIjoKCQkJCSMJIDExOCgxOCkKCgkJCQlkOC4xNDYoMTg4LCIxNjcgIisgMjAuMjUoJzUwJykrICIgLSAiICsgMjAuMjUoJ2IxJyksICI1ZCAxNWMuLi4iKQoJCQkJZWYgPSA3YgoKCQkJCSMgMjRlIDIzIGI1IDJhZSBlZSAxOGIgMTVkCgkJCQkxOToKCQkJCQk3Mi4xMGUoZDksIGVmLCBkOCkKCQkJCTI0MCAxOTYgMjY1IGU6CgkJCQkJMTYgMTcoZSkgPT0gIjFhOCI6CgkJCQkJCTJjZi5iNShlZikKCQkJCQkyOAoKCQkJCTMyID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScpKQoJCQkJM2UgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLycsJzRlJywnZjYnKSkKCQkJCWY1LjExYygyKQoJCQkJZDguMTM5KDAsIiIsICJkNyAiKyAyMC4yNSgnNTAnKSArIiAyYjkiLCI1ZCAxNWMuLi4iKQoJCQkJY2EuMjMwKGVmLDMyLGQ4KQoJCQkJIyA4YSgzZSwgMzIpCgkJCQkjIDI0LjJlKDNlKQoJCQkJZDguMTQoKQoJCQkJYzMgPSA4OSg4ZCArICI/OTU9ZWQmMjE5PSIgKyAxNygyMjcpICsgIiZmZD0iICsgMWExICsgIiYxMWU9IiArIDg4KDI1ZSwxYTEpKQoJCQkJZDAgPSBmZS4xMTkoYzMpCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkyYTMuNzcoMTg4LCBkMC4yNSgnMjhkJyksIiIsIGQwLjI1KCcyOTMnKSkKCQkJCTJhMy43NygxODgsICIgIiwgIjE3MSAxYjcgMTMwIDM3IDE1YSAxYzYgMjMgMWEgMTQgMmYsIGRkIDFiMCAyMyAxYSAxNCAyZiIpCgkJCQk4MC42ZSgxNDQ9IjM2IiwgZDU9IiIpCgkJCQk4MC42ZSgxNDQ9IjM1IiwgZDU9IiIpCgkJCQljMCgpCgoJCQkyYjoKCQkJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkyYTMuNzcoMTg4LCAyMC4yNSgnMjc3JyksIiIsIDIwLjI1KCcyNzUnKSkKCiMgMjZmIDE2ZiBhMyAyYjMgMWZiIDIzIDFlYgoxZSA4YSgxOTAsIDE1NiwgMTBkPWFkLCAxM2U9N2MpOgoJMTYgYTggMmNmLjE4My40YygxNTYpOgoJCTJjZi4xYmMoMTU2KQoJMTUgMTYwIDIxIDJjZi4xZWUoMTkwKToKCQllNiA9IDJjZi4xODMuMTM2KDE5MCwgMTYwKQoJCWQgPSAyY2YuMTgzLjEzNigxNTYsIDE2MCkKCQkxNiAyY2YuMTgzLjI1ZChlNik6CgkJCThhKGU2LCBkLCAxMGQsIDEzZSkKCQkyYjoKCQkJMTYgYTggMmNmLjE4My40YyhkKSAyMDIgMmNmLjFhMyhlNikuMTBiIC0gMmNmLjFhMyhkKS4xMGIgPiAxOgoJCQkJMjQuMjMzKGU2LCBkKQoKIyAyNzEgMmE2ICgxZjYgMjMgMjlmIDEyMi4xZTUpCjFlIDg5KDJkKToKCWNmID0gewoJCScxYTctMjNiJzogZTEKCX0KCTFiYiA9IDEwMC4xZjgoKQoJMTlmID0gMWJiLjI1KDJkLCBjZj1jZikKCTFjMiA9IDE5Zi44MQoJMTlmLjE0KCkKCTI4IDFjMgoKIyAyNyBiYQoxZSBhMCgyZCk6CgkzZiAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCSAgIDEwMyAxYzUJCQkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJwoJNzUgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLzRlLzkzLzhjJywgJycpKQoJMTk6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNzUpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMTI4IDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkyYTMgPSBjLjJjZSgpCgkJCQkJMmEzLjc3KDE4OCwgImJhIDE2YyAxMjAiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQoJMjQwOiAKCQkyYTMgPSBjLjJjZSgpCgkJMmEzLjc3KDE4OCwgIjI0YSAyMTEgMjdlIGE4IDI3YyAyMyBiNSAxMjggM2MiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQoJCiMgMjcgMzMgIAoxZSA4YigyZCk6CgkzZiAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCSAgIDEwMyAxYTAgMjQyCQkJICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKCTYxID0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly80ZScpLCAnNDknKQoJMTYgMmNmLjE4My40Yyg2MSk9PTRmOgkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDYxKToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkxOToKCQkJCQkJCTJjZi40MCgyY2YuMTgzLjEzNigyY2QsIGYpKQoJCQkJCQkyNDA6CgkJCQkJCQkxMWUKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkxOToKCQkJCQkJCTI0LjJlKDJjZi4xODMuMTM2KDJjZCwgZCkpCgkJCQkJCTI0MDoKCQkJCQkJCTExZQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCTE2IDJjYy4xMygnOTkuMjhjLjE0ZicpOgoJCWI0ID0gMmNmLjE4My4xMzYoJy8xMmYvMjAxLzE1NC8xMzIvMTVmL2NjLzExNy8nLCAnMTgxJykKCQkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KGI0KToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkJMTYgYWEgPiAwOgoKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMTRmIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDggMjEgJzE4MSciLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJYjMgPSAyY2YuMTgzLjEzNignLzEyZi8yMDEvMTU0LzEzMi8xNWYvY2MvMTE3LycsICc5ZicpCgkJCgkJMTUgMmNkLCAxZiwgMTVkIDIxIDJjZi42NShiMyk6CgkJCWFhID0gMAoJCQlhYSArPSA2MCgxNWQpCgkJCgkJCTE2IGFhID4gMDoKCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkxNiAyYTMuNDYoIjI3IDE0ZiAzMyAzYyIsIDE3KGFhKSArICIgMTVkIDQ4IDIxICc5ZiciLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCSAgIyBiOSAxODMgMjMgMjQ0IDFhYiA0OSAxNWQKCQkJCQkJCSAKCgkjIGI5IDE4MyAyMyAyOGUgMmQ1IDI4ZiA0OSAxNWQKCTZiID0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly84Mi81Mi83OS45Ni4xNmEvNDknKSwgJycpCgkxNiAyY2YuMTgzLjRjKDZiKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNmIpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyYjcgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgMjI4IDQ5IDE1ZAoJNDE9IDJjZi4xODMuMTM2KDJjYy4yYTgoJzEyOi8vODIvNTIvNzkuOTYuMmJhLzQ5JyksICcnKQoJMTYgMmNmLjE4My40Yyg0MSk9PTRmOgkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDQxKToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMjI4IDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCQkJCSMgYjkgMTgzIDIzIDIxZiAxMjEgNDkgMTVkCgk0ZD0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly84Mi81Mi83OS45Ni4xZjAvZTknKSwgJycpCgkxNiAyY2YuMTgzLjRjKDRkKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNGQpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyMWYgMTIxIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCQkJCQoJCQkJIyBiOSAxODMgMjMgMTU5IGRmIDQ5IDE1ZAoJMzggPSAyY2YuMTgzLjEzNigyY2MuMmE4KCcxMjovLzgyLzUyL2JiLjE0OS4yMGUuNzInKSwgJycpCgkxNiAyY2YuMTgzLjRjKDM4KT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoMzgpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAxNTkgZGYgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgMjFkIDQ5IDE1ZAoJNjkgPSAyY2YuMTgzLjEzNigyY2MuMmE4KCcxMjovLzgyLzUyLzc5Ljk2LjJiOC8yMDMnKSwgJycpCgkxNiAyY2YuMTgzLjRjKDY5KT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNjkpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyMWQgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgZjYgNDkgMTVkCgk2MiA9IDJjZi4xODMuMTM2KDJjYy4yYTgoJzEyOi8vNGUvZjYnKSwgJycpCgkxNiAyY2YuMTgzLjRjKDYyKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNjIpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyODcgMmMyIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCgkyYTMgPSBjLjJjZSgpCgkyYTMuNzcoMTg4LCAiIDIyNSAzMyAzYyAxMjAiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQogCiMgMjcgMjE0IDE1ZAoxZSBjMCgpOgoJZjMgPSBjLjJjZSgpLjQ2KCcyNDcgOTEgMmYnLCAnMTEyIDJhOSAyMzggMjMgMTQgMmYnLCAnMTdiIDM3IDFhZiAyMyBmYT8nLCAxZTQ9JzJjOSwgMjEwJywxY2E9JzJhNCwgOTEnKQoJMTYgZjMgPT0gMDoKCQkyOAoJMmMgZjMgPT0gMToKCQkxMWUKCTNiID0gMjhjKCkKCTNmICIxY2I6ICIgKyAxNygzYikKCTE2IDNiID09ICcxNjMnOiAjIDJhMQoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAxNjMgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzU3IC05IDhlJykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzU3IC05IDJmJykKCQkyNDA6IDExZQoJCTJhMy43NygiWzk4PTExYV1bMmQ5XTljICAhISFbLzk4XVsvMmQ5XSIsICIxYzEgMzdcJzE1NSBhZiAxMDkgNDMgMWI0IDI4NCAyYSAxYSAxNCIsICIxM2MgNTkuIDVkIDFhIDE0IDhlLzJmIFs5OD0xMGNdMWM3IGViWy85OF0gZjkgY2QgMTExIDJhIGI4LiIsJycpCgkyYyAzYiA9PSAnZDInOiAjMjRkCgkJM2YgIiMjIyMjIyMjIyMjIyAgIDE5IGQyIDFhIDE0ICAjIyMjIyMjIyMjIyMjIyMjIyIKCQkxOTogMmNmLjk5KCc1NyA4ZScpCgkJMjQwOiAxMWUKCQkxOTogMmNmLjk5KCc1NyAyZicpCgkJMjQwOiAxMWUKCQkxOTogMmNmLjk5KCc1NyAtOSAyY2MuMjA1JykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzU3IC05IDEwZi4yMDUnKQoJCTI0MDogMTFlCgkJMmEzLjc3KCJbOTg9MTFhXVsyZDldOWMgICEhIVsvOThdWy8yZDldIiwgIjFjMSAzN1wnMTU1IGFmIDEwOSA0MyAxYjQgMjg0IDJhIDFhIDE0IiwgIjEzYyA1OS4gNWQgMWEgMTQgOGUvMmYgWzk4PTEwY10xYzcgZWJbLzk4XSBmOSBjZCAxMTEgMmEgYjguIiwnJykKCTJjIDNiID09ICc5Yic6ICMgMWUzICAKCQkzZiAiIyMjIyMjIyMjIyMjICAgMTkgOWIgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzE0MCBlNSAxYTUgMWEtYjYgMTUzLjJjYy4xMGYnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMTQwIGU1IDFhNSAxYS1iNiAxNTMuMTBmJykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzE0MCBlNSAxYTUgMWEtYjYgMTUzLjJjYy4yY2MnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMTQwIGU1IDFhNSAxYS1iNiAxNTMuMmNjJykKCQkyNDA6IDExZQkJCgkJMmEzLjc3KCJbOTg9YzFdWzJkOV0yZDIgMWFkIDFkZSAyMmFbLzk4XVsvMmQ5XSIsICJkZCAyYSAyOTQgMTYxIDI5MSBhZSAxZmYgM2EgWzk4PTExYV1bMmQ5XTI1ZiAyNmFbLzk4XVsvMmQ5XSAxY2QgMTExIDJhIDIyZCAxOTcgMTQxIGI4IDIxIDZjIDI5MSBhZSAyMTYgNGUgMjc2IDI4YiAxNTUtMjIwIDFjZCIpCgkyYyAzYiA9PSAnN2YnOiAjIDFkNwoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSA3ZiAxYSAxNCAgIyMjIyMjIyMjIyMjIyMjIyMiCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzE1ZSA4ZS4xNGUnKQoJCTI0MDogMTFlCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzE1ZSAyZi4xNGUnKQoJCTI0MDogMTFlCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzEwOCAvMjcwIDJmLjE0ZSAvZicpCgkJMjQwOiAxMWUKCQkxOToKCQkJMmNmLjk5KCdAMTAyIDE1MicpCgkJCTJjZi45OSgnMTA4IC8yNzAgOGUuMTRlIC9mJykKCQkyNDA6IDExZQoJCTJhMy43NygiWzk4PTExYV1bMmQ5XTljICAhISFbLzk4XVsvMmQ5XSIsICIxYzEgMzdcJzE1NSBhZiAxMDkgNDMgMWI0IDI4NCAyYSAxYSAxNCIsICIxM2MgNTkuIDVkIDFhIDE0IDhlLzJmIFs5OD0xMGNdMWM3IGViWy85OF0gZjkgY2QgMTExIDJhIGI4LiIsIjI5ZSAyN2YgMWZhIDNhIGViIDJiZCBmNCIpCgkyYjogIzJiMgoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAyYjQgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzU3IGNjJykKCQkyNDA6IDExZQoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAxZGQgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIiAjMjYzIC8gMWU4CgkJMTk6IDJjZi45OSgnMWJmIDEzMyBiNiAxMGYnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMWJmIDEzMyBiNiAyY2MnKQoJCTI0MDogMTFlCgkJMmEzLjc3KCJbOTg9MTFhXVsyZDldOWMgICEhIVsvOThdWy8yZDldIiwgIjFjMSAzN1wnMTU1IGFmIDEwOSA0MyAxYjQgMjg0IDJhIDFhIDE0IiwgIjEzYyA1OS4gNWQgMWEgMTQgOGUvMmYgWzk4PTEwY10xYzcgZWJbLzk4XSBmOSAxMTEgMmEgYjguIiwiMmEyIDFiYS4gIGRkIDNhIDI5MCAyNzQgMmEgMjMyLzI5OCAzYSAyOTYgMTYxIDE1IDFmYyAyNTEgMTAgMWQ5LCAyNTkgMzcgMmFhIDJhIDI1NSAyNjQuIikJCgojIDIwZCAxZTcgMjhjCSAgCjFlIDI4YygpOgoJMTYgMmNjLjEzKCc5OS4yOGMuOWInKToKCQkyOCAnOWInCgkyYyAyY2MuMTMoJzk5LjI4Yy5kMicpOgoJCTI4ICdkMicKCTJjIDJjYy4xMygnOTkuMjhjLjdmJyk6CgkJMjggJzdmJwoJMmMgMmNjLjEzKCc5OS4yOGMuMTYzJyk6CgkJMjggJzE2MycKCTJjIDJjYy4xMygnOTkuMjhjLjFiMScpOgoJCTI4ICcxYjEnCgkyYyAyY2MuMTMoJzk5LjI4Yy4yMDknKToKCQkyOCAnMjA5JwoJCiMgMTdmIDE3MwoxZSBkYygxOCk6CgkyZDEuYTUoIjUzLjYzICIrMjc5KDE4KSk7IDY0PTJkMS45ZCgxODgsImM0IDM3IDI2NyAyMyAxZGIgYWUiLCIyZiAxMzggMjMgMTFmIDZjPyIpCgkxNiA2NDoKCQk3OD1hOS4xMWIoMTQ0PTgzKS4xNTEoJzE4MycpOyA3OD0yY2MuMmE4KDc4KTsgCgkJNWU9MmNmLjE4My4xMzYoNzgsIi4uIiwiLi4iKTsgNWU9MmNmLjE4My4xZjMoNWUpOyAyZDEuYTUoIjUzLjYzIDVlPSIrNWUpOyBiNz1hZAoJCTE5OgoJCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDVlLDFlMD00Zik6CgkJCQkxZls6XSA9IFtkIDE1IGQgMjEgMWYgMTYgZCBhOCAyMSAxMDFdCgkJCQkxNSAyNiAyMSAxNWQ6CgkJCQkJMTk6IDJjZi5iNSgyY2YuMTgzLjEzNigyY2QsMjYpKQoJCQkJCTI0MDoKCQkJCQkJMTYgMjYgYTggMjEgWyIxYjguZGIiLCIxN2QuZGIiLCIxOGQuZGIiLCIyY2MuYTUiXTogYjc9NGYKCQkJCQkJMmQxLmE1KCIxNzIgMTA0ICIrMmNkKyIgIisyNikKCQkJCTE1IDI2IDIxIDFmOgoJCQkJCTE5OiAyY2YuMjUwKDJjZi4xODMuMTM2KDJjZCwyNikpCgkJCQkJMjQwOgoJCQkJCQkxNiAyNiBhOCAyMSBbIjFjNCIsIjFiZSJdOiBiNz00ZgoJCQkJCQkyZDEuYTUoIjE3MiAxMDQgIisyY2QrIiAiKzI2KQoJCQkxNiBhOCBiNzogMmQxLmE1KCI1My42MyAyMjUgZmQgMTVkIGNiLCAzNyAxNWEgMTUwIGEgMTE1IDEyYyIpOyAyZDEuNDMoMTg4LCIyMWEgMTJiIDFiNSBmNyIsIjE4YyAxYjAgMjMgMTgwIDExNSBiMiIpCgkJCTJiOiAyZDEuYTUoIjUzLjYzIDFhNyAxNWQgZWUgY2IiKTsgMmQxLjQzKDE4OCwiMjFhIDEyYiAxYjUgZjciLCIxOGMgMWIwIDIzIDE4MCAxMTUgYjIiKQoJCTI0MDogMmQxLjQzKDE4OCwiMWVhIDQ4IiwiMWNlIDZjIDE5MiBhOCAxNDUgMTMxIik7IDVhIGYxOyAyZDEuYTUoZjEuMTc5KCkpOyAyZDEuYTUoIjUzLjYzIGViIGNiIikKCQkyZDEuMTA2KDk1PSIiLDE3ZT0iMmM1IDI5NSAyZiIsMTRjPWFkKQoJMmI6IDJkMS40MygxODgsIjFjZSA2YyIsIjE5MiBhOCAxNDUgMTMxIik7IDJkMS4xMDYoOTU9IiIsMTdlPSIyNzIiLDE0Yz1hZCkKCiMgMmM2IDJhYiAxOWEgMTVkCjFlIDEzNSgxMmEpOiAgCglmID0gMWM5KDEyYSwgJzJkNysyZDknKSAgCgkyY2EgPSBmLmZiKCkgIAoJMTQ3ID0gMmNhLjI3YSgnXDJiMFwyYzFcMmFjXDJjNCcpICMgMmI1IDE3NSAxMmQgYTQgMTk5ICAKCTE2ICgxNDcgPiAwKTogIAoJCTNmICIxOGEgMTNhIDFmYyAxYjkgIiArIDE3KDE0NyArIDIyKSsgIi4iICAKCQlmLjI3ZCgxNDcgKyAyMikgICAjIDI4MSAxNzUgJzJiNiAyYmMgMTc1IDEyZCBhNCAyMTInIAoJCWYuMWEyKCkgIAoJCWYuMTQoKSAgCgkyYjoKCQkxMWUKCQkjIDI0OSAyNDUsIDEzYSAxYjUgMTkxICAKCiMgMjliIDFhNCAxZjEKMWUgODgoMzUsIDM2KToKCSIiIgoJMjBhIDEyNiAxNzUgMmEgMmMzIDI0MSAyOTcgMWFjCgkiIiIKCTI4IDE0MigzNi4yM2QoKS4yMDAoJzI2ZCcpICsgMzUpLjE5MygpICAgCiAgIAojIDIwZCAxOAkgCjFlIGU0KCk6CgkJZDM9W10KCQljNT1iMC5hMVsyXQoJCTE2IDYwKGM1KT49MjoKCQkJCTE4PWIwLmExWzJdCgkJCQlhYz0xOC4xZjQoJz8nLCcnKQoJCQkJMTYgKDE4WzYwKDE4KS0xXT09Jy8nKToKCQkJCQkJMTg9MThbMDo2MCgxOCktMl0KCQkJCTczPWFjLjE3YSgnJicpCgkJCQlkMz17fQoJCQkJMTUgMmNiIDIxIDIzNyg2MCg3MykpOgoJCQkJCQk0NT17fQoJCQkJCQk0NT03M1syY2JdLjE3YSgnPScpCgkJCQkJCTE2ICg2MCg0NSkpPT0yOgoJCQkJCQkJCWQzWzQ1WzBdXT00NVsxXQoJCQkJCQkJCQoJCTI4IGQzCgoyZGEgPSA5Ny41OCgnJykKMmQ4ID0gOTcuNTgoJzExND0nKQoyZDkgPSA5Ny41OCgnJykKMmQ2ID0gOTcuNTgoJycpCgojIDI5ZCBhNAoxZSA1YigyNiwyZCwzMCwzOSw0YiwxZCk6CgkJMjljPWIwLmExWzBdKyI/MmQ9IiszMS41MSgyZCkrIiYzMD0iKzE3KDMwKSsiJjI2PSIrMzEuNTEoMjYpKyImMzk9IiszMS41MSgzOSkrIiY0Yj0iKzMxLjUxKDRiKSsiJjFkPSIrMzEuNTEoMWQpCgkJNzc9NGYKCQkxMTY9Yy4xYWUoMjYsIDE4ZT0iMTM0LmE3IiwgMTIzPTM5KQoJCTExNi4xZTIoIDFkMD0iMTE3IiwgMTc0PXsgIjI2MCI6IDI2LCAiMjg4IjogMWQgfSApCgkJMTE2LjE2ZSggIjE1YiIsIDRiICkKCQkxNiAzMD09NSA6CgkJCTc3PTU0LjhmKDE0Yj0xMTMoYjAuYTFbMV0pLDJkPTI5YyxmOD0xMTYsZmM9YWQpCgkJMmI6CgkJCTc3PTU0LjhmKDE0Yj0xMTMoYjAuYTFbMV0pLDJkPTI5YyxmOD0xMTYsZmM9NGYpCgkJMjggNzcKCgkJCgkJCQkJICAKMTg9ZTQoKQoyZD03YwoyNj03YwozMD03YwozOT03Ywo0Yj03YwoxZD03YwoKCjE5OgoJCTJkPTMxLjNkKDE4WyIyZCJdKQoyNDA6CgkJMTFlCjE5OgoJCTI2PTMxLjNkKDE4WyIyNiJdKQoyNDA6CgkJMTFlCjE5OgoJCTM5PTMxLjNkKDE4WyIzOSJdKQoyNDA6CgkJMTFlCjE5OgkJCgkJMzA9MTEzKDE4WyIzMCJdKQoyNDA6CgkJMTFlCjE5OgkJCgkJNGI9MzEuM2QoMThbIjRiIl0pCjI0MDoKCQkxMWUKMTk6CQkKCQkxZD0zMS4zZCgxOFsiMWQiXSkKMjQwOgoJCTExZQoKIyBiOSAyYSAxZjcgYmQgMWJkCjFlIDllKDgxLCAyZDQpOgoJIyAxNGEgODEgMWQwIDJkMCAxZGEgMjUzIDI5MiAyNTQgM2EgMjY4CgkxNiA4MToKCQk1NC4xNzcoMTEzKGIwLmExWzFdKSwgODEpCgkxNiA4MC5kZSgnMjhhLTFiZCcpPT0nMWE2JzoKCQkyY2MuMjYyKCIxOTQuMTcwKCVlNikiICUgODAuZGUoMmQ0KSApCgkJCgkJCjE2IDMwPT03YyAyMDIgMmQ9PTdjIDIwMiA2MCgyZCk8MTogMTg1KCkKMmMgMzA9PTI6IGU3KCkKMmMgMzA9PTM6IGM4KCkgCjJjIDMwPT00OiA4YigyZCkKMmMgMzA9PTU6IDE0ZCgyNiwyZCwxZCkKMmMgMzA9PTY6IGRjKDE4KQoyYyAzMD09NzogYTAoMmQpCjJjIDMwPT04OiAxMTAoKQoyYyAzMD09OTogMWE5KCkKMmMgMzA9PTExOiAxM2IoKQoKNTQuMTI0KDExMyhiMC5hMVsxXSkp")))(lambda a,b:b[int("0x"+a.group(1),16)],"0|1|2|3|4|5|6|7|8|9|a|B|xbmcgui|d|e|f|10|11|special|getCondVisibility|close|for|if|str|params|try|force|delete|icons|description|def|dirs|parsed|in|22|to|shutil|get|name|Delete|return|version|the|else|elif|url|rmtree|Kodi|mode|urllib|addonfolder|Cache|MAINTAINANCEICON|password|username|you|downloader_cache_path|iconimage|and|myplatform|Files|unquote_plus|tempfolder|print|unlink|channel4_cache_path|CLEARCACHEICON|message|FRESHSTARTICON|splitparams|yesno|build|found|cache|FANART|fanart|exists|iplayer_cache_path|home|True|bfriendlyname|quote_plus|addon_data|freshstart|xbmcplugin|busydialog|Paradox|killall|decodestring|unsuccessful|import|addDir|option|Please|xbmcPath|SafeConfigParser|len|xbmc_cache_path|temp_cache_path|main_list|yes_pressed|walk|CONTACTICON|versioninfo|INSTALLICON|itv_cache_path|ActivateWindow|wtf_cache_path|settings|self|setSetting|them|want|Count|downloader|pairsofparams|paradoxwizard|packages_cache_path|parser|ok|addonPath|plugin|wizard|existingfile|None|give|PURGEICON|windows|ADDON|content|profile|AddonID|BASEURL|versionfileexists|versionfile|get_setting|smf_hash|OPEN_URL|copytree|deletecachefiles|packages|CHECKURL|XBMC|addDirectoryItem|CONTROL_TEXTBOX|Close|theblackboxostv|addons|Wizard|action|video|base64|COLOR|system|paradox|android|WARNING|message_yes_no|setView|LocalAndRental|DeletePackages|argv|DialogProgress|from|directory|log|ART|png|not|xbmcaddon|file_count|CONTROL_LABEL|cleanedparams|False|your|seeing|sys|bversion|installation|atv2_cache_b|atv2_cache_a|remove|stop|failed|menu|Set|Packages|script|exit_handler|window|be|announce|killxbmc|yellow|Maintenance|successdata|Do|paramstring|setControls|versionpath|MAINTENANCE|Brought|extract|removed|AppleTV|cleanly|whatami|headers|suceess|heading|linux|param|open_settings_dialog|value|getControl|Extracting|dp|dlurl|text|db|FRESHSTART|Press|getSetting|Downloader|fileexists|USER_AGENT|e2|e3|get_params|shell|s|BUILDMENU|TextBoxes|iplayer_http_cache|WINDOW|NOT|common|installed|partially|lib|SendClick|traceback|movies|choice|F4|time|temp|complete|listitem|exit|continue|read|isFolder|user|json|RunAddon|requests|EXCLUDES|ECHO|DELETING|removing|maintainanceicon|add_item|register|TASKKILL|this|logopath|st_mtime|lime|symlinks|download|kodi|facebook|via|You|int|L2FkZG9ucy50eHQ|clean|liz|Video|FRESHSTARTBUILD|loads|red|Addon|sleep|freshstarticon|pass|default|Removed|iPlayer|urllib2|thumbnailImage|endOfDirectory|clearcacheicon|implementation|Authentication|Package|Install|zipFile|process|install|central|TextBox|private|changes|changed|Library|initctl|DefaultFolder|fixBadZipfile|join|ReplaceWindow|configuration|update|file|DELETEIVUEDB|was|MAIN|ignore|ConfigParser|adb|Applications|sha1|http|id|been|create|pos|atexit|module|set|handle|folder|WIZARD|exe|ATV2|have|getAddonInfo|off|org|mobile|re|dst|isfile|brsurl|Simple|now|Fanart_Image|Wait|files|tskill|Caches|item|button|DoStopScript|osx|ImportError|set_setting|contacticon|Downloading|application|maintenance|whatthefurk|installicon|Successfuly|ToggleDebug|setProperty|directories|SetViewMode|To|Error|start|infoLabels|of|repository|setContent|listbuilds|format_exc|split|Would|INDEX|MyVideos75|title|Fresh|begin|Other|thumbnails|path|initialize|SETUP|Check|enter|AddonTitle|StopScript|Trancating|downloaded|click|Textures13|iconImage|purgeicon|src|truncated|has|hexdigest|Container|available|Exception|Installed|cookielib|signature|zip|win|cfg|ADDONPATH|resources|req|STANDARD|U|truncate|stat|Password|am|true|User|Canceled|donation|burl|Archives|function|COMPLETE|ListItem|like|OK|atv2|database|__init__|it|is|Menu|save|Addons15|location|detected|sess|makedirs|view|userdata|sudo|setLabel|If|link|icon|Database|PACKAGES|need|DO|windowid|open|yeslabel|Platform|activate|KODI|Your|getbuild|type|Firstrun|FIRSTRUN|msg2|Anything|msg1|existing|Windows|Message|seconds|library|restore|contact|raspbmc|PARADOX|xbmcvfs|topdown|against|setInfo|Android|nolabel|request|setText|Current|Raspbmc|hashlib|Problem|another|already|Welcome|listdir|Control|iplayer|Hashing|account|abspath|replace|Contact|Changed|current|session|VERSION|manager|laction|at|uk|builds|remote|encode|var|or|Images|Net|bin|By|latest|recent|ios|Python|Action|Inital|Get|simple|co|Cancel|we|record|sha|cached|DBPATH|Amazon|bdlurl|ending|instid|The|Window|viewer|ITV|See|BBC|launch|python|orange|kwargs|before|All|submessage|rid|4oD|marker|UPDATE|net|compat|Manage|TNPATH|global|all|fresh|Sleep|copy2|devos|Build|clear|range|about|panel|bicon|Agent|DoSC2|lower|Clear|About|except|check|CACHE|bslug|Cydia|error|DoRA2|Force|Purge|raise|Sorry|Popup|class|Linux|added|false|rmdir|least|Start|shows|views|Apple|needs|purge|logos|until|10147|forum|recid|isdir|P|FORCE|Title|DoAW|executebuiltin|OSMC|logo|as|DoTD|wish|info|ICON|STOP|some|Id|utf8|used|Copy|im|Open|Done|CR|both|emsg|page|etit|DoCM|repr|find|most|able|seek|were|task|that|size|DoRA|DoRW|means|addon|args|TEMP|Plot|auth|auto|then|platform|mtit|What|Furk|hold|on|more|mmsg|HOME|Exit|Home|hash|Wake|init|DoSC|SMF|u|Add|Use|use|run|OSX|iOS|dialog|Yes|php|URL|500|translatePath|are|see|bad|x05|M|any|DoA|x50|art|ATV|one|atv|End|ZIP|WTF|itv|Zip|4od|DoE|end|ALT|can|dev|txt|x4b|dir|smf|x06|Now|Fix|an|us|No|data|i|xbmc|root|Dialog|os|so|plugintools|TO|My|viewType|th|F|r|T|b|N".split("|"))) 

В частности, этот комментарий им следует.

https://stackoverflow.com/a/33218455/1453147

Я попытался установить второй Exec на первой линии для печати, но он просто продолжает давать мне ошибку при запуске

TypeError: не может использовать струнный рисунок на байт-подобный объект

Как я уже сказал, я могу сделать первый шаг декодирования, но второй этап совпадения строк строк уклоняется от меня ха-ха.

Любая помощь была бы очень признательна!

+1

Возможный дубликат [Как декодировать строку python] (http://stackoverflow.com/questions/33217926/how-to-decode-a-python-string) –

+0

Это же те же строки, что и я, знать, как парень попал на конечный результат –

ответ

0

Как указано в ответе на this question, чтобы увидеть, что это выглядит как просто изменить exec к print

EDIT: Действительно, это выходной сигнал

import xbmc, xbmcaddon, xbmcgui, xbmcplugin, os, base64, sys, xbmcvfs, atexit, requests 
import shutil, urllib, urllib2, cookielib, re, extract, downloader, time, json, plugintools 
from ConfigParser import SafeConfigParser 
from addon.common.addon import Addon 
from addon.common.net import Net 

try: 
    from hashlib import sha1 
except ImportError: # python 2.4 compat 
    from sha import sha as sha1 




AddonID   = 'plugin.video.paradoxwizard' 
ADDON    = xbmcaddon.Addon(id=AddonID) 
VERSION   = "1.0.3" 
ADDONPATH   = xbmc.translatePath(os.path.join('special://home/addons/' + AddonID)) 
AddonTitle  = "Paradox Wizard" 
USER_AGENT  = 'Kodi/Paradox Wizard' 
U     = plugintools.get_setting('username') 
P     = plugintools.get_setting('password') 
M     = plugintools.get_setting('submessage') 

dialog   = xbmcgui.Dialog() 
net    = Net() 

BASEURL   = "http://theblackboxostv.co.uk/" 
CHECKURL   = BASEURL + "wizard-dev.php" 

ART    = xbmc.translatePath(os.path.join('special://home/addons/' + AddonID + '/resources/art/')) 
DBPATH   = xbmc.translatePath('special://database') 
TNPATH   = xbmc.translatePath('special://thumbnails'); 

EXCLUDES   = ['plugin.video.paradoxwizard','script.module.addon.common','repository.paradox'] 

FANART   = ART+'fanart.png' 
ICON    = ART+'icon.png' 

#set some default icons 
INSTALLICON  = ART+'install.png' 
MAINTAINANCEICON = ART+'maintenance.png' 
CONTACTICON  = ART+'contact.png' 
CLEARCACHEICON = ART+'clear-cache.png' 
FRESHSTARTICON = ART+'fresh-start.png' 
PURGEICON   = ART+'purge.png' 

#Firstrun marker 
FIRSTRUN   = True 




def DoE(e): xbmc.executebuiltin(e) 
def DoAW(e): xbmc.executebuiltin("ActivateWindow(%s)" % str(e)) 
def DoRW(e): xbmc.executebuiltin("ReplaceWindow(%s)" % str(e)) 
def DoRA(e): xbmc.executebuiltin("RunAddon(%s)" % str(e)) 
def DoRA2(e,e2="1",e3=""): xbmc.executebuiltin('RunAddon(%s,"%s","%s")' % (str(e),str(e2),e3)); 
def DoA(a): xbmc.executebuiltin("Action(%s)" % str(a)) 
def DoCM(a): xbmc.executebuiltin("Control.Message(windowid=%s)" % (str(a))) 
def DoSC(a): xbmc.executebuiltin("SendClick(%s)" % (str(a))) 
def DoSC2(a,Id): xbmc.executebuiltin("SendClick(%s,%s)" % (str(a),str(Id))) 
def DoStopScript(e): xbmc.executebuiltin("StopScript(%s)" % str(e)) 
def DoTD(): xbmc.executebuiltin("ToggleDebug") 
def exit_handler(): 
    print 'My application is ending!' 

atexit.register(exit_handler) 

# Anything that needs to be run before the script init's 
def SETUP(): 
    global INSTALLICON,MAINTAINANCEICON,CONTACTICON,CLEARCACHEICON,FRESHSTARTICON,PURGEICON,M 
    # See if we can update the logos used 
    # logopath = "http://paradoxwizard.co.uk/icon/paradox-wizard-icons.cfg" 
    # path = xbmc.translatePath(os.path.join('special://home/addons','packages/')) 
    # downloader.download(logopath, path + "/paradox-wizard-icons.cfg") 
    # icons = SafeConfigParser() 
    # icons.read(path + "/paradox-wizard-icons.cfg") 
    # INSTALLICON  = str(icons.get('icons', 'installicon')) 
    # MAINTAINANCEICON = str(icons.get('icons', 'maintainanceicon')) 
    # CONTACTICON  = str(icons.get('icons', 'contacticon')) 
    # CLEARCACHEICON  = str(icons.get('icons', 'clearcacheicon')) 
    # FRESHSTARTICON  = str(icons.get('icons', 'freshstarticon')) 
    # PURGEICON  = str(icons.get('icons', 'purgeicon')) 
    # FANART    = str(icons.get('icons', 'fanart')) 
    if U=="" and P=="" and M=="false": 
     msg1 = "Please register an account at http://theblackboxostv.co.uk and enter your forum username and password in the wizard settings panel to continue. " 
     msg2 = "Would you like to enter your username and password now?" 
     yes_pressed=plugintools.message_yes_no(AddonTitle + " - Authentication",msg1,msg2) 
     plugintools.set_setting('submessage','true') 
     if yes_pressed: 
      plugintools.open_settings_dialog() 

    INDEX() 

# Inital Menu 
def INDEX(): 

    addDir('Install Paradox',BASEURL,2,INSTALLICON,FANART,'') 
    addDir('Maintenance',BASEURL,3,MAINTAINANCEICON,FANART,'') 
    addDir('Contact',BASEURL,8,CONTACTICON,FANART,'') 
    setView('movies', 'MAIN') 

# Build Menu 
def BUILDMENU(): 

    data = OPEN_URL(CHECKURL + "?action=listbuilds&user=" + U + "&pass=" + smf_hash(P,U)) 
    parsed = json.loads(data) 

    for build in parsed: 
     addDir(build['bfriendlyname'] + ' - ' + build['bversion'],build['bslug'],5,build['bicon'],FANART,'') 
     setView('movies', 'MAIN') 

# Maintenance menu 
def MAINTENANCE(): 
    addDir('Clear Cache','url',4,CLEARCACHEICON,FANART,'') 
    addDir('Fresh Start','url',6,FRESHSTARTICON,FANART,'') 
    addDir('Purge Packages','url',7,PURGEICON,FANART,'') 
    setView('movies', 'MAIN') 

# Popup script 
def TextBoxes(heading,announce): 
    class TextBox(): 
    WINDOW=10147 
    CONTROL_LABEL=1 
    CONTROL_TEXTBOX=5 
    def __init__(self,*args,**kwargs): 
     xbmc.executebuiltin("ActivateWindow(%d)" % (self.WINDOW,)) # activate the text viewer window 
     self.win=xbmcgui.Window(self.WINDOW) # get window 
     xbmc.sleep(500) # give window time to initialize 
     self.setControls() 
    def setControls(self): 
     self.win.getControl(self.CONTROL_LABEL).setLabel(heading) # set heading 
     try: f=open(announce); text=f.read() 
     except: text=announce 
     self.win.getControl(self.CONTROL_TEXTBOX).setText(str(text)) 
     return 
    TextBox() 

# About us text 
def facebook(): 
    TextBoxes(AddonTitle,'[COLOR=orange]Welcome to Paradox[/COLOR][CR][CR]')   

# Install builds 
def WIZARD(name,url,description): 

    xbmc.executebuiltin("ActivateWindow(busydialog)") 

    # Check the username and password set in the wizard 
    whatami = platform() 
    burl = CHECKURL + "?action=getbuild&devos=" + whatami + "&build=" + url + "&user=" + U + "&pass=" + smf_hash(P,U) 
    data = OPEN_URL(burl) 
    parsed = json.loads(data) 
    build = str(parsed.get('bfriendlyname')) 
    version = str(parsed.get('bversion')) 

    # See if we have a version file 
    versionpath = xbmc.translatePath(os.path.join('special://','home')) 
    versionfile = versionpath + 'version.txt' 
    versionfileexists = os.path.isfile(versionfile) 
    parser = SafeConfigParser() 
    parser.read(versionfile) 

    # Check the version of the build against the latest available version 
    if versionfileexists and parser.get('versioninfo', 'version') == version and parser.get('versioninfo', 'build') == build: 
     dialog = xbmcgui.Dialog() 
     xbmc.executebuiltin("Dialog.Close(busydialog)") 
     dialog.ok(AddonTitle, "You already have the most recent version","", str(parser.get('versioninfo', 'build')) + " " + str(parser.get('versioninfo', 'version'))) 
    else: 

     path = xbmc.translatePath(os.path.join('special://home/addons','packages/')) 
     fileexists = os.path.isfile(path+url+version+'.zip') 
     existingfile = os.path.join(path+url+version+'.zip') 

     if fileexists: 
      lib = existingfile 
      dp = xbmcgui.DialogProgress() 
      xbmc.executebuiltin("Dialog.Close(busydialog)") 
      tempfolder = xbmc.translatePath(os.path.join('special://','home','temp')) 
      addonfolder = xbmc.translatePath(os.path.join('special://','home')) 
      time.sleep(2) 
      dp.create(AddonTitle,"Extracting "+ name, "Please Wait...") 
      extract.all(lib,addonfolder,dp) 
      # copytree(tempfolder, addonfolder) 
      # shutil.rmtree(tempfolder) 
      dp.close() 
      ADDON.setSetting(id="username", value="") 
      ADDON.setSetting(id="password", value="") 
      dialog = xbmcgui.Dialog() 
      dialog.ok(AddonTitle, name + " has been installed from your existing packages") 
      dialog.ok(AddonTitle, " ", "To save changes you now need to force close Kodi, Press OK to force close Kodi") 
      killxbmc() 

     else: 

      if parsed.get('auth'): 
       rid = parsed.get('recid') 
       dlurl = parsed.get('bdlurl') 

       if parsed.get('brsurl'): 
        dlurl = parsed.get('brsurl') 

       print dlurl 

       dp = xbmcgui.DialogProgress() 
       xbmc.executebuiltin("Dialog.Close(busydialog)") 

       # if whatami == "windows": 
       # FRESHSTARTBUILD(params) 

       dp.create(AddonTitle,"Downloading "+ parsed.get('bfriendlyname')+ " - " + parsed.get('bversion'), "Please Wait...") 
       lib = existingfile 

       # added to remove any partially downloaded files 
       try: 
        downloader.download(dlurl, lib, dp) 
       except Exception as e: 
        if str(e) == "Canceled": 
         os.remove(lib) 
        return 

       addonfolder = xbmc.translatePath(os.path.join('special://','home')) 
       tempfolder = xbmc.translatePath(os.path.join('special://','home','temp')) 
       time.sleep(2) 
       dp.update(0,"", "Extracting "+ parsed.get('bfriendlyname') +" Zip","Please Wait...") 
       extract.all(lib,addonfolder,dp) 
       # copytree(tempfolder, addonfolder) 
       # shutil.rmtree(tempfolder) 
       dp.close() 
       successdata = OPEN_URL(CHECKURL + "?action=installed&instid=" + str(rid) + "&user=" + U + "&pass=" + smf_hash(P,U)) 
       suceess = json.loads(successdata) 
       dialog = xbmcgui.Dialog() 
       dialog.ok(AddonTitle, suceess.get('mtit'),"", suceess.get('mmsg')) 
       dialog.ok(AddonTitle, " ", "To save changes you now need to force close Kodi, Press OK to force close Kodi") 
       ADDON.setSetting(id="username", value="") 
       ADDON.setSetting(id="password", value="") 
       killxbmc() 

      else: 
       xbmc.executebuiltin("Dialog.Close(busydialog)") 
       dialog = xbmcgui.Dialog() 
       dialog.ok(AddonTitle, parsed.get('etit'),"", parsed.get('emsg')) 

# Copy directories from one laction to another 
def copytree(src, dst, symlinks=False, ignore=None): 
    if not os.path.exists(dst): 
     os.makedirs(dst) 
    for item in os.listdir(src): 
     s = os.path.join(src, item) 
     d = os.path.join(dst, item) 
     if os.path.isdir(s): 
      copytree(s, d, symlinks, ignore) 
     else: 
      if not os.path.exists(d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1: 
       shutil.copy2(s, d) 

# Open URL (Changed to use urllib2.request) 
def OPEN_URL(url): 
    headers = { 
     'User-Agent': USER_AGENT 
    } 
    sess = requests.session() 
    req = sess.get(url, headers=headers) 
    link = req.content 
    req.close() 
    return link 

# Delete Packages 
def DeletePackages(url): 
    print '############################################################ DELETING PACKAGES    ###############################################################' 
    packages_cache_path = xbmc.translatePath(os.path.join('special://home/addons/packages', '')) 
    try:  
     for root, dirs, files in os.walk(packages_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete Package Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 
        dialog = xbmcgui.Dialog() 
        dialog.ok(AddonTitle, "Packages Successfuly Removed", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]") 
    except: 
     dialog = xbmcgui.Dialog() 
     dialog.ok(AddonTitle, "Sorry we were not able to remove Package Files", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]") 

# Delete Cache 
def deletecachefiles(url): 
    print '############################################################ DELETING STANDARD CACHE   ###############################################################' 
    xbmc_cache_path = os.path.join(xbmc.translatePath('special://home'), 'cache') 
    if os.path.exists(xbmc_cache_path)==True: 
     for root, dirs, files in os.walk(xbmc_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         try: 
          os.unlink(os.path.join(root, f)) 
         except: 
          pass 
        for d in dirs: 
         try: 
          shutil.rmtree(os.path.join(root, d)) 
         except: 
          pass 

      else: 
       pass 
    if xbmc.getCondVisibility('system.platform.ATV2'): 
     atv2_cache_a = os.path.join('/private/var/mobile/Library/Caches/AppleTV/Video/', 'Other') 

     for root, dirs, files in os.walk(atv2_cache_a): 
      file_count = 0 
      file_count += len(files) 

      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete ATV2 Cache Files", str(file_count) + " files found in 'Other'", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 
     atv2_cache_b = os.path.join('/private/var/mobile/Library/Caches/AppleTV/Video/', 'LocalAndRental') 

     for root, dirs, files in os.walk(atv2_cache_b): 
      file_count = 0 
      file_count += len(files) 

      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete ATV2 Cache Files", str(file_count) + " files found in 'LocalAndRental'", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 
       # Set path to Cydia Archives cache files 


    # Set path to What th Furk cache files 
    wtf_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.whatthefurk/cache'), '') 
    if os.path.exists(wtf_cache_path)==True:  
     for root, dirs, files in os.walk(wtf_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete WTF Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 

       # Set path to 4oD cache files 
    channel4_cache_path= os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.4od/cache'), '') 
    if os.path.exists(channel4_cache_path)==True: 
     for root, dirs, files in os.walk(channel4_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete 4oD Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 

       # Set path to BBC iPlayer cache files 
    iplayer_cache_path= os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.iplayer/iplayer_http_cache'), '') 
    if os.path.exists(iplayer_cache_path)==True:  
     for root, dirs, files in os.walk(iplayer_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete BBC iPlayer Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 


       # Set path to Simple Downloader cache files 
    downloader_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/script.module.simple.downloader'), '') 
    if os.path.exists(downloader_cache_path)==True: 
     for root, dirs, files in os.walk(downloader_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete Simple Downloader Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 

       # Set path to ITV cache files 
    itv_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.itv/Images'), '') 
    if os.path.exists(itv_cache_path)==True:  
     for root, dirs, files in os.walk(itv_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete ITV Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 

       # Set path to temp cache files 
    temp_cache_path = os.path.join(xbmc.translatePath('special://home/temp'), '') 
    if os.path.exists(temp_cache_path)==True: 
     for root, dirs, files in os.walk(temp_cache_path): 
      file_count = 0 
      file_count += len(files) 

     # Count files and give option to delete 
      if file_count > 0: 

       dialog = xbmcgui.Dialog() 
       if dialog.yesno("Delete TEMP dir Cache Files", str(file_count) + " files found", "Do you want to delete them?"): 

        for f in files: 
         os.unlink(os.path.join(root, f)) 
        for d in dirs: 
         shutil.rmtree(os.path.join(root, d)) 

      else: 
       pass 


    dialog = xbmcgui.Dialog() 
    dialog.ok(AddonTitle, " All Cache Files Removed", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]") 

# Delete cached files 
def killxbmc(): 
    choice = xbmcgui.Dialog().yesno('Force Close Kodi', 'You are about to close Kodi', 'Would you like to continue?', nolabel='No, Cancel',yeslabel='Yes, Close') 
    if choice == 0: 
     return 
    elif choice == 1: 
     pass 
    myplatform = platform() 
    print "Platform: " + str(myplatform) 
    if myplatform == 'osx': # OSX 
     print "############ try osx force close #################" 
     try: os.system('killall -9 XBMC') 
     except: pass 
     try: os.system('killall -9 Kodi') 
     except: pass 
     dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'') 
    elif myplatform == 'linux': #Linux 
     print "############ try linux force close #################" 
     try: os.system('killall XBMC') 
     except: pass 
     try: os.system('killall Kodi') 
     except: pass 
     try: os.system('killall -9 xbmc.bin') 
     except: pass 
     try: os.system('killall -9 kodi.bin') 
     except: pass 
     dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'') 
    elif myplatform == 'android': # Android 
     print "############ try android force close #################" 
     try: os.system('adb shell am force-stop org.xbmc.kodi') 
     except: pass 
     try: os.system('adb shell am force-stop org.kodi') 
     except: pass 
     try: os.system('adb shell am force-stop org.xbmc.xbmc') 
     except: pass 
     try: os.system('adb shell am force-stop org.xbmc') 
     except: pass   
     dialog.ok("[COLOR=yellow][b]TO COMPLETE PARADOX UPDATE[/COLOR][/b]", "Press the HOME button on your remote and [COLOR=red][b]FORCE STOP[/COLOR][/b] KODI via the Manage Installed Applications menu in settings on your Amazon home page then re-launch KODI") 
    elif myplatform == 'windows': # Windows 
     print "############ try windows force close #################" 
     try: 
      os.system('@ECHO off') 
      os.system('tskill XBMC.exe') 
     except: pass 
     try: 
      os.system('@ECHO off') 
      os.system('tskill Kodi.exe') 
     except: pass 
     try: 
      os.system('@ECHO off') 
      os.system('TASKKILL /im Kodi.exe /f') 
     except: pass 
     try: 
      os.system('@ECHO off') 
      os.system('TASKKILL /im XBMC.exe /f') 
     except: pass 
     dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Use task manager and NOT ALT F4") 
    else: #ATV 
     print "############ try atv force close #################" 
     try: os.system('killall AppleTV') 
     except: pass 
     print "############ try raspbmc force close #################" #OSMC/Raspbmc 
     try: os.system('sudo initctl stop kodi') 
     except: pass 
     try: os.system('sudo initctl stop xbmc') 
     except: pass 
     dialog.ok("[COLOR=red][b]WARNING !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit via the menu.","iOS detected. Press and hold both the Sleep/Wake and Home button for at least 10 seconds, until you see the Apple logo.") 

# Get Current platform  
def platform(): 
    if xbmc.getCondVisibility('system.platform.android'): 
     return 'android' 
    elif xbmc.getCondVisibility('system.platform.linux'): 
     return 'linux' 
    elif xbmc.getCondVisibility('system.platform.windows'): 
     return 'windows' 
    elif xbmc.getCondVisibility('system.platform.osx'): 
     return 'osx' 
    elif xbmc.getCondVisibility('system.platform.atv2'): 
     return 'atv2' 
    elif xbmc.getCondVisibility('system.platform.ios'): 
     return 'ios' 

# Fresh start 
def FRESHSTART(params): 
    plugintools.log("freshstart.main_list "+repr(params)); yes_pressed=plugintools.message_yes_no(AddonTitle,"Do you wish to restore your","Kodi configuration to default settings?") 
    if yes_pressed: 
     addonPath=xbmcaddon.Addon(id=AddonID).getAddonInfo('path'); addonPath=xbmc.translatePath(addonPath); 
     xbmcPath=os.path.join(addonPath,"..",".."); xbmcPath=os.path.abspath(xbmcPath); plugintools.log("freshstart.main_list xbmcPath="+xbmcPath); failed=False 
     try: 
      for root, dirs, files in os.walk(xbmcPath,topdown=True): 
       dirs[:] = [d for d in dirs if d not in EXCLUDES] 
       for name in files: 
        try: os.remove(os.path.join(root,name)) 
        except: 
         if name not in ["Addons15.db","MyVideos75.db","Textures13.db","xbmc.log"]: failed=True 
         plugintools.log("Error removing "+root+" "+name) 
       for name in dirs: 
        try: os.rmdir(os.path.join(root,name)) 
        except: 
         if name not in ["Database","userdata"]: failed=True 
         plugintools.log("Error removing "+root+" "+name) 
      if not failed: plugintools.log("freshstart.main_list All user files removed, you now have a clean install"); plugintools.message(AddonTitle,"The process is complete","click OK to begin clean installation") 
      else: plugintools.log("freshstart.main_list User files partially removed"); plugintools.message(AddonTitle,"The process is complete","click OK to begin clean installation") 
     except: plugintools.message(AddonTitle,"Problem found","Your settings has not been changed"); import traceback; plugintools.log(traceback.format_exc()); plugintools.log("freshstart.main_list NOT removed") 
     plugintools.add_item(action="",title="Now Exit Kodi",folder=False) 
    else: plugintools.message(AddonTitle,"Your settings","has not been changed"); plugintools.add_item(action="",title="Done",folder=False) 

# Fix bad zip files 
def fixBadZipfile(zipFile): 
    f = open(zipFile, 'r+b') 
    data = f.read() 
    pos = data.find('\x50\x4b\x05\x06') # End of central directory signature 
    if (pos > 0): 
     print "Trancating file at location " + str(pos + 22)+ "." 
     f.seek(pos + 22) # size of 'ZIP end of central directory record' 
     f.truncate() 
     f.close() 
    else: 
     pass 
     # raise error, file is truncated 

# SMF Password Hashing 
def smf_hash(password, username): 
    """ 
    Python implementation of the smf check hash function 
    """ 
    return sha1(username.lower().encode('utf8') + password).hexdigest() 

# Get params  
def get_params(): 
     param=[] 
     paramstring=sys.argv[2] 
     if len(paramstring)>=2: 
       params=sys.argv[2] 
       cleanedparams=params.replace('?','') 
       if (params[len(params)-1]=='/'): 
         params=params[0:len(params)-2] 
       pairsofparams=cleanedparams.split('&') 
       param={} 
       for i in range(len(pairsofparams)): 
         splitparams={} 
         splitparams=pairsofparams[i].split('=') 
         if (len(splitparams))==2: 
           param[splitparams[0]]=splitparams[1] 

     return param 

N = base64.decodestring('') 
T = base64.decodestring('L2FkZG9ucy50eHQ=') 
b = base64.decodestring('') 
F = base64.decodestring('') 

# Add directory 
def addDir(name,url,mode,iconimage,fanart,description): 
     u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&iconimage="+urllib.quote_plus(iconimage)+"&fanart="+urllib.quote_plus(fanart)+"&description="+urllib.quote_plus(description) 
     ok=True 
     liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage) 
     liz.setInfo(type="Video", infoLabels={ "Title": name, "Plot": description }) 
     liz.setProperty("Fanart_Image", fanart) 
     if mode==5 : 
      ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False) 
     else: 
      ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True) 
     return ok 



params=get_params() 
url=None 
name=None 
mode=None 
iconimage=None 
fanart=None 
description=None 


try: 
     url=urllib.unquote_plus(params["url"]) 
except: 
     pass 
try: 
     name=urllib.unquote_plus(params["name"]) 
except: 
     pass 
try: 
     iconimage=urllib.unquote_plus(params["iconimage"]) 
except: 
     pass 
try:   
     mode=int(params["mode"]) 
except: 
     pass 
try:   
     fanart=urllib.unquote_plus(params["fanart"]) 
except: 
     pass 
try:   
     description=urllib.unquote_plus(params["description"]) 
except: 
     pass 

# Set the current window view 
def setView(content, viewType): 
    # set content type so library shows more views and info 
    if content: 
     xbmcplugin.setContent(int(sys.argv[1]), content) 
    if ADDON.getSetting('auto-view')=='true': 
     xbmc.executebuiltin("Container.SetViewMode(%s)" % ADDON.getSetting(viewType)) 


if mode==None or url==None or len(url)<1: SETUP() 
elif mode==2: BUILDMENU() 
elif mode==3: MAINTENANCE() 
elif mode==4: deletecachefiles(url) 
elif mode==5: WIZARD(name,url,description) 
elif mode==6: FRESHSTART(params) 
elif mode==7: DeletePackages(url) 
elif mode==8: facebook() 
elif mode==9: donation() 
elif mode==11: DELETEIVUEDB() 

xbmcplugin.endOfDirectory(int(sys.argv[1])) 
0

Я успешно распознан «это» затемнение с помощью python версии 2.5 вместо этого, python 3.0 и выше получили основные исправления ошибок, в результате чего невозможно декодировать «эту обычную обфускацию base64».