pax_global_header00006660000000000000000000000064124076536240014523gustar00rootroot0000000000000052 comment=f42b554bf7f006936130c9bb4f971afd2d87f671 gocolorize-1.0.0/000077500000000000000000000000001240765362400136755ustar00rootroot00000000000000gocolorize-1.0.0/.gitignore000066400000000000000000000000151240765362400156610ustar00rootroot00000000000000*.swp *.test gocolorize-1.0.0/LICENSE.txt000066400000000000000000000021251240765362400155200ustar00rootroot00000000000000# This is the MIT license # Copyright (c) 2013 Aaron G. Torres All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. gocolorize-1.0.0/README.md000066400000000000000000000067411240765362400151640ustar00rootroot00000000000000 #Gocolorize Gocolorize is a package that allows Go programs to provide ANSI coloring in a stateful manner. Gocolorize is ideal for logging or cli applications. ![colored tests passing](https://raw.github.com/agtorre/gocolorize/master/screenshot/tests.png) [![wercker status](https://app.wercker.com/status/ee73c1abee9900c475def6ff9a142237/s "wercker status")](https://app.wercker.com/project/bykey/ee73c1abee9900c475def6ff9a142237) ##Features - Stateful ANSI coloring - Supports Foreground and background colors - Supports a nuber of text properties such as bold or underline - Color multiple arguments - Color multiple interfaces, including complex types - Tests with 100% coverage - Working examples - Disable ability for portability ##Install Gocolorize To install: $ go get github.com/agtorre/gocolorize ##Usage Ways to initialize a Colorize object: ```go //It can be done like this var c gocolorize.Colorize c.SetFg(gocolorize.Red) c.SetBg(gocolorize.Black) //Or this c := gocolorize.Colorize{Fg: gocolorize.Red, Bg: gocolorize.Black} //Or this c := gocolorize.NewColor("red:black") ``` Once you have an object: ```go //Call Paint to take inputs and return a colored string c.Paint("This", "accepts", "multiple", "arguments", "and", "types:", 1, 1.25, "etc") //If you want a short-hand closure p = c.Paint p("Neat") //To print it: Fmt.Println(p("test")) //It can also be appended to other strings, used in logging to stdout, etc. a := "test " + p("case") //The closure allows you to reuse the original object, for example p = c.Paint c.SetFg(gocolorize.Green) p2 = c.Paint Fmt.Println(p("different" + " " + p2("colors"))) ``` Object Properties: ```go //These will only apply if there is a Fg and Bg respectively c.ToggleFgIntensity() c.ToggleBgIntensity() //Set additional attributes c.ToggleBold() c.ToggleBlink() c.ToggleUnderLine() c.ToggleInverse() //To disable or renable everything color (for example on Windows) //the other functions will still work, they'll just return plain //text for portability gocolorize.SetPlain(true) ``` ##NewColor String Format ```go "foregroundColor+attributes:backgroundColor+attributes" ``` Colors: * black * red * green * yellow * blue * magenta * cyan * white Attributes: * b = bold foreground * B = blink foreground * u = underline foreground * h = high intensity (bright) foreground, background * i = inverse ##Examples See examples directory for examples: $ cd examples/ $ go run song.go $ go run logging.go ##Tests Tests are another good place to see examples. In order to run tests: $ go test -cover ##Portability ANSI coloring will not work in default Windows environments and may not work in other environments correctly. In order to allow compatibility with these environments, you can call: ```go gocolorize.SetPlain(true) ``` Once toggled, the library will still function, but it will not color the output. ## References Wikipedia ANSI escape codes [Colors](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) [A stylesheet author's guide to terminal colors](http://wynnnetherland.com/journal/a-stylesheet-author-s-guide-to-terminal-colors) ## Special Thanks https://github.com/mgutz/ansi was an inspiration for the latest version. I did a lot of rewriting, removed the 'paints' module, and did a lot of general cleanup. I learned a lot reading this and using this code. gocolorize-1.0.0/examples/000077500000000000000000000000001240765362400155135ustar00rootroot00000000000000gocolorize-1.0.0/examples/logging/000077500000000000000000000000001240765362400171415ustar00rootroot00000000000000gocolorize-1.0.0/examples/logging/logging.go000066400000000000000000000022561240765362400211230ustar00rootroot00000000000000// Copyright (c) 2013 Aaron Torres. All rights reserved. package main import ( "github.com/agtorre/gocolorize" "log" "os" ) var ( INFO *log.Logger WARNING *log.Logger CRITICAL *log.Logger ) type MyError struct { What string } func main() { //Revel Example //first set some color information info := gocolorize.NewColor("green") warning := gocolorize.NewColor("yellow") critical := gocolorize.NewColor("black+u:red") //We could also do this //critical.ToggleUnderline() //helper functions to shorten code i := info.Paint w := warning.Paint c := critical.Paint //Define the look/feel of the INFO logger INFO = log.New(os.Stdout, i("INFO "), log.Ldate|log.Lmicroseconds|log.Lshortfile) WARNING = log.New(os.Stdout, w("WARNING "), log.Ldate|log.Lmicroseconds|log.Lshortfile) CRITICAL = log.New(os.Stdout, c("CRITICAL")+" ", log.Ldate|log.Lmicroseconds|log.Lshortfile) //print out some messages, note the i wrappers for yellow text on the actual info string INFO.Println(i("Loaded module x")) INFO.Println(i("Loaded module y")) WARNING.Println(w("Failed to load module z")) e := MyError{What: "Failed"} CRITICAL.Println(c("Failed with an error code:", e)) } gocolorize-1.0.0/examples/song/000077500000000000000000000000001240765362400164615ustar00rootroot00000000000000gocolorize-1.0.0/examples/song/song.go000066400000000000000000000024241240765362400177600ustar00rootroot00000000000000// Copyright (c) 2013 Aaron Torres. All rights reserved. package main import ( "fmt" "github.com/agtorre/gocolorize" ) func main() { // one way to define a stateful colorizer var green gocolorize.Colorize green.SetColor(gocolorize.Green) g := green.Paint // Another way to do it red := gocolorize.Colorize{Fg: gocolorize.Red} r := red.Paint // now with string construction green_black := gocolorize.Colorize{Fg: gocolorize.Blue} // toggle attributes green_black.ToggleUnderline() b := green_black.Paint //all in 1 line c := gocolorize.NewColor("yellow:black").Paint fmt.Println(b("On the twelfth day of Christmas")) fmt.Println(b("my true love sent to me:")) fmt.Println(g("Twelve"), c("Drummers"), r("Drumming")) fmt.Println(g("Eleven"), c("Pipers"), r("Piping")) fmt.Println(g("Ten"), c("Lords"), r("a Leaping")) fmt.Println(g("Nine"), c("Ladies"), r("Dancing")) fmt.Println(g("Eight"), c("Maids"), r("a Milking")) fmt.Println(g("Seven"), c("Swans"), r("a Swimming")) fmt.Println(g("Six"), c("Geese"), r("a Laying")) fmt.Println(g("Five"), c("Golden"), r("Rings")) fmt.Println(g("Four"), c("Calling"), r("Birds")) fmt.Println(g("Three"), c("French"), r("Hens")) fmt.Println(g("Two"), c("Turtle"), r("Doves")) fmt.Println(b("and a Partridge in a Pear Tree")) } gocolorize-1.0.0/gocolorize.go000066400000000000000000000105641240765362400164060ustar00rootroot00000000000000package gocolorize import ( "fmt" "strings" ) //internal usage var plain = false const ( start = "\033[" reset = "\033[0m" bold = "1;" blink = "5;" underline = "4;" inverse = "7;" normalIntensityFg = 30 highIntensityFg = 90 normalIntensityBg = 40 highIntensityBg = 100 ) //The rest is external facing //Color can be used for Fg and Bg type Color int const ( ColorNone = iota //placeholder here so we don't confuse with ColorNone Red Green Yellow Blue Magenta Cyan White Black Color = -1 ) var colors = map[string]Color{ "red": Red, "green": Green, "yellow": Yellow, "blue": Blue, "magenta": Magenta, "cyan": Cyan, "white": White, "black": Black, } //Can set 1 or more of these properties //This struct holds the state type Property struct { Bold bool Blink bool Underline bool Inverse bool Fgi bool Bgi bool } //Where the magic happens type Colorize struct { Value []interface{} Fg Color Bg Color Prop Property } //returns a value you can stick into print, of type string func (c Colorize) Paint(v ...interface{}) string { c.Value = v return fmt.Sprint(c) } func propsString(p Property) string { var result string if p.Bold { result += bold } if p.Blink { result += blink } if p.Underline { result += underline } if p.Inverse { result += inverse } return result } // Format allows ColorText to satisfy the fmt.Formatter interface. The format // behaviour is the same as for fmt.Print. func (ct Colorize) Format(fs fmt.State, c rune) { var base int //fmt.Println(ct.Fg, ct.Fgi, ct.Bg, ct.Bgi, ct.Prop) //First Handle the Fg styles and options if ct.Fg != ColorNone && !plain { if ct.Prop.Fgi { base = int(highIntensityFg) } else { base = int(normalIntensityFg) } if ct.Fg == Black { base = base } else { base = base + int(ct.Fg) } fmt.Fprint(fs, start, "0;", propsString(ct.Prop), base, "m") } //Next Handle the Bg styles and options if ct.Bg != ColorNone && !plain { if ct.Prop.Bgi { base = int(highIntensityBg) } else { base = int(normalIntensityBg) } if ct.Bg == Black { base = base } else { base = base + int(ct.Bg) } //We still want to honor props if only the background is set if ct.Fg == ColorNone { fmt.Fprint(fs, start, propsString(ct.Prop), base, "m") //fmt.Fprint(fs, start, base, "m") } else { fmt.Fprint(fs, start, base, "m") } } // I simplified this to be a bit less efficient, // but more robust, it will work with anything that // printf("%v") will support for i, v := range ct.Value { fmt.Fprintf(fs, fmt.Sprint(v)) if i < len(ct.Value)-1 { fmt.Fprintf(fs, " ") } } //after we finish go back to a clean state if !plain { fmt.Fprint(fs, reset) } } func NewColor(style string) Colorize { //Thank you https://github.com/mgutz/ansi for //this code example and for a bunch of other ideas foreground_background := strings.Split(style, ":") foreground := strings.Split(foreground_background[0], "+") fg := colors[foreground[0]] fgStyle := "" if len(foreground) > 1 { fgStyle = foreground[1] } var bg Color bgStyle := "" if len(foreground_background) > 1 { background := strings.Split(foreground_background[1], "+") bg = colors[background[0]] if len(background) > 1 { bgStyle = background[1] } } c := Colorize{Fg: fg, Bg: bg} if len(fgStyle) > 0 { if strings.Contains(fgStyle, "b") { c.ToggleBold() } if strings.Contains(fgStyle, "B") { c.ToggleBlink() } if strings.Contains(fgStyle, "u") { c.ToggleUnderline() } if strings.Contains(fgStyle, "i") { c.ToggleInverse() } if strings.Contains(fgStyle, "h") { c.ToggleFgIntensity() } } if len(bgStyle) > 0 { if strings.Contains(bgStyle, "h") { c.ToggleBgIntensity() } } return c } func (C *Colorize) SetColor(c Color) { C.Fg = c } func (C *Colorize) SetBgColor(b Color) { C.Bg = b } func (C *Colorize) ToggleFgIntensity() { C.Prop.Fgi = !C.Prop.Fgi } func (C *Colorize) ToggleBgIntensity() { C.Prop.Bgi = !C.Prop.Bgi } func (C *Colorize) ToggleBold() { C.Prop.Bold = !C.Prop.Bold } func (C *Colorize) ToggleBlink() { C.Prop.Blink = !C.Prop.Blink } func (C *Colorize) ToggleUnderline() { C.Prop.Underline = !C.Prop.Underline } func (C *Colorize) ToggleInverse() { C.Prop.Inverse = !C.Prop.Inverse } func SetPlain(p bool) { plain = p } gocolorize-1.0.0/gocolorize_test.go000066400000000000000000000076571240765362400174560ustar00rootroot00000000000000package gocolorize import ( "fmt" "log" "testing" ) var ( DEBUG *log.Logger WARN *log.Logger ) func TestPaint(t *testing.T) { var blue Colorize //set some state blue.SetColor(Blue) outString := fmt.Sprintf("Testing %s", blue.Paint("paint")) basisString := "Testing \033[0;34mpaint\033[0m" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestPaintString(t *testing.T) { var red Colorize //set some state red.SetColor(Red) outString := red.Paint("Returning a string") basisString := "\033[0;31mReturning a string\033[0m" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestSetColorSetBgColor(t *testing.T) { var whiteRedBg Colorize //set color and background whiteRedBg.SetColor(White) whiteRedBg.SetBgColor(Red) outString := whiteRedBg.Paint("Setting a foreground and background color!") basisString := "\033[0;37m\033[41mSetting a foreground and background color!\033[0m" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestPaintMultipleInterface(t *testing.T) { blue := Colorize{Fg: Blue} outString := blue.Paint("Multiple types of args:", 1, 1.24) basisString := "\033[0;34mMultiple types of args: 1 1.24\033[0m" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestPaintComplexType(t *testing.T) { green := Colorize{Bg: Green} outString := green.Paint("Complex types:", struct { int string }{}) basisString := fmt.Sprintf("\033[42mComplex types: %v\033[0m", struct { int string }{}) if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestInitialize(t *testing.T) { blackOnWhite := Colorize{Fg: Black, Bg: White} f := blackOnWhite.Paint outString := f("Now this is cool") basisString := "\033[0;30m\033[47mNow this is cool\033[0m" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestToggle(t *testing.T) { craziness := Colorize{Fg: Yellow, Bg: Black} craziness.ToggleFgIntensity() craziness.ToggleBgIntensity() craziness.ToggleBold() craziness.ToggleBlink() craziness.ToggleUnderline() craziness.ToggleInverse() outString := craziness.Paint("craziness") basisString := "\033[0;1;5;4;7;93m\033[100mcraziness\033[0m" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestNewAllToggle(t *testing.T) { n := NewColor("yellow+bBuih:black+h") outString := n.Paint("all toggles in 1 line!") basisString := "\033[0;1;5;4;7;93m\033[100mall toggles in 1 line!\033[0m" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } } func TestPlain(t *testing.T) { plain := Colorize{Fg: Magenta} SetPlain(true) outString := plain.Paint("plain", "text") basisString := "plain text" if outString != basisString { t.Errorf("Error: string '%s' does not match '%s'\n", outString, basisString) } else { fmt.Printf("Success: string: '%s' matches '%s'\n", outString, basisString) } SetPlain(false) } gocolorize-1.0.0/screenshot/000077500000000000000000000000001240765362400160525ustar00rootroot00000000000000gocolorize-1.0.0/screenshot/tests.png000066400000000000000000000463351240765362400177350ustar00rootroot00000000000000PNG  IHDRx@Ƌ pHYs  tIME a~' IDATxw`\ŵ-۫vX%rŀ !@x {{/彐^HBz )ƀ1Yꮶve[wΜ93gftL    AAf% $Ri\aUU! t!] o.p]AAuEKIr_ۥ_d`Ј u]7YLOuL#ѕC1½aKǚL}5Y_jk:6;ԚꞔbZ3 E:ؼu~@+rJ*&jg:v/ʅZ9As.!V>;d 2w7VWRQ(S'.+O}=>$@3n4q!j\&\{^kPR#vxq 2A=-=i+!N^X&;3q¥[(M/#ɦܵ%ȸ"Bm_.Ϻ[:Q<[DO?w zH7Q-RVO=7(I/Zvi]^Dׁ'BhOO-ڝl~VS#VTntzswq9&Y9H3MaI#w/l;T "̮@K_IJMy*3 \&D!CG-קT.NOuіY½,{3ʀ5[]w:=(! uVђO^2n=R@s}SUC+2s}|~w4[1'[^3;E9#FՕ!uyryO@8 IJvBx&(Ģ7["o"̲@+ dlѿ-}wIJ s$'\LFzWy0m FZ2H$&rSa]rQ;N3\QZ){ٽ f}`2Uz#v}F lRR yp>NI)3/Cʬ@'$K-.>VGf6bAYh,\$c ;1GuJj,yVML-(JM-gZ|ޝPS {_՗bJOΨ^w~;)ŬWX"S-(%$3Xv; "AWE똈>lL'c{~-/6)Mt\.DC2ySY pzLd3B$Lt_!WOw3tľk8qx<GM$!Ѩ/d&udMJIT:wq$!!%˔iGAf}dI҄LYB*m}5H2e YDA EQ DE)*J&R2oFWLEAcUp{yw}OiRfh ⲪV*mrjʥ`%UFJѧ$J΀#l jF\Vg® Բy6!w[FaUL.] }=ΑQˏ zHʔBʛy+RΝOyBun7>̰Y l[տ$;YZձ:u^?ѺyM27ӓDۤQ eKU%za;k*/-]TS`s#L^Q}0oI!Ch]f~[? ꚋ i>m<" sktֱ[}bu6u#Չ/OO]`m~(iJwZuUI|"5 *t 2@IX I!+tǶhHaWqXP'Y)CXXZYz^jFn.k8(K Ա0OSqփz" I~ ǁXă4y$6^:εsJ2ծXyjzhhv_Bx%Ij<"x-=>avh#._]j}&$jZ~/Z{g%2tkV{Ns,jq̼goKSDCVP>̠h_kT,^2Ri7$!g.~^_q@)?6T&=ʪ-N G!&η[s\+-( H YiI)݃;ҤRi|3-5/X4Ͻe%dzEh(J;ۏЯf_!sz똳oZwlƌQϣ->]S'.uhmq |]fOuAI%$qŃ@+i#ppZ.4;8pv Jz8\t &PMV#[[m󭹥& 3lw &-1ϻ,!pz]{V=atZmۆy?v~8tlW~x,+dNZ'^զ$+wxPS'<0{Lvsz[/ŧ$: G!,2 t"[8@G#u ° 5&K}"uBd^@̩̐07A6/e*G*ѫnyV7nih.r8|9ۗZ~* HWhhv_2BvCns~\u&KsҕTSf'$>|Z'@fTWS$&0,19[Pd&*hXmfueu@||en$1û,bAͭ/Ae,YP5 EK`u=xk("x`{h}7yqO.t]?>;S9 HP?gOQ\1,mX>4/SW}`%Q$o;ꅟOT+xC/!&;ǬׄE!~~5 PPpU o5@ r4՘HE)Z%uUY{ rC¢ JW3 mp Au  E>M7(!ցhxHVܤ^#O`?`N[xk%>ˏ'|;ЏTY6۹o~N.a湷L-[a3;ҊE5o[ZlErΛM(q=6k]MVJJ[֡sPH0~{jN׹x<d Kz WˉPr~eUkns[;@J}ܜUo\-}sq^ Wbzu픊?Rur>.,~ȓL"rz>/!|=#yɣ< ɤ|p5or}3IjEd~7JǜR靟7ܳL>몋#lx8 %x!Lcrܛ*K*_av<𤳇2L{1i;Ye,C)*()ARd3ZC 7V_Y`'z/",Vfawڎ:oQzhQfpZx:swܞ7Td5$u44lVrHRzi Cp}ebk*ƝN,ory!6!<\@<4fӋu_k&5; Rӟ K®[-zij*ܡ{ PϦ~{"Keύ;θ4'%Wn?iSeoVݯ[ z{rY%;=?FxT׬b;@va:Q1(P? W(~INϮ!-3*X ; 9pƩ02OlN 4TJӆY(]?)C HeԤx]AY ?IS-ć+ƽd4Hd4@g__h}`lQ#Sɹ,x8 d\dߺT` #s"ݘ4M>^߉܇p‘?~fRbCŊp"%佼&^GG5 }fla}aZ@XA2̃Nn}jS`(u)gH5ʗ&>/?awqܮeOSN">36׳ @'@{XH̼Q @YJȜ¢88(@'MG, }a?h;~?eKmy|qw{zYeW/ 8!FWPw]$춱wK+:-7mvjBMYuq۪V67Qh 2em/ (+8qcA400&>azdP]DB? @quE:ʜ,sQɟ^_k4~d=]>XyGʟKC$W#\qs!E"G\QW(J$3pu?$B{חMpSU7*YOsPLm桘-Y[ ߫K®_ l75T,vޟ ߗ+zXq}[>WN(M?͞ AUX*O*Ħ=*Ղ'}HB'k]tJ %@W?*-0:_hZH#dbh= ߊV[jj\]=2N=}̮%z;;dOu,eA#?S(XMko]ش龵e&O'Fχ7{[[b=io{W<}kOIZ.}w*zJ"X=$m<=  61|7l][4mkܤRcr-[4w`Tq췿jaUnrϳHZ^a24>p7~3f/AÓD.o0>O[_{3;hD`A7HVd/7x9m֫ATmwC1Wlo{pxܓ r\lݣ[7߳0a."Zj8;?\̴ Sn J#OwFms C@G[tO_\<UiUY:~ dAEr+4BnT F 1ҢLD[Z*J>y͂#W9"nXp-  z ra )p}QbK+<+JqK;spO2-s5} Ngj[޷ziK̺5.8~;LhErՂyP܃mp4jF8Y;r$w]7~_|:ŧ9_4.O?;s?`υvGkhQ~5$ި&Z-Ga# hQ} SRuMdž"bZ^ݓPܒ{ϯ-_3;cC}Fx3'rOSDQ{޼:ÄJw\2H(w_;sۓ`ݹ!3;k{sPR׽jk*.VgP@IM%IGKGH|硬Ӄr۠iA4ߒ5zj=팍ycB0Sk'swzȒp2%sהgwUӇ2å[uEB=R7t'u!:~{s[,N{_hpj΁N>`TpG=~?vvGEKb ~!D`Ȉ)U֕('-anV ⫝& P IDATMXAB$ywZ220]R >xgB;='ϱdVZ~?tw!8yQcaџ+  dNsIAf%(~F,.p8=ASixpp ˱Q[PIJ D\<iKZ5opik7M˳]AfseWX('5M13WjYGGݢ<3YJttz˪ZXӪɩy+Of1Te*FR( 8DŽ'LYUz}kB?KRKis~+/*)/ޞQ3z[VI橎MB@A9#1$_ol_3lΚfXJ˜jN#ۓԥ^44*w$9mݢu,9DŽZWqE/l}ud<{Ҹdy|`et/z{}疻kXZ_#3ku~Ϧotg޷]7mn >hoJLmPAyxOZ-mOXr~RR'%'r\߆u.^KC=-\&h~Z;\oPTL\wP=JqH/b#\h1fHE)Z%uUY~%DN.IjPh s~:ߧZyo&HQ'8 s%"1 @#@n+Y?? g +ڙ1)3{f y_$3GT3+g?nPyv\@3 w>{ Edž%['ZMBni#[L<; 7_w?ohDZ~@;3tgR+ je3|XOKY/!ܝ!j_,ˠ"Dg;Eu:6J^Hy {!s>"ӧFHjg |j TY'9Oُ> 慻S՚P6 @(=BeâJNR~,!R~8~E]hU)G佅E',OKTo'S"!w Z9_g7(( ,F Q>ajz .ߗ$Y/@q Q'.ߗZI\rG&-!wZge ԣ D9Т%tww ß`uhEBNݧ>j&aLn =R+W)He58lh١7 *2ԗgy Eh+Yv>lK(x+]2H.j=!.TLDuVrfJ\z:`/Z4Q!~YjM[I^~>[VJlm\]B4[œKU'Sċ{ ԣDu똳oZwlƌ#/י"1#G/yho*\jwx bFxZ>"oOGeTpXb*I"G:]Iu>]&q̓v}T$nn޻^qVP$sp<UvQt4&̾2~vNVZ@uɟ^I1WϢ9 lRK}(3tT&lQ2Y{E!"POCbqPFp%󭹥& 3l8k;y%=̱G?i (~p}%bz9QJI47>̧is ##D:2B! `UW.:g``r[T;) jEHɨaD,ӥ0& N 5ȏW:z h}QG1yXD #{ $/)Y=U9)P9g@ w <(BQ1` +&K+ISSTMtډ#݉?z3CZ=LJ}yIKaS7U<}k_s'˩ZQ"W 7?"W OM{Զ{Ք"*Lv0&Mav}1ӂCM&J?.s,.Q] vc xbyIXdZ`~$ 0^^ LX;)i(SsZ)0Ԡtv1Ҥ]XD:,*bP J&#"f@=Odg{ԑH ̧yd[xfGa#s?~~q^{p:TÍ5N@t_hkydVP")h &˧#aGLug{:j 5d엏M!(K|-p߇MS *Zz$ۂzJ].oPVKl{Ҙ0M:Xc&">aD)Vx(hY8"A9Ֆ+뱆=ǖ+͇9ntץoy/EFS܅Y_8[2[c=ވZ/^+{+{gnʕ LL+^rRTIOa ԣmD2Dg0xhSFW woR6HӁxh;''} _;n>%H!90J{$x̴y0~6D#I"1@{Ct~ǻhmg sf'ADf :T[3rhOO3ZA@;3l/ZXM -5SN ~u#ӕ^Q["C= /߯̔~DwH)2{i=@I&N*97@0Ӆ%T:2^s3Υ_l;ɳ9|HdYe?XWp#P-Wmo3qyp\ԣQ)qܧ_[4?X#rO; :)D)'}|n2ŗZ4Hu6N{[-b 1Jy_  w48r0KcIR$`(DJ{8dk3\(U:4cuNh^Xs&#c(V~>UrĻnO >^wěSRS(O vq|Yo(闶W "Xt[IL? ;?oPDsE >1@ra^/'T;KVix=2KN4zZ,Gb<KJ#i*3qҪSԎ&NXN^S²wd@XIsw+cA UP#Tlr. 4Ą+!!Y:Fz)WId06ű=hd}|"aZt#i$&W E\R"`(~VZlzmW'g;Odg;JQgf_]jufBJ&,m K#7 )s.BF 5`NW%3򿯐:(Mf8J}=XTxf\ɠmS&ud (hg) Ptջ._Dm iDuM]>ȟV_N[>ڟ`xs/9g 0GWlb2dyzSiD-'?t~g)$퍂9h ˜慍 4+7_m0|jCQ$I.ᢥ_9_s.'2AQg0NߙfgGx\Εo%z}3avOO$12ݝz s2ڜ~o ̥Q̟$0uH(w"BXxB?ԣ:3۟0+98TG'RɞuUB9D!>?6">g&5v'ÆOOhCrA@;3lu οK+_r\wrtxJ?ܛ|@cw=zۓϏgѰ7;!2K-H^T]mOlVd*|emEv{s k-8&Wmz0VR~h߆۞L} U4kf[^/]/(mނ;&˯ӕ(+#%.?nPr~>BoKfL䥷lA?D?DfLEY&fy1;_z`LzAWϭd;9~45exdDuO$xY'QI O-;Tz31d{*7ӕq4s++7mգiDQQM5msVpV!r- _L~JRvӢ?;_;nx;gO]3?2?|ߧy*}M&{hal:a70!r-~aCi=Gܟy響śR.}Mo:>>'c>g?}b&ymNW>\F`{)4C bDIoh8'g"u똳oZwlƌ#B/י"1#BG/yho*\jwx MISgT]]I|D|]fOuAI%$qŃ@+i#ppLJO%p;7#b o=v_Խ 5?ئkw%g^]yWkrmϿ5k>lT&ߘBCZJʩZ |ƝMyK Y0~:b)^GGIWM]&$"NCbqPFp[sKKMf&F9pv JzcwshQ9;3ڙҬ̔&-3)ꡖf*kueAˏѥdSkR^@R cM$7. Ԇy˗,{I98!\{[_\~>fui{#p. ?Do@~#j^}\6f H_~HXxotMIU?Ś;>'>o3-_|H|xG?~\sP}mzՅ:wŨLRO9(o"I,д&}s%v8߭+(Nv _.cӦO_ب8sPeZ4DKɌa% l  ?DUE%>חݼT{u8ُ,Wk/5[;[N{wgnhdI];klvY=4s^pN!rQ} !XXhLz+?<_y w>b=$89GrpOe[1ƪ~g.b½OGF/~볩\Z]?ܟ@߅o~'%5ah鑑>'o:?{ocik/~8zU3vw<"o#=}^ Lȼ:# ho HZz4 hA*hA- N"zyk6MX_{f(8M$qM=ϊKS52n{Gk1_  7p *XlI`6=|Nb׳=V P< # H@ "wz!8Z: ܰ0k ,^PeZ.t\1O5e=!B&J䦦T21hFKGA>'eV-,+0= DeUm K &{ :;-U%̗چ||tAA2z'`hD\c{n/ʤly#B=œ r#Z^oXN;lY&n xmD(2A M刄@ mҬ^pzC,W&N  h?O #㮷=b\]njU^6"M@AAnPPTAA"x1 `EA  `EA  2'`宯.V2<A Q҄F}7/+ZkPR!KgÇu}1fzԝ g5Y+穉~O݀J˒dj_?D~QM(w;Gryu/ rn,v0]/X>.pfMLOp=%)/ۮզ+PV^ s -%3XѼq_E:9}vYyKYpfZ%ϸu|ǡ;9%r5u;"7\&\{^kPR#vU祦hd Zﲆ P2Ӣŕ&9ꪒz_E z@I2 ?Y!Ak!+ U(jiͼ;'`G̈́ Q^V A>v"ەT( dIDATȋk6@+`cVWZY0C+1֝:}%Кywm(?`Z3QD~v&/SYǹNI+Of}O]`m~1}'jAfbչ[Vݵ;O6;M!G$i 4Y?3@%T-Ry0r Ms%7f–nM)[>vޠ$hec_c4 Skp@OW(Lj={ 1U[*6eHRCf 5Ufѭg/ {<^{s}Ӱ*#G5;MAp͋ak8$`kk8cznV`0@IM%I[MBr>A^즇Wd* KEK7ݳJ*W@}vQ6oeZF}N77N웸]]D귇8Xb# "VgPX/A붢et xȧj- |.?Rf^Y)NH [\<Yy暛?#䔌$¹GJfYQ^ C>Vh5T4# j&_+7 P a\^zPRmjEiQ^xp(;}Jwk*ސa-CoM.ш.D   <b# Y PX/Ahw~B,Ț>8x?eե3tDI*cICpc~2qzH*o/clK߷\G{Ok^u썯H1'gT/;N4yMȄ!F;J"VA9ɍFt$u 2:֠$*R8EېeJ4Ca@8DRyoyB6^Y(T1(FJ9IT%SJ&aP57UF4䴇Hhv=7\Sg0Y໻{HSR#\=mGO|OI> !@1x=wz!̨@kl(m(LV+4<# v]3 &27' brTq|$YuqYU RuZ695oџ퉜-(24P6:O5N6ZBRxdiU_FXA3j *6QQN:lAƐbc!jzF^#HAX XPRa4}JA4 -OiRfh*FD>vhY/AH /u u'VVTY/Zk(`2 16wKYĂr[cr6T{tZZiH<{Ҹdy|`'ƙj늷ΐ@e9s^vC+jCuw(QۛOy߾<狚O,Dž ȲJ,RJ(v_p oN[h#G?.Ѯ'Tqƪ a Ӊeqx ͅ 6fPTYU\Q%챇AY =똒W3 m 2 [ 2A=ZA@  ca}Q̓t[KfMn0hQq&i}QbK+ \snJo۶OGvsQ>9dFd"\?a:%,,INR'3s^S(iyWA-8umv]nؒ].۲dɲhK[Xف8uUr.[*<$_''竢/kLJ[ {{nVtͼuoĦ_?9?Xv F|rῶ)׷RMˬeB+.n6L|9]v7B|Mqb5-_f)ܓǹ͖M}wPLJ ݳ>2e;,\zRM.}wrv!]&&B(̝5SMqb5/稌D!|V:4B*"G۸V^3:,om5^h4\46]-ȥ׿(t"0Z>p: @1;ZqB{Z7 d괸^bf|q}Ҙ'T~[6DҶ^w5/řfCzsy);B;($hO߯(o׷>+ ݾi=[>{,a%;VPYpc|Ф]PIKlzy>yq=!HEt;3|sDɽQkէwZj:nr6:)(~ J*VOFFzBdΛh"ohd8eT4MH Utt3>~t6=n^:;.:VR %W:=W^ JmǴhPUDŽIg*r;癆wǜnr#W\G|v{.x(u#6od`.879nfw_ljy|ޯSNǔ1em$ U"3oD[z6|([|,=~|Xj^]Z=[=C̋xj_9Фw;*Iqp 2K7C h@ hA @A -LI4a IENDB`gocolorize-1.0.0/wercker.yml000066400000000000000000000000221240765362400160540ustar00rootroot00000000000000box: pjvds/golang