命令行播放坤坤

只因你太美

发表于 2023-06-28 03:56:18
更新于 2024-04-18 13:33:37
Node.jspython

全民制作人们,大家好

我是练习时长两年半的个人练习生。

取出视频中的帧

利用 ffmpeg,我们可以把视频转换为图片。

bash
ffmpeg -i ./cxk-video.mov  ./cxk/%d.jpg

将图片转成字符画

我们可以使用类似与 python 的脚本,提前将图片处理成字符画。

由于图片非常多,所以最好是有脚本能够处理。

你看到下面的背带裤了吗?

txt
lllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllIIIIIIllllllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!iiiiiiiii>>>>>>
lllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllIIIIIIllllllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!iiiiiiiii>>>>>>
lllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!iiiiiiiii>>>>>>
llIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiiiii
llIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!iiiiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!iiiiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!iiiiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIllllIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIllllIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIllIIIIIIIIIlllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;II;:;;;II;I:,!!!!iII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;II!+{{{))}_l<???<;II;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:+1rczzzzzcczQOJnrt]lII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;>1nnCJUUUQQUUJCJYXXvnj_i;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Il:cvXJQQmmmZZ0CCQQCYYYzuf{>!I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IUXXvQZ00Zq00QZZJQQQCXXXnr/{>Il;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lfJXXwdZ00Zq00QZZJQQQCXXXzvf/(+l;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;jYYJObZYuYZ0OOL000OOOQQzzXcuxf)~!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIlllIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;I!YQX0q0n)fu0qOOL000OOOQQJJXcuxf/?!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIlllIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:[UC0mLn|]|cCpmm00wwwwwZQJJXXvvvj/+!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIlllIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:\JQqqY([-}rYpqqqqdddqZmmLJUUYYYcn1>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:\JQqOv([(/UQqqqqqdddqZmmZQQQLLLUzf[;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!iiiiii
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IiJm0CX|1xxxXZqqppqqqqqppppmmmmmOLX(l;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!i
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;I:L0znu{]|()nmOOqqppqqqppppbbdddqOJtl;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!i
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:l?nQz\]{\nCCCYYJ0ZZpppddbbbbpppqZJr;;:::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllll!!!!lll!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;I<[_<??__]]]]](uJUmqpdbbpdhppppmm):::::::;;:::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllll!!lllll!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<~++-??__+++__?}\|Lmop0OQXUppppmt!:::::::;;:::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllll!!lllll!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;!>_[}??]-+++-[})\(zbUtfuj\fXbowY!,::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;~_]fvxx]-+++-[})\(Lz|1zz/1|QkpZ?:;::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIIIllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;<+?]}}}??[[[{{))(\f/|/j/|1rkpZi!;;::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIIIIIllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::;+|uj)[]}{{{11))||(\f){{10#bo>:::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::;+|U[|xu\{{{11))||/fxj}(q#*h1,:::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::ll1{{((}}{{{))||\frrjufm**b!`+:::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::,:]{{}}}}{{{\\ffjxrrjcvW#%),l::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::,;!____-[)|truvvcuv/nxO**W!:::::;;:::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::;;;?_??{)rnvzJLUzctz&j@**aa?`.,I;::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::;;;]/ttxuXULCUvnrrpWk\***aa8#b0<;;:::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::Ii~1oOYzuxxjfX####0#**oooooaa#C;:`,l:::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::Ii'a#Brf\ttfZWa###&#**oooooaakk&0kj.:::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::;;!h#MmJLnZM###MMM####opoooooaahhMhZ}!:::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::Qa**hhh##MMMMMMM####8noooooooooqk'<`.';I<l"^l;.::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::`&**#####MMMMMMM####u8oooooooooo..I\kmhbfCWddUI::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::^pkoo###MMMMMMMMMMM%8d*oooooooWb:::<bkkkkkkkhhb#}"::,:::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::.#a*oo###MMMMMMMMMMM$Zohoooooook@:::a#kkkkkkkhhpbpo+!":::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::`l;**aa*p###MMMMMMMMMh8Qboooooooooau;i|kahhhhhhhhhhhaak*a[::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::;IMaaooa{#####MM##***$+ooooooooooo*+l`&aaooaaaaaookkaa***oo?.;::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::I^oaaooa{#####MM##***B$oooooooooooo"::Maaooaaaaaoo**aakkkookbi,:::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::,>::jhaaooo~**********k#mp**ooooo****@,l!&**ooooooo######kkkhhaaoC'^I::::;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::,_]>!O*aaooo~*********oh<#M**ooooo****@,l!&**ooooooo######***hhaaa#W(,::::;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
llIIIIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::?*"I!kaooooovooo******b|***ooooooo****$^>I8####*****#########**hhkkk#o/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::;Iko`"!kaoooo#k*******a&hWa******ooo****8,!I0MMMM##*****##MMMMM####hhhhhoL!:I,;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
IIIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::iZko;^!kaooooM#*******a8pZd******ooo****8,,>jMMMM##*****##MMMMM######hhhkabX+;;;;;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
llIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::l;,0koo+l!0#oooohhu#o****h^ooo**************-!!!%*MMMMMMM**oooo###MMMMMM###oohham]:!;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!i
llIIIIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::"I!Wooo1i[jaoooobk+Mo****l&ooo*************#\!!!$kMMMMMMM**oooo###MMMMMM###oohhko*Cl;;;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!i
lllllIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::I'kooooh:"~o**oooowpoooM<&h**************##kq!!!m&MMMMMMMMM##ooooo**#########**ook#aX!;;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!iii
lllllllllIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::;lo*****'Ila##oooo@vd#o(8**************####o8iiin#MMMMWWWWWWWMM***ooaaoo***######***aatI,:;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!iii
lllllllllIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::~@****#>,^B##ooooa_#h0b@**************####8Wiii+hMMMMWWWWWWWMM***ooaaoo***######***aaax<l,;;;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!iii
lllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::;_*#####n:;$##**oo#m#no**##*********########BiiiI#MMWWWWWWWWWWWMMM##ooaaaaaaaoooo***oooop+l;;;;;;;;;;;;;;;IIIIIIIIIIIIllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::i[&#####m~!B##**oopo]d8**##*********#######W8iiiI%MMWWWWWWWWWWWMMM##ooaaaaaaaoooo***ooooQL:;;;;;;;;;;;;;;;IIIIIIIIIIIIllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::nWMMMM#M,InMM##oo@`!hh**#########**#########}l!~*MMWWWWWWWWW&&WWWMM##**oooaaaaaaaaaaaooko;;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::IcoMMMM*Wlll*###oo_>]oW**################MMMMz;i>cMMMMMMMMMWWWWWWWWW8o#######**ooooooo**&0^;;;;;;;;;IIIIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::IcoMMMMoalllMo##oo\1t*a**################MMMMo;i~\MMMMMMMMMWWWWWWWWWYn#######**ooooooo***,>;;;;;;;;;IIIIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Iz*MMMMMMxI!$MMMooBmB##################MMMMMM&Ili?&8MMMMMMMWWWWWWWWWOloMMMMMMMM#######&&v,";;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Iz*MMMMMMd;!o@MMooMoM##################MMMMMM#iI<;boMMMMMMMWWWWWWWWWBM8#MMMMMMM#######Mh!,!;;;;;;;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
llllllllllllllllIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Iv#WWMMMM8+>r8MM*********##############MMMMMMMC:llYoMMMMMMMWWWWWWWWWWWMMMMMMMMMMMMMMMMb!;;;;;;;;;;;;;;IIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
llllllllllllllllIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:f&WWMMMMkj"~%MM***********############MMMM##Bdlll{*MMMMMMMMMMMWWWWWMMWWWWWMMMMMMMMM@b;;;;;;;;;;;;;;;;IIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
llllllllllllllllIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:f&WWMMMMWq>,kMM***********############MMMM##&&;ll:*MMMMMMMMMMMWWWWWMMWWWWWMMMMMMMMMa';;;;;;;;;;;;;;;;IIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;l(BWWMMWWW#iIuWWMM###*********###########MMMMW#!ii,#MMMMMMMMMMMMMMWWMMWWWWWMMMMMMo#o"i;;;;;;;;;;;;;;IIIIIIIIIIIIIIIlllllllllllllllllllllll!!!!lll!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;i[aWWMMWW8$i<[WWMM###*********###########MMMMkh>ii!#MMMMMMMMMMMMMMWWMMWWWWWMMMMMM@b~:l;;;;;;;;;;;;;;IIIIIIIIIIIIIIIlllllllllllllllllllllll!!!!lll!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;_LWWMMMMMM(!<88Mh###**##*******#########MMMM#Wx>>iOMMMMMMMMMMMMMMMMMMWWMMMMMMM@W?I:;;;;;;;;;;;;;;;;IIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;l_f&*WWWW$#k;IhMW|@a#####MM###*********##MMMMMMMl<-|##MMMMMMMMMMMMWWMMMMWWWWW##oj;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;i>}&MWWWWo&B>;m#L-(8M####MM###*********##MMMMMMM,_><##MMMMMMMMMMMMWWMMMMWWWWWh&x:;;;;;;;;;;;;;;;;;;;IIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllllllIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ll?k&WWWWWWW;>f8}_;}a#########MM################>_+;MMMMMMMMMMMMMMMMMMMMWWWM#W+;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllllllIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ll?v8WWWWWWW<;~8}_"i##########MM################|Ii!MMMMMMMMMMMMMMMMMMMMWWW8h}.;;;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIlllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:li1qWW&&&&&Ci<U(?;;;oa#######MMMMMMMMMMM####***p~iio&MMMMMMMMMMMMMM####WWWO,;;;;;;;;;II;;;;;IIIIIIIIIIIIIIIIllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!>[u%M&&&&&B+,-x]!I,lk#########MMMMMMMMMMMMM###8+>>qMMMMMMMMMM#########BovII;;;;;;;;;IIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllllllIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!>?\*#&&&&&MX;;v1!I,`o#########MMMMMMMMMMMMM###8!>>\aMMMMMMMMM#########h}+II;;;;;;;;;IIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
llllllllllllllllllllllllllllllllIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;l+?(Yo&WWWWW&#I;x{il:(oMM#######MMMMMMMMM#######M><<~M###MMMM#######**oail;;;;;;;;;;;;;;IIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
llllllllllllllllllllllllllllllllIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;;;;;>?{X*M#WWWWW#Bl<(]il:d$MM#######MMMMMMMMM#######a]<<_8###MMMM#######**po`,l;;;;;;;;;;;;;IIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
llllllllllllllllllllllllllllllllllIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;;;;;;;:l<?{w&WWWWWWWWW|i1_il:M&MMMM#####MM#######**##MMMMY>><mMMMMM****###****kh;;;;;;;;;;;;;;;;IIIIIIIIIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iii
llllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;:l<]{mWMMMMWWWWW0I+}-;}##################MMWWWWWWW8q--~/MMM**oo*********aa<"l;;;;;;;;;;;;;IIIIIIIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
llllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;:l<]{Q*MMMMWWWWW#;i->:(##################MMWWWWWWWMk}})|MMM**oo*********aa?,";;;;;;;;;;;;;IIIIIIIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;!<?{XhMMMMWWWWW&!>?>;ia#**oo***##MMMMWWWWWMMMMMMMaW>>!>MMM##ooooooo****ooil:;;;;;;;;;;;;;IIIIIIIIIIIIllllllllllllllllllllll!!lll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ii!
lllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIII;;;;;;;;;;;;;;;;;;;!<?{XhMMMMWWWWWB<?]}i!#k**oo***##MMMMWWWWWMMMMMMMaW>>i;MMM##ooooooo****d#il:;;;;;;;;;;;;;IIIIIIIIIIIIllllllllllllllllllllll!!lll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ii!
llllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIII;;;;;;;;;;;I!~[)coMMMMWWWMMBi!}(]:q#MM*****##MMMMMMMMM#######h@>>~-MMMMM**oooooooooo0III;;;;IIIIIIIIIIIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
llllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIII;;;;;;;;;li+[)YaMMMMMMMMM&!i_{{{%MMMMM###oooo***********###*&~!+-MMM#########**oob;;;;IIIIIIIIIIIIIIIIlllllllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
llllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIII;;;;;;;;;li+[)YaMMMMMMMMMk(i_{{{W#MMMM###oooo***********###W*J0dbMMM#########**oof:;;;IIIIIIIIIIIIIIIIlllllllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
llllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIII;;;;;;;I!~]1xpMMMMMMMMMOx<_])]b8*********oo*******####MMMMMd\ah**#ooaaoo###&oMv;;;;;IIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
llllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIII;;;;;;;I!~]1tZMMMMMMMMMQv<_])]8#*********oo*******####MMMMMZ)juUUUCC0000mmmz^II;;;;;IIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
llllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIII;;;;;!<_?\nkMMMMMM&hc\-}CJJqh*******####MMMMMMMW*hdCJYCUXfxuvvvXXYYUUJC0>";;IIIIIIIIIIIIIIIIIIIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
lllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIII!>+-(fQ*MMMMMWLr\_>@W0Umk8MMMMM##WWMMB8Mhdm0ccvvYnQYvxxxxxvvnnrnvzU..;;IIIIIIIIIIIIIIIIllIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
lllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIII!>+-(fQ*MMMMMYj)]I>>?a#dX#MMMMM%%oobmLJXznzucccvYnQYvvvcccrrjjXuxncX>;;IIIIIIIIIIIIIIIIllIIIIIlllllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
lllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIII!<_?(fQ*##Mk0f{-+!!III^Y(qcUvvvzUYYXXuuunXuzvvvzUnCJx//x)nffrjxrrrrj;IIII!!!>>~~_____--~!;l!llllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
lllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIII!<_?(fQ*##kQf{+<i!!III!Yr)ubvvvnzvvvvuuuJfjnvvvzUUCztu]Q]vnnv/cjrrrj;II>>???11((11)))))({_>lllllllllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiii
lllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIIIIIIIIIIli~-]\jQ*#awU\1}-~!!___)nxxuCfffrvvvuXxuzxLvvvvnfnnQnrvcLJUnj/r[)nnvn/+{\xzYCQQLLQLXcn/(111}[_<>>llllllllllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiii
llllllllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIli+?[\jQ*Mdnxf(1}]?}|||jnnnu0vvvvvuucX/fxufzzzzXzYuLxxvYJrj//\t)}Y(ruu/JOOZZZQQCXurfff||))11111??~!;Illllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiii
llllllllllllllllllllllllllllllllllllllllllllllllllllllIIIIIIIIIIIIIIIIIIli+?[\jQ*0znxf(1}]{(fffjnnnu0vvvvvuuxvjxccYzznnuncJfttvYcjv//jr)}zjnuuvCXXcccccurj/|||||))11111}}}?+!;lllllllllllll!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!iiiiiiii

处理脚本如下:

python
import glob
import os
from functools import cmp_to_key
from os import listdir
from os.path import isfile, join
from time import sleep

from PIL import Image

from lib import to_string

image_frames_dir = 'res/image_frames'
txt_frames_dir = 'res/txt_frames'


def is_ready():
    return len(listdir(txt_frames_dir)) != 0


def prepare(width, height):
    for file_name in listdir(image_frames_dir):
        print("正在处理 " + file_name)

        image_path = join(image_frames_dir, file_name)
        txt_path = join(txt_frames_dir, file_name.split('.')[0] + '.txt')

        if not isfile(image_path):
            continue

        image = Image.open(image_path)
        image = image.resize((width, height), Image.NEAREST)  # NEAREST 低质量图

        txt = to_string(image, width, height)

        with open(txt_path, 'w') as txt_file:
            txt_file.write(txt)

命令行输出字符画

如果我们不断使用日志输出字符画,那么命令行的窗口会因为字符而不断地增加内容。

而我们平时使用一些 cli 工具时,会发现有一些特别的地方,比如进度之类的信息是会将上一次进度擦出后输出新内容。

这是怎么做到的呢?

其实时命令行里的控制字符实现的。

我们可以给命令行的输出中添加 \x1b[100A 这样的输出。

它是控制字符,类似于控制我们的光标位置,我们的坤坤字符画是 100 行,A 代表光标向上移动,所以每次输出时光标又会回到画面的左上角,这样就覆盖了原来的图像。

至于让画面动起来,我们只需要使用定时器,把我们的字符画依次绘制即可。

js
const fs = require('node:fs');
const { stdout, stdin} = require('node:process');

const fd = fs.createReadStream('./txt_frames/1.txt');
console.log(new Date().toString())
fd.pipe(stdout);

let i = 2;

const timer = setInterval(() => {

  const fd = fs.createReadStream(`./txt_frames/${i}.txt`);

  stdout.write('\x1b[100A');
  fd.pipe(stdout);

  i += 1;
  if (i > 1478) {
    clearInterval(timer);
    process.exit(0);
  }
}, 17);