rainbow-identifiers-0.2.2/0000755000175000017500000000000012425446473015324 5ustar dogslegdogslegrainbow-identifiers-0.2.2/rainbow-identifiers.el0000644000175000017500000002261112425446473021614 0ustar dogslegdogsleg;;; rainbow-identifiers.el --- Highlight identifiers according to their names -*- lexical-binding: t -*- ;; Author: Fanael Linithien ;; URL: https://github.com/Fanael/rainbow-identifiers ;; Version: 0.2.2 ;; Package-Requires: ((emacs "24")) ;; This file is NOT part of GNU Emacs. ;; Copyright (c) 2014, Fanael Linithien ;; All rights reserved. ;; ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions are ;; met: ;; ;; * Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; * Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; ;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS ;; IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ;; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A ;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER ;; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; Commentary: ;; Minor mode providing highlighting of identifiers based on their ;; names. Each identifier gets a color based on a hash of its name. ;; ;; Use `rainbow-identifiers-mode' to enable/disable. ;; ;; Default colors try to be reasonable, but they can be changed by ;; changing the faces `rainbow-identifiers-identifier-'. ;;; Code: (require 'color) (defgroup rainbow-identifiers nil "Highlight identifiers according to their names." :prefix "rainbow-identifiers-" :group 'convenience) (defcustom rainbow-identifiers-choose-face-function 'rainbow-identifiers-predefined-choose-face "The function used to choose faces used to highlight identifiers. It should take a single integer, which is the hash of the identifier currently being highlighting, and return a value suitable to use as a value of the `face' text property." :type 'function :group 'rainbow-identifiers) (defcustom rainbow-identifiers-filter-functions '(rainbow-identifiers-face-overridable) "Abnormal hook run to determine whether to rainbow-highlight an identifier. Two arguments are passed to each function: the position of the beginning and end of the identifier currently being considered. Each function should return non-nil if and only if it considers the identifier to be eligible to rainbow-highlighting. Identifier is rainbow-highlighted only when all hook functions consider it eligible." :type '(repeat function) :group 'rainbow-identifiers) (defcustom rainbow-identifiers-faces-to-override nil "List of faces that `rainbow-identifiers' is allowed to override. It has an effect only when `rainbow-identifiers-face-overridable' is in `rainbow-identifiers-filter-functions'." :type '(repeat face) :group 'rainbow-identifiers) (defconst rainbow-identifiers--hash-bytes-to-use (ceiling (/ (log most-positive-fixnum 2) 8.0)) "Number of bytes of returned hash to actually use.") (defun rainbow-identifiers--hash-function (identifier) "Hash function used to determine the face of IDENTIFIER." (let* ((hash (secure-hash 'sha1 identifier nil nil t)) (len (length hash)) (i (- len rainbow-identifiers--hash-bytes-to-use)) (result 0)) (while (< i len) (setq result (+ (* result 256) (aref hash i))) (setq i (1+ i))) result)) ;; Predefined face chooser: (defgroup rainbow-identifiers-faces nil "Faces for highlighting identifiers." :group 'rainbow-identifiers :group 'faces) (eval-when-compile (defmacro rainbow-identifiers--define-faces () (let ((faces '()) (light-colors ["#78683f" "#43783f" "#3f7178" "#513f78" "#783f5a" "#707e4f" "#4f7e67" "#4f5c7e" "#7a4f7e" "#7e544f" "#783778" "#784437" "#5e7837" "#37785e" "#374478"]) (dark-colors ["#9999bb" "#bb99b4" "#bba699" "#a6bb99" "#99bbb4" "#e0d0a0" "#a3e0a0" "#a0d6e0" "#b6a0e0" "#e0a0bc" "#a7c0b9" "#a7aac0" "#c0a7bd" "#c0afa7" "#b3c0a7"])) (dotimes (i 15) (push `(defface ,(intern (format "rainbow-identifiers-identifier-%d" (1+ i))) '((((class color) (background dark)) :foreground ,(aref dark-colors i)) (((class color) (background light)) :foreground ,(aref light-colors i))) ,(format "Identifier face #%d" (1+ i)) :group 'rainbow-identifiers-faces) faces)) `(progn ,@faces)))) (rainbow-identifiers--define-faces) (defcustom rainbow-identifiers-face-count 15 "Number of faces used for highlighting identifiers. You can increase this value if you define enough faces named rainbow-identifiers-identifier-." :type 'integer :group 'rainbow-identifiers) (defun rainbow-identifiers-predefined-choose-face (hash) "Use HASH to choose one of the `rainbow-identifiers-identifier-N' faces." (intern-soft (concat "rainbow-identifiers-identifier-" (number-to-string (1+ (mod hash rainbow-identifiers-face-count)))))) ;; CIE L*a*b* face chooser: (defcustom rainbow-identifiers-cie-l*a*b*-lightness 50 "The lightness of the generated colors. Internally, this is the L* color coordinate." :type 'number :group 'rainbow-identifiers) (defcustom rainbow-identifiers-cie-l*a*b*-saturation 15 "The saturation of generated colors. Internally, this is the radius of a circle where the X and Y coordinates of a point on that circle are the a* and b* color coordinates, respectively." :type 'number :group 'rainbow-identifiers) (defcustom rainbow-identifiers-cie-l*a*b*-color-count 65536 "The number of different colors to generate." :type 'integer :group 'rainbow-identifiers) (defun rainbow-identifiers-cie-l*a*b*-choose-face (hash) "Use HASH to choose a face with a generated foreground color. The colors are chosen from the CIE L*a*b* color space. If a color not representable in sRGB is chosen, the components are clamped. The color generation can be influenced by changing `rainbow-identifiers-cie-l*a*b*-lightness', `rainbow-identifiers-cie-l*a*b*-saturation' and `rainbow-identifiers-cie-l*a*b*-color-count'." (let* ((bucket (float (mod hash rainbow-identifiers-cie-l*a*b*-color-count))) (angle (* 2 float-pi (/ bucket rainbow-identifiers-cie-l*a*b*-color-count))) (a (* rainbow-identifiers-cie-l*a*b*-saturation (cos angle))) (b (* rainbow-identifiers-cie-l*a*b*-saturation (sin angle)))) (let ((color (color-lab-to-srgb rainbow-identifiers-cie-l*a*b*-lightness a b))) ;; Clamp the color if the result is not representable in sRGB. (let ((i color)) (while i (setcar i (max 0.0 (min 1.0 (car i)))) (setq i (cdr i)))) (list (list :foreground (apply #'color-rgb-to-hex color)))))) ;; Face filter: (defun rainbow-identifiers-face-overridable (begin _end) "Test if the face of the identifier under BEGIN is overridable." (let ((face (get-text-property begin 'face))) (cond ((null face) t) ((listp face) (catch 'rainbow-identifiers--face-overridable (dolist (face* face) (unless (memq face* rainbow-identifiers-faces-to-override) (throw 'rainbow-identifiers--face-overridable nil))) t)) (t (memq face rainbow-identifiers-faces-to-override))))) (defvar rainbow-identifiers--face nil) (defun rainbow-identifiers--matcher (end) "The matcher function to be used by font lock mode." (catch 'rainbow-identifiers--matcher (while (re-search-forward (rx symbol-start (*? any) symbol-end) end t) (let ((beginning (match-beginning 0)) (end (match-end 0))) (when (run-hook-with-args-until-failure 'rainbow-identifiers-filter-functions beginning end) (let* ((identifier (buffer-substring-no-properties beginning end)) (hash (rainbow-identifiers--hash-function identifier))) (setq rainbow-identifiers--face (funcall rainbow-identifiers-choose-face-function hash)) (throw 'rainbow-identifiers--matcher t))))) nil)) ;;;###autoload (define-minor-mode rainbow-identifiers-mode "Highlight identifiers according to their names. Toggle Rainbow Identifiers mode on or off. With a prefix argument ARG, enable Rainbow Identifiers mode if ARG is positive, and disable it otherwise. If called from Lisp, enable the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'." :init-value nil :lighter "" :keymap nil (let ((keywords '((rainbow-identifiers--matcher 0 rainbow-identifiers--face prepend)))) (font-lock-remove-keywords nil keywords) (when rainbow-identifiers-mode (font-lock-add-keywords nil keywords 'append))) ;; Refresh font locking. (when font-lock-mode (if (fboundp 'font-lock-flush) (font-lock-flush) (with-no-warnings (font-lock-fontify-buffer))))) (provide 'rainbow-identifiers) ;;; rainbow-identifiers.el ends here rainbow-identifiers-0.2.2/rainbow-identifiers.png0000644000175000017500000017307312425446473022011 0ustar dogslegdogslegPNG  IHDRtIDATxߏ<d -%q⑒Xv [v0tGcYŴ5Vnk`dkJ0&r@ ȕA@/EV"* X,Vw!"ܢSkusP'mc-O m଻1Ѝ7v>8}ŹhŽӍ5d-E"QEJG[0ҪCUh}Ȁ0|FK>WCuwXqn>(Bdn)6X #]6Zη,OHK ո kcDWIk~=)<݃OUV~VnF}osg/Վ/m]ǵN**Tq7bYV}5[NC8>}#BVybvH8#X%Q(B!EμEua6*1ۚ.[WڅiT{Z6Յ+*Sg̢4=T;USXٓ)V^R[ w|+\ሴO;4k]VF.J,ODϻ?G`F!x#EE02j=,_W["QKgqFգ Qs(A/<}ܡ'PLt>փ:G'~>u1ݛ>r_VFLK>XNd`e"DQ(-Q{!~#ZӶ #j?ŋ (DUgDeǚI3QW(6X` 7>ik- wF}~}FHvE"D ^ #3t #[ -EF*#;rtܑu%:vtLօr`x'}~0*'$"bfcAю'(ZG?3n>Qo#y:ʴ6ʶrA9ţيq?C|C@+=HcHS獳Ku,o?W8#> I8/+^j00"D}DQ`EF !a(-------G>w hEѡ3}2EkjbuTPûm,HL]AUMCcKEn+ׯݺx=t+}unXy_uv9̯jR[ Sl.tP%f[5g #TBwy#*wzޢ[T95Y|E)JKȗ?z X"DQݢʩj-OQ]J~mXEOTqR]mϓF A*={e#4:L-*ts3eΑ?sc@?n[T:;&Cn_QI3:m oՇB-͋0-z\TW+!7x֋[$9^V-3)"DQ7HpsnQ9"[$gR$ɹEEdZlQN3?-mluj_Pu9?nD"DTܢZW%TBΏ[01W=fZA]7D#mFuRBqCg5_z(?n@nh2nQc=QL-ʵQֳF-zmKER0Y-('ț.-[( S-LAt,) # qzscJAA!ULh {m6HEn3k[T c/0 ihDQ-PHGEEa~U[BGa(rGa4Gƭh殹64zqDNAy[:Q܊fkOcWMn)nچZX#WX+NmWpH-Um?y0[4Oxt;oM4USO\EESrZ-:f%nG4ܢhkTFZUz`08H7Z(ڊosKh#rE $-6n`5"-`& 4㫽 /~_to؇ZOu@U,HʬJ𥲐ҳ)HY!QZ*l8D\W-ڻ)'sj uekqqsܢj ^\뤢KK ;3 f!E yT5rEj3j΋IT{9;{_;rR~U j)U˷UPZo.Z'_x]j~"F}!tP%f[چs]MA߽RTfjFi*|¨*D^`JLK~TƸ*T@U?;e̦Q#3%bGֱ2;&wtk/-EBNtKkGS#H4DQo(#B'jn4UPUENEi*1iȯW CC>2;&wtk/-EctpDDn#@S֥6kG Y")F^JzB¨[SݢQZMUH5KH {{:2Sb:|FU覷snT񺘘ྉM !"Jj:^G_Bz}hX>`-s̩wue WZωER}bbEEF5&w4i CChnJ7-[! vHralkeïTj1>Qmdj,4橏쫏S]L-,IԆ0-BuEjw$ƶ6 nQ6JFHBc̾8EɮD">ɒAm""+zmQaGD#.^c<k[#E*ǹstoo/r1E11>ӌ-rB#FEb<k[#E*}_˝g^\clQL4c\ADnGtAi]{&t&nlf #70[8CQ&1o-rgz-[L-sTXd6oQ[$H~-JtGg>ʻE1-ELcEyggޢrb"}t=<ŵ[ (-Q[dil+RlLeIGEV. bV(^H^#ޕD39Ksͯ[d5^huk>N[jk]cnKK;nQ >uq2{2nk &Y,q^k~"{h5D;MS\ q9^إ:ٻ#^''`5ݢxu= ZCň~ eu4XBQ(DnbZ_I#([(D͍0ʇӗ.bFE"DL-˗Oxӆ(bccccccc6"66666666!ز Mo"6666666lܢ k}G9Q JG-(bccccccc˶-:0moFuaՏtBo"6666666l3nک퍃 kh0 4㫽#666666Ellllllllf[TFomcʟ0bcccccc[ QƖm 3&#zCe[-Flllllll !زm$Z[:ˆm7D["P]Wdk:ˆm7D[ܢ\e[tBo"6666666lkvaƶ-p(bccccccc6"66666666!زmnѣ_?" ""9t:?>c8\n_k?lWou}s"DQ(Bdn7ׄ`5ZkE)au>EP_go27#]Ձ!޿"|\驰WUpyذRZdDsHc kO9F=5_egk=8tѹq_l]ǵN**T.h6=uW,'EuiR*KvKk@3Z9B\PQ(B!EμEuadDP%VRZ0is밥rad?~dYF*s.Btsh٣7$>/{ua䊪JT'A)(M%fO7W1F}ceOAe[{Iofi7܍p]#vFpܘrj1%,_j.)?ܣxG!E"Dp$adGu鮶FZFwwՎՅU7FJHH.¨*ʦ4Id0j Hnp{`Qs%A?7ʿ 쫏QzI0_bƏqʉoaOHj4ώnRnQ(B!F[Ám=%YiE@܈v0h?$dU֟*O}7]I~*< WN#ʎ5+h[쫏S]TA59a$'8n-?=puW.' .BO0JnO_}-B!E"DH-bT7/zn@7'`'atwutOIm{e;Io~-r]hSF`!m+pvP[ىZ?hk7ژ{7 Tn7IDC!E"DEе^Jnd Cc0DLPa/"Q!|CZgH18߈"DQ(BE"@`ԧrQ(-0ʴÇ77iw*s!EE2)°cE(--aE"-7attn}GQyA;j[h^E^?~oijW5|:*pܧyEy?>4ݯڇoMvbyFZZx`8ڮ-"; a4 \y%--ghYg{֜_ӗ7FK&w+yoH.g/&7>[jHB>h˟\~q.EKe̪>k^:(B|EF茶FuaUrí퍃 LBMzqY*:w/ZJ,[j-Y}-:{;߮͝wߎQV? n)̳[hVnQ輞˷/=5^9rfVpEzn)-t5aP&zjbI= #`:| 8+o~կ0?J$hA߃WJ?VPU~qjæŦ%7p}x[ޱ{%Գ: ٭(ݟ*ݺWK#2tCH xsjI]p-chDQ9La;KO?8vxY-ݟ _\8V??jU/^8;(J,Eڒȇ;9nOyܥl?{.ϬQ<:miTsUõʃw衬ڵzr}뾒c#@i±FfmNbӕ[TPFo_:TFVQ(:|nv%JVYEzD# k凢bycչҷr}YU8u[S>1ef;"uDEfp~1.EZ}mQ[qnD+=X4z&ֿSJO$E,Dg[in-ȊvO-^Ȩiֈa$7eD'@[4wrgc Q-|! fo._]pCNA1UJ)=||Swnǝv"qܙݢVSb[pQƷZYC't} 尝RE~ =( hBZg2nQzlQ2d{E^wƹˆݎۇ[wd:EnSlwzשg+N۾m̹[4WH)U؃zqnTzlQ@̨;D(-J-*\lVHT%3eݎۇ[wdʻ?Nnt":"F5 y- %EΔ7QaAbUg-J77nұEsUs:}"N|s98- X!!t҆#`#IEuwݢ|<5RI ,-ri6-򍆛tlQ踽Eu@`z-2]rN*-*utE[ZAVיL΄&OD[L-r̂1+hm8/ bZ Rr|u:nh>bGgw9NPt:7Ip(b;Kx4z /(C`ny&Qtl;צfv! bZE[䛷qC#6=#1oqʽ$q]"D9(+j;㼬Vs|kN%EΫrKe'Pۖs7&t\} Ϛn0yT\3鬉&ܟbdHH'.VGC},SuQf8Vآ"y%T r՗s ;!_SS}7Lšhq'?kukqp*&0_5qtZQ+G(i9PT?QA}׸t6 DsǝU}`"DQEqs'#ma 6 E9gZGkrƨ?n4 qgU-ZyQ&cEE"j38pO9s4E[4#b4 nMC7>9U!\YsR絘|ȝO>;jѮ{wΥCQE"DQ05hmZߺkeL=ؿ07^9widHnϏ>x>Ѝ*fs^"f>W>g{aIvE"DQ(-*hkTFZYzȒP;F+ G/v󁭓FF3;Fj{U !E"DQ[vJ zM [qbRKj`J/<}7\a>H7L\`3ϕy:T? JhdY-ɡ˭Rް?P{)pU~}x#[ƹ8atS]9߼/#Wj J=z=ӮKxa$qB/]Zf-6!E"DQμEuadp.R}k[A}ϕyE #A_+W@?[g8{*z@l>[7u5 i+Sly|ӞE!t.Ga|91Y1NJRqBD(?-x#鈡'Q7 5 Q(B!E""I,R+G㫠{?-aOj02Ϝ`~amέЦ #_=nGyD[(B!E"DnQs(~c#nQ֓vXvwQDwJ|h_-ULLQews% #ѤvJjvHQ: #(B!E"DnQ.zkkɏ]mFfz5:(ZwF1z!K|yE<&p^b{9/' #C[sM*|]^ я.-퐶t~:JS3'P`>*E"DQ(BմQ )_>㔅QW׊B1cH@ i?eXG*}FPĨBo鼼=]ǵ2r_w"pY Q%/tx0b%qE"DQ(XUh<&.@$Ot#E" ""˪dQCQ(-BM"56?nnnnnn$ܢ gG9]۪o6"`"D)Ys`8mavj{>0íq4<0pE[D H J0!`"D3oQ@Y}h&{k80ŏ-BDEUd5V-Bn?a+!\Cc>[("1?`"D}hze_Z"`"D[4#XQE#DnnnnnnBEO}ǟy?1|j-ˇo=o}yϿ|4 Gۤt-Gho{݇J{xssݺc"DQ(/2||zn88xUpbaYJ?Fm~^ɄWXa\XDQ(B!f,uYkGHJݍ00R}>F׫OU{[-*bF !E"D1"(4Gn`q"%z6>2XVBkHjoF8rWadUβJ!=E"DQ4iQ 3aӲɆ -h>ҋ̵]ǭ_TβJu Q#BC #ϭÖʅg- *]˩4,|Oړ֏Ϻ0rE*rjv,JSHܔy7c+S3N-N!vQ@0gǟ8_{+^Ițߏ0"-|.L9"&6uDL0X&Q(B!&i”*lk3QHOdI"%s2>uFQlw\SFFKH*ߺ\$}~[8tFΚf7Z= 6Dz& "Q{&EL3u>E"DQ4آi[ +Y!H囍rzFc#} /t݆'#Da4pn+u eE9"Ϻ^AK.61%Ewޢ$!!E"DQۼE n0(y"DREM10XYLeu˄NUNoA2fGdt^!GM(sk7P[?-iviiQ#^'s%Q2#'Hۺ^)KZ#|Ղbì5Ѷ̒g]YeqEE,ӵ+'} UfY)Rv֫r[=KJ_v+~=v~ƹV".Mz+jLef_ħod-BvhzОISʗߗ~N=t!H_/nQA!E"DQμEadIiCќ<`n#|D8 SKFO~ tD֝sǕ)?{7v@EFh\.zuW~KU!։ _~ќvc|vE]Gw$Q(B!EE¨1ni*?DVq13~T?Cӄ|fwIuF H=0tVz@Wj+|%XDa[mB&}sq[{¨v}H|W_})n@0jGE"DQ(BUߚ>n47XK'O|?(鼂& SOPTtܰW(0ʞR(Y.} sq-hEu}0+Q(B!E"ܢrUE3FN7BDdQD7F/ʙ]7Zh(} n1&t5qՍw=Ea5DpܑtPi0}Q(B!E""9f- ?:} `}ϥ@dTPm!ly5D?F[{k-/W׽WadZ-hg[(B!E"DnQmu*^3 uw.[7^(fk". ٭j2寿nqka? +OF ]@=ۭ= ¨6zSo:͉#qea$קkmB0[(B!E"DJE1qa0QE#DnnnnnnҹEͭ3_t)gQXvrt{G =9n|izN}~<h1E^z槜EK^=6?H~Ƈ~|P4{܇kxFsb{C'np~[}.|Ɓ>8[4Oxt{o-]I9{'Bt-B$f-([/:Ej)= ꫝziqݢiڋ}x噤X3o'#-:0moF0rY;=Zd)#t7l #VFO}ŽɼSNPNi-[S%q_˯(Rzr9qtep&_R9?JEEьݢE3-nd eu鷿{*2GH M{"D"%zTo`]FZ9e| /&0R}b s⟋D2 ,>t&y蟰2yu7}8WY,'74uIlAeV?.VQb 3v z=RQ=fţy9E9gU\"|_ )/[0¸E>Eqyw*T$*.X.>)ӯ_IwGoݜ7[~ܨHctyξU/r]Fse.VQb˳Q:֡Ueʃ%.ES9-zdd9G(cG IaDGE 2c6-l8ث/;n<򀆯 c*\qJ,bW{uyT7Lg޼}mߦn!>-$>4p7ZO)**R6ъ]޿rxQ}h[_NYZX}2zJ﫶CѯM"I-%*$϶)Ao %x^1/:\}Tr]t1\<{$'Q\_|r!*>?C+d\}[ZNT=ۢܜFfmNئ/f{y|-L%c0i{t2c'* +fV# ~Ж^7-2\F[0EcrN2Pgc |DoGʵ\ɵIq&Z~Kl`"݇ՖQhOCO1ǟ 2!ʜ\o~ޓ~Ĥt,'r~GPa(]gns`-rۿFu ݢӋ[4#FIĦ0-B-swwNѠfPT9149Q.K[tXK~!ϫX3L#:^@վcEK5UNm">vcݢu-dn`nܢ`lNǙ bȽn#EK6!=YRݖ`5/S*}[}W,=iV4ȫS=G-] }}K&ɒZ{nD-XQY֏p;Hg%Io7mt"ʔy; ܢfX~̀d…Jxy%TAQ}|ho}H0Ł|nQ"""""""ܢe\Plʣggs\wOܢj4aʅ֭w vܵ޺W9>H ,{pc-WYy'P´8hELcE~N-W7?AKZs!`,p=5OکRHZunl—- k@-B/N&Iǝ[—-B8n8H+5;EuZvYQaqOB`eRrY2w [EM^qm/5ʷrz/St-BMDyݢg._'ϼygkw7^|Z(kE~åcY~'(ʸErd_.|qr|KEK.L9.Qc¨އV褕FR_׵іMb}k\BtALV -JL~}rD62dlQtUTX*2tze$u9n-VQb}kܟ~e܁c,z-NP>N?G-z?׎k6.Z'_x]jgxˉ;nQ~ݯ)6vKk@3sI>BEFVZ]lEj @WWUH5oӪ2?"tRv"Hu"E:;e[ {ϔipq]M >x]zHOרC9bp~ZL-m/[sQnx k̹ `!G!EzޢhGQtUTX*2tze$n¨9 n)"i pzv,JS+˦U!Ҩ}<{ӭĞ4- V.;Epܘrj1嶴n]S~̹GEҾuG-}h~W+)BeREsgomyn]<ͳE 姓{C[7v J\tOumn"\3}u]qS79DVНImf-֘`"DQ1)nr'~ )*ܢ7O6nQ(۬-r2аe;ٽKu̐._}zvẘ؟W[QD巂Ew,BOݙi/ܟ"IH"YE`쪇 aԿ[TH)=S]T[hld;H-\Jo2P+CDeQKWn69HO0b;Mjz|9\Nq8~7GhIuWpFwEr˷?oU-6P1 t&HIA:nدqc•`|2T쫏S]T}rnXd:AmR+_wqrbܰfnn%>#fk aEI1 Qn[#!HѽŪ:Ebwx +pvμE [(,5h=& "!*=(-rb@bRbvq3Νx!rES-rB#SbگWy[*~آ1ۧ"\n"ٻEA/)n8/ǵ=[<[䛧msTXdZۼE nЌ[3QL,:;S[ݵWh:_֡}}g>]3D`znIqEy&3=qF936oQ[$ [3QL,7-+l4v>B3ʙ7>GL-s7ׅ5+[۩6S u.VZ,8/{hh,*K}5Ѷ:[KK;nQug;kɥEP%|֖mn+?iM4gp}-#!:.J.r*ZU5u?#Ѭba\C*>kDEkg56DSϟ)W[kzT#^'su]wg-THrX֭}|' .@}Q0qh n`hMB!p`)ƦN EcӼ=ANPppVܾvK)Z`"n^Y,vmƄ3Qً7N!L+!K:-:!Dnсh{{5rکREmV"v|oޟl=bJXnQxhQs8`]FZ9Jh0 t-3*QIrtp~Y"Oc@1}\6-C7+ܯ ʷn_Q,,n5_-үݺ~yе^>T9k<rT!EE0rЌHN$j #Z5UT$^8,-J-ڼ?|wWg=fҤtŏ-B*2"z1einQjl[of:Iu.FEuٻE̓,[(JE-r}qE[Ft%F wX -s[0gn[ԴlAep-R˂XHG-j+GnhnQ'0[ԈW-BEDh]]%fW76w-{" r oG+Eђ%ǣ "DјHly$,v" 8D@nQ{ijl+TkYΜD{Gkm 'cۈ%]^ӗ1\>"DQwQ$TkYΜD{Gkqj@Ngշm@vcE#&,[(B!a46zTCU74IJ-B!pF[("!aE"-ZZatOn>%fxɛ}N<hnIXUQJnhDѓ/~ťOd>kpDEz]Xg؃۵-֟>(nbaL= LDzL+![=nV-:0moF0rY;=Z3FыXShyeXXjQ4?w/4nV-Rf#uYi崱J0RaYJVgE0RQ"驣^a3y98z w 9w/}dWИ=CU+cW<-Bͅ(:'W{魿k+d ŅcE\RO?ן)|Q[d> FߔC9|բWiQcfVEEJd'ԇf\hf~}"DV;;R”I [((zjOd--VQb}ܢ<镑("W6T)n2Lw)s|Ö}(βTao7ʉgt-r+㕲pn}ZpӴQ4QQ]bY)WȊz'祖-zd3QE&kf2X XaTFhW * H.V-BM^ H@04gЙ"!, Cϝ0R峣XѝiG/= .C=o$bcFnhZ(zޢI!(omH,|#N˚3Dz6Swޢ$!nhڢ(vM~-JrEn++jsGMaf6ǐ0pW_ňT ՗3K|UrvXV-B͡(zY'˟_U\"D[43FƢԳ&sEQE!H:(lKCnQ(ܢFEEEEEE戳\3G^.T;}n#v,?j]=qbu`aQ+TXK[Jhhӗ7~e?|ۿˍlu5 DW[$q` "DQ'Nrh.3\.(Rnֱ%k%Ek/^{ty&VBn:#\Nh08Xʩ" ~bXT`BE+^α{&Dy|4vb)zwӝgG~G'C1լb- gj:,[(#dݢOJ=v~O}7k>Ԣh"DHn=J eaWjbI &oշV)ӯ_Y;Bq$FՇV]Ky$\*<?*5{?oZ:86*[IrrLH=xZv+heI`lg;w~uۓw>ԉ[T9J)8Wk9iݏR!L#E˜#c=<;-""8qűQiGآC6-1%+bnh&5QEz]XgX{EXg]G90iR:hv `%"DQ'NϪ^^峈"n:#\Nmq4"ꫪ-ͻ릙[JVaS%VG!rr~7tjZ*gֶ&] 'Ǫ^GEk/UxK}EE0L0pPkMVQ^(vPnQ[})R/Q9tۯjfVQ^--2yݢ(-jV-"ˁ %Tc'\b7,+42k'fSQ`nѢ"e(/f7ϿvWn~3ϣ}"Oc-[W4(X"CC,kn/Y[EEcܢآ|߷R::hEQ5UT$^8,-j-B,[d /-ruܢf!-0nѢ"9NѾ"DEZYCs5-->ܑbu3nnт"ewX -s[[$ #y 5jyJE-([6GO`䟷[nQ-!X6Ed;Gqn,qn"-< 9ʦǎs<Ee=iֈζ"*{ݢG5ѬAgN5xmK6YmKbpG>՚h֠3's\6YmKB,[4Fs!EEQqIApR:!F"!`q"kmQ(h}*Z~,[(ܢBF0 72h4<&7?-Bdn)-5ad![$y#`"D3oQCU#??Qvqf~q0sE[T"k~t0UrE[qp#d#`"DYk|8:֋EJE"-rzʍ `5"D[4#XQE#DnnnnnnBEO}ǟy?1|j-ˇo=o}yϿ|4 GtXLp]fѽ2ۻ4uǢ E"DQ4_~k?>(ep=qO5w m4W=0kŎEd7 ͏ի+ٙ$&׮{~8)}Raޘu L-Y<&}eB}<0nQ(Bͩ(-fxWO V-2h5r`U%FRNYz0Rcw!f*T ¨K; ~&@9r%E"DQ4ǢhLH ͑[(h@0Ő-qd-UNA}#W/וRǟMVO_ F-|:5OUXOM5j/G=vj<嘧{PSHUV~Vz>N.;s7\Ŧ\뤢KK_8*!}JN|V?8n}%dcs'B;|S]1_u-l88CU꛺>fl]ǭ_9YR'nH@GQ(B!f%d|=lZ6pW_vܢy _UV$˟yvTq5z: E8b2#CZu>KUo*Xώh}^TԇVLbi^*TW}v!9HUKηO$1GN+ף|\/'hL>VKunzk='.tǞ>R;$ֿ(-|S+]*~Ʌq3k%sjv*6rmnTΓ^SvE"Dh*(ǚ^Z;/[W#Դ[T;ktuF,[TT>Pm+0J'h7ډNF4ڍmFటaEHc P쫏S]T I 'KMOnJQ&;"Qb=Cxs g|H SȲɮD">%!-B!E鈢 m SȲɮD">%!-Rk|76uU|C(;.^9qh)S0R֕_"ߊ\oc7ZdԺѢk(n*%ֿ/aqun(&[3آF!E"DєDQآi,[T-Qn6a_ яF:+lӣ0r'5C;gH18߈ß G6D?A OFc Olߛ0 3M y8k3oQ[$H~-JrPnQ(BMIu(-;oQ[(Xh'ʯq8oV5St2m[е,Yy6Q#{~Pv qʿra.ձBC]ZAF<ҭI#CZeax_3~t(zT D2Kywf"{ǁDC!EIjAa֚h'̒g]YeqEE"wƣEg߁`L̍[(Dh:¨6VV^ Un?V"D!QE#-Bn(C7>9 |/?9mX-Cbg~;rė9}\1vZI?D!E"[aq`8*pZ(v`Hx ~ž'to~={yL֏n D<)s9Kp7ʋUO/e|fkBq%Ut& Ե#a}>0߻wf!E"DQ[TFZGɦ|pIXMQOFDaN Ss܅FvlsDnwv Oz6 %wF],0wE"DQ(-Z;`&,1䈤G|y,jyV1O=$CTsلq?_&rvG9nOnQ3ɹžkwO>k[s\0d~"]X=W|ʗdg? q#-B!E"DyȤl j1DQ<ٟ돓V{&<rBؽx&CvS<ro,|0tK{/Yxpߦ:\vQTUUEՇ4 1 Q(B!E""Y?MUԄo(x,?i ~(}<  /{TuFC⫾?ތ)>GQ>}+"\zÖ͞*؝:/eH:voK{h P]$a!E"DQ[Tk/ڌ7SFs Apӄi==ǍFF+\ͽGzo׷a nO_yMNIn&Zj$QٱAuyuE"DQ(-*'kzĸk58ՠ$/{mDuxplnh_esȍ n FΔ:o&Jl7U\ʇ{anQ(B!EEV3c`h!QcHQ=XN̰8a_#f~?tem!eBԡ1Cma* o17ڄP~n|#N܉Rޛ`"DQ(B!pr+٬Ğ0r緧oX}U[7^('Uy*'P5ݬP2'q~3;AMZ0Zlre2)_XnùoEad/!,1mYߣ| nI#E(B!E"DE1ya0QE#DnnnnnnrEG>wt.͇-j?|k|[~zpw3fmX+ Î 1d2 aNnnuŰo-n-ZRQbXK=y։ŭ?EFF0 7h4<S. # {Yhhan"n`i"%qׄ-ld82[,.ɱ{XGNj RXz>*,*J*)k;+:=X[(軣l;70.~]v۞Dmͨˢ[/ד^W?L.F&ek8h~6֜~QM[Tw*'>O`i()-ʏa 'Cl<-(ݢIjVQQSZf 9U*Fb-Vuե6)a 1U>?F{p;v3˗jج}9̱[4U>?z!E-)_a3[ "9w*Wbq^"-pbw5#V9h`aݢE>HpnK9o;EPsn"Ejv-;M`/[(<-j}[nќqݢMjo}[nL\/vRh?E sǞhnS[{ށG[4r0[4(-j;Evڪ:9ǒݢܢ'')٩kܜj/!rg-r oXBg[$͝(2rs,)ʞ)a nP[4= tE[4¨a[("""""""#N|#9wf]gyۍ-B!x>ʻEka GZAvZCv{k80GEm =Nx<{&08qNЍ7v>M0>EN/ >(%rm\a4nmo,ehx>nZDvx(cz=K![lńbLTQԕŻE"DQ n1%t5a$!L0ANa{8W]pUZ9wJT9ڴFƒAҡ*6.;B'Ÿ>뉤5=ttj )Ϫ=ҨSs΃q?MIE#^!FL*-ZQ\۟TL<ۗ'Z9ʿUjߪOٴF"DQ 2)Lv2V#x1**3kQNPe} QaV{kTFNU~埝2TbUA'W~O}ceOo[{Io&j7Mp]#>3mExJD[E_y|ryl'tye!E"u, 7+"ұ{Sݢ-Opnu-j m>¨zUABz=7e O9whA=cs}st[9T8itD=uup2ˎL,HE??/ruE"D|EZYCm3섑ܟ(*&t6 Tsiۅ@aEҪSHc mᩏ쫏S]_O06LDE "tODE*PNs$"DQ0nbim>Q"[$9H-<`nnI\EҝsG"וM]3n( }-ZQ[u"'iRE"D`ݢ*:1_/`0ƴAeovDH(ojn֊ȝo a?;C!|#N܉mzƒ_wz?~jE#lǚHtr&ȨLu(B!b$I++v}B&E_m],fEƓP#ZìN7^(iRK~ۻG.Nej#I&E_m],fEƓPC!EǔQ\"D-0*ynppppppp`ܵVbwEܢֻN>r'7 EkuaGaٍ5Qr:nh̤hwE .ܚ53"#F[#W [K4UQF렊&Tܢ t-nh DTܢcoO6gEkׄ-l>[" a4\*Cϱ{Yϛ,J,{LtFniFBrR=e@ޞ*'uEEy%ySCcUO<(s~04O]GC4'- O/?߶gcܓ-24Ij_>z#PK,<[d>hHq=L9o}Jf8VKa+PS@(7(XFiR{ڍ_6@-Q4CQd\f"A@:v@a)|.V2KűZ: [@(7(XFiR{v(Y6@[7#݈r~ٽ0:XLsQBTr,i,.P<dž#"^C4wXRQ4 Qݍʹ(][d*Lr,i,.0n@vp<[$q, -Ҫ_|V{!pnN[[d^UQd& rvq+""y-c@gQ4-活EaESUQd& rvqm$(P|n#q(^CM-*kBnQDlQ 3"iۤ"gjwnhܢ2&EE0-FM-rFJEr&te¨9r7AuޢܢƠ0{T=OP u;/(-"DtDn8N-j1(eC:-f>n#čN a16'nX#R_-n&ViyI[ͩL#|N9UQqE@H4DTDnX#Z"{-0aM4;rUQ&SF~OB=rb/h<Fn +π9pŏsE%>bN9\#a4Imہ#"-B`#"-֣mE2#װ` hm"#kº+V";#?L-Bͧ(z/}4h08XʦmTF㫢"j߽[0%Q4h~q)q`&l1dZ?AcS[߽LxdzEG6!S/ztm[4@E02)[Á+ a4>"!X̅[7#=׺LGhc8 O{h85 EyEu Oj85ɻEZYCAn~Ѵ"b!-"`nZD\˲[C,[(--T b=: a4zpYE0-Q4Hp`nQ֓Vnb<6¨̅[(Q[0h<FcZ!EEF,p[""""""""ѽ&wwͺ>kj嗇 Gۤt-GhopE ?yL|t{C9O\CϡW_{i;28nҵ}ڏJw>=7qOw oz,[/{`8*֊D)oӝ`rJnфݴ~ګpyfM}RaK#~a"DJhhJnQ Ev,{k<~u&>kZ _Mx^'E[dhk pk{`)FtTQFN}ڥpTnE׋p&,[(ZQM]-[ap-J^ @9rEn)-t5a*tєfU7#[ү|pg*}/-=FOvDzt {1nMO92_egkyo'>#֞?xhS?uRQץv2v]*G _SHץ6.'_r.1 PEE'_߿<t _/~xW+qnWWNU#l=f'+Dgxqμ)XAM!WYYZf}w8nՎ6.Z'_x]j~]3`uW,'u*wO.lv9߼ێ+:Afæe {e-[U3|Lk[4.TcQevp$ZS/a4>42_# .ύPfMkв#A۬4o:{K%fj{U!Ҵӭt"\O[q<_uSNLK-/dbpg!cZ))`qF!C)=\,!y2{Y_ݿLY?GE~Q:]s%Pw\~{/rj[$Yr5U!Ҩ}̎ɍ;KKJؙp=o"[$ Ǎ)'&( t0ڂ)REvq G>[]ya/pk|2As|q ߖ'.'8Iw0>s\JrX~ܢԿջFnhݢ,-[5o_A=no[ t3J^ԍOTFY#|#|.>N!vQk3QHOp*}󕯻r9yӃ3C[m SȲɮD">%!`ݢYdu[:hNݢ~cd>,[(KQ$EևGy-D3=-rys9z[ fA%Ea9ΗuG^/>-(-;oQ[(efzʭVOGMh[&VXqAkm,HyMhVV KQ[z >uq2w uݝ5zqPjuOMr5kVC `QF!QnQԚh'Uk\ km,8t^*&Z=nEkPjk]\jvݢ@~_}dNxQY;f]V)KZ-kYk0Kywf"{ǁ!`ݢ@M8e<.,=0EQ(BpFbh묎 K8PE(---BnpF[("JӬyoǭrNf+h -Bڸcc}i[{~tPܢ\٬mVU5aGoA0%M,y[)sYW^iBYE" SrZ-zR7/QOռէs]E3h0*uMJBz,a+ܢ9D.bJ9vE[[4Q)n)-t5ad!K$i1VdS6RrrRK"y1@B77=Ý[wS0܃Bʯ8A89nY9`<)w:R}R;ĽaO䭏x}j[sgӼ WrүKA6tWQWH[.),E;/&QBo=dܢ< =)*+?^ԬS -znT;n7?)w:R}R;ćm3lͩQ߄;o~]Em$ZS, aTnQKn;TSfQJ5=Sw_Xlӭwaz: ץSGMi^_}\OX},{nQ+no[% R+De5˷W>:>N!vQA7drnXjo}WyIu\DkkĖCF91qE)!k~;G"#[;3آ(/4B0:HQE[ [uEE)V(.(%6Dr T(w>E.F1(2vfjEQ.^h`tlx}b"+= &UK{Y/Ï0Z ȝQx 7o&839z[ ~-Jt0Ehuw/zu.2DrEE;=-[ -\zFk9#ڬ|] ;h"ܢQ.e-LV-U_,fMh5WB3B}/+W[k2rcvݢ@~_}d\W.Lt=[ 5ќmJ.")jV0nE"",/3M"D[("!aE"-Bn-ZpWea72hm0pE[TFZGg dh}#`"D@h #-z6֊<j#`"D3oQ]FE"[@kk?V-BnӓV۸Q]#`"DyГ8Z;2DV-BnQ UunV-R]dVLkU4vַ0uEnx `I"D!EEEEEEE =u?6&7|prmn_k?lWou}s\+Sg̢4)7W1F}ceOo[{IoFk7=p]#Nͽ>H[|hR!3G!E9E-m93Qs""D@?n.=zB$r_gdb%4nz]xmDU%<ֱQK@rF# rQylv.~ןoՕs7&*W+ػ:G7FR}bco k.OݢK9Ztq("DQ4}Qݢo4[(-2=i|Vu/H+jgJ''oKj7o=]8@E6 `nQ((RnQmnEV}t§:3TQލփ0rR$akWs"؍4n( MQḩ[(B!,p-_YRHaI\yO_!|C3oD|7a$;D?Q?\+1D&nCtE"DєDQn'H-o>v-QyQZ,6v[a)Z¬ሌad/^n">N~T.,إ:VhyKK;(W8ӖFu/Qt"5+jP XQ(BM[nK~[,f(fEE"@`F!EEFEC^^ U0nQ[D+npF[("!aE"X:hm(X.v㠕~pc0pE[TFZ*Gg [Wj#X|QEkH*h}Ј.-B8Յ.˚?Qrthp[CE"-MܸVaV~,[("^UE#XjQE5Wp*BJE"XuH lMX#XZQ+-BnQ[[[[[[PnSGgcr?~g '7} [?l[_>/;7|=sḺ{on E"DhEѡW_{y~!`ݢڢQ 2}0ܪ-cJ蛛xdWF_fv߻e;0-?|?:nQ(B"D[dhk #-rݣ3Aβ%ԯh #'0Jk)]cEjE"DQ-B*EkHLy*=䈧L0,G={+Oݯ_+ҏ?vz$\U*\?NEi*1{ßW1F}ceOo[{Io>j7܍p]# # Լn\wo;E5z}h**:N0A](^|{= Q(B-(Vkχ|T|VnQeⳝLyEnQEoJ9zAC|Fw+t*gLP0 Z9 (u1\c3gT)@wv2޿/7Yݢ7IhuE"D" YqC2[uQckD[m]f0J'h7ډNF4ڍmFటaEު3Hc Znz3b%?'*{㷥[(5Jҙ |ㅑ104gЙ"^w aE"DhEahΠ3Ep|%?@*F xatutOIH[W~/+rh1YF`h0 ^ntEQ1GnQ(Z>QBQ1GDEPGhz*nC#Ny7(I F!_ 7"qc OFB;O>)xИwڝsߘE"DQ(v6Ea56.} #ct Y[*U>݈Uө7v>M7;oEM>I.zEw -B!E"D@+0p){^ъgCLx.0J8y;.hIuY!a9vE"DQ(-RG +Xel2catAzRäuY /ht ^ݕnԺC؝~yzz=uUE~>PzY)_|5W3֪RUq77U.>۳~ 쇷P~ƹ8aԬoUHI iHFo3x qr -B!E"DyHIm&%~XY~ֿbEv^_@.щ+<=#}t4Zi+[i5RAU<>T~[gD=IC7|FQ7w-W. ,H4DQ(B!p$a@k{4`cύ0r Ճ_=z˟?Y?ݱK='a䫏TDaToqӄX~HXpۯnYwk 'ݮHҹdȖ)v'dnQ(B!EENOZ1Ft"|?Xe$p}]vK[^.IțG?`Fv⿩Is|> s+moHx $w-W. ,[(B!E"DnlJ֦NN' #anzNBEt LmV(-~uC_te ҮRQ [(B!E"DnQ 5\߷ AlXf0r' LX~3r)[9h~Y F6G=֐i~52RN.+}\@}>D\ߵxܘ!ì+!E"DQnZ#i~ѣt3#?fϺ?;v#'^ f5:ZNPg_;.a/c!,3=BFoӡVqt^?|qi[]SD,^>A[(B!E"DE15a^7#DE"Dn`a5 "@=8pE[[[[[4/S3v"ؼ?|{Ν4ܯ͟ Gۢ3[(B!EPEkEa Gr}Ȫmk80Ç77ǔ;}|h{ÏG+WmHS3;s(wba0=Q(B!p 4HK\ ,}0rtdє*7 9YaS=WM>1QZ; !E"DdnSBg #-6֬FH0ںQB<~dVBM[!y1J+u0/}x E"DQμEuatp}k³ #ߔV3μ-hrVl{Z~|օ+dU~"柝2TbUcJP_<=gn%տyp7ZηuGקp{ۡ(эo֑h"DQ[$ #-2~'Wa4xwX=[ͭaa$:~kF&0U^ctsܯls쫏uSZω #>u1\c3gT)@wv!E"DnӓVmTAE0䅑"KEICFg.$a?ŋ (UgDeǚGg).J~`OT oKMQ&k,}#_wO3ڳ@[(B!EE8NWEu׍6QatutOIHs1Iw~DnivE P0|n4W{Z7ZPN:_wE"D`0tе^5z-hLZM5wi/gBȝp a\?$mq=9_HvE"D`"EoeAʭ?Ve4c{dе Y/F?jN`n&ra.ձdad0 G.NJB6E"DQnx,@&!h>Q>uvE[[[[[[[4[e>DErʵB܅E0xwXj v-ɬץ"F] b~nhNx;?j鷿plˉOrҵ۟h.X ݋_:~#)˫ 4y_OYr;3[Q[]v㠫n߬͋0ESOh& w?ߚIy{;ww`]y*xJt7}~唯4ӷf{?$M}b޽L#L-B!_pvN'-o}E'~>Y.-vߺ/켴(-2훿[4uy?yQbn@+T0UQ-:v`hbV-8Sw@S.j?1Tx9~9sa-qSé_G[(BEsg0^ܢreKХO\B|2}IEESlHQn)-0bR?*h}`>[HaTWJVgE0RQ"驣^a3y98qV!PO [0exr}cey ݋VV˷^uЬf)弪/_{յߦ5Qoݦzs?k_.I CL߂&^Nom=Ps+6UJ׫a(wFhC}87!f+Ԙ_>]-:˫İS CKöHXt]VT-vz}A ]Էe.U¥8{~ '+qUk ?qnr'|&v?_.=UEF /&-SJKҭS8QtE*#K[t7>݂s|\Ƌ5*ڏ xWOt{} ?_7abuɤ:`ԇ̅1nћ2ǚwLv?hrPXU=fs$Zx[v_9'Q6wk| +{y7Ͽs-zmhG5+4\/±]f+}JeNoTR6_Fiȗ˚Z)l앦J_Ęw6)OD9ou4|:feަlG j*zTЙ-#^|i"DѪE:.VZ=Sadˠ߿rx3ݥtY[::R('a0X#FL؇fQ4Oᩣʜ֨\ Um_}rohq y#щɊ$XO9עx-߁hnd~<1[[$\SJJ ;#O]TLษ!Se[((]+N'biDpgǩO=hfnQ c"-tHd45Y9VQ-blQTbb-^"UuERt].2Sa4HR 7"K9CǨgȝ<'c?E9WFIJ\b"ݽy{:yLҮ8:@Gftݢ^[%~_ȔH-%?x7x~qgr!!&*dwu9rl㴹E}"l7ʙHryst>op% eZNݘN_l[䛷Ŗ1D\fRNZ"iZ/(n&+d"ܢl߮oaZntE?no"k;8EE(-:oןAK~6:jV(9[&\|3cHUky+zHbD4Jy9Xk<Ńb}kDkqyuZ#i+nhRu͠&Z:>Z^kB7b z"c>sQw&>ΏNkp?V-BMGIΑ-[v؅cłbkDkqy+8Miev\m-:zݢ kigG^:-Ʉ5ќFA^Owę&X[+OQ2&Y--23}ؘ:aZ-4[:-&k_9-UfFYkdUlTk]er-8D;nN835.?(Z%hmgƢR9*U1+ן-O+ ky'Q[F!{zJ(GTO},ugMioZ9V;-_.'oO|uL;;nVW<_s붍m9S:Aq5Ͽ;WS&Pv:nv-7##g&H>^?~IY-C훿ϖûj%狫6mTg2=9ZY*/yY-#QDk#\5Hb gFZ)o:5m?-ً;NN2o_]}Y vxW|Z1;tֱ$& -p41XFi}b5~oT޷fyIt)/R,_WR0(JKI>i7R*lη~{o~uyKE,M~Hϩ۳H4D|"=h H1vL^*BrlQآp=o3x˼<,0ɱEVfV |5 +9nr䘗`=س:FLT޷tFBr}r}آIG{h#F[0h:E5ܟ܉/|]+g]^Sy;g>-.>E6h5/_\o-*jUvڂtM>Gg;n[@kiaQ(!Twͧ>u?0m\ ܇5L-]KjI՗[[M,iK('-1;2B9 :Fo%~-E,?t&;k嫿pM +ϖzN>oG^{%=&О}EE F?y"7ݢߩ\[$Ǯ8]ʹh7 Qiw^(ߖedrnXHnh}EV3(&8X%7Irvw7Ę ܢr6%WN3%P~pZ7!:er% _wtvH-{rYEsq}S/sj"D< m SȲɮD">&K"vpEEeJhOLߠ'-|Żbl|rnQL9r|tInQnQkX;-h$Uf*dvvI-GgZ9e^eZ"oPR>QY$_ BU [ NFkB)żL3TcUȑul҇[伝nQآ4(>lαEC_nsŞ$s𾚾[x)[4|I-=!f/:L3Ȧ7("f'5(څi?oQUO9Fu5ișHw:EIdu-jrؙbB.Lآ5Bq("'gآ$7G;s[4G(-_Y}J^C=ȎxP}[ HxG'ܘ/E=Ev+I @i^Ǿܢln*1<8y GͧEE!7>>k%|3p*R/M~$[Խ=8oh.DQy"aPXyGy7 0oQOn)H xS}E٬ϱ̋e"߾BQ%E EsZE!Ȏi5MqޢduޢqeSfnQ>E!taLQ-j2EIn3QL9͑(js|VL:(/<ɗ@ƍ̖YƻKԬ.֑\5'֕5h>sR{G=cU]@9k kl/VWM{"iM4a+kЛ'MNnѣV {G=˩}-j/ &6Қhs]o__ffrjy[--Ds1dnOhdYJ9|EH4kM4T˖]$ߚh)nSxU~kMi "\h<LEc:Ϊ>3<?%<(9)'u;~ߺg_~Q(-##4CsgbFrM^Oj iBQhݢiwVYg3䵸E v_M>b', %QChlj3(ifnQA-(ZuFMjQ#-9HZEsY!EEEEELʅSR5z[-C~tM ¡Cο|x9<^ GtXLp]& XrU+Z\ZKmsq"k}QQ\4>Z0c­KeܷvNYq̲ӝppm[Tg1!P8cϥ:ƢR9*ً"g$ZC|++qA2D.y|;T\kCoUQ[`T/n}NEi*1{P#3%b^D'ОR[̅&Յ|+\^ {u}\0}~_z/]T.VtjjS#!:Cg>کffm<";""Qsjn8TPUNEi*1iȯL CQXvTآq1;z: E8$b*W#ߴk~ǮջoT_NEi*1ԈU!Ҩ}>7tk/-15cXtpdGlD} .PUc꣑D0ڂ)REvq G>[ԘN){C?z3/kn+ NJCMo">u10Km_Pz.Wr=D^XEK5UNm">vTE'q @е߽[nQDEջ?-B"mAdeQRA5HݥIyAXnF_-ʆ_•a|2[^W19HOp$6}B歧 go"Ʌ⿂[ _RWzFH%߂V̾8E$=Eb}ymIMOnJܢ̋pO{ W0>n]|.L9"&6uDL4nQ5?{Eg$B0s_E!tEKo*Ev:wLy{5vlxݣbƹW>Lm߽Izq:Ξ>U?-BEzb"7VF_EW‰-Jّ"l^Ν^Ibdc"cd[F[$^آq+tHnJן;G7WآȘEx=W)}EgOo^>-clQL4cl-*{1kK-_jo >3˼Etw1ҽb93Ř7&9G[ЌǑ>1޷VG̟2}abDM-pnE9Q yh (jޢHEInѼ[71{{5&tgi}_7I#Ѭ5z"8Et{ ZT gXמ-4Y>-(}OzH`tSo9'R-J:[͐hNj3gWsT}U[k>Z,8/͵nXxM݊>No,W[kR+4NKK;nQ >uq2GA2ot (Hp%̢T\[*kZD>N;?*W[kR+4MKK;nQ >uq2}RV-JZ?otQfv,yݥZv]{\[O[4okǒ #q|AL1 `Xa^WvEPQ"ܢyx6<[|L-Zn Q4#Q[4D|[0;ppppp>Ÿȑvܼ?|{Ν4ܯ͟ Gۢ3[(B!Et65a7WuB?; #T羚hFYyO7[Fӹ}b۩`B8XtQ(B!L=/~83HK\ @.{F_s)CT͇HEvE"DhD=n&Bg #-z6֊<֪Й6B2"IJE:u+Yϖ_;#Y O> +,UEIT{9_D~)Ǩz-Y?sً/m]ǵN**Tqg%_by]n'ܾuwDR QE˦{=)[(B!E%y}m( Dk[r #oߍVǯ2d.ny7- *1ST*U-{Z~|օ+dU~"柝2TbUcJP_<=gn%տyp7ZηuGקp{ۡ(эo[MMhDC!EErlj'к֛H9=6F}yX&_ebstWo~3<{*32IvxQdztˠ~ug;Oe_}zN\I;8RMZ;=zl^}ʌNnQ(BT"DL-2=fżeе?aTS6~aT, ,Z#%$*;zwٶ #IpO⿂0"oUj$Qٱf-7x=љ}q Fb}Rx-aKS%LvE0nQ(BREᖻH=aԳ0Rݼw,atutOIHs1Iw~DnivE P0|n4W{Z7ZPN:_"gQ(B!f'p`N"5,ߗHO'ѯQ' #M /t,t;7Dy:CF$NܘnCT}~H}{sH2 ٸE"DQ4}Qܢۯ?(yq֞zT&_#.ȷGQrU晎9$k.#2_/e5M$)s"]cޥDa𢡊x]̩J]]jBEFͥV_?`nQ(BT=sX3"[4K.+}buK:-B!E[0J s`/lQSf;ann=V|ulQ[[[[[[[[nSGgcr?~g '7rgGz o~؞뷾<|e}Y_>vnc{m>X[(B!EYź z͏<|xss77?;s>*<\@}9׫ BN.;s7\Ŧ\뤢KK_Z}VvF?*PC;!E"DbHEVe_yd>>VFU0r!):`z#;nF=>XOt DWoz$Q³=k`-U֩ OSfQJ r>)A}>VDvTnqhz: E8bGѧPV `"DQ(BnQ=:Jhڱ}=$&U9}B(RFH8n@V5sFwkг3IvxQ%`]!͛f2觏}~W?c}st[9qa$G.{3:y)kBE"DQ(ܢ"ڑ>m͟,`.#+q(|+KB$CH:,1IIxva$ )^Wz0HcURFkVrcM O}tf_}B좂 #>yQi" `"DQ(BnO oT7oTX¨PմQR}FKii׍=x0[W~/+rݍh1YF`@7Z0Jn7qE"DQE* -FO@˟0rw Gwj$aNj80;C!|#7a$;D?QE  nQ(B![k[%z5A"wf [3m::CCӄHq?FQĶsBwYyX6#{YU9 qʿra.ձBCЫ]ZAF( ? `!"DQ(B#ƦE +H4DMMeÛ;[("ZpE[0"D!QEs!;G;,[=Y.]E"DQ(p_Eab2nm7)onщwgѲ>OT>EF3ia:YNς`a"DQ(Bhmck8Dρh{4

D)hԯd#hwC`,uS~z7ey;ګc}vt͞Եx|_ז?7R g!pvOF鿎v 5~EԵ99v8[(B!E"-GYb~a*ȵ[㶭?J2x}Sx["@E.] c3Y{Y-6I&/'H1lA"g>>>~9YrɊK_69roXeD0k:v((4QXAey}o"RDH) [V*h}m3IUglt1ڋ~VϩbTBo%3vA65WE1j gb~WdH)"E-J[Q u|i61:g+U H)"E +NbtHCyƷ#l)EKbԽmSj#F`"RdvӪBY^eH-JYQv!H~1K" [?²E?(4Ͷ{#l)1~n)--------˲EnLJ~]]M?ӗ߫7ߟ3ՉO:n/ő^ [DH)"ElQ_l)lz/β׫ߧ '??>utm-b^K0-"E"R}Vn޾{*y<2b43&p\bD`"RDH)"Ep%ZW7JO'C_/V:1$41 *WpW~ȹY!,Qhqy*pZn'fbth'M6+̯hOŧ:J:k9KKGˆQ#73"nu8SOS;땿h"RD9L졼×˽dv1D$|u=GtHEx,O{jto9f\OrԷ~ib쯈C?oL|r(e"-4\͐x[k;]tX>l[}UvinG l)"E"8Kb'RZb$WPp (AibzlUMp L89V><k;׌LqA>>[kA w=f{ eָUǹl|!FdH)"E~{Lc>5b4NƞOf* 3{k$9ke|i1 G؁sqgҮ_fDCaQSƧ8O ׫\m.51E@&[DH)"ElQʊJK-Fg 45rG]ѰN\[ F{%bTT>'F1nY׷mQ@!vAl)"E"E3?$nwdhu$q/Zl01 {(o7w'>4xsn2l,Ā=JEj ћ'Um1[+Gh77b/"RDH)p%LѱTwKs]E0J4Rd^"Xd٢̤~r-"E?8 9s/TIENDB`rainbow-identifiers-0.2.2/README.md0000644000175000017500000000466412425446473016615 0ustar dogslegdogsleg[![Melpa Status](http://melpa.org/packages/rainbow-identifiers-badge.svg)](http://melpa.org/#/rainbow-identifiers) [![Melpa Stable Status](http://stable.melpa.org/packages/rainbow-identifiers-badge.svg)](http://stable.melpa.org/#/rainbow-identifiers) # Rainbow identifiers mode Rainbow identifiers mode is an Emacs minor mode providing highlighting of identifiers based on their names. Each identifier gets a color based on a hash of its name. ![Screenshot of rainbow identifiers mode on its own code](https://raw.githubusercontent.com/Fanael/rainbow-identifiers/master/rainbow-identifiers.png) ## Installation The package is available in [MELPA](http://melpa.org/). If you have MELPA in `package-archives`, use M-x package-install RET rainbow-identifiers RET If you don't, open `rainbow-identifiers.el` in Emacs and call `package-install-from-buffer`. ## Usage To toggle the mode M-x rainbow-identifiers-mode To turn it on automatically in most programming modes: (add-hook 'prog-mode-hook 'rainbow-identifiers-mode) ## Customization To change the colors, change faces `rainbow-identifiers-identifier-`. To change the number of colors used, change the variable `rainbow-identifiers-face-count`. Since version 0.1.3 it's possible to change how colors/faces are chosen. By default the old behavior is used, but it can be changed by setting the variable `rainbow-identifiers-choose-face-function` to a function that takes a hash and returns a face specifier. Currently there are two such functions predefined: * `rainbow-identifiers-predefined-choose-face`, the default, old behavior. * `rainbow-identifiers-cie-l*a*b*-choose-face`, will generate colors in the CIE L\*a\*b\* color space without depending on any face. The color generation can be influenced by changing the following variables: * `rainbow-identifiers-cie-l*a*b*-lightness` * `rainbow-identifiers-cie-l*a*b*-saturation` * `rainbow-identifiers-cie-l*a*b*-color-count` Since version 0.2 it's possible to allow `rainbow-identifiers` to override some of the highlighting done by the major mode or other minor modes by setting `rainbow-identifiers-faces-to-override` to a list of faces `rainbow-identifiers` can override. Also since version 0.2 it's possible to filter which identifiers are highlighted by adding functions to the `rainbow-identifiers-filter-functions` hook. Only the identifiers for which all functions in the hook return non-nil are highlighted.