pax_global_header00006660000000000000000000000064136134056630014521gustar00rootroot0000000000000052 comment=093d037012bee9356f81215cdade995d7c0844ff terminal-colors-3.0.1/000077500000000000000000000000001361340566300146345ustar00rootroot00000000000000terminal-colors-3.0.1/MANIFEST.in000066400000000000000000000000531361340566300163700ustar00rootroot00000000000000include README.md terminal-colors setup.py terminal-colors-3.0.1/Makefile000066400000000000000000000003471361340566300163000ustar00rootroot00000000000000# help me remember 'python setup' commands help: pypi - build sdist/bdist_egg and upload to pypi clean - remove pypi leftovers pypi: python3 setup.py sdist bdist_egg upload clean: rm -rf build dist terminal_colors.egg-info terminal-colors-3.0.1/README.md000066400000000000000000000044721361340566300161220ustar00rootroot00000000000000My goal in writing this script was to provide all the functionality of all the various perl/sh scripts found around the web in one place with some additional bells and whistles. It automatically detects 8, 16, 88, 256 color capabilities (via ncurses) and displays the appropriate color charts. It can display the colors as blocks or (2d) cubes optionally with color values overlaid in int or hex values. It can show the full rgb text string as well. It can also show the display with a vertical (default) or horizontal orientation or have additional padding. It also works as a utility for converting between 256 and 88 color values. Installation ------------ In Debian (and children) you can install this via... $ apt-get install colortest-python http://packages.debian.org/source/colortest-python Otherwise pip works... $ pip install terminal-colors Help output: ------------ Usage: terminal-colors [options] Options: -b, --block Display as block format (vs cube) [default]. -c, --cube-slice Display as cube slices (vs block). -f, --foreground Use color for foreground text. -l, --rgb Long format. RGB values as text. -n, --numbers Include color escape numbers on chart. -o, --basiccodes Display 16 color chart with SGR ANSI escape codes. -p, --padding Add extra padding (helps discern colors). -v, --vertical Display with vertical orientation [default]. -x, --hex Include hex color numbers on chart. -z, --horizontal Display with horizontal orientation. --version show program's version number and exit -h, --help show this help message and exit Conversion options: -r N, --256to88=N Convert (reduce) 256 color value N to an 88 color value. -e N, --88to256=N Convert (expand) 88 color value N to an 256 color value. Screenshots: ------------ ![default](https://github.com/eikenb/terminal-colors/raw/master/screenshots/default.png) ![numbered](https://github.com/eikenb/terminal-colors/raw/master/screenshots/numbers.png) ![long](https://github.com/eikenb/terminal-colors/raw/master/screenshots/long.png) ![padding](https://github.com/eikenb/terminal-colors/raw/master/screenshots/padding.png) terminal-colors-3.0.1/screenshots/000077500000000000000000000000001361340566300171745ustar00rootroot00000000000000terminal-colors-3.0.1/screenshots/default.png000066400000000000000000000217111361340566300213300ustar00rootroot00000000000000PNG  IHDR$@|sBITO IDATx^ݿ,Yp_tkBkk @DƊXTTi.=mc!sCI DDw̞>Egy=9y? @2uW @ ([ @.([?Of9tk @ƖZc9n @藭W3av'LKz~]z{=9OtC/__jXN^b>i @@kzڈ pGluz5;>~;y8a-CO9{mcki3^s3% CɳOw 0Q:C 8 7ɽ;NÖsJr+ _im?b̵s>|tG  @7*['=6lsE7jF%@+([3I^-v;W lM5˹? w=fvE^"@- D-?ނu3aH3 @  @V/}fx85>ŠmT~)6j|L=|0;W\=Ntv @F\hU%@^@ٺ' @P6U  @ ([7D @`Cֆ¶* p{eHlH୿CYÿ4?v5q/'? @oְ _-s$@tF6 @,(*[Wq=ܚ )pï{poA5f6ݪ}ƵݡݸmڞQ @^cV{C8{P>k?5WG1m @+xS >,Fs\zͦziT'_1$/yTۛ{"׈3?Z]SʹZb$$@N>c[  @%M}u)z@lw;b;jsIEn;}#n?scSv?0qaԧ&l\%^'@V*Vٺh⢻9 PR:_# @`iD_~v @`kӿFܚ}  @~?%_w1O_kz_|k]H;[s\K8#lr 0G@ٚZ @e  @9= @([g&@P蹖 pF@:0 @`5Gϵ @3  @s9z%@P9L#ls- @ua @ekk  @g3@ @([s\K8#lr 0G@ٚZ @>̉O9O7g??}̑??8sӇ>xG}t  @<leb" @U(L @yV^&&"@ ([´  'leb" @U(L @yV^&&"@ ([´  'leb" @U(L @yV^&&"@ ([´  'leb" @U(L @yV^&&"@ ([´  'leb" @U(L @yV^&&"@ h,:{ @*[ݡOx͏Ԝ| 8 @@-eV!@@CPji @ L@ 8 @@-eV!@@CPji @ L@ 8 @@-eV!@@CPji @ L@ 8 @@-eV!@@CPji @ L@ 8 @@-eV!@@Cxx\Z{t)$'@:>٪M @@e+0# @u:YڄPC1 PG@٪M @@e+0# @u:YڄPC1 PG@٪M @@e+0# @u:YڄPC1 PG@٪M @@e+0# @u:YڄPC1 PG@٪M @@e+0# @u:YڄxxEpI K!!3 @Odi @ P@ H @@eN6!@PDPdi @ P@ H @@eN6!@PDPdi @ P@ H @@eN6!@PDPdi @ P@ H @@eN6!@PDPdi @ P@ H @@eN6!@gz8FBBRHH #:YڄPC1 PG@٪M @@e+0# @u:YڄPC1 PG@٪M @@e+0# @u:YڄPC1 PG@٪M @@e+0# @u:YڄPC1 PG@٪M @@e+0# @u:YڄPC1 PG@٪M @@g.p,# @jdF @B`EPjh  @ T@ X @@ eF @B`EPjh  @ T@ X @@ eF @B`EPjh  @ T@ X @@ eF @B`EPjh  @ T@ X @@ eF @B`EPjh  @ Ta?׷~;yϟvPis^~=A$@ dkQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.lm` @`QekQ^7'@.O'K<ܵ#f6zE'[waP @`+V' pe.JlE@J$@"l݅C  @([[Iڞ @]{( ek+Iۓuv%@"lm%i{ @wP @V$mO @.]=؊IE@ٺ  @[P=  @([waP @`+V' pe.JlEn[t/G"@]a?O_/7yQ{X @B^zM<ݿ=s1uIDATدժkW1 @W]+p'[𲓯̹ HQ>W_q/[M5;Oպ& @@@״\:í^:QNZ kKH(/p\N~b5l  puWD LHV)pu voz'=%sz'K]t{ @tgN~WNO#% @9*d\}qE=㭜I <{jkGGfq_niGW_q^$@N׈ @5eV @`u'~g;t_^nHX⿳ C @5BnK}@XP@Z׭  @ʖ @`AekA\&@([ @qݚ ly @Puk @=@XP@Z׭  @ʖ @`AekA\&@([ @qݚ ly @Puk @=@XP@Z׭  @ʖ @`AekA\&@?폐 gIENDB`terminal-colors-3.0.1/screenshots/long.png000066400000000000000000002434571361340566300206600ustar00rootroot00000000000000PNG  IHDR$(t sBITO IDATx^콽\-H]|>G@8  3 2rh!)Cq߀m@ε7lEWvTDڑ?A4vŊ\Iꬓtz_d 2@ 0Iˬd 2@  Pl d 2@VdAlLs/y 2@ @Tl%i_oMu d b;hd169tYw {mS_c#e, d ̀[ ?UHZV]^uGu=d 2@2"i쩟 d d '[/ 2@ sl Vͷ5;UM|>&!Vb\]bCX zLzB<@ d x6[Y0 " 7dg&$ܫm2hj FqH-:Q2@ dFbX;hO y}Xwպޑ%0 2@1pb+s/jH^mVJ:2@ !ezC69qI0RBM d%3p]?A ^nI@ dW?\ݖa2@ d8غ큝q -d 2@nQwc?bPοm!u(=+QHl-z҇ 2@U3ty2@ d #{#d 2@@[Mtљ 2@ m PlEo2@ d 41@D d 2V_&d 2@@[Mtљ 2@ m <ϖ&*oIƶۛt>TA,d; 23^#rJݶnOZ\sL@KM%hɫl5 *NRi䜒ē6%-H2RqXtݏ4O2?W6FLj/V2d`^э 2@Ȁ0l]44 d [bb([Yg{Ƀi!yfm ǗDLX̢+]71camYd$iK2@ Lj\! d 2#[;d 2@3@u{2@ ;2@#,M d >[\! d 2#[;d 2@3@u{2@ ;2@#,M d >[\! d 2#[;d 2@3@u{2@ ;2@#,M d >[\! d 2#[;d 2@3@u{2@ ;2@#,M d >[\! d 2#[;d 2@3@u{2@ ;2@#,M d >qK|xx拝NƇۅ+܅7 _p>.v/W nn~lYɰ72@ dغ- d #30yF{Y|:ׯ%P?gΙ=vCPt9Hxp\DSZU.Qn1-CD */<|{8]Œ%G(WYlɢesnhtJ#f-p H}>E텕hJ%*i)#uqa⹨̴**J+SїHT/ IKyu-i!ÞvaIaݦ5O#uGœFűZ=’2ӂ ' u#ieW->E텕Qc$m-]BZW W8ـcQ{aeO;*ި-Xn 6Fr @c3 20aCy|FBC`?`jI cmWgTZU/EiLF]$j%c;Ҡ0RݏsWͷzL ,fh<1T|U $榔IQI0sę1!Oi#pHF R~/ZQ (׫*JkQ=|yd3ًݻ70ui%/ZJ s`Er5J_#`Qx[j)hb>zj taWl}"q -N`WIH_9S~@s>",󰯧HS~?]pwuEYX+u0q.?; hlŞ;T11I?.\^fݝ؅ʃ^z[ RFk9=(n$'LNXiQ@ϙkim:`PfjE;KWPDuNyA d X "pW[i#U b'h1aќQsۈSNJ}.*2"kzHWY$.&vXKi%ɒ~OiΈi0Ym-C^l2R>rJ~JFx٩utCK /bjWd돉Z }ӰO /b4Ph_KO[:AG؍V(þ<"6{brki $]AhJp"vi* 03FG׮KεF*5^Vg@4I Mߵҥ0cΌс[ŋ\K{XKaTlƬm)43VU^8 ګZ_bh׭:ů[dn|LX'ato2uҭ(Cf`V:fAZ3*>ƑʐQgsc#MIQ B>m?8O !.{[/3 6b zQ8b6ˌ릳+sXOp]bw!]+,כ*ӹ9'a-2d1z~׊kf^mx ?A? {܅K1誧 5w& 83F%(62nn]]^x u4[6/"+Ars;&t5Rb&1%k\nr0 d 2z 52@ 1@,L d ]߃w{]I]X׶܅6.k[VB_xs,<ٲ3 d 2@&2@5L"d 2@Ȁe`tdev87|⩟E'ɞ ߹)m(>ɢ^`t19p]POtAH\DSZ_Ԅ$Xdyx{ _/wM^yD]8{YP <96Y>\oϻ` I{RM_^qgK+{FP[9mx_S4PD}Fw_@/:~dѿg5L!EPn4û,N?=Bz926ˏ_^},YEʞ4$&$m5c}`e**iH+oQ{ae6MmEēooa=KpR^]e FrZIEeTQZn| q^pRZ'E{څ%euDFOa$x2i aТʬUC$O-iu礴GEjϯ-83b &VZ\, 5ՁTFNGm +-q.E3#lL2E+Ĺ jX3TFNGm-\ʜ$VWXis.+V±cˌLBjɣ>U-؟q6rJ>T-ԒVWXis1%ꪖT4-v3n-zF,k TWJX< +kjH|?*-&3vQBSNJ cYSD2?p}}N1jE~X` wrt3t`cb>i[t琮[ӹWGCI۶Hlm KjRZMG]1"d ⋇EP#2d)ܰ39mD]zn˼i͌3;EW-1]nڭ$n.7Wi. *]b\Wngxj`nfwOww1b7u $d 2@2[у 2@  PluS@2@ d ,30rr;)]amv wa6= =͎.f'wƓ-?2@ d`"[d*2@ d X&ޞN_m:[m,_)9[t#2y^TEO_sr~ɡBϯɨŔ,WRs.JVoOm~X)C"4g`un$`7R$45q2Xvl&݌Pi%"f} c$W52 J7/(p$g+YJ\rLc1Zq6&-(?:Պ6@+}2qG#֢+W)?{t +J'TPa_tʙq E ;sCёxgҷ/wP,P_[ ǹS5U G'} ʏr|@n EĖ*poA^nU=-PQf BzU$i@5Zm}CHELG \ҲL/)*FGUMovNXE -.v៻\5/^v JX`җ9ՒU9ŐYC[jyOoŎ۵Z wP̀ @k`*szb5jJkŚX`-[2Dy)-BR2szK9rԺDLxYUzhgWdlyur0Z[,WRZI<ed V9=a$6v>*2zHWB_bJڥ$V1F`ѥ<|8~EK"O-:I\t|Ri {K@{R>[ӿ__o٢eϵQӤ_i;-wp )v894XŻ}?wA=??uH\DSZ_˄$E4&ۢ.||y_sME}K &r~o^ד~S_3.#0uig9ly/?J9"8y.gɒ,WSȠIFb}_: ACao^}, Eʞ4$&$)G7bs2Gl%-U`(R^XMAƚo1搄Oj&ڵL & rD">IiN1j K 6-<*ʯ*Fbk9=)SWقQv*j/ZE/ikHOR *j/̀`2ný@?%ePo{̋DZXբv$݄.J&"eZat6zfM EVl\Qo$SdKG[Z Gb}6Zg}yJQsƈfX*l32্8OBӠ0g?:IĹs.@õVk)w:f_zkX{TU[ol= PPib->\hDq'h|cqQ?m\(,03LvKm'n5tq ؒRM 5JG92<-1#*S ^BlQnSY`goEy4[6"uX0GlU(ުUtJd΍ĭ^?Vy|_$qXE*)X荵}>ZT:%bjmf>8Z"WT"s7ΦK%N'[%x^UMo7 -Vp+*)YDE]rԇ6/x!`U;٥Ǧ㱅e]^h|=tI\z1;3*|}i潢hb; >RCȩ_HY,R[E.wwj?w8[ˬ_HԃU+"khmSSKc-Ѽ芽1X{$|$5o]Po/ c~t>U^]zت)}a04Í%Jk(p04.Cjf_],hj{z=djI|[F.bAЭ  jXi\,h0b[,jf\ΈYxZΈ'0Z[,^է+-9|GPFa#Fb#m#zH"#J]Cӵ/qS+hO~Jb#hӑ #ޜZJKszHgRulXLJ#;[+\1롓7%J+xgO0ڲ񝮴waVmw;Nʣ5xg ѣ-6O/h~ s9kX_72 .(ezҭ2kӲm*Wѷ"Jk1I13s%)IJFTne~uay+\ V]Ŕ S'#ƕ:~Jk#J d00mϥ0=8U,G6L:n)֟K7ӃAU46`ex E1GPܕόgj9z=#(ngP!FsF!^s q|xޞF!^q~|xgs)=7h.;(CF.=7O_H17sw;74\~h9w1.77X-vޠ%͵;KP/irsoo8.7;V d 2@U2@uƦ d kabZv}2@ W {_{eMw$ ܅#0pwpl<ٲ3 d 2@&2@5L"d 2@Ȁe`}:dKr3n^⯟EʞkhjIMi@=.wy $!'Qy.e~z"ቊ"2n6rrF;]PO܅ sp@}EÇ]r 9?~rbJ+{FPTUaInJtn;;fCm7? Y$=#]DK@÷?Nn'g? YBEʞ4$&$Vo\-" +)hn7׃ю'9eēxJkH:Fh FS<2=$<hbR'!ZIȢ2úM p NUsKJU`s2+J"Њ/GPP4yu5MZx*j/̊X6 T-]2. [:Vf^0$Юo4Fګ[2@1ϴx3foqþվY×adX˄`4h>řMcy ?;s#5{Ž#NR_r#*ߋJfs\4g]"{ Z䔟9J 7*0n>'Fyt֖?m\.;=/(6s,ڨ6.WRbܙ[&GvK&FJ'\dY`6gox[jEs!d=UO@K!jڞhOxZ >!R>2?#^joXi,27 %7MR}/@ ,٪r8-soݔNanemT~~m,ߛ+gW?+ KZʫlbx2 DG}BS9߽dc (0Фfi ֱYaw7n-vdȫHE̶_6Tۯ*rj#ESv쟥We`t &:c()?@y3G]'\ֶt4ˁfⱺ=!FeQi-:t>,-pQݞo?nsC[pT\~W((M7p.`-}GYQrI_#D׊zn0ic34ˁPYՁ^QYJzWJJ*%yMQa,XfV!j=#-t1R)">0,&Z&yՕWZF9%}ᵗؼI^STmecܠuu(ݛSϼkZΣٓ 'R,F#p@p,ߎ*H[N|xVaxn~}di(Qo#S+bexj;S]p:Y+|q+>vܠg\b妠ǎSI2]n4>v ]m\՜yqqrz7%Ic bi2@ d ־: d 2p Plsyd 2@ ̹ Tw^-3wa5jsZ͕ d]d2d 2@D2 2@ 9cĻ;իP8h6Y>}G ɒ>TYCS&t9h+½څK{K>}y.|*bΞ:b}V罸@sNZ肄>y|>/$9݇߅>;cwQ w}؈."`]]P)0A><;_qΪ_[ OIi[s(J+H4AQ[02t[f)I1z`ZxQ]h+=)-IR-IFń꾄i嗷'#њb׮[k,,rہxɵW4[.0i) 8TO&kb:^wpa>d VZ,[5δVnb[늙cd C,rwb/0WfEG.sunicqR:fr;Jߑ>X0%|Bź>vmKlQneY b9P"sÜsE :tNfs9P%TSҬs(Hzņs<ٟzUCrو8f@`Кԕ5s< nI~Ạ6.Q9Poŝ8zW<+-#>T*Sꂅ sG\e'y.ȧ掼S!h.ianGZxѣuXb|Qwޑ! ‚IN;R}C+-RFG<Ѥ ﮋMH+{܅UzY|QH-?(TZyqdmjQWr8N;YxiqL,|b}'Mߎ/by?*q:&=vJ>jkj.{իTa},&/2(s4(\|P;E[5]ܫnm؊,|tiէrZ?wC]/xөM΀zR} vbk dZgvN5;xΔA&}z?SV8+5W)S)I4{{65lnbnpo'^]ϲW)+{EUw.~$sӕB&vx :W9V vsK;d٫nZ/Lwk d 0sl0ɝ~e>M!S|cG0+VÚ4R_2 ZZҋ0wAs#7 }b}'-J/#=9d}lo#C1yvPxnۈuxȒAleR7t N'tڧ7.7q)㔮FLfǎM뵚3~qk.7n8>vܠg\b\nr&J d !(c0 d 2@0[d 2@b`z. v¸ [1p;[a܅Fu lYF 2@ ؚH&S2@ d20gx&~ŒZ*?}dI}HvPԨ 7h+|rw[ʠ5Oާ&FP,飏ʞ:Uw/ƻ D,wo.|0_?ϻx_څ.=s* Icˌ>F{E/?~ǯ⠟%}YCٳ$N ]E¥ý|&˗7u$ȧL=xB8)ƻ%-w.6'_$!9crˏ}dg eY)ƻ/Z戭T&.l>2DeMn[D%9UP (.(XRNc1 , @IK;1 BZRi}XLf-FbkMF?iu=:Qo#H4CXo4UQ~ZOZ~gN[= rVQ Lf-|BcOޒ,&Zr͗@}wl=FxYދL<(V[F[kџ 20 fxy6[TZZ%fm:*Gbk9ž1Za[Z9mȁYHl-gJ+9lkbU;O#.v| oAʖ(@>!F45S5V8-C ؅*q&;<=@yA~nh$W1sàF\%2c8?Ir<^ -Ƃjj86ya$#JwxJ@y!(jwY(SEj UL ^EU[$yՕWZZFNG%mĶ.dr[!#-Vp:q.oG LH/\K$}ՕIiEapJ?}ThR]#B*$JK]8_څ>q4>sĖUPi$ 'UW!ET$N;{[<>EORUU>|0 \.ޏhJ[0* bE?*q&9U!xl#,5] =}'׏?JCFbqX4FV]>H]yEj_6 *Y'6؅K SR9b{bzpj^Byuo/PR[Z6ڦzSs*[fyz-j!P޲F^NyuK:oY[I$^4QTxHҒ$}tEZ-SBwp8:FbqXKag.*%k|nU<}g}c%==FdZFʍĶ˪2%Գdhu#ents!lrN>Qtgkžw^!띮RE!zequ/aK&ǯ CeV_덚XKXw/ { ̺5SMT6:D?ޞ>v"J+]35ޤ>ve,󻸢Lx+ޞqغ=^"2@nҺյs]d 1b:_Yo#-<M7 G}>iJQ|1Eqq{.6ҋ0 P@dXD?z`}!}j[{a o#-~bmšx]-no#69'{krؔ6tgq5NhqqrN;Nj$/i&\0n+>vܠg\b_rSc)]$#X2@ d ,0@@a2@ d 0@5c d 2 EւZBYrV!1w\ Qې`ɖe d 20d2 d 2@,sƈwlWO>?_%}FM Ĩ[=ƻ罸x ӿ?~ڈK{? 9&gl=OrX]E¥ý|&˗7? qޔv|3=Bzg;b9]lOj .! ńA~ys OO5=x][D爭:KbCd6MPo;ImQHi)̅¥DHldZ&F#>IQdTi #Ѥ7\v[_GPJ@{HU-6F?i=:QoZJ* 2\v8[_]3)-#e=x2Z$#Ϧ-83#֘>{DiM?Ӻ>V+3= d #J=QiDl<-8'9gl1FV+nsLu"f閝l1xjWQ*uF?yu-.N;#+-R!#z䣏Ѽ4Sg!d'R {6OuC0곭m1j>3'1PUXm3_[?ҿ?*q&hdNFbU:vHrs`cznzǎKLtqJW#I&Lj#3 2@  Pl-D 2@ # PlX2@ d ,00By.4+wa5jsZ͕ ,lYF 2@ ؚH&S2@ d20gxM/ڨ} cO-9YG';k({jԄ@`W-b{ދ-PPJeHϧOysOʞ:Uw4MzbW-b{v.((D#k>_>y_dI}TvPԨ *fŻc݇~!Q\ˠ_~~. *;k({Q54vID /o޼ 9''L=xB㱾}܅_pPC_~|. 5=Opd+h#R9Ie$h^ZG%UPp%"bEGbq&sQ 54)ځʙD7\PGbk9nSQ~'p4"bj-k*NRZ^]e F;CxI\vlZ]O@PQ4EUѨ.:dpMs(xWC#lijiepM3(=_4>^աLpz ~(XSË٦-sG܎O=ͺ+^c|Q5q'iuзy ߚ-+^c|QR;'kknv.̻_Ii⅋=FNG*F 0"}:TV@Zxu㮝Kr40n '4mD(j-+^c|Q oOV7eIi⅋a))$76#x2T^{o,*/@@8ýj'X5_+h'U^Rrz{[ub?2dQMxN_k$g!8,~`eP1p3~]x6 ]+TPUFrx,yI8EIv^li%[Z [ZZп?֜k{-kG-nWQbZ:41'Ҕ} \ؒM@8F#1!RLWZ2CgE~,W*^ncI4Rn$ s9+ IDAT֬ng="JkL d20g^$_Lo#íOmE^$_O2ؼ /<+.7߅Г07?e?Ɔ (k(o#b4g>j/Нk5Oo6"Fwa?(9ex E1O_#I_ө/rcW4]nn"/6(jrsn%=ӿN;Nj$t9L0v1Xw=rsVsc z%ƿcD0Q2@ d 1@5D d 2%d 2@s.PFNc0ʁD܅rQ90@޴P'[~&d 2@D(&Td 2@ #=|_?$F&˧,O5=5jM Fsb ꛏXi $PCbHϧOysOʞ:Uw,G}[ _/wAA)%I^w-~NGeg eOpIx\X}( ,Qs8zN QYCٳ$Xnb# !ɧh/& _]P)Iv`YD9wBrr~zI{.B_~]P)0A><;k({ /Z戭T&KbIW1pXV&hz`4n4FTMBy[.F݅KёاdK+:$UPbqcQF b2OKcogi%F~DGTD=ܗȁپ&>3-ic8iX_5;,74ˁfǣ83F}--crJWρ8v]l{U1^l.CEqf"9;WGyw,0ʃ9)t.85rf:3RU"4{>E*)Imm;fM4%XF?쫩Fȉ+4(o#(p|5}oהSm]Wg#nhnZKuL 7%eνF/ͩW'rU\{^By˵*Tlc>d|NѾ\iL 0~vuKi۟{d˱rI~qcIq i#`l!f]Lt&SB=++[;AeP~ʏT.z2K?.s=h/iaߕ.*ږAa)wUڛAa)wVֵ/*Aa)wW&爭)_R:%&HxM'npo7ĂLJvEn>fYT`7gjynz0Gl \["d ;[E~XmDs%OQzh5F_IXvU_joݝ(%Fb}#Xk~XmDs2&ϫ;[|1ZCâqO|12ؑNYmD+~8NWx N{y@rhJҴ+ٵ(yԳD%Tgd45:3^lF~xZv%}Gս_ǓY?)Y왌7k-9Hn҂%_Ӯ:+b7~E?)Y왌7`B+ܤ]Eo_Ӯ:P, |O~S_3 $n!f8 Ŵ}?[IKyu- X^ZcCx]+äk _"EEؤfz&)0ɼ>?XÞvRzkyfrM+0cK" )F3D=Xr (.*Lv*HVƨItEk4#x@]z6oz``26i+$n(F_AX[X{Q RZMI(S1+co))uFK&Fbc<(μ :qxKŢsƈԭF?m\ +?[L"8x+g^ 6w[TZ\~WG-<1ڴQ2Ў3_m? &791s+q&(? V:mJR9n&#nAq6&(?t||YX`] 8!][CmXD/vޘG7lHl.kP:" ZE)Z:TD8Z$ &\ #bEq)*0* +3{40iE"-FGd8,I-`YWWbEq)*4el:aB|>U$yjmjxG$Hi7QWu%0ƒ 1"4)!PiJC;֬s3".vޢik&R}ȽC08)NS؅{vk#99$/B)nXnRv^ti1ZL8X; ;)v M/U@,R~z cmHbp~oz1[MI,F#'ڂQ,WBނkaPU M:iw k=xW3fYp-FGb5b%'ZW{QBEWj[@q`nN>Z,] Ao) (H9b XMr'%R b'=Rh$dhΥ^I<Ƭ Ήk)Mb2=UQ)xcF vdIt!b:B2ؚn7|Z`o-VU9 #ۉcW^+¨BjC@=-"FzCŊa;[j>ycs}z܅l .ۇzgkd9UG=W?[_#bg z'YVdZF}Z|Kn'ۯ\߾QZy8ͽ7|$Ukdd \)uKcd30g7hiǷ=/MPIEKW蓬;9OAOӳ9J'nQs;qVaN!S;6S%ow_BMQ:P, ]PP=@r` 2Uנ9b+i)Ee O8xIO2KZ5u^/K6[,FQe+e1\ҲH-Fb*"ɗ.(RW`bU-Oab,FKD`MnZ=¥3(|C -2|-iƙcB)NHlK%hk G[Fw[çk6rtuLGbW"rT+=[wE2gЪ çZZΠ0,[i~Ԛ3FҊ6.{WUl+ 0̱i Όc1z -IhS1C(ikg#J݂ jJGnU,5\r0rJ>*i5f[LBUkv+ rg8Z$y1Օs"j8wu@4-tZEXO^)q6rJ>#CIiHj914`yJw74WGV%"t=JRt_`S;xݚxgbp~o8{O(Z&{T?}(RL_;Cg0֐7x:OE]E˒{uJMT狃ŢDG#*3Uc"E]E[P#P[ M\cg^M:kԊ[ٮsDiF/qV{zK-v_;R4%"HkaJ񖎴WTm%lfU戭vC,DInS;P-f.YѠp].JKuSV!:B2#klSDiE|z=UQzڸұsګ횳L̮CNu<]pUkvsj5K{ɴN:TG(-po#.i~W\vĈSa4f|d`~] ofx!Ӈ2L?w2l73}D.?q*H61 S~?BePؗQd`~] #n@b^rIqV0ݶY>-k8Zk6w꧷6ܲ͝ H8XN !A h,OSm>kME}Ҷq3;-k5r/d\& d 2%^;[ _|hFK>y=7L\LAl2}Я}X߉݅?q(GPzn͹TT#ާfI˃MԪaX[igާfIjװ0:uXhaNSSqct`5vrsJW8͌.oL͌w/|3nfƎϻP1;73v|ޅy1b32@ dغM d 2@uܽagd 2@ 00NDk땽_/j Qې@j܅ըmH]h k5W'[~&d 2@D(&Td 2@ L#}xs=}1jj?_)9[t왌qt*ny{w h2?yԳ%TgG/!qө|K:<9H S-Z޾}e8y&7>- ?믿~'{&cr%$p]yoVڅp铢tb_+b_8z؄$3 $n!R]WoRɆѼ[o>yԳ&T'ɞ]BOlSҦwXJ~ ɮF?~.g OΓ=@r`SnsVR^]e F;VE@!45VtKB'cQj!t¤Έᘁ2m[+JGū+jnwHt¤DSŵW}}dY[%\"ꪖ 忩72yj#<2)uǗ3?EI(Rb-f'U/sn-g=r:U>)J+s^W:2ګxU4 E".vޢ 9 * 2H]lUݦb]5$l:[!9؅{&"U^uS'sVIUXiyR-^ y k{ ۇ&dή IDAT[VlQWrTաPR=eZθR{KJK(od>j-۳{-kW55EU׏P޲Fu_[֨r[)ꇋ=nYp1M~݅̊p?>-2铟O丯Z,ͬQ7">i$G)$y:Bv~2EiU!k!حj5σe|#f8c#uqqE4#?ŹCt,6qX40}D(VU9x/]5Ҹ8KeLF(zg+uI wgkn h;[ې6ʁaq9wVdPH}ZV|qi76wore, +ֺU#PZ% AOXElm=lL6k(m:a2@^J%ũb8BA@_ǎD>2⋇EH}b}'ƒOA ӳ9zǎ޲vQ;p J U"oXSX-=<Ƀyy;ozǎ| O)6;sjU*F#>{Mp:ƎuNSIno8]nb7v.7qNAoo8.7W#N-&!d 2@ 0@u%2@ eb{ d ǭ#I>YȞ -AK vp 4d;v@CN/ 5; d8QUu '~8Ⱥ:.onQ4j*bG"v!va 졇tq@0 @0 d @2#U0 @0 acěo2]oY;"ۿ~9Yd$#. W^̜1]ucf[o 3WJH2*d*A'oʓbii%|1%g3 >~9Yd`B.#9kI=y9md3d\4~ +3$$aXZX3]f"# ˧ۏ_O _(>߅iS*tB0bګy! dJԤ]/|w '$y)Tҕ ^,lfc%k'w՞%L{b;.gg%njjd)&)!pQf۳1ScFbgpzoQ5RKτëSInNI,f=ͰJgH{zb{zp:S;ۅ{j%4$Ai=BXg,vA(='svx%rQ͖trnWKZcܰmD,)YzbK9=dv07[i.g'̓dT.I@ LojC6KfFآe"-*Ylb̀Ov]lبkHi}u,H:S)G2+u%JHi.fP*QE dDJIؼQw1J3Z*y`_w;ۅ{I8WA,Fc$JJﱣA^; /)YhJ̨mNZI2h)5Hbl֌QʠŨ(ËpeOz[]Īɒx. ZV<E~ WZ$w r R7R=Չ5ȩζ_?&JsrH B][Ŷ$zH*9kɆqmnţ=9CdC߅EJ_5ȩwFabkq ÕUzg4sE6zg ר֨ 3|DN5&wgr[YiQSl]FD^"Գ׵mlNFU'~' l0uk?DWZ!d`Rʣ::WnX` v@B.acDy.bImD,dz1$~^,20!H`i 瑀9Uib{rs! E קw?vA] C+c0 PEU!l)4xD<=}(FEקw>~?x@ IFb\ٻv[P]%ŞFYKC?ٱ704@)/6sH!ʢ䑡J REgeەxRl2zCWV{Iѣ_=L"d!-5kmvIIEɣc3AFݬlJxë4׺y6gzJʬiibu=3PH6x&\i.C=ʀ%~(+^gÓ` _~gg8(Kd̦.2'^ V>;F_JdlJMk{13Z=DXd`O'6a(Kdx7dުNlIxBK*\JҳجDCFy= )]B&-Sw*F5Y(+T'X4ڊzJ`T`ʂКެDCɎ+T Q0gh)Z,Ѩl,z֫4S)DPj{DSL'L"Ȋ*J1`,DkbV obH!Q3o_Q`j?'wTHNS!9adU 9d_J eO= adbe*WZkҚ#QZUQcvUJ({Tգ"*yJ&/lZ*j^\(X/?+Pj$']MMj!⺲XۛmlN!u(ӳurbW(4ʅٟk{;LUYF2b8Z=HČU7UMa?i-[CRW}l uujAWѳ:,{msb]97|uuՙbpw[u2p91#wR\ WnK/E -l\a )ׯ=UfgcK_n#( @0 0bRv* ` d En[4 @0 @-RgGuoffdϱ [k.hFY-H|` `` !` `  T�L.sKr1,Dw ώW򇔊>&#l ̆ kt_]x L6T~??xHAq 3B56f-7v|B0U6 -|^ )}LE@ Ou=߿x삊U0( fs{ϟO $R16Ydlfuֽ|p؅sE ~niij3eOpJdW('L?wN0ۋUw 6 T2JTy^&IM3W-ub++(*0e%VhhUKVjKNJ+Ddc77J&J+EBP)V< d%E2PfD J3 ZJVKV[V*y)vJxC}RRE)ydg?+.*0"_ k͛V*;X*ƈ<3O=*o-zokt*$'lo~ Uޚ|T=N]4&Y;Wj ]m3*-O ZQZI{өIKuc谆3%HٜtQj`TŃEu1vK[SԡI.dZ;S ?T$Ui7v.c(J&fTGoO iX( "S!X&J.`]<|9r)= CRd\t-! *ֆ^O s{.$/lRéME<o.c%L0;-ן>=xv3qJRJ 1r!3Snaa,ܾiij3a䅍S*M!VPչ׉-R.T`ʂf%mURn[\L Lj2ghY,= 嚬Vl,EeVlqJ3(0Pe<@VQY~ޤ2,DR?̙ShFʵڄX4*KR\N) -WҊ„bzImh+`\r ^ Q\V~a'KY05z0RHo]) ;;z+6V,, [g PkծȘ*{ ٟ2^KkU-' jzX]ձVmoUmKǫ>]aU3Xk,-ucR!:?[Pj.Hw 3dʣx%خ=^k89éЕw A)sC$S5؆3#<,pn''6[že{)"NNMJ;\b%jn/"NxxgS `/yqWHqrs/j=.[Kޔ3\dg;XxɱV1U c[3+G,c x 1y0c*^6e x  PRr͏[Y!_g`8ʙC%/l&RIQ /Jǔ>&#ٺv.c(J&fTGo]ψ4,2W0K{rLKviTۋO?~f|g $2>Eճu=]PFϘٓr{{i3" %aoJek; dĶ04b`.$/pJR*Y(bl؅.`0 bprwͧg>ϯmI.nw[: ;u3 K$K5KJ$863RI#j{uыv.0)[) [/~(?T!yX TM" ar% *Dx2=HE>;S ?T$ cUu$&-]l X:k 9 .) RX$&{pwY3`r{}iij3aR* W0) Snd6̐1޾ 0S*d])C2YԮ7[sɵCU.;=dIBi3c=7j~՞X2vbgW0&+}Ŋ@FM 13Yƈ;uF IDATU 'g?x%UK`pR)C&-!YF[!SXcV6VFo.)dRUJ !dx+ =fc "euIZllB<”B&Y"ZmQ;ktU73EgR*&l{NfHC?>CQtK5;X*ƈ<3TTcG6s,,k bL+8]J])K!m>+VvzrQ82\XԆ'vlScTr/+:(zP?I ?ceFcOF?ed涳%C]w@۔9v1beD>Cb%T;4*uDRTOOh`WnEg+Bۥfz%dbםUIi .j JaݬkXuJN5! d(Lb`' N[߅™V-f;QHo+΢g(0bR*rX@NSÆK*{ C!?](FLexr!X4kyyE,a 0i_Ns6\R`&۰3'o*!c,Z=.vA(J Xiϧ]pFLJrKlfݝB]%FMhis6JRKH fNȬ$]x:߅&k[t]]@FLJ%]ބIRNlI9, )#`C?nUgK8Mk0(ieqv2gK?*oTo-$YQ$ZK(#6e1bUx5*$~Hghq60P>*RɨRiKճP)(ia@IH*%c=IRVɮTjRl6:F%"I3J+^*~KѐS[Y;~HCN7ND! _e%܉B,҆wjxHŐW dN :K]=Գ^,+츊d کWKP3(?uXBPrƦatk;kٜ2C=[92J !3'8뉵 IGم _U'tj}PxfP`ĤT*Y('dl2.P*$폏7ww]x<P`ʓ੎O_vA<#, ]UdZbQ;!݇.<9dllEO_vAjķ ?THE--G'~/o#]N[ŷ | 9xΆ+0bR*t,]k>>v|Bp $[\_~z T`ĤTll`>>}.c(JffȖ[4^ 9I^:{Ĩl:4h0^VvaP٪ 4pNvaJ]m%$[mcͱYՕSHg=+#6e1bb gRT) X⬲Lɣ$ HbdslV6QNT`ʢU)OB:J$I KҰԆL LZlo v%>Öl/ؒbX%Jɀ WgW dϴ@o'_- QQUmaS!ϢnOnj3g󐞃y՛3Sɝ's]=ζK SR5̓ܝ]8 .vMKi [=I-01\?`k)[:Ѥ3'(5Fg˂Sj~?ݢB- $N2jXU'BKsK ʝN*:Zab:l3ICzb4RRsËh/<*qRegM#MSC$&\Y{e{iD\!$E&ګتX4R4QeCO=UoW`ii8gjyLRRګmUklΨB1jګmD{ xA]Ne{{^\,7< N/n-07BJþ];Qwo0'?ϻ{av!|~.w6[WJ✰":ըq峨6Hݎ/UtJa€5$g$e@ ̀ kqbS7|>]@0 88,'*l'~ۛCpGI6q!Ch+}]m l!VG*1斋; EFmt)9#[-x<'t R3˶׳JUJd/qy<'t gE !lؼc-/ ߜA5!mb=$UQYQ6õvX!]9SC߅o2[JΥ^؝ (<8bKK@֛y^ 5p>-eo IDATum~?xֻiN]/źK^m/֕݇W׮k{}|VQXd@ZFf{}:}ͼNbKxw/@b%^ll2f^̫k׵"U^9%2R®RJ Em/f݇<bݻgE./%`7%zmo*]B,5Dz(-IKJ]wW 2LXf ƢV&BZ UxK FU^4*XkQb'yZ"y\/1X4J -*Yzv!^C=krRZq PXe)AR U^ʉRvC=(Vob^lR1FlĹU+ p0 ^YrllKg`[uU_!Z p0 얁,rݮ<=ÒmpDmdTߊ1.┼>|–핋%y^UKiobqYB&;_~WH.tw*뵫ۙels^W3D&- N^E.'yJ 钋JwzdP0UxҲx|I^RCuaUgp.E6H!*U`u+yq_~W/w\z0lS^ͳC`5'yJ 钋ԅy^ɞl/ dj$eQd$RJ`uvf&69y3fZKH])-CR ݆15S[{*1\1ʡTd/m-e{q!$S݆ۧ%VOͱw3S`OSyŞ 84bwJ8mbod;풬Wם•A RWP` H!.z yFiPAB! SBJE#Enz0Ɍ>Oq#xi'>͗OUlUgQ@QՖVH꨹JJSce[mLw#ꝭ6 pˇ}o%_Kjꝭd:5V# ,ꇑaZrOy2E1#j%7,g`[@K;Jkil|cVdn$Ȳc]RaRe֡BK؍Z Zˆq,jƮlF?|?ǭuf.1Y5u&r+;ZKͺ)J`vO[iuH%k)ka#k)7"Y1H@} g~vkwѡrYuۈ{mbw+vT{ʾt }ouDoKSŬF5TGV۝' a7aXj9ԍsC;8`%oTǎ5Y L%79Xט8mTrwӆM%7)Yyט8mظܜִi  t@lu#  ꌈ @ ߍD!ӁΈUaXVa ?T]v' , ZP@ LjK!pOx9CIhp%Cnf _]0xC;w~UPIJK Yo4ĕd*|1ƞ$(6˧zNC 4mhщq\/-^:Tx'˧zNrCXb +@7݆]:nRr.WMemrw*$=%_XCtH@!:Ca\ɛV[:3 Zʪh:҂z1$QfvD!JnUTR*ZHk㵥VIR3I{l՜Vwid^/DE1ftS"lnZ!fU2?1b %b +#`וMڵj&obFiC`ٳU*9vjI_Xnٳc[։au 8F30J@nVUɹ^tCr2{M[~pڳj#l.tVGKqwR{cr;JߑJKӽF`Y .\'WK)]_rx𒳹蒇ٟ@L7)k%dwQTr6]muz.\?"|>xx*QZ!_ԕKi=m[vCh>P"$'-tue/`o֗KQNbȸ~nzBVW )eyMQNb)?7;әAƨZ$j?ULOZ]%J+*_Vf(@a=r%`oǗc$Vs,])]6Z ĈJGVH3[] ewŲ6lV/boǗ`o.- Xvv+!Y:Ecb"v|Iϭbku!%EUF׊k`呵8\GT3yJ;5[zqSY_E爭X>}׾4j͕U.Fii>Y<\2=UZ{HTR$HNF{Hvgw@}{K3urZvCr:ۈ?r`~O=;T4Eu!؅n^|㌦RZ?_ 'ZNaj[[~ޭn1$5}{؅n^t毉ؚnv"#ՁUm ҤN[)ޭJ7mA**Z*܎߳a֞ VTZ+:%sVZK!BRRw3_KA%QoG G_ =yG sItXW"mD;HXΓ~0zAs}0kvQ|D_qkOΓ~+anqd]p<}o 3C 2ɂ@ l/|Ig졲N/ dw}UPIp{a|ovhF4q/.WU޻>}*$+5X^L]6+&.`+k*<\€} 9 a/} {cA;h|}/bw5 cYi͵ĒTʯ䭊Zsk 5^kL,hj$׶-A*% )k)-ZkK6KTR*+-`Uxík:V6^,ZZP`bqrKÉ=(e돻W 2[pu-X:fb1X@jɄDSk)@b-h0==6yb,+ VǺd[rlԢfFr DC r";\#v@#傀c.t~~& +jWcoL#蒇_ Y+V-bTc.t~{ˢ\dJ3$xKٳH;/t~{[P.9CLWѩY,.9pɁ]tCnuo4ܞDle`\@ '-Vpue2rJs8"TUIo-('-Vpue/`o֗K?r},b QH ϗ}o* +wzSb @ ϗ^kAv<'-Vpue/|Y~ vS+#|>x$`Jv)Pm5״K.T5kͳlϋ".HԱZm$wQKw;l-cwH̽J:qho56e"/V! U(>2*]1MF}޷HS) b"-5* 7;=UZ^EC"WK#^;V"G{o Y12H|3>W1!Q~KdM_:kVyq|]nυpDOiʕ[~ޭBT`mũ[~ޭB>}DK}}ʕ[~ޭBY[Hdn v[>aMքBK/nTPV,ֺ58ܕm\RJ[t*l=m~FC VfHLJ !C`DK0ZJb^wgJŵQhGɵy҇+bXj7 m#Z m})yЮZe_<]m`(lxiw#^To#7 R7Γ~6n߷\@Bg^~Ig<[7yn%|ǎSU8ݱTruNw8#6~x @=[=ȁ @[ @= CEAc*@`;[) @+@lR @ %1bJ;}7~ 9)\b:zE5Ž[}y3bvZӏ 9 ab: Fl@K!&;r>˭۷ƞ$(6裧zNC `{KC}/.WUw|UP*| z_h_dmXWW{*<\€dUPIn{kOz[Y,'0XɛVIsܖ9tZ8'Z͉\ݥ-ZcbID[V~ٱoL]r)w2bkX}/j-[+PVO\gkꟘZS ZJ8fkukG[|T[[P lnm̕-{e߹RNlqgl+zdsH<WW }4yo#ZMFm;O蕇W ;RRM/eFr<%wޓ 싇YcqdEtΓ-uXW-@␮޿?d`=ǯ7\d~O޿7\mo*YVkL6l*HɊiækL6l\nr8 @g :*2@%ؚvih  3V9ҡ3`f$ f *o@ "֊0)@R#Dݗ<}ǒR%7ZtXcEҤ Va6,Ĕ\[rO~]0`FML\6veÂ*|[_<f6&;hxO?x]ru^u@("Rqc@KnҤ->*dpnk}ӏ_WA='!k dۋmXHnRr.Wakn} 9uv^%i.ە Z[UDCaaErYa`UTҝM\˨ZcbIQV~ٱҝVVvPmZ^^H(Jn呶ޤx"˪Chc^/DZEVܠoKۃ1ZRyX/+(JvY &V{5*V-O5 XYfujA` v'вaT~v"#Zbs'4J91'^~{:1b1rs蒇]X/I~j;}E<^&czEZ:);h19pə`tC \CLJ`"w/9.y(^;nb6nE9ڳHq>KKe +/V8A "tdJ3*,څ b-o2ygH+닧q[5OP}IY IDATe`ˋgH/oӋ=姴#,bk 7MZ_+ kYk:V[K_'fMU/|o&JI5kY:.U*"*xN U[=Z9}H$n$w*$zHֶeق#F9Ӈt{EKn$O3eU>[}Cw";[$5FrK0wJWmJi;[WMԼopjثwFOۭV_TlMKrꇍRv^iQK-!f|g/Jug-*:p+v ˎuFGiV)2UW@l]ZRR۴onY;Z*K"DQZqJ@(u}?T";vI?ZJ3W6%id1^yЮk|Q(XVG;OA[-zQ([ڶ1#Zb;Op0<$^}n{(5Vzn^-q@ K+Qg+e|Ig|T3Zט8mTrӆ]_Xy7-Ʀ=[ט8mظqť1@@uUd LK5 @g 3sCGgp!*I`XU`g+% @`EaR  8FLw/$9)\b:zE5۽Y>jW6,Ĕ\[rӷ_WA='!L,1Xdh ų?\r`51Aƻ~ 9I a/^u{sGq\/V&.)pxӏ_WA=*_d [lr)\;D<>^*^)*<\feZd{zz] a/} szq`V4Rz8",+y*+a#M5qW<[4EE]$Ykf>F +ZbAZ"mxn}TӗUCD 8- +5upPTJK_Iei- N*+mi,:m٪V 8%)uIr*͆嵝$Gi{D5xg+{G5FG;[H NFun:cgZ?BtnՕ:NW;UG$ pb|։mB% օEoA 鯐X']:lB35 أ@e52޺B'szJb`xHƚ[5&I3(GzFJMs A P%}5|k_+ӟ:ꦐ4; [M8%1KCc b  @bkڥ1@@ gX͛Ggh!*I`fXzٚs]  @ld! @squ>O>DiTY7M3nIdNg&F-:>F{t۷o㟉K:@,!A Ę#cs# Lu˫܃ܤa-e-1Ū"Yը'huRb !bKGn̈́8ϱ1i-툰Eu^jQjidܥs$7KuKQZ{g2W9 8F\3>%I/`4-瀃{ZrJ_QA-u~]S~ dHB[YG:\@#V#(ŠZ*k+؀}rmpR)"|/\j [ҏ8oOZ]Y+GId'w@$ð-G-U>*ژH۰E-`bx;>kgX;v(-d" ߳uŽʩK1;}rQBs(!}ดQK$cp$9ݬRG~Aʶ’lb֘-h(^]zֻVnujAo%1xW W/fծ9d9tpA޿o& __<YwuSH^]nĊtR3qա7@bꗐ @ 03̫Co \=._;7o VaUI9ׅ @8 Ii@ 0'\+{޷-iZ?KN&%uǵ(6X~_[I INs!v-:%F:?u7͒KNvVOOI@S:Sf[>+()(M,G:ΊfJdY(kӝreWIo%\Ai% )8*3k) m#eRM@BcD>؊UֲؽujtTn{DB8b z~*Gq,@Lj#,{8x}*w\:1J#] R4^w\田t/\{X,+VS0"n#=h'jgEd@V\9y\IŗJ-2tR4^tTŹ>'xÕvJ4$joR*4O r!HŇa[VZie&BMw]D$V 훉VoYˢFMXlS\`KiW㭮Ār;$Iu>ˬ큣zֲEYVv˾WߠGw[RK-Fr[/9J-tC npWvѳr+Ji]0{-}tdQBZ&G{_6Q#\g: HŇa@S;J+Ow\ےQFrC4[b*eE-~Q~Wx!!⓰-]rDe[uh/~0MG-9.S w@&e|->s!i3r3dN-ja$T; ;[\+o/{Vm7VHKrYc`QoV(Q~WA3%xۧ(IY>^]z-uXDE C@_W7-Lzĭ.7nLj. A p3"s @`Zi @8.ȟaÛ7o0'Uas`gku+@NBud Ic9ʺw~Wqcd׳MuT~~p H%Ow*'??+1h1~vH??&.;Zo??K~&VY7uJ[%2W#_Rݺ mY׊`J䑵tl3Zj[Gsr*QHO\hq)1=HGx!@L[gZM2Zpy^a+ΦΆ!+ 1,-СVw "JNV "ת*{WM'ȍ=mt+ ;ZeՉ>@K #>%DVWViirI.C*-) HJ+QW6ZRn\vy\ʹkOn7 !MasÒ޲Bv(jWZNdY{Yoe9B@lj/tT#ڛ!R:*[+ZroAZ%U-1G.j`,.j>}!}:RQZ#ٕS[#9{PD[\ۉ)-[g({ai ٮ-; @l%PU(42:Flf݈O?*71 wV_t BBu-+u>GQҲ׭:Ss Hcɀn߳usK>ՄRK#@ U_sNM>(!  `gw2*dpTnuvnhU8V~Jx֞ z+ C}oy9d,MjNo["/J ꯞ ȿۿ]݌)$ o!7fb#n]uuԇ8Fvih  3@la @@lM44@pA x޼ys -X> ???CLH  @8y֒@ 0!'\k۷}L1>y'hENY?~1ֱrTC?u@2x˯گg'I?*4q1j\ue-1=V6Z7rYef-mlkQbiOYeVy7{PKc08=OO(42ZfRkuhaGK;7z[. ]7kҚKKc]Y:;Ufբ]%F! -YAՑ.8福U#:SRҪr~O]xʵ,%ZJ@GZ]YHl[G妓\wTZR>kue/N%wm@\+!U1ՒUZA'e@U*"F $UV`rH+_i]gɲFPYo#̱z;^4*ͳE aT{Q 'غ"K+[[ZŒv?-q⩱aV'Z>}]n:h)SEG{%eXKK!f$q\ҿ=k e׷B-[-TlyWsVrPwicQVrk;[a{#^KrׂC2->s$(-{ݪC{9;;>cW a/ce_duVKK7pT({κ:E'%hQ6 Y m4v9e8*v`g!rȨK V'l7VQo#wu{֫F}rnG-xnV~G_Suݑ*U8*v@`% MO__nFV]TӴo:Y]nv@ Acs# @`RI @89֑Y@ 0).O0֛7o*̰ @;[s ]A p,$Ӏ @`N#ι.W7Ҵ~L )1Fʵ 'o}[}I :`QSֺooŮ%3΁W_iˇ~L\b:++.1 b;iKYQDndCWZG]i B["!@`#eoIDATR@5Q,JdC5#ڊ?_YW9{NQIc - TZ. -8OBpTn1phO*~.i- W j״ [UDT'-J"HvtH%`7&*$8Tu9C/\0 LC "x@V+YuTnu‰ZEilUXÒQʭގvW,eú8֍*24GqRicN bk,B,OewlAk<*v-K&Vki VB}-uȗܩ;[L_,RĈO J]ߎZK?-"QUvZw*w$Y|yi H0uhFQr\6ZBg"li5VTB+Qjids(NG %.#HJUlGff䖲JR{P6:~CRD+$ ?~ƚ(g}28_@#C %`Wmy||)$ o!7fb#n]uuԇ8Fvih  3@la @@lM44@pg  @;[. A p3"s @`Zi @8V9@ 0-ִKCc b  @bkڥ1@@uUd LK5 @g :*2@%ؚvih  3@la @@lM44@ ΰ i ] @ [gXE@[. A p3"s @`Zi @8V9@ 0-ִKCc \ث~Fu"]B 0' 9+@'|4_t;Gl $ AiYi5 \ zj-4Ӂ @`WZZ%2K@l @)}ŲTs9~U߹> HHHH>iHHHH t$!~oK}25 와Wl'?j=?nHHH`iZl}ӯ̶M:[߽ k'IHH—%k-|† Z.*]ZYHHvM " Y&1b~'$@$@$@G@o#9"   XwevZjRqW\vwr xv+ZQ3!l]gL$gGf9G[H$@$@C`!5 &'|#Se Vm[ V-{qQO[3vkՁIP.  V̀կ醿t[9Sc"Uxk$@$@$;;[mG5Z[uJ;; .lBl˚~";p")e*  c& ſ[)XN$@$@$;aw&  -ްc B,ZHHHD[{ÃAcާ^n^ه*sֵ"U֎bԴM夝HHH@vvvF$@$@$@$@lqPHHH'@Umy-V$  XkgggcaEnbζvxx^aF'h;v5C6Մv   1Jl &   $f pP$@$@$@$PO mDn~f   c#Pxl8^   ( po}q}')?~TЪU o}|W ? Z7dxqA+6! Xl-ÙUHHH֑>xHHH`q=߃zo6'_'u?=o[/[e߽_&ﰭ{X}gǴ_%TUi! 6bKRW(~ɣEi)ue-цFQZJ]YKe OsQZ&1I+[QZ,UWIjIHH#m״{6,ֺ̚c_Ki;jV' D`bkNvMñ{ǠϢGw {PeN X@o>XV$ҪWV) l@3[ᨆZ {g-/v+</lW92? 2%/SecOX\KiYi%=(7FOqqY+1H6KآZ1k& ahvfJ0&G\S`HHf+[ bj5y=j}%֪-3 v4[2=YEiih/_F{-vBk9*$@$@I6Q[EiaHH@-CTw=,8~VbwF [r4~#?ypUD^#f 88o2گϮRh*u[{g*uU>~x,J$@$!mD%Ɛ @!BplF$@$@$@[J!   B;0A]]]5ul_xao/lYL.#K$@$@H+[P9$   γ`OHHH@{x~xZ? }?zmwks=4Fcl+{~䃯A~ Wï= & ]~`J?vD"qHgwF"-ݦj24|8arDYN3F52=Nᱷ vYqɣGWf`\^< Ƅk )oW^3:pyz89n:Cyb+Sj@-ehުu5ZDoU]#Rn)%֢S0I@iIbMX_M-=={;Y2VVVjQޚ>]šTۮbG^,Xaۍ+-;\oDx$,eƂ^2ARm7 N6,hOt氛,q..V5M(-9APoaONGg}#: PZotX?\ Ow%k`)E5E56 R?HV3.-:'ña/0R'e 8'Íŭ(-,/VZʾ_oٵ+pHH=o?)2J ,kW.a]ֲ-Yoh7Yx!6@4bJ+Z]N}g)u Ku.=aۈMY$XKaoM<ژ .up> 7TZZltUZ ӰZ.=:7ޚ=T b-5}XEB9;Ғس^šl0R[ӷ*'+2`Ie!RV.kJ^gIU& սYi/fTZ5vb k)yBTZݭt%|RZm?^Wy(Yt~W{g 6{ k5-];[XKao[EiSYbfjGc6fl1pms[^E5>G{Y|?uxTZn7 ^Eitm#Ii-&#WZ s_WTZL|r${&=C䔍?x&rOl8DoL=>qnnCZjˮERU']pzV0cl&}CTL~P':f9u6KUtncy ~pE~wk)|pmDqcUv)KekC69ޛَo&ތW4Sn^.N糺o~ T-3V:AvإOkwb1!g{&J?-L b|yF-"lWlm}dd   XjYHHHPlSIHHV#`_m,|Gй3;{`n<+wnʕ΀HHH PlIHH:u޻DEѶa6cz:I~ɤ:zbM~0 .Iس`K0Utn}QO^}ZW_׺Y`ګUӅө>zLxjmSI0CX% (.<6,aX\T>il~:۱״3N\C0@|ycKLnLTLmi,AbC¢It/OR^Ozΐ*}yqr+ItT}VTT V Df-ehެB*X=F =_ WU65:͋V]6l(-9~ւRC(* fw*e嗵'uDjU {!-*Zʪт5EN),JuF)kXRl}͙FϿ€Kޚ{Ɨ;`o*x#j1}K$UA1[كo'_pv|&Kvi~d]S;`og4NR1ޡ-썌Q7ocC:ҵ1a~~mj߰/*֛ٮnsU>5wYQu@1,_58ۓ݀#Clud_]4xW[/qwj4NV[/ s4֚[[Fj    aHHHObkϐ#   0?Zfî: qd׷L}O}kkX{ IDATKZfVKE$@$@$@ t$0n#zk\]=w-K0}4L:wWw`///?6?oVQ1;[T./.~3=lbUqz^Bql&}2i zƻ<8TOr׍?ݲC+R-[SD5b%FJxI#kId3+i䲖hx*3o'r*%ZL>AXccֈ)+z[-Bu%[oeœ,kc-ehޚRIYl@V9ƶVt@iF3kE$$Lͯ4]*BMfDטJ?uDX+]Li㨗R |M+٦Z {m6Z V|VtMsR( | <b` +-ռɄdpG%ٮҚ%txr4Y-ꏧJE3T'u\3vReU9\iTmr[V>>u~+?Z}Ť7\ƕ:"VOh$XUEtXj/ؗ7Ƕ%`):nRiXWÐpZ ϿK-u>gؾҒ\k%|2#KieXi:2Ȫ=~JKP)LJcUh^^{^5 piqxd6Z/BiA.kϗ [ٳ6'ƶ–.TkŔVtWʎFlٳRO= Ub3ZBE̡xG*٢VYl 衴OҊ*ZK)kMPZZxtWq4+:{J'6 cwk;jmwOimdHHj1b%^fg0 ܴC=ѵәRZmj]tRZr PZz[(UxiNJHir.G\D i_y)Nc)R^;;;˗obo2ägpDW֘+ޜ+nu0wWן~71^4XFSUGF<{5ۗlW?x%.xnK${Cv<|&zfM㨮|1!sVۈmD;Xoc9MCu׃ =8f;«nhWO?T $ێa7QX 3~WZRUv5+L}?q; ز}]ůn+nǒ!tK]ǯ.u~W_k+խ[8ۻ`5IWu%ia^`[Ep3jqd}bkۈ-&#s j(VC$@$@$@@b2H$@$@$?aFGL 9A\CaHHH{} `>U\T>W&`JUSt>? r €Ҡ ^bvvh`+א* M.<6{\`دW1{~82 kΧc>ᜈڵ1Ol)E5*0k)$rJ'ei%TDi) _X/JWSRZjNI+%$Z5IFie<6qgT(Ŝ9=a~RT1J?JVzKP]DoRIYV)XgWi9ēXoVEƶVt@iFI䨷&ւGe]JuC)FYMjGSo6b+SRV{ƸGIHZJHvd괦Z4Xw#H@7f ] U՘{k`?[M[Df;'3]IsGVziڗuJ複ҚOe*6hLO=-n8$zV))]XӶk[t.*ci_9Vֈ*ʜTZJۈ5}5m-#!`[M6ʟʓmL~lZjٚM|8>|g]J+x~:5@Zl)K귚Uۂ?U86.ƍ-uث2*x;Ew&fO5{F:lQZV\ӲE]F>OQS\8嗵#=6\֒@N@=~urc>uٞJN턖Flqԋdt#XV[Qv*FJoʉ]^V'` RDWnzV)] /R{ޜ+nو؛VsP[ѷsl9ƫ{OT[u 7c}كlǗ;`olMu<g<ө ?1ށUJH3n@uo#^snp!-{:e:q|lvU֧fCfl8~V79ޡtƆwkزmA^n+nǒ!tK]ǯ.u~W_k+խ[8ۻ`5IWu'+խ[` g{ 9Vuk.ۈ$@$@$@$p(9s$@$@$@+Z <˒ ?Zǁm='t|(   ("@UHHHHG`Fz# wGϞz:dRWڅ7xshZxw&5v_O^L~^9{~~bZ:lB _uU@WɌ|:C' (Wf54O9tI3Չ2~~y,><%Y7]s5o<ՄK*JIB^l$L \Xdch[l{jY_!9Xgk),GF'x JȞ|AO%iӫT TN={ix1^1)u~ co3XPw5)˂`\n$Om/v@QQ5=Vzbnø.)X:2i" 0׫3{l8jp9w#i:#Nzo-8ּVEy,G୥Jn(T;2UZVNuFLb.[^iE܈6Z VJQ>*-TZxCEZUg/m֐^`Piʉrў':AKJ+XI/ +]v2ΛDDsEw~JkQwd\m a-m{z Vaff ؍DáRM.\I=*e/XK{U>7?0aki/]x] 0ޫJi쥴f 3 :ЕZLiCZ+`:XKao]卶~L"l@um։E07 ~xsWGuX޶+e ~{M[c)~{\՝; ϵ s]b\07ۯN?-.|QU ؛D7ga'N*zN}pR׷ 8v-l7T緄Cۈ7OA-G* .wofA x#0|/ͳ3u9=Km~\Zh.Q?.ui\}T^l5?l$]iyDkCj 2a9پ_F1IHHH?bHHH`M[kgm   '#\k s$پ.u" ,Ӓ@leb( %x    0n#η$ wsD6oz:䮮r 9*6Ѵb͖a8?{5{3̅|oFu-̯Clf*OS}h "O d:CTH˻g.I9E&dq>tcoqѡ~ה~>Y\C0.nh:?n^{M0؋3ә; ӱ۳;Z|91VxZ,ZyQ)O^d}fk;3p58mXbW vZRqƻRz՘ VtYwRze0p8cYl߯n#?rF [ $@$@$@$ЎV;D$@$@$@-cHHHHl5$@$@$@$"@"C; 4 @"S @V $@$@$@$ЀVLA$@$@$@)[)2 @[ 2 PlN$@$@$@ Pl5$@$@$@$"@"C; 4 @"S @V $@$@$@$ЀVLA$@$@$@)[)2 @[ 2 PlN$@$@$@ Pl5$@$@$@$"@"C; 4 @"S @ݗ/S}Of3xodƻR%Q4tq7Nrѵpd 8. .} n#=uѽ{obј1 Ħk'Ou1]'G~٘0z#gfNT8#qq~셣4LZM:2躧'^"?۰1H7kDZ.5V1KbR@7^}u)mcT\'/l T`+ 3Wh0`3ɋ\=h̘Jq 3%Lᗊ^[%b]a*X/'ϟ/(*~55ޙ)]D*3lhu:ϯs;3|~5{"Pmq=zRjOP.Q`9j(E5[,6R^RmUg֒J5ؕfJ0Ϭ%nLT .x*3\{f +KoIPj IDAT0^*Cm--38xWƙ$vޣ)+&U<-(-Y[Lo/&RZ RZ$Z[Ki9G-uK-aA3lmDo90RzkU}p~ުRҪiuJPl)i[i*xP3V} +-TG=;;ZKiINJ+:p+%ph唵&),V-^TEł1RĤf)-Ib%U+7Orc L)o/cʮ#J puK*uGꇪޚ'JEab0jvՖFJ-auOL)کBbTZ<rgdbk%!:)-QZMz֛M:_*OVjk06d>PK'A^Eu~ (VZҰ No zCf;`KJ˾J{p֦}PiNJ˞ZF{SY]qC;*e/_K{mv>;Vj|AdҲo2fi/d[0̱ R[SwmW?aϝNi8* ҡZxmTvwJˢ˲`-YT0R[Swm_;;;Z ׫+UvAkg[`7T޼jɺoԝ.լy(;ma7j֤nFN_;uj֤W{p=S_v|C7Ufjɺ7OA4S=+T!IlQ:ix^ zUND{rv|}Cן.]`pPאgv:M:6:5~^;[[zh%+`WE2orz" RͽR7!lD;zgDlЭ??+|Z\ _kwSl_Jny 1[jO}_F\# :' l֦;C$@$@$ph^t@k'946|vsg8w xW$ܔ+[3= q:ѓ t&0n#չ{Ol]0Fhv'Ou1Ѷ躸|qd_Ia0FhЁϞE&*L~ʑA'<셣4|ZבA=}앮{q:I{K0l7~A\ch h;ہ7>86> wK$Iu 3h0`3r~b 0`3z>ar I@/lxR1Q;(t}rs.0C\CX4I'}p-7OStxgN+3skll`9W9c*U+N^r(FlX,J1fXm1Fe4 LYJIAi&gg֒J5ؕfJ0Q3kIU*0⢳PNY!MviDx>/P=*xHϬWTT֝5 #>ӿ@c)%%WZn(EuW(0RmH=ިlV)V<-5^[+jxgeuUTT iJuCUW{TJa^LV]$N&ۈVQ-3*ukZE[TH0O Q7o)):3 pNWBr UH VQ9VYOXW ۃ^=j,7=&bruS/vkH58pI[o֖Ul; uu tfj7v)3.Ipͦ \͟ i`o< qfjIl6~kW]GW{Xߟ1_KE;5cZ`״і vlk`G; B%M"No`]KKaxD؋vޣW*8>_8R2!HVRVV'1լ  ԃp~rvr8Po9Fq[o4([  .kyČX󬵦ewE]F}YJ]ʫ;dL-_Ye|bnuhdQvki YZ=?Ĥ W:YXݞk>XNhYi|2^s^9/?ò([mDV{Hܴr\{9_c $n衷DxOR?Vd{0Ut./fKU> LM(-& ]R)5v^ghLMxxl2Z[a˽=-՛gEu=0:ܡfY+RVO$R6"?TZ!172%\XkWKf-8@Q zEuS+ҚH{mD'PZt|C(Nʽ4([a~:L :_$zG{ ʱIpjA7Qǹ-(-zҊƷ2+-u:>?x{skx] {kWla5:M_g;V~ &5ۅnҪ鿴mR+D|xw3/ >Ehn>)K-_ ko^{3[o|Cu>|RT&rCgd]Pv{|''v|C7YfwȜ}f) wϫ*62ٮZE/2M ma?Wxѱ.𐖽TlWG!-"]±{8">Eqm|ZlYou! Ƿ?0R7Z7fxcK~\m^{咺a ?'R|`h8mX&bkn&^ 7WZ]Gl8ۗҬD2C x:l_-62ӆUHHHHPlpHHHEbk[σ!  80:6~' Z~?l8gÞ x v ۈw]{.=4ژ0zmBeGObuNNcդW ǏmC^Z...=U8 {mQ\_>{a*f@N/2uOcuaA0[qlV۪%1 O}⺫; ]u@f6acL4Z/._f0=?|af>kb€h\u^`/~rs.^\󫇓ث2KjJN+3祭ĤahLt>yگ4ODKN|Fˍ|~55^\w^-d؀,J35 ,dVY LcU`{q+">̙$,UCOVY N(T$Oث4SE^YzKiI](”-:"-*F0B jv4YJy^7ݪb8; Si ,`oh(`ʬdL]RjώVEE-H Ҫ"J؋; ZʪRuwl# \ԊL2<(*hc`*nd$t\ `9f+Hb5MR,hZUXYVYjʄV{ ˙a'0[{M=2W}ԍ-XKao`*դTM֢j {MmA K(-i=l2"`'tzζ¢5\iI߲v%kga]tfU]XKao׎ ^W/J[lQQ5.%)ڋ\]kmS JD7 ˔VC-mbYKK]BշotQ!꺱38a{/|l V#^dCse0/n[Oy2طdl15{|&ZRzLiŖa1Koג5v]bRK_6fyWx|>XFZ { F=5:KD:em\ig k)fu+cS_Èڂ<q#gdmp)GТe'ZMƛ~0O0V|˞ʜ{D$4wq=zKV[! J=S1j6b͕֖[[ւ3lkUR? + UJʩ3dؑZKJ<6CL3 {X,ʆ9څҒZef-(<[l-6 ,R7T\eo#>V܎e"V͟nugƻR]Z)p/}YwR]Z g2Wuk-62ӆUHHHHPlpHHHEbk[σ!  80:Og8w&8ۛ`d"*|lL$@$@$@C/ TܿѽlV0Fhvz'Ou1jҫXPT\?1b*{m6kx,RWEaI8xBc$s,̶ ӋgLXOäMe卫fdטGń.IexsU\wu1n"{~yv1&cچQŋl{ڣ⅙#I FhЁӋf_םNif *{qίN~r UTsPt:_9/m%&jbot>yvvҧj:krt:_M|ݣWlY,JZ)4YZ7U++4 -MUWJ匊!fVEnL6֍M+i_SJ3aXY핥fԅ"L+آCʦ!R)0iY4ʨfXԒJ;k&ie(iʓLw5 ,dVYKǮ4*Ђ&F JfRݰ:)jWZ D.T6+VUW-7EKYu5ZjN*eFe52ufZnVE״ִueɩ ;]ӪO;&c@UĚzYd[Tj&s<±co %jLV8CK@Cc ˓xVή]lUm*Z]YkQaC?pfcpͦ (Umc.ZpH=t9ۣ^d =bo {8fmՒl< LȒ%Z!ߗho4Xk =~,s>`V~j `Z {W!`řҫl 5()."sHVRa=Փ0|Y#euqGp-zp~K-p|q{'P(p ۭC-.* ]7NbeJCZuIj*eʊ=U*+הe-hc.mIJ䠕lÆ/kw$WtCgv* ,\=ku*LU9/?I+4=wxCNagP`Şz'`j o8^a5ƆKeϿ[KX e-=xJ8 2g8WEE)Rό#wpfðI T .dQ] 7[lakvF,!G`׽aVKVT _.,JSyr{TZ5ZX'ao.0>Wi m5}~K}nl_"HRpۊ۱L ݺͯnxW[+<e4NV[ˀTl_Jnپ_F\fڰ { Plmy7$@$@$@FOdzpvA}lB F&!*\٪$@$@$@$ Pla> @q.7>*ШbfOIiX̘-Ė-KɏaOU3G]& T d8C0L Oϟ2uOcui0[qDZ.5M  I5 10L _0] cl\׽8d&*{gJ 3{\H+u==afu|ƌ%xz2|2>!l IDAT霯>N^3uS/S0y4&Ut:_Ĥ쓺ɺj:OW`/(S[J3 ,`hOrDh4S*RY}f-Tu&S1TT ^ZKjݎۺIc+D{5[R'$$*`HϬ%UqGEm_#hVUitݪтJ35 ,dVY ]]#J%^RV]ohdh^IbpFEY]%hhSoYfF^2(`ʩdY`-eh;NfZfT@?;Pĩa֬iU*-ύlr⁜.96UHڋSqáV3,>W!U~)K$仰+-謢򴪏Z,+H&)=Llh+@Ғ枽J뺮c})Ȳ*Jz鵫 ;ZJK҂?ǀ?9=aeLt2ysMsDmt0R^ˏhka^eJ˓٩{CLn#Ri'۱)50UW.eلeTZYo[꡴":W睲X]MykTU[E\cGw[)uf3[hc[PZBPoaNqyR蔽|YI, tX?#\]WCieofRæ:/?{|"ێʔVC鮃[bKu χQZ.$RWص+p0oSj+5=eLldaó_7^?Ŕ=?t5ex=MJzO1VU[st[v=o2 w5VJZ5TZD %Tt%,3Ŕ-{cAs17*ّړ2*YYd-CR۳mFLJs5|0US*ea/8xS*eT%Vxs4gS'OŤ4S(l=[lY]u @UMR*ew .kͶVi-ί/R)eƂx7RvONO^g,ד?SZ}{ڠ wǰ*~OܻpɆcpPXپ~vD7?z Tp y\ou}=R7| o6xc%J]{řp}:v~T-'bkY _7~VZk+g2WuZ,3İʬZK9ۗ~d}b˻̴a   80[@9   m`oHHH럎gg.;لg{LBUUIHHH|%   *6]W|ts6C^Z?'OuibDذrqy+0aQlۄϞ9a6'I ]WA lse8=}= ¤Uf޸lVۆ1=+/jbmahF-痧/l ð6Z/N_fxBx~~v4{]uOO_~]w:Dx:b>tcJbT+O7NStr TsЁ~e漴=I>W9/1)nmt>ӴWn9DKN!ĨVB`bKiqV`&ihJ+QKEâFO6&ֆ)ielUCOVYLݘ4>\{ihD.7zj*e#YT¢T vFi;F3kOkFoT6]5 LYZI+IB @LV]涭QQVW)56fF:UQQKtȨ&E0Yu5Z[ZV'R)5fvH6L *e:ץaQۢLqá3)! vkH2zew`ofn;ΖTlFvZZX{X1aA-R\TJU}-d ({@~-pj ʍMkZΰjֱj=5&ޚlۉ@Z*1l0uثJƕVGPKJR`[VH_ΰcPo9=h)KMx@Pl-|+TTҪ+Zv ՘ FxYu5Zc3^ǰ%<7e;JJˆc[VR1lZ Nh:eOOhLOu/ JXزJK6S1gwWg@ XV$RL{œkg%X[s{v>X)VVŶ9zQwUު)7kLdVVJKsk#<1X*aD4V*_eבb*aڭ]3`.kmpcבhcXSWse嫅WJQ5# ۦUi[Nd1JkȦh/{\Ea87OlؾjѪiY5ؖHHEu>PTY'iVeJɵ`-x*-' ›D 7;,h/-QNFNh9{;8Ձ# ni\Nh J+-UZaSZ" (-7{C ,vlk̶Ɛ%`xfHwUWaQ*#hkoRa5(vvv& }:ÊOd\ośXeWĬwy޺;,5n>0駗7 ;~!!WSu{ 7_PMvlyF<} 9?yxq=nb؛z| Pb|kyP'T8q7TDz\mkԍ}:-D[6~;Z[7~V͟Ju=bkپ fYkVl+[|N}_F\# :' l֦;C$@$@$phnlڰ8   lm9$@$@$@Jb@,E$@$@$ [x :a l6{A$@$@$p(rX$@$@$@ @^ (} 6Plm9$@$@$@Jb@,E$@$@$ [x :a l6{A$@$@$p(rX$@$@$@ @^ (} 6Plm9$@$@$@Jb@,E$@$@$ [x x}7U|u @ @L=|=2' bj"  8F[9f   n#/",]]5^<>( ~cU<We`?/~1xkhzG~${%2 PmAQq^c?c\C+~C;XE|% Xu~- y/a@V[~B//lFdpa{HpVۿ۠YmAZHENljx1RV]/kQh^9D&F J]Rdh^Ie0+ɪтĶu-ehjxq]%$Z JZHkIU:ZƶJ 1Un+$vk Ä6ZRPI¬elT]IvMۈʲڌk_7t",jl j[B-Of#]-ؘբ5t 6WZ W5YۂxO{kjReU^YmDRl[wSJ o88 lتS5m & )@2E9bs& SiMFY\RZ83ZC۔MU&iNGK`r@h) LiRM yЖ-+-mYz oJiyPic[8TIeO Dm$hOKDκQ|W¢B*̞PQ+avU,ӓ1,!8\)7DW·S[цD _H W{=/m;m,*iJZ-RZYjJZyVxj޳Nf!B$;qRKJŤ4Q% CecS7%: K)Tg\ҒPQbR9=` V*Ɠ?UZ 0[KVh*- V#vu1qJ+հUd1iz^jz}:&-8<UjZ ]ԭQQ5mtgD8&p+{m2T*Ne-$@$0bF-մݝ w &V&RZTMfǰ{@$@$@$pnO*e39 ּg?c89/l> pek#  7}??HHH`&loFݟٟ`*ʯ__u%x P Vy~Wԕ`6mUڟ - Jp0OO?+a@V[CdUiG4r v@1G4\= 3Xl cOdQ;]u??G t0k* w^hT>`IزZƑ+Y` ಖUW~iFSJ3)Y&lsZTV])ieRPI¬elT]%$ZƶJZHkI946UT"NRYd94T94ԵHY)RE0J”EyUMH`J[ m$@d7 )NO_Hy4jd/ݶm/=g?IvD [la-5\jFoUZC!IUIu&U6,z-C*e8 FLXKaogJ챂LQe:ÆCiZCkZ`ВĖT%Luu״]K0w S/SZLHqZ {qfJKH7\nbNqynrPZ=.8>6oe-\ +|ef +$geJ%p|^c'?cHH )xZ {(iV8DI+$}3Lo)iWZ訕JKV$ Y'Uj15{:Gq;Қ=oŏC0Gy:0Қ=U1{~0HH .,(R) VIK`*V6ZrlAJ'RZ}$f_jZ!5U P7A譆1R) I D2Fiմ-ILrPQ*^eUHJ~x2Piy(1H`]Zl%.W XRfSe5-u*++l0PKm^(,.mV~5Sz*hn,VZDWnǸK$p&b (-bw1PZSYcBpe`5^@iwj/ (-bCpyfJ pNאy6t$^Pqp\־ɘ.e ~ ]VU U(-Oszid*@ϻ)PF-մL`D؅n[`Ƕ$pʖazvA+ZWT[g!] ZѺ:b]Њ֭4*-Q6] ZѺb [ Do|!:Eo-Fyg m[D3ZIAC߱w]嵫YSk|PQ DMHvvv&`>ϰyR~vBZ^e,J$Њ@*<$@$@$@$p ()s$@$@$@Z = 3[7λ .   ;})??b{J\)EuI/ lWUɗ?Xۈu5H    u J lg*2,jiMH#  |_VWǁ4[ˬqq! SIwHHH`DiYi5n| hPZYmB#  o7ל']eۈ<ce   g{IDAT9YR\=b$ *ԦgqK*|7l i_;;;s( EW4F   n#$@$@$@{"@ž @V1vaLH$@$@$@ .($@$@$@$Љ;eZ   &@y@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$@9@$@$@$@ Plu$@$@$@$o <&;KIENDB`terminal-colors-3.0.1/screenshots/padding.png000066400000000000000000001321641361340566300213170ustar00rootroot00000000000000PNG  IHDRYsBITO IDATx^AeK畯|5x@Mď5xKJrΏʥ'4R)mYXNMbCShcsJg9#;qޠ(N㽝oر^'رbKX+VE8_ @ "kb@ @2 @ FȰ?k󟋦` @L V9%/7C @B?ɾaB.37=' @@/e/~ ضb!pk:ΤyLn&׊3B @`ezdX }%XozuaYOd@ l@x(q sf @ %khou&yֱugWn:'*Yĉqr\%g"I$^1E@ L&PHRJ~oA;9,:}.ߢ['-U4ibv٢Xg"F/2L @H$PHdQ%,l}2d|Vc?"' @X yj!>LMg'Y@ T!& ȍ 8}'x "2% @|U0 VA $@ ֯` @ $5ʰu[C - @X%C7 O~_@jVR#v2+"r!ƍ+gѴY=IVr`@ %>Ccu 9 @%0 @VLej @@8X㪐 @ b솭xq @ P#dXBN @ VL  @@w0רj @KYI$[;͉5n @~"D>  @d.A @ y7L<޷e8J*](ݪd~1A4B @#+I4"DQ+r~nٴ>}ѱB @&,u )}Z,! ;ެz{@ ,@g7,?JK,ksg0!@ \y%&9\c3Od5v8!@ anV);i[;JaU| @ /ԖXLY @ehA^͐7?"[O@ @_*E rȾ.l)bYVu&mC*}@ @GI1* @6B ϡčb @ )t鸉@ @`DA @_vOdB.>9_}S:_&wtۓgퟛ7Wpr_&Mwߚ7&w⟙77tIN_@VFwVL @2"?@ @`eF\ѡ\O͹ {>!H.?WN }Ϳ8Es1?ecm-~)]T[zA>)3?#H  @PaNK(I3}NK9`-sie/Bt(_z9WYqF @`6}(qY`-:wl lZ-,bUQ,b;A4بނ3 P,2,xO462"[ZVMĝHD͇ ny+ %D ұW9jqms @`eRne2/K5]NR}@w-m1 @B C)}鵸!@6N ۻaheid eV3@J n؂~yk+K( @ ;l2,{f%8 # ׯ&XGF@ A%n])/NGĈ @@0w"1~g?fESbss$)2Cw).w$ra\JZ @<2̑Z VtϹr5fKSa{K80~Y&- Pb<+Wُ^[z_?/Gq~cUgnY^٫Ls;'NJt;'_A((K7C  @ aNKi@wզ!l٩,ehݪthv,dˬ)zJm&[*ݧWn5a]x@ ԣ;]5~(yգst7ųw,% }!@@@VGst.n"[U #g3TLgr[Y>,Lp @f Cg<:R_Bܔ,2@ 6~\zh.R9ߔ5X[g  ,@XMK]/ri/-2j)%j0)xl `H "II .u VrQ_z->+X @@f8)E܌, V cA ش Kgw(ZJ 0{U0> @ dXYi%Awׯxlmԙ @ (XGF @c [Mh?螃+9?551לNk5ᚇZk;d ?&^<rgDv%7%\̓˹bW7 3a&  @`0)ŁGzte[ ]A*gEV)&lque[2F97#y+?n/+"C &J\j2@ @`a X$R @Dd. @|u~~4I @Zd @B P @ 2l-+< @ @-dH @X dZVy@ @ ! [B& @ Ȱ$ @B"M@ @`-akYI@ ,2l! E @Z ֲ @XdB4!@ @e% @ Ȱ,iB @k! [J2@ @`!a Y(҄ @Bd @B P @ 2l-+< @ @-dH @X dZVy@ @ ! [B& @ Ȱ$ @B"M@ @`-akYI@ ,2l! E @Z ֲ @XdB4!@ @e% @ Ȱ,iB @k! [J2@ @`!a Y(҄ @Bd @B P @ 2l-+< @ @-dH @X dZVy@ @ ! [B& @ Ȱ$ @B"M@ @`-akYI@ ,2l! E @Z|Lۖ_iwT;ӔS:‹Hu)y޷' @`٪o"EW+>  @ CV:*e\eb @ Iw\ @VK |7lhrJw(f) ѭzpo;w'EJ_E7s A?Yowʸ'W&2, @ "+\/C\&V:LW1#+q>*C% X(*Ӊ+}Iʘ~ni(uX!@A#ÔΤOXʣ྿>=9Z'gh1#g}*V=k&dH@ 8o뻾/nY59rd52!@ !\feJ mdy P%ON4DVs. @f%0N5_@ИS2ߠO)9O. @qa}=U$XJߓqce: @ +ÂQJ,[r/u)?x&/r|xB &|(Q*Suɪo0٘ӖJ,(v?m78z4ez_*Y%~NM  @@:???K2)s}ȹ2$ @FJ @ @`nnJ;or2|; @ p(q@ &e7?f(F9r~crN(9Q9& 39DŽ39DŽ39DŽ39DŽ39G797979797979wb(@ @ dX6 @ C`/_ LmOo=Fyn/+=n9V=|o9 ip/U"_xɳ|ŋ]K'0M-}w^=iOG]4Aze'pMFWXvkN0rĹ18E㠯 LEr/).nUѭ=oz-;vt^w +;׏k |tk e۫7^1i\G*r{f[ʐյwf4!c<^ KNyd/ly6G11ʒmѭ1q]mn#RVɖ6N b !e [J-F?JUߨ(+l1 $xe5TAe.,5(1Ety9 Vj!;%uWۢ[m?Fw*KꮶEN1U%l5fZMXՆ,h)iUj32*Q΁ s_o~LJj$9TB@gV(N␊K ^ֺbjy6)WI>-tk5BUrΰf-!,ŕ %b ī؈ ~5lmMh5c{rOfEtuk&Q"b2B[sp"1HIZHJ#`}/udG #)b,I Td" Re_y.@y :ѭnLGq"cwoנ"k075qJLw)p(ŏ//p:E`Vb*cn <̕ Q!'^yC Q9Eh!tu]6X܆&k^[dw^q7%P&',:yĎ1"JA'w_;%^1vDd)E-'IZ  nRYɖ&ϡf~n%}Un͕8W\sswȖ)m7)Lt[e2-2n4XuKҟR4XZCiݻ'Quh0#x ~lLWY5I!`0]ef3L-‚,;ӈ:?4X%'īgW'ԩ{ucU}2Kl2etzAuU2*CVNJ ˙L;d((ll&,@Q沭SUqjX5_X,j6`Vw*`_5h W;9*$ٔ`,ݰJ=yaZht w!4Dlp0+Ǖ7ݳgua)i-Wpwb`urpBԭou]yw"13R /?ySSbE~n A% &ey㭳NtyO!gJz:o?q ~ itͰ̏65+Uޔ[Y?(Cчz(Ħy|HQr3:!/<_AkgTs?VivF5PsvF5PsvF5PsvF5PsvF5hTsF5PsF5PsF5PsF5PsF5PsF9 IDAT5`TsbiPb @ P20p @NO @ nXQ @f ٥g @ d wF @6K٥g @ d wF @6K٥g @ d wF @6K٥g @ d wF @6K٥g @ d wF @6K٥g @ d wF @6K٥g @ d wF @6K٥g @ d wF @6K٥g @ d wF @6K٥g @ av&㟟'3(CBor~Q 9?|9=x]ǝQ9&ԜQ9&ԜQ9&ԜQ9&ԜQ9&ԜQ9՜Q9$ԜQ9$ԜQ9$ԜQ9$ԜQ9$ԜQ9՜HP @@6Ȱl( @ @ C1㻗/QFngw^d[m(n9֡_w1'7O^MƸx%_|)g,Vi]_Uy7YM]4iNrn}^ }+QUl4I z꧚[Er [Rtk,[v>v|Y[v>z'05q}q#k b\۫QL\ L[oqD{^/0?uΌ#D'2f+ʐյwr0"Sq2Wn5K,6_j[tk${)tWۢ[r~jSPfm}ߐ^6v7i+G$τAe4X`- #O(+l>pBOeL+)dK[D nM|Jj[t8%uWۢ[rwB+UAKI@VkڬirHmk( T d6-sd Td|9yġ}",m,ө}S!5ұfSU`5"7D@*RƏ"=֒>IZEN*!ÔCi#e6ݽ.eyVy%S[|LNXVBQÓA]A|1#e1])}SO>F8cJM_,sP)=+=r7ef ӱJ͖(B`HMUOGɎ@`iN$*K.m}Zk~pjD;wöˉP.H w,L5+$j/P2^ӭJXL9\e)FeJeX%[a%V{&Z1EydQ^Q~` %N?V~J.QHն9j{0}qSɻ}StqyEs+=&OhXJ'wN:1ZP2j0/|f$5;\go[ϸܪAhHנNhtC1w!K&?ah.D)& Zg({UjK: +5G2έUBJ DgCV֯ueVXΌ@F^X_CVzk` רNkp TYfVᲭIUw) F31s&9@G.ĔE01%mVN`뙳Ie2VUd8Duլ}Vďnq @~`j;saq+$6Va,\>H!kavGiQN McKì!p|dUQ` e{_z7fk%7%K8|k-?2.P׭ՖbP9W0-1w߆ranMyzoy 2Vq =]ʕ5aywƚ ygߔ[3P4Cy,0M;'&/w'Δy{}Bt EL6a;{nb<*Vl)}yzK%[=u~~&=8d:3(CBor~Q 9?|9=HQ9&ԜQ9&ԜQ9&ԜQ9&ԜQ9&ԜQ9՜Q9$ԜQ9$ԜQ9$ԜQ9$ԜQ9$ԜQ9+PkZĘ@ @0dXa @ l2l@ &ݰ£2 @ `7lK!@ 0 @ l2lK!@ 0 @ l2lK!@ 0 @ l2lK!@ 0 @ l2lK!@ 0 @ l2lK!@ 0 @ l2lK!@ 0 @ l2lK!@ 0 @ l2lK!@ 0 @ l2lK!@ _7>=M???Lig1!Q·>!;r~0rzΓ;sL9;sL9;sL9;sL9;sL9;s49{sH9{sH9{sH9{sH9{sH9{s091ߑ  @ laP @@ /c\/_~ony|mOm0w_j-a(W7 /n_|v&<}W[R\kɩnIM.Z2`w^ayۭ9SO>(8?f+,o*m3}PR8w+8g ~ecQz~(Қ7 ͍>k=:k.M߷ɹ[gfbܪ6H\s='ù[sV28h6QdKY5cIY%[-d/j[SV9p)YAt0u`R \'2\s I-3Rly !q%Mehyܝʒҫ [d0>J|垥%(+_wgi5WbRVɖv6~I{8%uWۢ[w+PVAt(jq6[tj9g|&l/s'yj%4SWkRɖiq(e5)E4.B *]K``7tkL\<[VjI픋["ݲ,VK3BUr0;4Xٕ}۾e9Vurh0Q=ᐋ@ [[cb56x4X|-ӌ*|"4 C|0y{lo1k]2_zI%[d_k-G={5 +eK[0' |`:J5rK`%`y\WY5o&jWnS^XM5W-F_)ʪ(W0E9SOUz(f '%B ;ܚu&9"^buj%Tr,*0"m2{k`R .eO hQwxgR e=5Env- 1Pej0תUWc*&C,25mM!*`[y}%L`[75_XhU%FB mn VWD}׬'oEųZ4[a]̓kޔ(7&XUcy QM]Ρ\I[͒>5<(7N(j_ME *ָ{+ukl2EtJ,T-LkUW3{ba>NM5{nOpF1:LyO!w!, i`KŜi/sMupug:??wS}zͽ7=ig1!Q·>!;r~0rz1N|vF5PsvF5PsvF5PsvF5PsvF5PsvF5hTsF5PsF5PsF5PsF5PsF5PsF5`Tsk>3| @ & + @ @m!@ VxT @ Ymv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `CfÝQ!@ @mv8 @ `Cfا7&㟟<(cB{ 91}BwF9_'`'uwF5PsvF5PsvF5PsvF5PsvF5PsvF5hTsF5PsF5PsF5PsF5PsF5PsF5`Tsb#C @ @ ò$ @ _%Ƹ6>߾|w~c5wnVo3LM&/=s>گ}>s><505azK:zJdywݒDSѭSWv>rW7*wșDtʫ*o$}PR~ +,oʜʘpݪʫ*;ݲێm^ LM9^xεC>unvN[gf[m5ʬ 9[k|6|z&d} Vf dUR 8 ޖ0]m jV"Z8 [PI2-iv DW ɜl1yd[{h<)|V !RU`f1 ܳ֠e.,J @V-K]gRޖhNh*hj(ߢ[G眅6s.eZ>1zs}r]DfR aUψC5( NI p %I˗X'D V> HU6@++T*rj\9#U|!*9gXNN5

p+,Ƞos ɡ!{5PhsV;9:[ONy&󭭙浩UE!_aOYĘ'w EԻ[-j|y”V!@Z+ur ;nY˚N!Bhe0Z4QoկEl{չfP.Pza@K9,%֜]\ ^*slX6$N!Z~O!r/:XVX_l NwZ1]'+>W-k+̿cK s7p(BK!?xXKp+Lyf-19 "EW/M0yd{mlE9IK=+fZ̝%CJ,fנ2RDN 6%wohoJRV ^ .h[+oLE|{J6Ke+^޺ a.PpGUlYgЈlpa@_bh+L^X_,֚[p "TY̕mգ?CX(x66dɰj?:hj80NLe@K P9H`KG1rjmG9k)MO`| *Itݟ?_;agUBs]5-`:[R^;먋ݘl})4c7 䇞 SC8F`cyԆ| B`bJL%kX׏/c3bkaq(}ݫyP^燞Wcb!;cr`C,)6Uܣn6Ė~?( 6*=Ja]ʕuμDRɛ{'5A:̿Z̓ =[^Y l4)Dy 2XVXՅNk5<Z۵~!bmtl IDAT;r~0rzΓ;sL9;sL9;sL9;sL9;sL9;s49{sH9{sH9{sH9{sH9{sH9{s091ߑ  @ laP @@ /c\^n?no;9}:GJ'c>Y >E'Oֹrŧn~:rg]M^΁o8ew݂Ӥ[v|d;V2 9>^t!&a`5>()?&*(;^f_½+#ޟW݂[% t߭*DU*݂['u{nѭC~{{qӭ'Mi}p1Ό#LJu{qq3F:SY>z{vq# ;$>uZ&beSYRw-jNb*hV: R讶E%摒]mn5K;pQn {_2\U̙ue40GJ'c:5$I?ZCJd)Ȫ^aQL'GT]mn͘ƨPNb*hT]mnSYRw-u'elӏ`!feYRJXy&m r m5dK< D 5XfNn GS `%LY5)ӝ*;=VU(1ܤ}sxRJ*9c@;eD]bPVX3*y"ҭS! E !,&N~0f̥EIB:G>11{"t\O N$,tqi=tkd},DI`0zVocسֿ՚ +nksζby qCg3PBӭ enX*Qbz'/лc]6]eVG^Ѽ|%ҡĪCVx mi̽3%vg(k0%6VuLaNP{ `9%*;`Ü_s7%*KZQs^hs¸RVIU&$?qh9<Ոm{\I%[&enRY7v4ɻ:f1.CZ[:loJԙʭF=N=֒7s:]o ELŬ} ZC5Yj^CZk}(oG\M)5Z4X)^fԣt٢G*ŖCfwtw0~(~=L -?gۛ5틖[S[BUҭUMDOf ZCe`1L`1I374܄3_4Թ5mRMCz &/9ւmEjGWYauS^+,/Ds'?Uhh ah09<H3EFfj`#RUG1xUsoY송tk_F0EU;i\' B;4Hb}ݥ[G}c]u2Xjt/Q`KDUVZUn]" `5n.%@-a_kL rB`At[4M?qa$ۃ4ZJza{;{zw9M XQ Q!ݙCzݺIk utݥ9tb)w!bI` Dj5}Djs'1 Ä"[X̓垃 .9J^!8gX (7:O 띚Տvq}ݚP&Z ;)N:?ɟo>P>g7rCb2IyPDn&- n-n-d uk,ERdb7Fn n͝˸xaoH޾tk4F ?9RLfw֕n͞LPWV5jsʌtbMJWU7Ū br#֔ J4L!@ 2lM\ @ @-`H @X4@ @rU@@ 2lm+| @ *_ ҃ @Fe> @@a/A @k# [ۊ2@ @rȰ @ @mE @ P9dX Dz @ ֶ @2"=@ @`mak[Q@ TNV @ 6Ȱ( @*' |H @XdV@ @@U@@ 2lm+| @ *_ ҃ @FfBOO&3;?<(cB{ 91}BwF9_'`'uwF5PsvF5PsvF5PsvF5PsvF5PsvF5hTsF5PsF5PsF5PsF5PsF5PsF5`Tsb#C @ @ ò$ @ _%Ƹ>>w{gmeZus~s`jy9Pg*j: s篺P8{駴ݳZLY_V]&M60([&2:;#pzuP&7``͗ˆHAI뫟ʎn1LnnayWROo{\bw+&;FM~ec{nݚ[[O]? 3%{uv|FJΔ {{qvWO.2%tNl=;ȁnMLɤ{ dC:ȪEZBkw*]mn-d8J$uWۢ[XFh}5OT8iVtF ¬㬍Nh +i-6 !q%Me(jF W`5R_DF+V i-L8%uWۢ[gJdXj[tŔ,h))9::ŪM4 6b D♘l6՚TnEUyKCRU>s҃>آelPY5*U:KUi2Zt}}9l2133 tVexP)ìF9'R@UW(,/ ՙmYUٕ1YØ9>F[7њZ9bX't~P*&:E9cLp+X8倎ZՒ0n9k`8;DaV#N$R-k) eOV.Zq]bLV)tzQB`yt -Vɫb_k ^ZЪ_hp(ƘU,f@` č/E` [`~bzT:DyQ(bku &Ep,)V2]C[^C(gȫeK;|%ՈC7vnjh&wƤѦsgcnJ> =ݱCDl%rL1C]nC'PV\޷=V{6ELɅ7o񥗼Q%K/vD׮^=d0C/`̂Ɣ7pȖ)ŕl-| |%NsK+uܹW:aאς荖a`m->'~8A.,G \аdML^XoE5~\yaWƏ gJ:V"e [Ą [$ @.a])h09D+V_eg_>:ں~䇳c>gCp{G|GV%GJtJ,H1X\G1_ՋN _;3pzh>_;9GD8=FًCo(H֧7PC73> Ei߼{~b8sGΔm'Qs\2잱'Q1\2잱ŧ?>Py.^|59N]:SYg}5ǵ YrA~nUIʱru nIP9Ϣ.Χ=&sr֭*':6xnUܭ*%}s3ajJ%g46՚TneYZHjE:̗d9PSCnRɖP큚 I&[Bʭ&"l!PS<TDgS΁+k|Od|iʭ/9w!Rɖs~+z/"6_M@M=,֤r-sg>-~ R-aZz9%uWےb(gj[R,SoKL@tT]mKuZ>1mѭ.tfΡDEY!K s1})-=)-ft,[XY%&("KLΚyIk"%S֚Ygtr"䎑V9ztKN`}ͷ#s:ZXA{"6(磜$TLyYĘL88k>1-H)ۿ5},Pź(' SzRN*Ps1i`.޳1.ԧI…!!UEJ0%V^) 5 lgC`1 ZU`Y ,KerD9٘q- ͪiZ,q߬T^1qdhj 'u2{bzߌD9xOLw'tkE4Ūͥ[SƭonD" <&`J! sK`kc4X%JXXu[fK`nWmJ=@٦tr=JlLIfy&}'ʰ@tլ|q{Lk܅Z4|[( 697]ӌ1'1sܫ@CsdĬDVC,UJNeز4N \R4r o-s4XUn͛I|U|K .I5#Y!5g3LP9Klt5N)̙꜡UE'?jء"c9%%޲2_þuj0C s Yc1vbvuo|<5 CO2YV-:Un͛y2L`T7xQޅ 5|׫~Uy}!@XDyUYP"EGMh-T+:+L%tv  Йvj2glk ;1CRL[6dUn͞Ld@]e! k`KnpMo/Blsxi/Bl 9ܳr%n76ܛ..,DMW wޔ,l=._X?4[{V.׭Nty.BTwu֜j4~ f8y6?lxSb<{\M)wl_jcgK8e$/(KNM Dt58M( uk4Z5`Nk?=7(Vw"1;Vg/a&1軂SH8?ovF9r|HQr3:!/<_nΨ\'Ԝ;sPsjuB͹39 5Ψ\'Ԝ;smTsjeBy09 5\&ԜsPsjeBy09F5';RĘX@ @IȰp @ 2,'MbA @8I˻a'p @ , ˂  @b bI@ @ dX @ KK ?@ @Y ò`^ IDAT$ @ XȰXRA @B#A @ @Œ @@Ȱ, @ @ 2,~ @@eH@ @a @ 2, F@ @% % @ ,aY0 @@,dX,) @ d! ˂  @b bI@ @ dX @ K.GVr>&7'|guBF9_Ny?^Ψ\'Ԝ;sPsjuB͹39 5Ψ\'Ԝ;smTsjeBy09 5\&ԜsPsjeBy09F5';a1 @ 2,JA @!P^]ƭ7 w{ۗn>}$pJ:v L[o6K=97Ό""dɶ ruqSD]7׫sD9|uIuӭs#79n,gjGQΑjw'?o@9$jkcn gl$*kCn glW1\? C]59N>}gJ5K_=Y_q~|'05nAd9WuHfO x-,':cYT7սlw2+&}[κUsftJJp֭*UEf>tP *fAKIptf-}nTnP͂@t ř#@M I&[Bjj(`&l +Rf `K;SM^A՚sLJʭf@YRɖ쩶{֗ߐ|Odˌ9w=Eh@]fR pz^AJmk(Nz~j[Ry|{/uW4d9 }%WjR*#K&TFvRJꮶE ogs(QjY\*)}GRkIZ"S[EjHB9탕dEh)&Փ3HS4LĄ-b)bk#U|&)}G)VD[+ʖ>SӖ>%ߑa;Z) S3IYcԭ gc:&6}YġP5O9h)}#u,&wMcTrP1!t:+' QhMHy”N8䎉 tRBdkV"e{ ^ѱD;55VV>X*W3n!Α}3C vFI=1+C==1y>Ut|$ȺҭAdyQNkn, <&ǤRʬTXu[dw/Q ^26 V5Xp?G|b ukL9|`>Xh9@E۬89 ,e}3jIM`zYҭ&Gp:M!0:Zw-=bMJ_3njlUr?G @@eCI @ @1J]}|ˏk 2`Ɩo߽m_9w}\Ό"dL2uu{Fw~c[e-WW>NMu +œ]2잱gY_]7ױMCFȘaP釜"̔'Qs\N>Ad\-Wjk|tk܆\\~59Nw04bz'Qs~ȹ[vݚ|~g}5ǵ>ul;ϯ:[s}Ϻ峨}J` /eV;f1El{Sb"*K,(+HX !y}0d6_¡cVxv%THK;TV'z̝WԅVpm^'W;huSHV6\+Wc_ 6vϒy[Dɪ{+Q)2ח^CZk=&>9fZs̪4X͠sG(E! UL-=)dmrtwpyL -n"mUCyGmkZijYs4f-mdyUYP Vf ' Z1U6Y3Պo\WYL%G~q$ 5ɜqh0> (L ]`_]7ZF4X! n͗t|YF솵7 =}b3^<r%)VgRR̸HmC]7%\̓'W?g螃;㭹^:$( 9|QΗsu39 5Ψ\'Ԝ;sPsjuB͹39 5Ψ\՜sPsjeBy09 5\&ԜsPsjΥQ͉{(1&> @ p2$" @ $ IX @NnI? @ @ vò`$ @ XȰXRA @B#A @ @Œ @@Ȱ, @ @ 2,~ @@eH@ @a @ 2, F@ @% % @ ,aY0 @@,dX,) @ d! ˂  @b bI@ @ dX @ KK ?@ @Y ò`$ @ XȰXRA @B#A @ q|&GV'{3(CBor~Q 9?|9=x];sPsjuB͹39 5Ψ\'Ԝ;sPsjεQy09 5\&ԜsPsjeBy09 5\՜HP @@6Ȱl( @ @ C뷏~;ٵO`jzȰYZ}wor~͹zuf!KzAn>|&7>UFruuCO({9\]\}e^7(;fo:Y|֗OnLC>5|}5Lmor>Cf7~b8s]Cfꓨ9Q׺V1{է|z۳'$jq흜=Ը)Os>uT?9ݏ,9|r>b LM{gYT7moF׭gݪ8t¹4[U>w+O511Y|V2hP *fAK "PSR-u'W:cKsv@t)q2f*PS~@]IUVLj*ݥhtA^A,-{nCպIm2v^AF,h DP93g|&l#jJm"8)%uWۢ[]2+H^*ޖ)@)LR_ h^a6wrSYRw-))T]mKu:Zu&y`̥9& `*on`h%*m`)]*]ZHOOm-KNI5+2q HUխ,o|m@GM>F8c:޳MXtkzbJ޳bR0hEJ~w.(r{eqƺM>F8 O޿1=' v-ŔeAR֜SmE ;cL|z"7{ (gn XQElUL6D6- tdnZ⮚2wL1j`19gkj+^S[YaD[Z,bԩޗsSG2Jbfҭ:` :_V'Tcl2p0xE.!;C8Y<0栐pB4ZFk0 x0Kxe0LyZS_wudծOI㟫o5X(OZ%ܫ%m_ٶ G^zz> ='0|')1ǞbXLw)& vxȋIfRj)Z8K_]>_]cG^css G6(_< WO̝ØNig7c: s{tzMq}\˓["K_uVv^OUpVb3ٓcf#C_>92lmBK'J/Q糺aZ,W !ZNS}~Д+)2d9Hq%GVUcMmۇllYn]fD2UQj ,;Օ^c>󕝪̕E|-9YL. O؆" l(,r}ɳԿchUڴCa(7o)m Ǵ57 (LWP5uOkja^V=0TV}ZV^0Az!h-yp%7 tkۆBkULvJ4w~y@[g=;/2שZ41+KhR~,R~8{N`|E鳘@a>+l>nf]e)VcZB9tH N1131@`Yc?J]CϺ5u.?[)96&[=d1bƳUz{5<ͳް^[iq{5<Cma^%m6s/لClɟZÃ8X٪a8<<)Q[iq qxp{!wJRI|{5<(y&NALг13OZ"yEݚZFQbcb:mT󝂚|RPyk?  @@UCI"@ @1^Jt]ǯ?f|tVw_]C5j搏d,IRm䞛G7$&WݿQp3v %Mz^=:Я @sdxőGB5;n&ʭAfXaT?81kgpPԭvvG#3(r<AW9zxA9 2գwwg|tk򂩎w4;5Dw75U>$,Odd.yJ嵍e8}<}Vubf,?}<oo {hl- S^pVyzCrݷʣݷnf7^xyy oGokp2SSz:7#SHY%G-p$I0sznRɑT㮔RIH6֐MQVRɑ&=5+J*7929uWhy++% ʭa"OYRɑ9rӚw t3{jʚ6sGtܕ{jYBjM*792_zVfK2_ʒˎX3 1"J.;[!r7#) (1#ᚅ6A)M ”p#%Ve5v.%J5҇e_|$EjHyK<#t#%e$. S{NLRLI9/jHϖRفJFN֮()$HM4XLmRkDYFY5YlMIwdX.ʹ"5+&wQ k03uMUioj8aoyW yʫ^~0f5)IIb2rP1WOL]Ę> 뉙Zg C [Ձ"Ve`A41EG -,H y1friJo,~nlLsZ QZy`ލD[I֤Ē&\JbKУ?ҭ5XE}EV coԽk0s%k0k6[`M8}\K:WjOtX ЗK"0|'6tkD+1IUT+$alJ,Sy_ux7U/i5] /ϻ)}EC2cݞHSt5rsdJ̜wB\7f澢 QʝZ41ν5c{+=./$dI_.%ʳ1U=9LZW\OςQUY>I ޱNc0up~}|Lkt>cuLkXDGĖTD_*15J/#Gm2L*je"C A/lI&C`Lk'x6_u&xlFnu#L156>w=1KtTIlLmc>+Ju[g뙧V^7[ ۘs+ZM+by_yI[ێxx_ڡնR^Rh$\yΝ2EM==Z:̝0px~+ZmFаS=3.p0LV{5<yeرkx'`cygFM U nwDl;ѳ\ql%vG{!֒fGXÃ{e$]懇{PcM燇VƳUz MvJ2?&f{!9ukg#ALeO0Мy۫u+2Jo/"Qԭkx V̏yYvJGX1n@In߆sY[UqͦFb70]YV$$i'9)H/6^w@9)feZEV)&J/֭V6yͬ[KNc>c%1yK|tXSI=1%Vֈ.tWCsL~ܥ;֤J'?tk|IIqPLI5:O|[S @*HbF&?tkLk󉽔 @@aneC @@s @ tJNKl@ @=4]f@ @cȰ7!@  z5j @:& x( @2]f@ @cȰ7!@  z5j @:& x( @2]f@ @cȰ7!@  z5j @:& x( @2]f@ @cȰ7!@  z5j @:& x( @2]f@ @cȰ7!@  z5j @:&P?Λ,qnT jԨ j>mT󝂚|RPyk? c;5bS?}<}(V4sVyѭtNj(c%! ԔRj3wDνԠ2Jm,)<FG` c)<%dZ#A5$WTnrV2\EYI&G\k 0E1rkWS,P"(ּoHܔ<)_j3wDV/K詩g5 m5|73By#]4:t|b3)%uѭ&]ftڳFα#A 4RJ.;[עb"rGt0"]ΥDV[-Ljyt .sҧXR;[{N+=s[`FNt =3(zjdI4VCZ_Y{ݕJUV7٤֚crNoݑa+_r.*.);&v\# J9 U,_rU|heP*aI@y+&[I 19c>zHskw'Z -||?̨Sg2&Vj;M5ypҡǶQuVG^%ĂL&t@;ξJ@fd^b!$ $)̦73VJ)KQe ubVtT!.۰t}{llUmp GzƼ3ݚ7#Q@<G|uzW" *KWbpJ}XJ֘):ZВk m[(L^;:M/`y_qIeGmƵ}KQ|1'{! )Zb^շCf3oƫ3H8v56nt(&2$K0G=9 LT^n͟0̕ű[Rߕ[kZH™xנĔXT1A;{q.dٽ"m Fh5Qݍi5,pLJf0*Wze)T f.4z3t[g*i2mP(WzL&!YI 6,U^pP|s6fPe ;k1~yG^QecZkl|aƴظ$'8i `OVeҭ2l^_EbIac,r2bY|) LPVRɉ*:(:*GŒ&SD1t묅)`N NWu3I_*-ׯ`YLY4K0Y!# b/9ow_ p $ gIl XsyK2*K*zbb b2۰>I%9H!rhoA@! ?$S3u\>heZJV`Sѥn3gC9 m6Ͻ\Eǒ?2f!^/D%T:B= $VI;i\Ã<̰mu8<=6̳Ұ^κA~%p(ɶ6YiI[ 4} nC/26c~i2U(mmwJԭr#K6P>[g^Ã1g Sgggn擓K3l޽{M~uK|m77M5ݼy u떒8Kࠒtzz&s玒8IJTӵkܐ{)@0#%ԚʒˎXkHѭ\7RJ.;[Mˈ.QRwjRIԍ7RJ.;[t26#%JʒˎXkHd #6'I'_*(9bxmL*G蒞r$0%ГUSpOtIO9L Jp)^X)ZVhm!d5,#./(ςu-ɶ*P"$F 4$+Z*Aҭ%F0\krU.vɰN7\a[+;(Km*#oh0|yA1Q`9Б,g2DhĖl:H$Y^!h( ƊuZ3vIDAT_ Α̻8_1:jmG^`1 ;)9 @N\/@`y V(Gy2L6i^B @3n1%emLviV>hVN`Tɞ&,Q9 uTʞ&,Q*UIឞsXeO33y N7gs/cRmq,Lٲ'm螞g25˞f^Y )z+I-CU≮.4'4Xĕ=≮ 9[ˮ@@p eؘrט܃LJ/[yLVPzYc"ʕ[c>s`Zc>c9R󙻶A f]H926W3]q}JD./a^T|Ug[B*I%3xQb# a%:$dyR_d[&vL-3{,kW1XD_6泼$~|Ld{ݿ5OMEժ V'O9B||VJbKVW̽X-# -#(Ն+T)s3(̘!,cSbB;@ 0EG)IE L:SCZL1Xeq1Uh0dj֭rVӬ%M&W4bL;Ӭ%M&WdY &UfMh0Gq%LQʔY+L0tU8k$ CYU[ TvٺN;k`C) -eEZJͫZJVTJƤh0=U` ҧ.Q%zU) @`0Pۓ<ZNx*+0Jfn6Э+=2UɄ %b{ruJTV6B&=9̃guuYk6Jo{r:)q erļAۓC[DGd ŗl¡| dEy%d`Ay%!>p,a丼v(RĎ!X0qb# $>,)󫯾/Ȏ- |嗳ßgƭnUf@0)䈝l^hUàq]ޤAY5PJe]]2#2H2MHR婩W(J%:$v0AJ,ٚ +ȪP g@m dl-7 J-~R50iª,OME2ji0=V4܄@ S41)tXnR窕A`_f,ϣ(c*?GEy=/VVg><`Jy_ˋ,Qؑa}]ݥ[g]_bY 6 &?Z*S4죸Uh0JTdŕ2E)_W4bsmU*IW4b2֙*`.2E)&Sn3!@YzESC)D`9T4SgW4Xvι :uTԫZJ٫ZJ%:$V)iPJM6 H@64K$g)P^;`̖4(!X0qb#ْ<KJ<`2vJ\,XtcƲŏ%9۫uk|FyQ̃g~gZ~̨)f`zfЋ1Jsm6̃gu;p2<=2UeXbĶ@4펨[ # (;<<47|Sq/_Ύ- ï\[{edǖe_~=;$ݻ7nȎ- }vv[cKo޼~Νؒ{eǖ^v-;w͎- |ؒz+;>ʎ- tRI8 `<@ @X2lL@ @d  @%۰Ed2@ @{LӰ=|@  kA9!@ =& g @@ Ȱԙ @cȰ=|@  kA9!@ =& g @@ Ȱԙ @cȰ=|@  kA9!@ =& g @@ Ȱԙ @cȰ=|@  kA9!@ =& g @@ Ȱԙ @cȰ=|@  kA9!@ =& g @@ /=2Ŋ  @$ȰYg`>\ƴX!@ |`j8Th>K2kc]-A @hK`]Fw bL㟆Y?WɰHIl0! @6\~[ݻwU2̤=71Q! @ &EWppu`<aK ` @+\2lٱd@ @:y;O [Q! @6Bhݿ\x.o}[g!Òp @ ' Ց?32{VA2  @@KRM-YM9P[- @ I xW02a3/ @@R۰ PCm`Y @ `~=l`!ϻu!t>X!@ 8t9R:%mR< @@ 8  =І@+ @ oƮ =aynw)  @ R6%@ @=@[ @ l@۰2$! @ N mX\( @L8XB @"fFIENDB`terminal-colors-3.0.1/setup.py000066400000000000000000000020321361340566300163430ustar00rootroot00000000000000from setuptools import setup, find_packages import os def description(): path = os.path.join(os.path.dirname(__file__), "README.md") with open(path) as readme: lines = [] for line in readme: if line.startswith("Installation"): break lines.append(line) return "".join(lines).strip() setup(name='terminal-colors', version='3.0.0', description='Utility to test color capabilities of terminal.', long_description=description(), author='John Eikenberry', author_email='jae@zhar.net', url="https://github.com/eikenb/terminal-colors", scripts=['terminal-colors'], packages=find_packages(), classifiers=[ 'Development Status :: 6 - Mature', 'Intended Audience :: End Users/Desktop', 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', 'Environment :: Console :: Curses', 'Topic :: Terminals', 'Topic :: Utilities', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 3', ], ) terminal-colors-3.0.1/terminal-colors000077500000000000000000000472601361340566300177050ustar00rootroot00000000000000#!/usr/bin/env python3 """3.0.1 John Eikenberry GPL-3+ http://zhar.net/projects/ Copyright Copyright (C) 2010-2020 John Eikenberry License This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Description My goal in writing this script was to provide all the functionality of all the various perl/sh scripts found around the web in one place with some additional bells and whistles. It automatically detects 8, 16, 88, 256 color capabilities (via ncurses) and displays the appropriate color charts. It can display the colors as blocks or (2d) cubes optionally with color values overlaid in int or hex values. It can show the full rgb text string as well. It can also show the display with a vertical (default) or horizontal orientation. It has the option of additional padding and supports -h --help as well. It also works as a utility for converting between 256 and 88 color values. Development A note on coding style. I was playing around with using classes as simple module-esque namespaces; i.e. having classes that have all staticmethods and never get instatiated. As a side effect of this it makes calls at the module level thus this script is not really importable, thus limiting reuse. Contributors Isaac Cammann - cube display bugfix Jan Larres - submitted patches for.. - compact rgb display - use of color intensity to determine foreground contrast color - 16 color SGR ANSI chart - 88 color rgb display bugfix """ from __future__ import print_function __version__ = __doc__.split('\n')[0] import sys import curses from optparse import OptionParser, OptionGroup, make_option from math import ceil, sqrt from inspect import getdoc from functools import wraps # output constants fg_escape = "\x1b[38;5;%dm" bg_escape = "\x1b[48;5;%dm" clear = "\x1b[0m" def _get_options(args): """ Setup and parse options. """ option_list = [ make_option("-b", "--block", action="store_true", dest="block", default=True, help="Display as block format (vs cube) [default]."), make_option("-c", "--cube-slice", action="store_true", dest="cube", default=False, help="Display as cube slices (vs block)."), make_option("-f", "--foreground", action="store_true", dest="foreground", default=False, help="Use color for foreground text."), make_option("-l", "--rgb", action="store_true", dest="rgb", default=False, help="Long format. RGB values as text."), make_option("-n", "--numbers", action="store_true", dest="numbers", default=False, help="Include color escape numbers on chart."), make_option("-o", "--ansicodes", action="store_true", dest="ansicodes", default=False, help="Display 16 color chart with SGR ANSI escape codes."), make_option("-p", "--padding", action="store_true", dest="padding", default=False, help="Add extra padding (helps discern colors)."), make_option("-t", "--test", action="store_true", dest="test", default=False, help="Run tests."), make_option("-v", "--vertical", action="store_true", dest="vertical", default=True, help="Display with vertical orientation [default]."), make_option("-x", "--hex", action="store_true", dest="hex", default=False, help="Include hex color numbers on chart."), make_option("-z", "--horizontal", action="store_true", dest="horizontal", default=False, help="Display with horizontal orientation."), ] parser = OptionParser(version=__version__, option_list=option_list) convert_option_list = [ make_option("-r", "--256to88", action="store", dest="reduce", metavar="N", type="int", help="Convert (reduce) 256 color value N to an 88 color value."), make_option("-e", "--88to256", action="store", dest="expand", metavar="N", type="int", help="Convert (expand) 88 color value N to an 256 color value."), ] group = OptionGroup(parser, "Conversion options") group.add_options(option_list=convert_option_list) parser.add_option_group(group) (opts, args) = parser.parse_args(args) return opts # instantiate global options based on command arguments options = _get_options(sys.argv[1:]) # don't allow -f by itself options.foreground = options.foreground and ( options.numbers or options.hex or options.rgb) class _staticmethods(type): """ Got tired of adding @staticmethod in front of every method. """ def __new__(mcs, n, b, d): """ turn all methods in to staticmethods. staticmethod() deals correctly with class attributes. """ for (n, f) in d.items(): if callable(f): d[n] = staticmethod(f) return type.__new__(mcs, n, b, d) def _cached(f): """ Memoize function w/ no params """ _cache = {} @wraps(f) def cache(): if None not in _cache: _cache[None] = f() return _cache[None] return cache class term16(object): """ Basic 16 color terminal. """ __metaclass__ = _staticmethods def label(n, esc): """ color label for 256 color values >>> options.numbers = True >>> term16.label(95, lambda n: '') ' 95 ' >>> options.numbers = False >>> options.hex = True >>> term16.label(95, lambda n: '') ' 5f ' """ if options.numbers: return esc(n) + "%3d " % n elif options.hex: return esc(n) + " %2x " % n return esc(n) + " " def _render(): """ 16 color info >>> term16._render()[0][-1] '\\x1b[48;5;7m\\x1b[38;5;15m \\x1b[0m' >>> len(term16._render()) 2 >>> len(term16._render()[0]) 8 """ if options.foreground: esc = lambda n: fg_escape % n else: esc = lambda n: bg_escape % n + fg_escape % (15 if n < 9 else 0) return [[term16.label(n, esc) + clear for n in range(8)], [term16.label(n, esc) + clear for n in range(8, 16)]] def ansicodes(): """ base 16 SGR ANSI escape codes >>> term16.ansicodes()[0][:6] [' 0m ', ' 1m ', ' 30m ', ' 1;30m ', ' 31m ', ' 1;31m '] >>> term16.ansicodes()[1][:6] [' ', ' _ ', ' 40m ', ' 41m ', ' 42m ', ' 43m '] >>> len(term16.ansicodes()[2]) 18 >>> term16.ansicodes()[2][17][0] '\\x1b[1;37m\\x1b[_ gYw \\x1b[0m' """ fg_codes = ['0m', '1m'] + [fg for pair in [["{}m".format(i), "1;{}m".format(i)] for i in range(30, 38)] for fg in pair] bg_codes = ["_"] + ["{}m".format(n) for n in range(40, 48)] x_labels = ["%6s " % fg for fg in fg_codes] y_labels = [' ' * 6] y_labels.extend(["{: ^5}".format(bg) for bg in bg_codes]) text, esc_code = " gYw ", "\x1b[%s" codes = [[esc_code % fg + esc_code % bg + text + clear for bg in bg_codes] for fg in fg_codes] return x_labels, y_labels, codes def ansicodes_display(): """ 16 SGR ANSI escape codes in traditional format """ x_labels, y_labels, codes = term16.ansicodes() print(' '.join(y_labels)) for i, code in enumerate(codes): print(x_labels[i], end='') print(' '.join(code)) def display(): """ display 16 color info """ print("System colors:") colors = term16._render() padding = ' ' if options.padding else '' for r in colors: print(padding.join(i for i in r)) if options.padding: print() class term256(term16): """ eg. xterm-256 """ @_cached def _rgb_lookup(): """ color rgb lookup dict >>> term256._rgb_lookup()[16] (0, 0, 0) >>> term256._rgb_lookup()[128] (175, 0, 215) >>> term256._rgb_lookup()[255] (238, 238, 238) """ # color increment is based on xterm/rxvt palette cincr = [0] + [95+40*n for n in range(5)] color_rgb = [rgb(i, j, k) for i in cincr for j in cincr for k in cincr] color_rgb = dict(zip(range(16, len(color_rgb)+16), color_rgb)) greys = [rgb(*((n,)*3)) for n in range(8, 248, 10)] greys = dict(zip(range(232, 256), greys)) color_rgb.update(greys) return color_rgb def _to_rgb(n): """ Convert color value to rgb tuple. >>> term256._to_rgb(128) (175, 0, 215) """ return term256._rgb_lookup()[n] def _rgb_color_table(): """ 256 color info >>> term256._rgb_color_table()[0][0] '\\x1b[38;5;16m 16: \\x1b[38;5;255m\\x1b[48;5;16m#000000\\x1b[0m' >>> term256._rgb_color_table()[-1][-1] '\\x1b[38;5;255m 255: \\x1b[38;5;16m\\x1b[48;5;255m#eeeeee\\x1b[0m' """ rgbl = term256._rgb_lookup() label_num = "% 4d: " label_val = "%s" if options.foreground: render = lambda n: fg_escape % n + label_num % n + \ label_val % str(rgbl[n]) + clear else: render = lambda n: fg_escape % n + label_num % n + \ fg_escape % (16 if rgbl[n].is_light() else 255) \ + bg_escape % n + label_val % str(rgbl[n]) + clear return [[render(n) for n in [i+j for j in range(6)]] for i in range(16, 256, 6)] def _rgb_display(): """ display colors with rgb hex info """ colors = term256._rgb_color_table() padding = ' ' if options.padding else '' while colors: rows, colors = colors[:6], colors[6:] if not options.horizontal: rows = zip(*rows) for r in rows: print(padding.join(i for i in r)) if options.padding: print() print() def _colors(): """ 256 color numbers """ return [[i+j for j in range(6)] for i in range(16, 232, 6)] def _greyscale(): """ 256 greyscale numbers """ return [[i+j for j in range(12)] for i in range(232, 256, 12)] def _render(palette): """ compact 256 color info """ if options.foreground: esc = lambda n: fg_escape % n render = lambda n: term256.label(n, esc) + clear else: esc = lambda n: fg_escape % \ (16 if term256._to_rgb(n).is_light() else 255) render = lambda n: bg_escape % n + term256.label(n, esc) + clear return [[render(n) for n in i] for i in iter(palette)] def _compact_display(): """ display colors in compact format """ colors = term256._render(term256._colors()) if options.cube: _cube_display(colors) elif options.block: _block_display(colors) print() greys = term256._render(term256._greyscale()) padding = ' ' if options.padding else '' for r in greys: print(padding.join(i for i in r)) if options.padding: print() def display(): """ display 256 color info (+ 16 in compact format) """ if options.rgb: print("Xterm RGB values for 6x6x6 color cube and greyscale.") print() term256._rgb_display() else: term16.display() print() print("6x6x6 color cube and greyscale:") term256._compact_display() class term88(term16): """ xterm-88 or urxvt """ @_cached def _rgb_lookup(): """ color rgb lookup dict """ # color increment is based on rxvt palette cincr = [0, 0x8b, 0xcd, 0xff] color_rgb = [rgb(i, j, k) for i in cincr for j in cincr for k in cincr] color_rgb = dict(zip(range(16, len(color_rgb)+16), color_rgb)) greys = [rgb(*((n,)*3)) for n in [0x2e, 0x5c, 0x73, 0x8b, 0xa2, 0xb9, 0xd0, 0xe7]] greys = dict(zip(range(80, 88), greys)) color_rgb.update(greys) return color_rgb def _to_rgb(n): """ Convert color value to rgb tuple. """ return term88._rgb_lookup()[n] def _rgb_color_table(): """ 88 color info """ rgbl = term88._rgb_lookup() label_num = "% 4d: " label_val = "%s" if options.foreground: render = lambda n: fg_escape % n + label_num % n + \ label_val % str(rgbl[n]) + clear else: render = lambda n: fg_escape % n + label_num % n + \ fg_escape % (16 if rgbl[n].is_light() else 87) \ + bg_escape % n + label_val % str(rgbl[n]) + clear return [[render(n) for n in [i+j for j in range(4)]] for i in range(16, 88, 4)] def _rgb_display(): """ display colors with rgb hex info """ colors = term88._rgb_color_table() while colors: rows, colors = colors[:4], colors[4:] for r in zip(*rows): print(''.join(i for i in r)) print() def _render(palette): """ 88 color info """ if options.foreground: esc = lambda n: fg_escape % n render = lambda n: term88.label(n, esc) + clear else: esc = lambda n: fg_escape % \ (16 if term88._to_rgb(n).is_light() else 87) render = lambda n: bg_escape % n + term88.label(n, esc) + clear return [[render(n) for n in i] for i in iter(palette)] def _colors(): """ 88 color numbers """ return [[i+j for j in range(4)] for i in range(16, 80, 4)] def _greyscale(): """ 88 greyscale numbers """ return [range(80, 88)] def display(): """ display 16 + 88 color info """ if options.rgb: print("Xterm RGB values for 4x4x4 color cube and greyscale.") print() term88._rgb_display() else: padding = ' ' if options.padding else '' term16.display() print() print("4x4x4 color cube and greyscale:") colors = term88._render(term88._colors()) if options.cube: _cube_display(colors) elif options.block: _block_display(colors) print() greys = term88._render(term88._greyscale()) for r in greys: print(padding.join(i for i in r)) class rgb(tuple): """ An RGB, (red, green, blue) tuple. Takes integers. """ def __new__(cls, r, g, b): """ We want 3 colors. """ return super(rgb, cls).__new__(cls, (r, g, b)) def __str__(self): """ Display in compact rgb format. """ return "#%02x%02x%02x" % self def is_light(self): """ Is this color light (or dark). """ red, green, blue = self[0], self[1], self[2] intensity = red*0.2126 + green*0.7152 + blue*0.0722 return intensity > 127 def _cube_display(colors): """ Display color cube as color aligned flatten cube sides. """ padding = ' ' if options.padding else '' if options.horizontal: def _horizontal(colors): size = int(sqrt(len(colors))) for n in (n*size for n in range(size)): colors[n:n+size] = zip(*colors[n:n+size]) while colors: rows, colors = colors[:size*2], colors[size*2:] for n in range(size): print(padding.join(i for i in rows[n]+tuple(reversed(rows[n+size])))) if options.padding: print(padding) if colors: print() _horizontal(colors) else: #options.vertical - default def _vertical(colors): size = int(sqrt(len(colors))) top = [colors[n:len(colors):size*2] for n in range(size)] bottom = [colors[n+size:len(colors):size*2] for n in reversed(range(size))] for group in [top, bottom]: for rows in group: for r in rows: print(padding.join(i for i in r), end=' ') if options.padding: print(padding, end=' ') if options.padding: print() print() _vertical(colors) def _block_display(colors): """ Display color cube as cube sides organized by color #s (default). """ padding = ' ' if options.padding else '' size = int(sqrt(len(colors))) if not options.horizontal: for n in (n*size for n in range(size)): colors[n:n+size] = zip(*colors[n:n+size]) while colors: half = size*(size//2) rows, colors = colors[:half], colors[half:] for n in range(size): for r in rows[n:len(rows):size]: print(padding.join(i for i in r), end=' ') if options.padding: print(padding, end=' ') if options.padding: print() print() if colors: print() def convert88to256(n): """ 88 (4x4x4) color cube to 256 (6x6x6) color cube values """ if n < 16: return n elif n > 79: return 234 + (3 * (n - 80)) else: def m(n): "0->0, 1->1, 2->3, 3->5" return n and n + n-1 or n b = n - 16 x = b % 4 y = (b // 4) % 4 z = b // 16 return 16 + m(x) + (6 * m(y) + 36 * m(z)) def convert256to88(n): """ 256 (6x6x6) color cube to 88 (4x4x4) color cube values """ if n < 16: return n elif n > 231: if n < 234: return 0 return 80 + ((n - 234) // 3) else: def m(n, _ratio=(4./6.)): if n < 2: return int(ceil(_ratio*n)) else: return int(_ratio*n) b = n - 16 x = b % 6 y = (b // 6) % 6 z = b // 36 return 16 + m(x) + (4 * m(y) + 16 * m(z)) def _terminal(): """ detect # of colors supported by terminal and return appropriate terminal class """ curses.setupterm() num_colors = curses.tigetnum('colors') if num_colors > 0: return {16:term16, 88:term88, 256:term256}.get(num_colors, term16) def main(): if options.test: print("Running tests...") import doctest doctest.testmod() print("Done.") elif options.reduce: v = convert256to88(options.reduce) # reconvert back to display reduction in context print("%s (equivalent to 256 value: %s)" % (v, convert88to256(v))) elif options.expand: print(convert88to256(options.expand)) else: term = _terminal() if term is None: print("Your terminal reports that it has no color support.") else: if options.ansicodes: print(getdoc(term16.ansicodes_display)) term16.ansicodes_display() else: term.display() if __name__ == "__main__": main()