[英]How to use python to decode base64
Im trying to decode the following I can get past the first step of the actual decode I just dont understand the second section of hash matching? 我正在尝试解码以下内容,我可以通过实际解码的第一步,我只是不了解哈希匹配的第二部分?
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("|")))
In particular this comment im following. 尤其是此评论。
https://stackoverflow.com/a/33218455/1453147 https://stackoverflow.com/a/33218455/1453147
I've tried setting the second exec on the first line to print but it just keeps giving me an error when run 我尝试在第一行上设置第二个exec打印,但是在运行时它总是给我一个错误
TypeError: cannot use a string pattern on a bytes-like object TypeError:无法在类似字节的对象上使用字符串模式
Like I say I can do the first step of decoding but the second step of matching the pipe Strings is evading me haha. 就像我说的那样,我可以执行解码的第一步,但是匹配管道字符串的第二步使我回避了哈哈。
Any help would be most appreciated! 非常感激任何的帮助!
As specified in answer to this question , to see what it looks like just change exec
to print
如对此问题的回答中所指定的,要查看其外观,只需将exec
更改为print
EDIT: Really, this is the output 编辑:真的,这是输出
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]))
我使用python 2.5版成功地解码了“ this”混淆,python 3.0及更高版本收到了主要的错误修复实习生,从而无法解码“ this”特别的base64模糊化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.