pax_global_header00006660000000000000000000000064131561637220014520gustar00rootroot0000000000000052 comment=b98c252f782ebb3fa6187ca4b46cddeb99985719 pygments.rb-1.2.0/000077500000000000000000000000001315616372200137705ustar00rootroot00000000000000pygments.rb-1.2.0/.gitignore000066400000000000000000000000731315616372200157600ustar00rootroot00000000000000Gemfile.lock ext/Makefile lib/pygments_ext.* tmp pkg *.pyc pygments.rb-1.2.0/CHANGELOG.md000066400000000000000000000056241315616372200156100ustar00rootroot00000000000000CHANGELOG =========== Version 1.2.0 (2017/09/13) ----------------------------- * Exclude symlinks from the gem package to solve Windows issues [#181](https://github.com/tmm1/pygments.rb/pull/181) * Upgrade pygments to 2.0.0 [#180](https://github.com/tmm1/pygments.rb/pull/180) Version 1.1.2 (2017/04/03) ----------------------------- * Resolves #176 exclude find_error.py symlink from gem [#177](https://github.com/tmm1/pygments.rb/pull/177) Version 1.1.1 (2016/12/28) ----------------------------- * Suppress Ruby 2.4.0's warnings [#172](https://github.com/tmm1/pygments.rb/pull/172) * Enable `frozen_string_literal` [#173](https://github.com/tmm1/pygments.rb/pull/173) Version 1.1.0 (2016/12/24) ----------------------------- * Support JRuby [#170](https://github.com/tmm1/pygments.rb/pull/170) * Make pygments.rb thread safe [#171](https://github.com/tmm1/pygments.rb/pull/171) Version 1.0.0 (2016/12/11) ----------------------------- * Upgrade bundled pygments to 2.2.0-HEAD [#167](https://github.com/tmm1/pygments.rb/pull/167) * This includes **incompatible changes* because of upgrade of pygments. See http://pygments.org/ for details. * Relax yajl-ruby dependency to "~> 1.2" [#164](https://github.com/tmm1/pygments.rb/pull/164) * Python binary can be configured by `PYTMENTS_RB_PYTHON` env [#168](https://github.com/tmm1/pygments.rb/pull/168) * Improved error messages when python binary is missing [#158](https://github.com/tmm1/pygments.rb/pull/158) Version 0.5.4 (Nov 3, 2013) ----------------------------- * Update lexers file Version 0.5.3 (Sep 17, 2013) ----------------------------- * Fixes for Slash lexer * Improve highlighting for Slash lexer * Upgrade to latest pygments (1.7, changes summary follows. See pygments changelog for details) * Add Clay lexer * Add Perl 6 lexer * Add Swig lexer * Add nesC lexer * Add BlitzBasic lexer * Add EBNF lexer * Add Igor Pro lexer * Add Rexx lexer * Add Agda lexer * Recognize vim modelines * Improve Python 3 lexer * Improve Opa lexer * Improve Julia lexer * Improve Lasso lexer * Improve Objective C/C++ lexer * Improve Ruby lexer * Improve Stan lexer * Improve JavaScript lexer * Improve HTTP lexer * Improve Koka lexer * Improve Haxe lexer * Improve Prolog lexer * Improve F# lexer Version 0.5.2 (July 17, 2013) ----------------------------- * Add Slash lexer Version 0.5.1 (June 25, 2013) ----------------------------- * Ensure compatability across distros by detecting if `python2` is available Version 0.5.0 (Apr 13, 2013) ----------------------------- * Use #rstrip to fix table mode bug Version 0.4.2 (Feb 25, 2013) ----------------------------- * Add new lexers, including custom lexers Version 0.3.7 (Jan 2, 2013) ----------------------------- * Fixed missing custom lexers * Added syntax highlighting for Hxml Version 0.3.4 (Dec 28, 2012) ----------------------------- * Add support for Windows * Add MIT license pygments.rb-1.2.0/Gemfile000066400000000000000000000000461315616372200152630ustar00rootroot00000000000000source "https://rubygems.org" gemspec pygments.rb-1.2.0/LICENSE000066400000000000000000000021211315616372200147710ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) Ted Nyman and Aman Gupta, 2012-2013 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. pygments.rb-1.2.0/README.md000066400000000000000000000104621315616372200152520ustar00rootroot00000000000000# pygments.rb [![CircleCI](https://circleci.com/gh/tmm1/pygments.rb.svg?style=svg)](https://circleci.com/gh/tmm1/pygments.rb) [![Gem Version](https://badge.fury.io/rb/pygments.rb.svg)](https://badge.fury.io/rb/pygments.rb) A Ruby wrapper for the Python [pygments syntax highlighter](http://pygments.org/). pygments.rb works by talking over a simple pipe to a long-lived Python child process. This library replaces [github/albino](https://github.com/github/albino), as well as a version of pygments.rb that used an embedded Python interpreter. Each Ruby process that runs has its own 'personal Python'; for example, 4 Unicorn workers will have one Python process each. If a Python process dies, a new one will be spawned on the next pygments.rb request. ## system requirements - Python 2.5, Python 2.6, or Python 2.7. You can always use Python 2.x from a `virtualenv` if your default Python install is 3.x. ## usage ``` ruby require 'pygments' ``` ``` ruby Pygments.highlight(File.read(__FILE__), :lexer => 'ruby') ``` Encoding and other lexer/formatter options can be passed in via an options hash: ``` ruby Pygments.highlight('code', :options => {:encoding => 'utf-8'}) ``` pygments.rb defaults to using an HTML formatter. To use a formatter other than `html`, specify it explicitly like so: ``` ruby Pygments.highlight('code', :formatter => 'bbcode') Pygments.highlight('code', :formatter => 'terminal') ``` To generate CSS for HTML formatted code, use the `#css` method: ``` ruby Pygments.css Pygments.css('.highlight') ``` To use a specific pygments style, pass the `:style` option to the `#css` method: ``` ruby Pygments.css(:style => "monokai") ``` Other Pygments high-level API methods are also available. These methods return arrays detailing all the available lexers, formatters, and styles. ``` ruby Pygments.lexers Pygments.formatters Pygments.styles ``` To use a custom pygments installation, specify the path to `Pygments#start`: ``` ruby Pygments.start("/path/to/pygments") ``` If you'd like logging, set the environmental variable `MENTOS_LOG` to a file path for your logfile. By default pygments.rb will timeout calls to pygments that take over 8 seconds. You can change this by setting the environmental variable `MENTOS_TIMEOUT` to a different positive integer value. ## benchmarks $ ruby bench.rb 50 Benchmarking.... Size: 698 bytes Iterations: 50 user system total real pygments popen 0.010000 0.010000 0.020000 ( 0.460370) pygments popen (process already started) 0.010000 0.000000 0.010000 ( 0.272975) pygments popen (process already started 2) 0.000000 0.000000 0.000000 ( 0.273589) $ ruby bench.rb 10 Benchmarking.... Size: 15523 bytes Iterations: 10 user system total real pygments popen 0.000000 0.000000 0.000000 ( 0.819419) pygments popen (process already started) 0.010000 0.000000 0.010000 ( 0.676515) pygments popen (process already started 2) 0.000000 0.010000 0.010000 ( 0.674189) ## license The MIT License (MIT) Copyright (c) Ted Nyman and Aman Gupta, 2012-2013 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. pygments.rb-1.2.0/Rakefile000066400000000000000000000035711315616372200154430ustar00rootroot00000000000000#!/usr/bin/env rake require "bundler/gem_tasks" task :default => :test # ========================================================== # Packaging # ========================================================== GEMSPEC = eval(File.read('pygments.rb.gemspec')) require 'rubygems/package_task' # ========================================================== # Testing # ========================================================== require 'rake/testtask' Rake::TestTask.new 'test' do |t| t.test_files = FileList['test/test_*.rb'] t.ruby_opts = ['-rubygems'] end # ========================================================== # Benchmarking # ========================================================== task :bench do sh "ruby bench.rb" end # ========================================================== # Cache lexers # ========================================================== # Write all the lexers to a file for easy lookup task :lexers do sh "ruby cache-lexers.rb" end # ========================================================== # Vendor # ========================================================== namespace :vendor do file 'vendor/pygments-main' do |f| sh "hg clone https://bitbucket.org/birkenfeld/pygments-main #{f.name}" sh "hg --repository #{f.name} identify --id > #{f.name}/REVISION" rm_rf Dir["#{f.name}/.hg*"] rm_rf Dir["#{f.name}/tests"] end task :clobber do rm_rf 'vendor/pygments-main' end # Load all the custom lexers in the `vendor/custom_lexers` folder # and stick them in our custom Pygments vendor task :load_lexers do LEXERS_DIR = 'vendor/pygments-main/pygments/lexers' lexers = FileList['vendor/custom_lexers/*.py'] lexers.each { |l| FileUtils.copy l, LEXERS_DIR } FileUtils.cd(LEXERS_DIR) { sh "python _mapping.py" } end desc 'update vendor/pygments-main' task :update => [:clobber, 'vendor/pygments-main', :load_lexers] end pygments.rb-1.2.0/bench.rb000066400000000000000000000014711315616372200153770ustar00rootroot00000000000000require File.join(File.dirname(__FILE__), '/lib/pygments.rb') require 'benchmark' include Benchmark # number of iterations num = ARGV[0] ? ARGV[0].to_i : 10 # we can also repeat the code itself repeats = ARGV[1] ? ARGV[1].to_i : 1 code = File.open('test/test_data.py').read.to_s * repeats puts "Benchmarking....\n" puts "Size: " + code.bytesize.to_s + " bytes\n" puts "Iterations: " + num.to_s + "\n" Benchmark.bm(40) do |x| x.report("pygments popen ") { for i in 1..num; Pygments.highlight(code, :lexer => 'python'); end } x.report("pygments popen (process already started) ") { for i in 1..num; Pygments.highlight(code, :lexer => 'python'); end } x.report("pygments popen (process already started 2) ") { for i in 1..num; Pygments.highlight(code, :lexer => 'python'); end } end pygments.rb-1.2.0/cache-lexers.rb000066400000000000000000000003361315616372200166620ustar00rootroot00000000000000require File.join(File.dirname(__FILE__), '/lib/pygments.rb') # Simple marshalling serialized_lexers = Marshal.dump(Pygments.lexers!) # Write to a file File.open("lexers", 'wb') { |file| file.write(serialized_lexers) } pygments.rb-1.2.0/circle.yml000066400000000000000000000005601315616372200157550ustar00rootroot00000000000000machine: ruby: version: 2.3.1 java: version: oraclejdk8 environment: JRUBY_OPTS: '--dev --debug' JRUBY: jruby-9.1.6.0 dependencies: pre: - echo rvm_autoupdate_flag=0 >> ~/.rvmrc - rvm install $JRUBY post: - rvm-exec $JRUBY bundle install test: override: - rvm-exec $JRUBY bundle exec rake test - bundle exec rake test pygments.rb-1.2.0/lexers000066400000000000000000001142571315616372200152270ustar00rootroot00000000000000{YI"Brainfuck:ET{ : nameI"Brainfuck;T: aliases[I"brainfuck;TI"bf;T:filenames[I" *.bf;TI"*.b;T:mimetypes[I"application/x-brainfuck;TI" dasm16;T{ ;I" dasm16;T;[I" DASM16;T;[I" *.dasm16;TI" *.dasm;T; [I"text/x-dasm16;TI" Puppet;T{ ;I" Puppet;T;[I" puppet;T;[I" *.pp;T; [I" Augeas;T{ ;I" Augeas;T;[I" augeas;T;[I" *.aug;T; [I" TOML;T{ ;I" TOML;T;[I" toml;T;[I" *.toml;T; [I" Slash;T{ ;I" Slash;T;[I" slash;T;[I" *.sl;T; [I" Cirru;T{ ;I" Cirru;T;[I" cirru;T;[I" *.cirru;TI" *.cr;T; [I"text/x-cirru;TI" Nimrod;T{ ;I" Nimrod;T;[I" nimrod;TI"nim;T;[I" *.nim;TI" *.nimrod;T; [I"text/x-nimrod;TI" Bash;T{ ;I" Bash;T;[I" bash;TI"sh;TI"ksh;T;[I" *.sh;TI" *.ksh;TI" *.bash;TI" *.ebuild;TI" *.eclass;TI" .bashrc;TI" bashrc;TI" .bash_*;TI" bash_*;TI" PKGBUILD;T; [I"application/x-sh;TI"application/x-shellscript;TI" Golo;T{ ;I" Golo;T;[I" golo;T;[I" *.golo;T; [I"CSS+Django/Jinja;T{ ;I"CSS+Django/Jinja;T;[I"css+django;TI"css+jinja;T;[; [I"text/css+django;TI"text/css+jinja;TI"Coldfusion HTML;T{ ;I"Coldfusion HTML;T;[I"cfm;T;[I" *.cfm;TI" *.cfml;T; [I"application/x-coldfusion;TI"Literate Agda;T{ ;I"Literate Agda;T;[I" lagda;TI"literate-agda;T;[I" *.lagda;T; [I"text/x-literate-agda;TI" Xtend;T{ ;I" Xtend;T;[I" xtend;T;[I" *.xtend;T; [I"text/x-xtend;TI"PowerShell;T{ ;I"PowerShell;T;[ I"powershell;TI" posh;TI"ps1;TI" psm1;T;[I" *.ps1;TI" *.psm1;T; [I"text/x-powershell;TI" Limbo;T{ ;I" Limbo;T;[I" limbo;T;[I"*.b;T; [I"text/limbo;TI" JAGS;T{ ;I" JAGS;T;[I" jags;T;[I" *.jag;TI" *.bug;T; [I"Kal;T{ ;I"Kal;T;[I"kal;T;[I" *.kal;T; [I" text/kal;TI"application/kal;TI"Dylan session;T{ ;I"Dylan session;T;[I"dylan-console;TI"dylan-repl;T;[I"*.dylan-console;T; [I"text/x-dylan-console;TI" Java;T{ ;I" Java;T;[I" java;T;[I" *.java;T; [I"text/x-java;TI" Nemerle;T{ ;I" Nemerle;T;[I" nemerle;T;[I"*.n;T; [I"text/x-nemerle;TI" CSS+Ruby;T{ ;I" CSS+Ruby;T;[I" css+erb;TI" css+ruby;T;[; [I"text/css+ruby;TI" MySQL;T{ ;I" MySQL;T;[I" mysql;T;[; [I"text/x-mysql;TI"C++;T{ ;I"C++;T;[I"cpp;TI"c++;T;[I" *.cpp;TI" *.hpp;TI" *.c++;TI" *.h++;TI" *.cc;TI" *.hh;TI" *.cxx;TI" *.hxx;TI"*.C;TI"*.H;TI" *.cp;TI" *.CPP;T; [I"text/x-c++hdr;TI"text/x-c++src;TI"CBM BASIC V2;T{ ;I"CBM BASIC V2;T;[I" cbmbas;T;[I" *.bas;T; [I"XML+Smarty;T{ ;I"XML+Smarty;T;[I"xml+smarty;T;[; [I"application/xml+smarty;TI"autohotkey;T{ ;I"autohotkey;T;[I"ahk;TI"autohotkey;T;[I" *.ahk;TI" *.ahkl;T; [I"text/x-autohotkey;TI"OpenEdge ABL;T{ ;I"OpenEdge ABL;T;[I" openedge;TI"abl;TI" progress;T;[I"*.p;TI" *.cls;T; [I"text/x-openedge;TI"application/x-openedge;TI" CMake;T{ ;I" CMake;T;[I" cmake;T;[I" *.cmake;TI"CMakeLists.txt;T; [I"text/x-cmake;TI"SourcePawn;T{ ;I"SourcePawn;T;[I"sp;T;[I" *.sp;T; [I"text/x-sourcepawn;TI" Mako;T{ ;I" Mako;T;[I" mako;T;[I" *.mao;T; [I"application/x-mako;TI"JavaScript+Myghty;T{ ;I"JavaScript+Myghty;T;[I"js+myghty;TI"javascript+myghty;T;[; [I"$application/x-javascript+myghty;TI"text/x-javascript+myghty;TI"text/javascript+mygthy;TI"RSL;T{ ;I"RSL;T;[I"rsl;T;[I" *.rsl;T; [I" text/rsl;TI" Scaml;T{ ;I" Scaml;T;[I" scaml;T;[I" *.scaml;T; [I"text/x-scaml;TI" MAQL;T{ ;I" MAQL;T;[I" maql;T;[I" *.maql;T; [I"text/x-gooddata-maql;TI" application/x-gooddata-maql;TI"ActionScript;T{ ;I"ActionScript;T;[I"as;TI"actionscript;T;[I" *.as;T; [I"application/x-actionscript;TI"text/x-actionscript;TI"text/actionscript;TI"SquidConf;T{ ;I"SquidConf;T;[I"squidconf;TI"squid.conf;TI" squid;T;[I"squid.conf;T; [I"text/x-squidconf;TI" Fantom;T{ ;I" Fantom;T;[I"fan;T;[I" *.fan;T; [I"application/x-fantom;TI" BBCode;T{ ;I" BBCode;T;[I" bbcode;T;[; [I"text/x-bbcode;TI"CSS+Myghty;T{ ;I"CSS+Myghty;T;[I"css+myghty;T;[; [I"text/css+myghty;TI" MuPAD;T{ ;I" MuPAD;T;[I" mupad;T;[I" *.mu;T; [I" XML+Ruby;T{ ;I" XML+Ruby;T;[I" xml+erb;TI" xml+ruby;T;[; [I"application/xml+ruby;TI" Kconfig;T{ ;I" Kconfig;T;[ I" kconfig;TI"menuconfig;TI"linux-config;TI"kernel-config;T;[ I" Kconfig;TI"*Config.in*;TI"external.in*;TI"standard-modules.in;T; [I"text/x-kconfig;TI"Python Traceback;T{ ;I"Python Traceback;T;[I" pytb;T;[I" *.pytb;T; [I"text/x-python-traceback;TI"cfstatement;T{ ;I"cfstatement;T;[I"cfs;T;[; [I"Ada;T{ ;I"Ada;T;[I"ada;TI"ada95ada2005;T;[I" *.adb;TI" *.ads;TI" *.ada;T; [I"text/x-ada;TI" CSS+Mako;T{ ;I" CSS+Mako;T;[I" css+mako;T;[; [I"text/css+mako;TI" Gherkin;T{ ;I" Gherkin;T;[I" cucumber;TI" gherkin;T;[I"*.feature;T; [I"text/x-gherkin;TI"Io;T{ ;I"Io;T;[I"io;T;[I" *.io;T; [I"text/x-iosrc;TI"UrbiScript;T{ ;I"UrbiScript;T;[I"urbiscript;T;[I"*.u;T; [I"application/x-urbiscript;TI" PL/pgSQL;T{ ;I" PL/pgSQL;T;[I" plpgsql;T;[; [I"text/x-plpgsql;TI" Inform 6;T{ ;I" Inform 6;T;[I" inform6;TI"i6;T;[I" *.inf;T; [I"Bro;T{ ;I"Bro;T;[I"bro;T;[I" *.bro;T; [I"!ANTLR With ObjectiveC Target;T{ ;I"!ANTLR With ObjectiveC Target;T;[I"antlr-objc;T;[I"*.G;TI"*.g;T; [I"XML;T{ ;I"XML;T;[I"xml;T;[ I" *.xml;TI" *.xsl;TI" *.rss;TI" *.xslt;TI" *.xsd;TI" *.wsdl;TI" *.wsf;T; [ I" text/xml;TI"application/xml;TI"image/svg+xml;TI"application/rss+xml;TI"application/atom+xml;TI"Genshi Text;T{ ;I"Genshi Text;T;[I"genshitext;T;[; [I"application/x-genshi-text;TI"text/x-genshi;TI" Pike;T{ ;I" Pike;T;[I" pike;T;[I" *.pike;TI" *.pmod;T; [I"text/x-pike;TI"Objective-J;T{ ;I"Objective-J;T;[ I"objective-j;TI"objectivej;TI" obj-j;TI" objj;T;[I"*.j;T; [I"text/x-objective-j;TI"Python console session;T{ ;I"Python console session;T;[I" pycon;T;[; [I"text/x-python-doctest;TI"Ragel in C Host;T{ ;I"Ragel in C Host;T;[I" ragel-c;T;[I" *.rl;T; [I"IDL;T{ ;I"IDL;T;[I"idl;T;[I" *.pro;T; [I" text/idl;TI" aspx-cs;T{ ;I" aspx-cs;T;[I" aspx-cs;T;[ I" *.aspx;TI" *.asax;TI" *.ascx;TI" *.ashx;TI" *.asmx;TI" *.axd;T; [I"Ragel in Ruby Host;T{ ;I"Ragel in Ruby Host;T;[I"ragel-ruby;TI" ragel-rb;T;[I" *.rl;T; [I"HTML+Genshi;T{ ;I"HTML+Genshi;T;[I"html+genshi;TI" html+kid;T;[; [I"text/html+genshi;TI" RPMSpec;T{ ;I" RPMSpec;T;[I" spec;T;[I" *.spec;T; [I"text/x-rpm-spec;TI"CSS+Smarty;T{ ;I"CSS+Smarty;T;[I"css+smarty;T;[; [I"text/css+smarty;TI"ANTLR With C# Target;T{ ;I"ANTLR With C# Target;T;[I"antlr-csharp;TI" antlr-c#;T;[I"*.G;TI"*.g;T; [I" LLVM;T{ ;I" LLVM;T;[I" llvm;T;[I" *.ll;T; [I"text/x-llvm;TI"Python 3.0 Traceback;T{ ;I"Python 3.0 Traceback;T;[I" py3tb;T;[I" *.py3tb;T; [I"text/x-python3-traceback;TI"TypeScript;T{ ;I"TypeScript;T;[I"ts;T;[I" *.ts;T; [I"text/x-typescript;TI" MiniD;T{ ;I" MiniD;T;[I" minid;T;[I" *.md;T; [I"text/x-minidsrc;TI"SQL;T{ ;I"SQL;T;[I"sql;T;[I" *.sql;T; [I"text/x-sql;TI" JSON;T{ ;I" JSON;T;[I" json;T;[I" *.json;T; [I"application/json;TI" NASM;T{ ;I" NASM;T;[I" nasm;T;[I" *.asm;TI" *.ASM;T; [I"text/x-nasm;TI" Idris;T{ ;I" Idris;T;[I" idris;TI"idr;T;[I" *.idr;T; [I"text/x-idris;TI" AutoIt;T{ ;I" AutoIt;T;[I" autoit;T;[I" *.au3;T; [I"text/x-autoit;TI" Sass;T{ ;I" Sass;T;[I" sass;T;[I" *.sass;T; [I"text/x-sass;TI" aspx-vb;T{ ;I" aspx-vb;T;[I" aspx-vb;T;[ I" *.aspx;TI" *.asax;TI" *.ascx;TI" *.ashx;TI" *.asmx;TI" *.axd;T; [I" Ceylon;T{ ;I" Ceylon;T;[I" ceylon;T;[I" *.ceylon;T; [I"text/x-ceylon;TI"HTML+Evoque;T{ ;I"HTML+Evoque;T;[I"html+evoque;T;[I" *.html;T; [I"text/html+evoque;TI" NumPy;T{ ;I" NumPy;T;[I" numpy;T;[; [I"CoffeeScript;T{ ;I"CoffeeScript;T;[I"coffee-script;TI"coffeescript;TI" coffee;T;[I" *.coffee;T; [I"text/coffeescript;TI" XML+Mako;T{ ;I" XML+Mako;T;[I" xml+mako;T;[; [I"application/xml+mako;TI" CSS+PHP;T{ ;I" CSS+PHP;T;[I" css+php;T;[; [I"text/css+php;TI" VimL;T{ ;I" VimL;T;[I"vim;T;[I" *.vim;TI" .vimrc;TI" .exrc;TI" .gvimrc;TI" _vimrc;TI" _exrc;TI" _gvimrc;TI" vimrc;TI" gvimrc;T; [I"text/x-vim;TI"CSS+Genshi Text;T{ ;I"CSS+Genshi Text;T;[I"css+genshitext;TI"css+genshi;T;[; [I"text/css+genshi;TI" Fancy;T{ ;I" Fancy;T;[I" fancy;TI"fy;T;[I" *.fy;TI"*.fancypack;T; [I"text/x-fancysrc;TI" Ragel;T{ ;I" Ragel;T;[I" ragel;T;[; [I"Scalate Server Page;T{ ;I"Scalate Server Page;T;[I"ssp;T;[I" *.ssp;T; [I"application/x-ssp;TI"AmbientTalk;T{ ;I"AmbientTalk;T;[I"at;TI"ambienttalk;TI"ambienttalk/2;T;[I" *.at;T; [I"text/x-ambienttalk;TI"XML+Evoque;T{ ;I"XML+Evoque;T;[I"xml+evoque;T;[I" *.xml;T; [I"application/xml+evoque;TI" Redcode;T{ ;I" Redcode;T;[I" redcode;T;[I" *.cw;T; [I"RobotFramework;T{ ;I"RobotFramework;T;[I"robotframework;T;[I" *.txt;TI" *.robot;T; [I"text/x-robotframework;TI" Scala;T{ ;I" Scala;T;[I" scala;T;[I" *.scala;T; [I"text/x-scala;TI" Lighttpd configuration file;T{ ;I" Lighttpd configuration file;T;[I" lighty;TI" lighttpd;T;[; [I"text/x-lighttpd-conf;TI"RQL;T{ ;I"RQL;T;[I"rql;T;[I" *.rql;T; [I"text/x-rql;TI" Chapel;T{ ;I" Chapel;T;[I" chapel;TI" chpl;T;[I" *.chpl;T; [I"HTML+Velocity;T{ ;I"HTML+Velocity;T;[I"html+velocity;T;[; [I"text/html+velocity;TI"Ruby irb session;T{ ;I"Ruby irb session;T;[I" rbcon;TI"irb;T;[; [I"text/x-ruby-shellsession;TI"CSS;T{ ;I"CSS;T;[I"css;T;[I" *.css;T; [I" text/css;TI"Ragel in D Host;T{ ;I"Ragel in D Host;T;[I" ragel-d;T;[I" *.rl;T; [I"Asymptote;T{ ;I"Asymptote;T;[I"asy;TI"asymptote;T;[I" *.asy;T; [I"text/x-asymptote;TI" XML+PHP;T{ ;I" XML+PHP;T;[I" xml+php;T;[; [I"application/xml+php;TI" Gnuplot;T{ ;I" Gnuplot;T;[I" gnuplot;T;[I" *.plot;TI" *.plt;T; [I"text/x-gnuplot;TI"Gettext Catalog;T{ ;I"Gettext Catalog;T;[I"pot;TI"po;T;[I" *.pot;TI" *.po;T; [I"application/x-gettext;TI"text/x-gettext;TI"text/gettext;TI" Matlab;T{ ;I" Matlab;T;[I" matlab;T;[I"*.m;T; [I"text/matlab;TI"C;T{ ;I"C;T;[I"c;T;[I"*.c;TI"*.h;TI" *.idc;T; [I"text/x-chdr;TI"text/x-csrc;TI" Eiffel;T{ ;I" Eiffel;T;[I" eiffel;T;[I"*.e;T; [I"text/x-eiffel;TI" Genshi;T{ ;I" Genshi;T;[ I" genshi;TI"kid;TI"xml+genshi;TI" xml+kid;T;[I" *.kid;T; [I"application/x-genshi;TI"application/x-kid;TI"VGL;T{ ;I"VGL;T;[I"vgl;T;[I" *.rpf;T; [I" Velocity;T{ ;I" Velocity;T;[I" velocity;T;[I" *.vm;TI" *.fhtml;T; [I" Koka;T{ ;I" Koka;T;[I" koka;T;[I" *.kk;TI" *.kki;T; [I"text/x-koka;TI" Alloy;T{ ;I" Alloy;T;[I" alloy;T;[I" *.als;T; [I"text/x-alloy;TI" IRC logs;T{ ;I" IRC logs;T;[I"irc;T;[I"*.weechatlog;T; [I"text/x-irclog;TI" SWIG;T{ ;I" SWIG;T;[I" swig;T;[I" *.swg;TI"*.i;T; [I"text/swig;TI" Prolog;T{ ;I" Prolog;T;[I" prolog;T;[I" *.prolog;TI" *.pro;TI" *.pl;T; [I"text/x-prolog;TI"XML+Lasso;T{ ;I"XML+Lasso;T;[I"xml+lasso;T;[; [I"application/xml+lasso;TI"Smalltalk;T{ ;I"Smalltalk;T;[I"smalltalk;TI" squeak;TI"st;T;[I" *.st;T; [I"text/x-smalltalk;TI" YAML;T{ ;I" YAML;T;[I" yaml;T;[I" *.yaml;TI" *.yml;T; [I"text/x-yaml;TI"#ANTLR With ActionScript Target;T{ ;I"#ANTLR With ActionScript Target;T;[I" antlr-as;TI"antlr-actionscript;T;[I"*.G;TI"*.g;T; [I" Cypher;T{ ;I" Cypher;T;[I" cypher;T;[I" *.cyp;TI" *.cypher;T; [I" XSLT;T{ ;I" XSLT;T;[I" xslt;T;[I" *.xsl;TI" *.xslt;TI" *.xpl;T; [I"application/xsl+xml;TI"application/xslt+xml;TI"S;T{ ;I"S;T;[I" splus;TI"s;TI"r;T;[ I"*.S;TI"*.R;TI".Rhistory;TI".Rprofile;TI".Renviron;T; [ I"text/S-plus;TI" text/S;TI"text/x-r-source;TI" text/x-r;TI" text/x-R;TI"text/x-r-history;TI"text/x-r-profile;TI" DylanLID;T{ ;I" DylanLID;T;[I"dylan-lid;TI"lid;T;[I" *.lid;TI" *.hdp;T; [I"text/x-dylan-lid;TI"eC;T{ ;I"eC;T;[I"ec;T;[I" *.ec;TI" *.eh;T; [I"text/x-echdr;TI"text/x-ecsrc;TI" Perl6;T{ ;I" Perl6;T;[I" perl6;TI"pl6;T;[I" *.pl;TI" *.pm;TI" *.nqp;TI" *.p6;TI" *.6pl;TI" *.p6l;TI" *.pl6;TI" *.6pm;TI" *.p6m;TI" *.pm6;TI"*.t;T; [I"text/x-perl6;TI"application/x-perl6;TI" Logos;T{ ;I" Logos;T;[I" logos;T;[ I"*.x;TI" *.xi;TI" *.xm;TI" *.xmi;T; [I"text/x-logos;TI" Racket;T{ ;I" Racket;T;[I" racket;TI"rkt;T;[I" *.rkt;TI" *.rktd;TI" *.rktl;T; [I"text/x-racket;TI"application/x-racket;TI"Text only;T{ ;I"Text only;T;[I" text;T;[I" *.txt;T; [I"text/plain;TI" Dart;T{ ;I" Dart;T;[I" dart;T;[I" *.dart;T; [I"text/x-dart;TI"Ragel in CPP Host;T{ ;I"Ragel in CPP Host;T;[I"ragel-cpp;T;[I" *.rl;T; [I" Scilab;T{ ;I" Scilab;T;[I" scilab;T;[I" *.sci;TI" *.sce;TI" *.tst;T; [I"text/scilab;TI"Java Server Page;T{ ;I"Java Server Page;T;[I"jsp;T;[I" *.jsp;T; [I"application/x-jsp;TI" ABAP;T{ ;I" ABAP;T;[I" abap;T;[I" *.abap;T; [I"text/x-abap;TI" Rust;T{ ;I" Rust;T;[I" rust;T;[I" *.rs;T; [I"text/x-rustsrc;TI" Diff;T{ ;I" Diff;T;[I" diff;TI" udiff;T;[I" *.diff;TI" *.patch;T; [I"text/x-diff;TI"text/x-patch;TI" liquid;T{ ;I" liquid;T;[I" liquid;T;[I" *.liquid;T; [I"Matlab session;T{ ;I"Matlab session;T;[I"matlabsession;T;[; [I" Slim;T{ ;I" Slim;T;[I" slim;T;[I" *.slim;T; [I"text/x-slim;TI" HTML+PHP;T{ ;I" HTML+PHP;T;[I" html+php;T;[I" *.phtml;T; [ I"application/x-php;TI"application/x-httpd-php;TI"application/x-httpd-php3;TI"application/x-httpd-php4;TI"application/x-httpd-php5;TI"Objective-C++;T{ ;I"Objective-C++;T;[ I"objective-c++;TI"objectivec++;TI" obj-c++;TI" objc++;T;[I" *.mm;TI" *.hh;T; [I"text/x-objective-c++;TI"PostScript;T{ ;I"PostScript;T;[I"postscript;TI" postscr;T;[I" *.ps;TI" *.eps;T; [I"application/postscript;TI" verilog;T{ ;I" verilog;T;[I" verilog;TI"v;T;[I"*.v;T; [I"text/x-verilog;TI"JavaScript+Ruby;T{ ;I"JavaScript+Ruby;T;[ I" js+erb;TI"javascript+erb;TI" js+ruby;TI"javascript+ruby;T;[; [I""application/x-javascript+ruby;TI"text/x-javascript+ruby;TI"text/javascript+ruby;TI"COBOLFree;T{ ;I"COBOLFree;T;[I"cobolfree;T;[I" *.cbl;TI" *.CBL;T; [I"Base Makefile;T{ ;I"Base Makefile;T;[I" basemake;T;[; [I" Ioke;T{ ;I" Ioke;T;[I" ioke;TI"ik;T;[I" *.ik;T; [I"text/x-iokesrc;TI" PyPy Log;T{ ;I" PyPy Log;T;[I" pypylog;TI" pypy;T;[I"*.pypylog;T; [I"application/x-pypylog;TI" Python 3;T{ ;I" Python 3;T;[I" python3;TI"py3;T;[; [I"text/x-python3;TI"application/x-python3;TI" Swift;T{ ;I" Swift;T;[I" swift;T;[I" *.swift;T; [I"text/x-swift;TI" ANTLR;T{ ;I" ANTLR;T;[I" antlr;T;[; [I"PostgreSQL console (psql);T{ ;I"PostgreSQL console (psql);T;[I" psql;TI"postgresql-console;TI"postgres-console;T;[; [I"text/x-postgresql-psql;TI"JavaScript+Django/Jinja;T{ ;I"JavaScript+Django/Jinja;T;[ I"js+django;TI"javascript+django;TI" js+jinja;TI"javascript+jinja;T;[; [ I"$application/x-javascript+django;TI"#application/x-javascript+jinja;TI"text/x-javascript+django;TI"text/x-javascript+jinja;TI"text/javascript+django;TI"text/javascript+jinja;TI"LSL;T{ ;I"LSL;T;[I"lsl;T;[I" *.lsl;T; [I"text/x-lsl;TI"Mathematica;T{ ;I"Mathematica;T;[I"mathematica;TI"mma;TI"nb;T;[ I" *.nb;TI" *.cdf;TI" *.nbp;TI" *.ma;T; [ I"application/mathematica;TI"(application/vnd.wolfram.mathematica;TI"0application/vnd.wolfram.mathematica.package;TI" application/vnd.wolfram.cdf;TI"Erlang erl session;T{ ;I"Erlang erl session;T;[I"erl;T;[I" *.erl-sh;T; [I"text/x-erl-shellsession;TI" Modelica;T{ ;I" Modelica;T;[I" modelica;T;[I" *.mo;T; [I"text/x-modelica;TI" Treetop;T{ ;I" Treetop;T;[I" treetop;T;[I"*.treetop;TI" *.tt;T; [I"Tcl;T{ ;I"Tcl;T;[I"tcl;T;[I" *.tcl;T; [I"text/x-tcl;TI"text/x-script.tcl;TI"application/x-tcl;TI" FSharp;T{ ;I" FSharp;T;[I" fsharp;T;[I" *.fs;TI" *.fsi;T; [I"text/x-fsharp;TI" NewLisp;T{ ;I" NewLisp;T;[I" newlisp;T;[I" *.lsp;TI" *.nl;T; [I"text/x-newlisp;TI"application/x-newlisp;TI"CSS+Lasso;T{ ;I"CSS+Lasso;T;[I"css+lasso;T;[; [I"text/css+lasso;TI" Todotxt;T{ ;I" Todotxt;T;[I" todotxt;T;[I" todo.txt;TI"*.todotxt;T; [I"text/x-todo;TI"Shell Session;T{ ;I"Shell Session;T;[I"shell-session;T;[I"*.shell-session;T; [I"application/x-sh-session;TI" Newspeak;T{ ;I" Newspeak;T;[I" newspeak;T;[I" *.ns2;T; [I"text/x-newspeak;TI"Bash Session;T{ ;I"Bash Session;T;[I" console;T;[I"*.sh-session;T; [I" application/x-shell-session;TI"Gosu Template;T{ ;I"Gosu Template;T;[I"gst;T;[I" *.gst;T; [I"text/x-gosu-template;TI"Rd;T{ ;I"Rd;T;[I"rd;T;[I" *.Rd;T; [I"text/x-r-doc;TI"JavaScript;T{ ;I"JavaScript;T;[I"js;TI"javascript;T;[I" *.js;T; [ I"application/javascript;TI"application/x-javascript;TI"text/x-javascript;TI"text/javascript;TI"Common Lisp;T{ ;I"Common Lisp;T;[ I"common-lisp;TI"cl;TI" lisp;TI" elisp;TI" emacs;TI"emacs-lisp;T;[I" *.cl;TI" *.lisp;TI" *.el;T; [I"text/x-common-lisp;TI"APL;T{ ;I"APL;T;[I"apl;T;[I" *.apl;T; [I"GAP;T{ ;I"GAP;T;[I"gap;T;[ I"*.g;TI" *.gd;TI" *.gi;TI" *.gap;T; [I" Factor;T{ ;I" Factor;T;[I" factor;T;[I" *.factor;T; [I"text/x-factor;TI"Awk;T{ ;I"Awk;T;[ I"awk;TI" gawk;TI" mawk;TI" nawk;T;[I" *.awk;T; [I"application/x-awk;TI"systemverilog;T{ ;I"systemverilog;T;[I"systemverilog;TI"sv;T;[I" *.sv;TI" *.svh;T; [I"text/x-systemverilog;TI"JavaScript+Mako;T{ ;I"JavaScript+Mako;T;[I" js+mako;TI"javascript+mako;T;[; [I""application/x-javascript+mako;TI"text/x-javascript+mako;TI"text/javascript+mako;TI"Elixir iex session;T{ ;I"Elixir iex session;T;[I"iex;T;[; [I"text/x-elixir-shellsession;TI"HTML+Cheetah;T{ ;I"HTML+Cheetah;T;[I"html+cheetah;TI"html+spitfire;TI"htmlcheetah;T;[; [I"text/html+cheetah;TI"text/html+spitfire;TI"Inform 6 template;T{ ;I"Inform 6 template;T;[I"i6t;T;[I" *.i6t;T; [I" Julia;T{ ;I" Julia;T;[I" julia;TI"jl;T;[I" *.jl;T; [I"text/x-julia;TI"application/x-julia;TI" Smarty;T{ ;I" Smarty;T;[I" smarty;T;[I" *.tpl;T; [I"application/x-smarty;TI"Protocol Buffer;T{ ;I"Protocol Buffer;T;[I" protobuf;TI" proto;T;[I" *.proto;T; [I"Tea;T{ ;I"Tea;T;[I"tea;T;[I" *.tea;T; [I"text/x-tea;TI" Jasmin;T{ ;I" Jasmin;T;[I" jasmin;TI" jasminxt;T;[I"*.j;T; [I"ApacheConf;T{ ;I"ApacheConf;T;[I"apacheconf;TI" aconf;TI" apache;T;[I".htaccess;TI"apache.conf;TI"apache2.conf;T; [I"text/x-apacheconf;TI"JavaScript+Genshi Text;T{ ;I"JavaScript+Genshi Text;T;[ I"js+genshitext;TI"js+genshi;TI"javascript+genshitext;TI"javascript+genshi;T;[; [I"$application/x-javascript+genshi;TI"text/x-javascript+genshi;TI"text/javascript+genshi;TI" Scheme;T{ ;I" Scheme;T;[I" scheme;TI"scm;T;[I" *.scm;TI" *.ss;T; [I"text/x-scheme;TI"application/x-scheme;TI" Octave;T{ ;I" Octave;T;[I" octave;T;[I"*.m;T; [I"text/octave;TI"LiveScript;T{ ;I"LiveScript;T;[I"live-script;TI"livescript;T;[I" *.ls;T; [I"text/livescript;TI" Monkey;T{ ;I" Monkey;T;[I" monkey;T;[I" *.monkey;T; [I"text/x-monkey;TI"Red;T{ ;I"Red;T;[I"red;TI"red/system;T;[I" *.red;TI" *.reds;T; [I"text/x-red;TI"text/x-red-system;TI"Coldfusion CFC;T{ ;I"Coldfusion CFC;T;[I"cfc;T;[I" *.cfc;T; [I"d-objdump;T{ ;I"d-objdump;T;[I"d-objdump;T;[I"*.d-objdump;T; [I"text/x-d-objdump;TI" Hxml;T{ ;I" Hxml;T;[I" haxeml;TI" hxml;T;[I" *.hxml;T; [I" Groovy;T{ ;I" Groovy;T;[I" groovy;T;[I" *.groovy;T; [I"text/x-groovy;TI"Pig;T{ ;I"Pig;T;[I"pig;T;[I" *.pig;T; [I"text/x-pig;TI" CUDA;T{ ;I" CUDA;T;[I" cuda;TI"cu;T;[I" *.cu;TI" *.cuh;T; [I"text/x-cuda;TI"Handlebars;T{ ;I"Handlebars;T;[I"handlebars;T;[; [I" HTTP;T{ ;I" HTTP;T;[I" http;T;[; [I" Python;T{ ;I" Python;T;[I" python;TI"py;TI" sage;T;[ I" *.py;TI" *.pyw;TI" *.sc;TI"SConstruct;TI"SConscript;TI" *.tac;TI" *.sage;T; [I"text/x-python;TI"application/x-python;TI"Boo;T{ ;I"Boo;T;[I"boo;T;[I" *.boo;T; [I"text/x-boo;TI" Logtalk;T{ ;I" Logtalk;T;[I" logtalk;T;[I" *.lgt;T; [I"text/x-logtalk;TI" VB.net;T{ ;I" VB.net;T;[I" vb.net;TI" vbnet;T;[I" *.vb;TI" *.bas;T; [I"text/x-vbnet;TI"text/x-vba;TI"D;T{ ;I"D;T;[I"d;T;[I"*.d;TI" *.di;T; [I"text/x-dsrc;TI"BlitzBasic;T{ ;I"BlitzBasic;T;[I"blitzbasic;TI"b3d;TI" bplus;T;[I" *.bb;TI" *.decls;T; [I"text/x-bb;TI" SCSS;T{ ;I" SCSS;T;[I" scss;T;[I" *.scss;T; [I"text/x-scss;TI" Haml;T{ ;I" Haml;T;[I" haml;T;[I" *.haml;T; [I"text/x-haml;TI" FoxPro;T{ ;I" FoxPro;T;[ I" foxpro;TI"vfp;TI" clipper;TI" xbase;T;[I" *.PRG;TI" *.prg;T; [I"Debian Control file;T{ ;I"Debian Control file;T;[I" control;TI"debcontrol;T;[I" control;T; [I" Jade;T{ ;I" Jade;T;[I" jade;T;[I" *.jade;T; [I"text/x-jade;TI"c-objdump;T{ ;I"c-objdump;T;[I"c-objdump;T;[I"*.c-objdump;T; [I"text/x-c-objdump;TI"XML+Velocity;T{ ;I"XML+Velocity;T;[I"xml+velocity;T;[; [I"application/xml+velocity;TI"JavaScript+Cheetah;T{ ;I"JavaScript+Cheetah;T;[ I"js+cheetah;TI"javascript+cheetah;TI"js+spitfire;TI"javascript+spitfire;T;[; [ I"%application/x-javascript+cheetah;TI"text/x-javascript+cheetah;TI"text/javascript+cheetah;TI"&application/x-javascript+spitfire;TI"text/x-javascript+spitfire;TI"text/javascript+spitfire;TI" COBOL;T{ ;I" COBOL;T;[I" cobol;T;[ I" *.cob;TI" *.COB;TI" *.cpy;TI" *.CPY;T; [I"text/x-cobol;TI" objdump;T{ ;I" objdump;T;[I" objdump;T;[I"*.objdump;T; [I"text/x-objdump;TI" ca65;T{ ;I" ca65;T;[I" ca65;T;[I"*.s;T; [I" SPARQL;T{ ;I" SPARQL;T;[I" sparql;T;[I" *.rq;TI" *.sparql;T; [I"application/sparql-query;TI" Lasso;T{ ;I" Lasso;T;[I" lasso;TI"lassoscript;T;[I" *.lasso;TI"*.lasso[89];T; [I"text/x-lasso;TI"Ragel in Java Host;T{ ;I"Ragel in Java Host;T;[I"ragel-java;T;[I" *.rl;T; [I" Vala;T{ ;I" Vala;T;[I" vala;TI" vapi;T;[I" *.vala;TI" *.vapi;T; [I"text/x-vala;TI" Haskell;T{ ;I" Haskell;T;[I" haskell;TI"hs;T;[I" *.hs;T; [I"text/x-haskell;TI"Lua;T{ ;I"Lua;T;[I"lua;T;[I" *.lua;TI" *.wlua;T; [I"text/x-lua;TI"application/x-lua;TI" AspectJ;T{ ;I" AspectJ;T;[I" aspectj;T;[I" *.aj;T; [I"text/x-aspectj;TI" Groff;T{ ;I" Groff;T;[I" groff;TI" nroff;TI"man;T;[I"*.[1234567];TI" *.man;T; [I"application/x-troff;TI"text/troff;TI"JavaScript+Lasso;T{ ;I"JavaScript+Lasso;T;[I" js+lasso;TI"javascript+lasso;T;[; [I"#application/x-javascript+lasso;TI"text/x-javascript+lasso;TI"text/javascript+lasso;TI" GLSL;T{ ;I" GLSL;T;[I" glsl;T;[I" *.vert;TI" *.frag;TI" *.geo;T; [I"text/x-glslsrc;TI"GAS;T{ ;I"GAS;T;[I"gas;TI"asm;T;[I"*.s;TI"*.S;T; [I"text/x-gas;TI" MXML;T{ ;I" MXML;T;[I" mxml;T;[I" *.mxml;T; [I"XML+Cheetah;T{ ;I"XML+Cheetah;T;[I"xml+cheetah;TI"xml+spitfire;T;[; [I"application/xml+cheetah;TI"application/xml+spitfire;TI"Go;T{ ;I"Go;T;[I"go;T;[I" *.go;T; [I"text/x-gosrc;TI"Pan;T{ ;I"Pan;T;[I"pan;T;[I" *.pan;T; [I"MQL;T{ ;I"MQL;T;[ I"mql;TI"mq4;TI"mq5;TI" mql4;TI" mql5;T;[I" *.mq4;TI" *.mq5;TI" *.mqh;T; [I"text/x-mql;TI" Felix;T{ ;I" Felix;T;[I" felix;TI"flx;T;[I" *.flx;TI" *.flxh;T; [I"text/x-felix;TI"Properties;T{ ;I"Properties;T;[I"properties;TI"jproperties;T;[I"*.properties;T; [I"text/x-java-properties;TI" Igor;T{ ;I" Igor;T;[I" igor;TI" igorpro;T;[I" *.ipf;T; [I" text/ipf;TI" BlitzMax;T{ ;I" BlitzMax;T;[I" blitzmax;TI" bmax;T;[I" *.bmx;T; [I"text/x-bmx;TI" Perl;T{ ;I" Perl;T;[I" perl;TI"pl;T;[I" *.pl;TI" *.pm;TI"*.t;T; [I"text/x-perl;TI"application/x-perl;TI" Stan;T{ ;I" Stan;T;[I" stan;T;[I" *.stan;T; [I"INI;T{ ;I"INI;T;[I"ini;TI"cfg;TI" dosini;T;[I" *.ini;TI" *.cfg;T; [I"text/x-ini;TI" RHTML;T{ ;I" RHTML;T;[I" rhtml;TI" html+erb;TI"html+ruby;T;[I" *.rhtml;T; [I"text/html+ruby;TI"Coq;T{ ;I"Coq;T;[I"coq;T;[I"*.v;T; [I"text/x-coq;TI" Tcsh;T{ ;I" Tcsh;T;[I" tcsh;TI"csh;T;[I" *.tcsh;TI" *.csh;T; [I"application/x-csh;TI"Darcs Patch;T{ ;I"Darcs Patch;T;[I" dpatch;T;[I" *.dpatch;TI"*.darcspatch;T; [I"Nginx configuration file;T{ ;I"Nginx configuration file;T;[I" nginx;T;[; [I"text/x-nginx-conf;TI" Agda;T{ ;I" Agda;T;[I" agda;T;[I" *.agda;T; [I"text/x-agda;TI"AppleScript;T{ ;I"AppleScript;T;[I"applescript;T;[I"*.applescript;T; [I"HTML+Smarty;T{ ;I"HTML+Smarty;T;[I"html+smarty;T;[; [I"text/html+smarty;TI" Inform 7;T{ ;I" Inform 7;T;[I" inform7;TI"i7;T;[I" *.ni;TI" *.i7x;T; [I"Literate Haskell;T{ ;I"Literate Haskell;T;[I"lhs;TI"literate-haskell;TI" lhaskell;T;[I" *.lhs;T; [I"text/x-literate-haskell;TI"PHP;T{ ;I"PHP;T;[ I"php;TI" php3;TI" php4;TI" php5;T;[I" *.php;TI"*.php[345];TI" *.inc;T; [I"text/x-php;TI" Mscgen;T{ ;I" Mscgen;T;[I" mscgen;TI"msc;T;[I" *.msc;T; [I"Ooc;T{ ;I"Ooc;T;[I"ooc;T;[I" *.ooc;T; [I"text/x-ooc;TI"Debian Sourcelist;T{ ;I"Debian Sourcelist;T;[I"sourceslist;TI"sources.list;TI"debsources;T;[I"sources.list;T; [I" Delphi;T{ ;I" Delphi;T;[ I" delphi;TI"pas;TI" pascal;TI"objectpascal;T;[I" *.pas;T; [I"text/x-pascal;TI" Modula-2;T{ ;I" Modula-2;T;[I" modula2;TI"m2;T;[I" *.def;TI" *.mod;T; [I"text/x-modula2;TI"PostgreSQL SQL dialect;T{ ;I"PostgreSQL SQL dialect;T;[I"postgresql;TI" postgres;T;[; [I"text/x-postgresql;TI" Rexx;T{ ;I" Rexx;T;[I" rexx;TI" arexx;T;[ I" *.rexx;TI" *.rex;TI" *.rx;TI" *.arexx;T; [I"text/x-rexx;TI"HTML+Django/Jinja;T{ ;I"HTML+Django/Jinja;T;[I"html+django;TI"html+jinja;TI"htmldjango;T;[; [I"text/html+django;TI"text/html+jinja;TI" Haxe;T{ ;I" Haxe;T;[I"hx;TI" haxe;TI" hxsl;T;[I" *.hx;TI" *.hxsl;T; [I"text/haxe;TI"text/x-haxe;TI"text/x-hx;TI"Django/Jinja;T{ ;I"Django/Jinja;T;[I" django;TI" jinja;T;[; [I"$application/x-django-templating;TI"application/x-jinja;TI"DTD;T{ ;I"DTD;T;[I"dtd;T;[I" *.dtd;T; [I"application/xml-dtd;TI"Nix;T{ ;I"Nix;T;[I" nixos;TI"nix;T;[I" *.nix;T; [I"text/x-nix;TI" vhdl;T{ ;I" vhdl;T;[I" vhdl;T;[I" *.vhdl;TI" *.vhd;T; [I"text/x-vhdl;TI" Mask;T{ ;I" Mask;T;[I" mask;T;[I" *.mask;T; [I"text/x-mask;TI" Zephir;T{ ;I" Zephir;T;[I" zephir;T;[I" *.zep;T; [I" Pawn;T{ ;I" Pawn;T;[I" pawn;T;[I"*.p;TI" *.pwn;TI" *.inc;T; [I"text/x-pawn;TI"JavaScript+Smarty;T{ ;I"JavaScript+Smarty;T;[I"js+smarty;TI"javascript+smarty;T;[; [I"$application/x-javascript+smarty;TI"text/x-javascript+smarty;TI"text/javascript+smarty;TI" Fortran;T{ ;I" Fortran;T;[I" fortran;T;[ I"*.f;TI" *.f90;TI"*.F;TI" *.F90;T; [I"text/x-fortran;TI" Cryptol;T{ ;I" Cryptol;T;[I" cryptol;TI"cry;T;[I" *.cry;T; [I"text/x-cryptol;TI" REBOL;T{ ;I" REBOL;T;[I" rebol;T;[I"*.r;TI" *.r3;TI" *.reb;T; [I"text/x-rebol;TI"ERB;T{ ;I"ERB;T;[I"erb;T;[; [I""application/x-ruby-templating;TI" Befunge;T{ ;I" Befunge;T;[I" befunge;T;[I"*.befunge;T; [I"application/x-befunge;TI"MoonScript;T{ ;I"MoonScript;T;[I" moon;TI"moonscript;T;[I" *.moon;T; [I"text/x-moonscript;TI"application/x-moonscript;TI" Dylan;T{ ;I" Dylan;T;[I" dylan;T;[I" *.dylan;TI" *.dyl;TI" *.intr;T; [I"text/x-dylan;TI"MoinMoin/Trac Wiki markup;T{ ;I"MoinMoin/Trac Wiki markup;T;[I"trac-wiki;TI" moin;T;[; [I"text/x-trac-wiki;TI" Croc;T{ ;I" Croc;T;[I" croc;T;[I" *.croc;T; [I"text/x-crocsrc;TI" HTML;T{ ;I" HTML;T;[I" html;T;[ I" *.html;TI" *.htm;TI" *.xhtml;TI" *.xslt;T; [I"text/html;TI"application/xhtml+xml;TI"reStructuredText;T{ ;I"reStructuredText;T;[I"rst;TI" rest;TI"restructuredtext;T;[I" *.rst;TI" *.rest;T; [I"text/x-rst;TI"text/prs.fallenstein.rst;TI" NSIS;T{ ;I" NSIS;T;[I" nsis;TI"nsi;TI"nsh;T;[I" *.nsi;TI" *.nsh;T; [I"text/x-nsis;TI" Elixir;T{ ;I" Elixir;T;[I" elixir;TI"ex;TI"exs;T;[I" *.ex;TI" *.exs;T; [I"text/x-elixir;TI"HTML+Myghty;T{ ;I"HTML+Myghty;T;[I"html+myghty;T;[; [I"text/html+myghty;TI" Makefile;T{ ;I" Makefile;T;[ I" make;TI" makefile;TI"mf;TI" bsdmake;T;[ I" *.mak;TI" *.mk;TI" Makefile;TI" makefile;TI"Makefile.*;TI"GNUmakefile;T; [I"text/x-makefile;TI"sqlite3con;T{ ;I"sqlite3con;T;[I" sqlite3;T;[I"*.sqlite3-console;T; [I"text/x-sqlite3-console;TI" OCaml;T{ ;I" OCaml;T;[I" ocaml;T;[ I" *.ml;TI" *.mli;TI" *.mll;TI" *.mly;T; [I"text/x-ocaml;TI" Clay;T{ ;I" Clay;T;[I" clay;T;[I" *.clay;T; [I"text/x-clay;TI"Julia console;T{ ;I"Julia console;T;[I" jlcon;T;[; [I" Ruby;T{ ;I" Ruby;T;[I"rb;TI" ruby;TI" duby;T;[ I" *.rb;TI" *.rbw;TI" Rakefile;TI" *.rake;TI"*.gemspec;TI" *.rbx;TI" *.duby;T; [I"text/x-ruby;TI"application/x-ruby;TI" POVRay;T{ ;I" POVRay;T;[I"pov;T;[I" *.pov;TI" *.inc;T; [I"text/x-povray;TI"dg;T{ ;I"dg;T;[I"dg;T;[I" *.dg;T; [I"text/x-dg;TI" Evoque;T{ ;I" Evoque;T;[I" evoque;T;[I" *.evoque;T; [I"application/x-evoque;TI" Docker;T{ ;I" Docker;T;[I" docker;TI"dockerfile;T;[I"Dockerfile;TI" *.docker;T; [I"text/x-dockerfile-config;TI"reg;T{ ;I"reg;T;[I" registry;T;[I" *.reg;T; [I"text/x-windows-registry;TI"HTML+Mako;T{ ;I"HTML+Mako;T;[I"html+mako;T;[; [I"text/html+mako;TI"CFEngine3;T{ ;I"CFEngine3;T;[I"cfengine3;TI"cf3;T;[I" *.cf;T; [I" Mason;T{ ;I" Mason;T;[I" mason;T;[ I"*.m;TI" *.mhtml;TI" *.mc;TI" *.mi;TI"autohandler;TI" dhandler;T; [I"application/x-mason;TI"Literate Cryptol;T{ ;I"Literate Cryptol;T;[I" lcry;TI"literate-cryptol;TI" lcryptol;T;[I" *.lcry;T; [I"text/x-literate-cryptol;TI"ActionScript 3;T{ ;I"ActionScript 3;T;[I"as3;TI"actionscript3;T;[I" *.as;T; [I" application/x-actionscript3;TI"text/x-actionscript3;TI"text/actionscript3;TI" Kotlin;T{ ;I" Kotlin;T;[I" kotlin;T;[I" *.kt;T; [I"text/x-kotlin;TI"ANTLR With Java Target;T{ ;I"ANTLR With Java Target;T;[I"antlr-java;T;[I"*.G;TI"*.g;T; [I" BUGS;T{ ;I" BUGS;T;[I" bugs;TI" winbugs;TI" openbugs;T;[I" *.bug;T; [I"ANTLR With Python Target;T{ ;I"ANTLR With Python Target;T;[I"antlr-python;T;[I"*.G;TI"*.g;T; [I"YAML+Jinja;T{ ;I"YAML+Jinja;T;[I"yaml+jinja;TI" salt;TI"sls;T;[I" *.sls;T; [I"text/x-yaml+jinja;TI"text/x-sls;TI"cpp-objdump;T{ ;I"cpp-objdump;T;[I"cpp-objdump;TI"c++-objdumb;TI"cxx-objdump;T;[I"*.cpp-objdump;TI"*.c++-objdump;TI"*.cxx-objdump;T; [I"text/x-cpp-objdump;TI"Batchfile;T{ ;I"Batchfile;T;[ I"bat;TI" batch;TI" dosbatch;TI" winbatch;T;[I" *.bat;TI" *.cmd;T; [I"application/x-dos-batch;TI" Hybris;T{ ;I" Hybris;T;[I" hybris;TI"hy;T;[I" *.hy;TI" *.hyb;T; [I"text/x-hybris;TI"application/x-hybris;TI"Opa;T{ ;I"Opa;T;[I"opa;T;[I" *.opa;T; [I"text/x-opa;TI"Hy;T{ ;I"Hy;T;[I" hylang;T;[I" *.hy;T; [I"text/x-hy;TI"application/x-hy;TI" Cython;T{ ;I" Cython;T;[I" cython;TI"pyx;TI" pyrex;T;[I" *.pyx;TI" *.pxd;TI" *.pxi;T; [I"text/x-cython;TI"application/x-cython;TI" Erlang;T{ ;I" Erlang;T;[I" erlang;T;[ I" *.erl;TI" *.hrl;TI" *.es;TI"*.escript;T; [I"text/x-erlang;TI"VCTreeStatus;T{ ;I"VCTreeStatus;T;[I"vctreestatus;T;[; [I" Clojure;T{ ;I" Clojure;T;[I" clojure;TI"clj;T;[I" *.clj;T; [I"text/x-clojure;TI"application/x-clojure;TI"ANTLR With Perl Target;T{ ;I"ANTLR With Perl Target;T;[I"antlr-perl;T;[I"*.G;TI"*.g;T; [I" Myghty;T{ ;I" Myghty;T;[I" myghty;T;[I" *.myt;TI"autodelegate;T; [I"application/x-myghty;TI"ClojureScript;T{ ;I"ClojureScript;T;[I"clojurescript;TI" cljs;T;[I" *.cljs;T; [I"text/x-clojurescript;TI" application/x-clojurescript;TI"QML;T{ ;I"QML;T;[I"qml;T;[I" *.qml;T; [I"application/x-qml;TI" MOOCode;T{ ;I" MOOCode;T;[I" moocode;TI"moo;T;[I" *.moo;T; [I"text/x-moocode;TI" RConsole;T{ ;I" RConsole;T;[I" rconsole;TI" rout;T;[I" *.Rout;T; [I"Raw token data;T{ ;I"Raw token data;T;[I"raw;T;[; [I""application/x-pygments-tokens;TI"HTML+Lasso;T{ ;I"HTML+Lasso;T;[I"html+lasso;T;[; [I"text/html+lasso;TI"application/x-httpd-lasso;TI""application/x-httpd-lasso[89];TI"C#;T{ ;I"C#;T;[I" csharp;TI"c#;T;[I" *.cs;T; [I"text/x-csharp;TI"TeX;T{ ;I"TeX;T;[I"tex;TI" latex;T;[I" *.tex;TI" *.aux;TI" *.toc;T; [I"text/x-tex;TI"text/x-latex;TI"ChaiScript;T{ ;I"ChaiScript;T;[I" chai;TI"chaiscript;T;[I" *.chai;T; [I"text/x-chaiscript;TI"application/x-chaiscript;TI" Cheetah;T{ ;I" Cheetah;T;[I" cheetah;TI" spitfire;T;[I" *.tmpl;TI" *.spt;T; [I"application/x-cheetah;TI"application/x-spitfire;TI" Smali;T{ ;I" Smali;T;[I" smali;T;[I" *.smali;T; [I"text/smali;TI" QBasic;T{ ;I" QBasic;T;[I" qbasic;TI" basic;T;[I" *.BAS;TI" *.bas;T; [I"text/basic;TI"GoodData-CL;T{ ;I"GoodData-CL;T;[I"gooddata-cl;T;[I" *.gdc;T; [I"text/x-gooddata-cl;TI"HTML+Handlebars;T{ ;I"HTML+Handlebars;T;[I"html+handlebars;T;[I"*.handlebars;TI" *.hbs;T; [I"text/html+handlebars;TI"text/x-handlebars-template;TI"Objective-C;T{ ;I"Objective-C;T;[ I"objective-c;TI"objectivec;TI" obj-c;TI" objc;T;[I"*.m;TI"*.h;T; [I"text/x-objective-c;TI"Literate Idris;T{ ;I"Literate Idris;T;[I" lidr;TI"literate-idris;TI" lidris;T;[I" *.lidr;T; [I"text/x-literate-idris;TI"Embedded Ragel;T{ ;I"Embedded Ragel;T;[I" ragel-em;T;[I" *.rl;T; [I"objdump-nasm;T{ ;I"objdump-nasm;T;[I"objdump-nasm;T;[I"*.objdump-intel;T; [I"text/x-nasm-objdump;TI"ANTLR With CPP Target;T{ ;I"ANTLR With CPP Target;T;[I"antlr-cpp;T;[I"*.G;TI"*.g;T; [I" EBNF;T{ ;I" EBNF;T;[I" ebnf;T;[I" *.ebnf;T; [I"text/x-ebnf;TI" Gosu;T{ ;I" Gosu;T;[I" gosu;T;[ I" *.gs;TI" *.gsx;TI" *.gsp;TI" *.vark;T; [I"text/x-gosu;TI" Snobol;T{ ;I" Snobol;T;[I" snobol;T;[I" *.snobol;T; [I"text/x-snobol;TI"JavaScript+PHP;T{ ;I"JavaScript+PHP;T;[I" js+php;TI"javascript+php;T;[; [I"!application/x-javascript+php;TI"text/x-javascript+php;TI"text/javascript+php;TI" XQuery;T{ ;I" XQuery;T;[ I" xquery;TI"xqy;TI"xq;TI"xql;TI"xqm;T;[ I" *.xqy;TI" *.xquery;TI" *.xq;TI" *.xql;TI" *.xqm;T; [I"text/xquery;TI"application/xquery;TI" nesC;T{ ;I" nesC;T;[I" nesc;T;[I" *.nc;T; [I"text/x-nescsrc;TI"ECL;T{ ;I"ECL;T;[I"ecl;T;[I" *.ecl;T; [I"application/x-ecl;TI"Ragel in Objective C Host;T{ ;I"Ragel in Objective C Host;T;[I"ragel-objc;T;[I" *.rl;T; [I"XML+Django/Jinja;T{ ;I"XML+Django/Jinja;T;[I"xml+django;TI"xml+jinja;T;[; [I"application/xml+django;TI"application/xml+jinja;TI"Standard ML;T{ ;I"Standard ML;T;[I"sml;T;[I" *.sml;TI" *.sig;TI" *.fun;T; [I"text/x-standardml;TI"application/x-standardml;TI"ANTLR With Ruby Target;T{ ;I"ANTLR With Ruby Target;T;[I"antlr-ruby;TI" antlr-rb;T;[I"*.G;TI"*.g;T; [I" Duel;T{ ;I" Duel;T;[I" duel;TI" jbst;TI"jsonml+bst;T;[I" *.duel;TI" *.jbst;T; [I"text/x-duel;TI"text/x-jbst;TI"XML+Myghty;T{ ;I"XML+Myghty;T;[I"xml+myghty;T;[; [I"application/xml+myghty;Tpygments.rb-1.2.0/lib/000077500000000000000000000000001315616372200145365ustar00rootroot00000000000000pygments.rb-1.2.0/lib/pygments.rb000066400000000000000000000011001315616372200167210ustar00rootroot00000000000000# coding: utf-8 # frozen_string_literal: true require File.join(File.dirname(__FILE__), 'pygments/popen') require 'forwardable' module Pygments autoload :Lexer, 'pygments/lexer' class << self extend Forwardable def engine Thread.current.thread_variable_get(:pygments_engine) || Thread.current.thread_variable_set(:pygments_engine, Pygments::Popen.new) end def_delegators :engine, :formatters, :lexers, :lexers!, :filters, :styles, :css, :lexer_name_for, :highlight, :start end end pygments.rb-1.2.0/lib/pygments/000077500000000000000000000000001315616372200164045ustar00rootroot00000000000000pygments.rb-1.2.0/lib/pygments/lexer.rb000066400000000000000000000066551315616372200200640ustar00rootroot00000000000000# coding: utf-8 # frozen_string_literal: true module Pygments class Lexer < Struct.new(:name, :aliases, :filenames, :mimetypes) @lexers = [] @index = {} @name_index = {} @alias_index = {} @extname_index = {} @mimetypes_index = {} # Internal: Create a new Lexer object # # hash - A hash of attributes # # Returns a Lexer object def self.create(hash) lexer = new(hash[:name], hash[:aliases], hash[:filenames], hash[:mimetypes]) @lexers << lexer @index[lexer.name.downcase] = @name_index[lexer.name] = lexer lexer.aliases.each do |name| @alias_index[name] = lexer @index[name.downcase] ||= lexer end lexer.filenames.each do |filename| extnames = [] extname = File.extname(filename) if m = extname.match(/\[(.+)\]/) m[1].scan(/./).each do |s| extnames << extname.sub(m[0], s) end elsif extname != "" extnames << extname end extnames.each do |the_extname| @extname_index[the_extname] = lexer @index[the_extname.downcase.sub(/^\./, "")] ||= lexer end end lexer.mimetypes.each do |type| @mimetypes_index[type] = lexer end lexer end # Public: Get all Lexers # # Returns an Array of Lexers def self.all @lexers end # Public: Look up Lexer by name or alias. # # name - A String name or alias # # Lexer.find('Ruby') # => # # # Returns the Lexer or nil if none was found. def self.find(name) @index[name.to_s.downcase] end # Public: Alias for find. def self.[](name) find(name) end # Public: Look up Lexer by its proper name. # # name - The String name of the Lexer # # Examples # # Lexer.find_by_name('Ruby') # # => # # # Returns the Lexer or nil if none was found. def self.find_by_name(name) @name_index[name] end # Public: Look up Lexer by one of its aliases. # # name - A String alias of the Lexer # # Examples # # Lexer.find_by_alias('rb') # # => # # # Returns the Lexer or nil if none was found. def self.find_by_alias(name) @alias_index[name] end # Public: Look up Lexer by one of it's file extensions. # # extname - A String file extension. # # Examples # # Lexer.find_by_extname('.rb') # # => # # # Returns the Lexer or nil if none was found. def self.find_by_extname(extname) @extname_index[extname] end # Public: Look up Lexer by one of it's mime types. # # type - A mime type String. # # Examples # # Lexer.find_by_mimetype('application/x-ruby') # # => # # # Returns the Lexer or nil if none was found. def self.find_by_mimetype(type) @mimetypes_index[type] end # Public: Highlight syntax of text # # text - String of code to be highlighted # options - Hash of options (defaults to {}) # # Returns html String def highlight(text, options = {}) options[:lexer] = aliases.first Pygments.highlight(text, options) end alias_method :==, :equal? alias_method :eql?, :equal? end lexers.values.each { |h| Lexer.create(h) } end pygments.rb-1.2.0/lib/pygments/mentos.py000077500000000000000000000254301315616372200202720ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, re, os, signal import traceback if 'PYGMENTS_PATH' in os.environ: sys.path.insert(0, os.environ['PYGMENTS_PATH']) dirname = os.path.dirname base_dir = dirname(dirname(dirname(os.path.abspath(__file__)))) sys.path.append(base_dir + "/vendor") sys.path.append(base_dir + "/vendor/pygments-main") sys.path.append(base_dir + "/vendor/simplejson") import pygments from pygments import lexers, formatters, styles, filters from threading import Lock try: import json except ImportError: import simplejson as json def _convert_keys(dictionary): if not isinstance(dictionary, dict): return dictionary return dict((str(k), _convert_keys(v)) for k, v in dictionary.items()) def _write_error(error): res = {"error": error} out_header = json.dumps(res).encode('utf-8') bits = _get_fixed_bits_from_header(out_header) sys.stdout.write(bits + "\n") sys.stdout.flush() sys.stdout.write(out_header + "\n") sys.stdout.flush() return def _get_fixed_bits_from_header(out_header): size = len(out_header) return "".join(map(lambda y:str((size>>y)&1), range(32-1, -1, -1))) def _signal_handler(signal, frame): """ Handle the signal given in the first argument, exiting gracefully """ sys.exit(0) class Mentos(object): """ Interacts with pygments.rb to provide access to pygments functionality """ def __init__(self): pass def return_lexer(self, lexer, args, inputs, code=None): """ Accepting a variety of possible inputs, return a Lexer object. The inputs argument should be a hash with at least one of the following keys: - 'lexer' ("python") - 'mimetype' ("text/x-ruby") - 'filename' ("yeaaah.py") The code argument should be a string, such as "import derp". The code guessing method is not especially great. It is advised that clients pass in a literal lexer name whenever possible, which provides the best probability of match (100 percent). """ if lexer: if inputs: return lexers.get_lexer_by_name(lexer, **inputs) else: return lexers.get_lexer_by_name(lexer) if inputs: if 'lexer' in inputs: return lexers.get_lexer_by_name(inputs['lexer'], **inputs) elif 'mimetype' in inputs: return lexers.get_lexer_for_mimetype(inputs['mimetype'], **inputs) elif 'filename' in inputs: name = inputs['filename'] # If we have code and a filename, pygments allows us to guess # with both. This is better than just guessing with code. if code: return lexers.guess_lexer_for_filename(name, code, **inputs) else: return lexers.get_lexer_for_filename(name, **inputs) # If all we got is code, try anyway. if code: return lexers.guess_lexer(code, **inputs) else: return None def highlight_text(self, code, lexer, formatter_name, args, kwargs): """ Highlight the relevant code, and return a result string. The default formatter is html, but alternate formatters can be passed in via the formatter_name argument. Additional paramters can be passed as args or kwargs. """ # Default to html if we don't have the formatter name. if formatter_name: _format_name = str(formatter_name) else: _format_name = "html" # Return a lexer object lexer = self.return_lexer(lexer, args, kwargs, code) # Make sure we sucessfuly got a lexer if lexer: formatter = pygments.formatters.get_formatter_by_name(str.lower(_format_name), **kwargs) # Do the damn thing. res = pygments.highlight(code, lexer, formatter) return res else: _write_error("No lexer") def get_data(self, method, lexer, args, kwargs, text=None): """ Based on the method argument, determine the action we'd like pygments to do. Then return the data generated from pygments. """ if kwargs: formatter_name = kwargs.get("formatter", None) opts = kwargs.get("options", {}) # Ensure there's a 'method' key before proceeeding if method: res = None # Now check what that method is. For the get methods, pygments # itself returns generators, so we make them lists so we can serialize # easier. if method == 'get_all_styles': res = json.dumps(list(pygments.styles.get_all_styles())) elif method == 'get_all_filters': res = json.dumps(list(pygments.filters.get_all_filters())) elif method == 'get_all_lexers': res = json.dumps(list(pygments.lexers.get_all_lexers())) elif method == 'get_all_formatters': res = [ [ft.__name__, ft.name, ft.aliases] for ft in pygments.formatters.get_all_formatters() ] res = json.dumps(res) elif method == 'highlight': try: text = text.decode('utf-8') except UnicodeDecodeError: # The text may already be encoded text = text res = self.highlight_text(text, lexer, formatter_name, args, _convert_keys(opts)) elif method == 'css': kwargs = _convert_keys(kwargs) fmt = pygments.formatters.get_formatter_by_name(args[0], **kwargs) res = fmt.get_style_defs(args[1]) elif method == 'lexer_name_for': lexer = self.return_lexer(None, args, kwargs, text) if lexer: # We don't want the Lexer itself, just the name. # Take the first alias. res = lexer.aliases[0] else: _write_error("No lexer") else: _write_error("Invalid method " + method) return res def _send_data(self, res, method): # Base header. We'll build on this, adding keys as necessary. base_header = {"method": method} res_bytes = len(res) + 1 base_header["bytes"] = res_bytes out_header = json.dumps(base_header).encode('utf-8') # Following the protocol, send over a fixed size represenation of the # size of the JSON header bits = _get_fixed_bits_from_header(out_header) # Send it to Rubyland sys.stdout.write(bits + "\n") sys.stdout.flush() # Send the header. sys.stdout.write(out_header + "\n") sys.stdout.flush() # Finally, send the result sys.stdout.write(res + "\n") sys.stdout.flush() def _get_ids(self, text): start_id = text[:8] end_id = text[-8:] return start_id, end_id def _check_and_return_text(self, text, start_id, end_id): # Sanity check. id_regex = re.compile('[A-Z]{8}') if not id_regex.match(start_id) and not id_regex.match(end_id): _write_error("ID check failed. Not an ID.") if not start_id == end_id: _write_error("ID check failed. ID's did not match.") # Passed the sanity check. Remove the id's and return text = text[10:-10] return text def _parse_header(self, header): method = header["method"] args = header.get("args", []) kwargs = header.get("kwargs", {}) lexer = kwargs.get("lexer", None) return (method, args, kwargs, lexer) def start(self): """ Main loop, waiting for inputs on stdin. When it gets some data, it goes to work. mentos exposes most of the "High-level API" of pygments. It always expects and requires a JSON header of metadata. If there is data to be pygmentized, this header will be followed by the text to be pygmentized. The header is of form: { "method": "highlight", "args": [], "kwargs": {"arg1": "v"}, "bytes": 128, "fd": "8"} """ lock = Lock() while True: # The loop begins by reading off a simple 32-arity string # representing an integer of 32 bits. This is the length of # our JSON header. size = sys.stdin.read(32) lock.acquire() try: # Read from stdin the amount of bytes we were told to expect. header_bytes = int(size, 2) # Sanity check the size size_regex = re.compile('[0-1]{32}') if not size_regex.match(size): _write_error("Size received is not valid.") line = sys.stdin.read(header_bytes) header = json.loads(line) method, args, kwargs, lexer = self._parse_header(header) _bytes = 0 if lexer: lexer = str(lexer) # Read more bytes if necessary if kwargs: _bytes = kwargs.get("bytes", 0) # Read up to the given number bytes (possibly 0) text = sys.stdin.read(_bytes) # Sanity check the return. if _bytes: start_id, end_id = self._get_ids(text) text = self._check_and_return_text(text, start_id, end_id) # Get the actual data from pygments. res = self.get_data(method, lexer, args, kwargs, text) # Put back the sanity check values. if method == "highlight": res = start_id + " " + res + " " + end_id self._send_data(res, method) except: tb = traceback.format_exc() _write_error(tb) finally: lock.release() def main(): # Signal handlers to trap signals. signal.signal(signal.SIGINT, _signal_handler) signal.signal(signal.SIGTERM, _signal_handler) if sys.platform != "win32": signal.signal(signal.SIGHUP, _signal_handler) mentos = Mentos() if sys.platform == "win32": # disable CRLF import msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) else: # close fd's inherited from the ruby parent import resource maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1] if maxfd == resource.RLIM_INFINITY: maxfd = 65536 for fd in range(3, maxfd): try: os.close(fd) except: pass mentos.start() if __name__ == "__main__": main() pygments.rb-1.2.0/lib/pygments/popen.rb000066400000000000000000000345061315616372200200620ustar00rootroot00000000000000# coding: utf-8 # frozen_string_literal: true require 'open3' require 'multi_json' require 'timeout' require 'logger' require 'time' # Error class class MentosError < IOError end # Pygments provides access to the Pygments library via a pipe and a long-running # Python process. module Pygments class Popen def popen4(cmd) stdin, stdout, stderr, wait_thr = Open3.popen3(cmd) [wait_thr[:pid], stdin, stdout, stderr] end # Get things started by opening a pipe to mentos (the freshmaker), a # Python process that talks to the Pygments library. We'll talk back and # forth across this pipe. def start(pygments_path = File.expand_path('../../../vendor/pygments-main/', __FILE__)) begin @log = Logger.new(ENV['MENTOS_LOG'] ||= File::NULL) @log.level = Logger::INFO @log.datetime_format = "%Y-%m-%d %H:%M " rescue @log = Logger.new(File::NULL) end ENV['PYGMENTS_PATH'] = pygments_path # Make sure we kill off the child when we're done at_exit { stop "Exiting" } # A pipe to the mentos python process. #popen4 gives us # the pid and three IO objects to write and read. script = "#{python_binary} #{File.expand_path('../mentos.py', __FILE__)}" @pid, @in, @out, @err = popen4(script) @log.info "Starting pid #{@pid} with fd #{@out.to_i} and python #{python_binary}." end def windows? RUBY_PLATFORM =~ /mswin|mingw/ end def python_binary @python_binary ||= find_python_binary end def python_binary=(python_bin) @python_bin = python_bin end # Detect a suitable Python binary to use. # Or return $PYGMENTS_RB_PYTHON if it's exists. def find_python_binary if ENV['PYGMENTS_RB_PYTHON'] return which(ENV['PYGMENTS_RB_PYTHON']) elsif windows? && which('py') return 'py -2' end return which('python2') || which('python') end # Cross platform which command # from http://stackoverflow.com/a/5471032/284795 def which(command) exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir| exts.each { |ext| path = File.join(dir, "#{command}#{ext}") return path if File.executable?(path) && !File.directory?(path) } end return nil end # Stop the child process by issuing a kill -9. # # We then call waitpid() with the pid, which waits for that particular # child and reaps it. # # kill() can set errno to ESRCH if, for some reason, the file # is gone; regardless the final outcome of this method # will be to set our @pid variable to nil. # # Technically, kill() can also fail with EPERM or EINVAL (wherein # the signal isn't sent); but we have permissions, and # we're not doing anything invalid here. def stop(reason) if @pid begin Process.kill('KILL', @pid) Process.waitpid(@pid) rescue Errno::ESRCH, Errno::ECHILD end end @log.info "Killing pid: #{@pid.to_s}. Reason: #{reason}" @pid = nil end # Check for a @pid variable, and then hit `kill -0` with the pid to # check if the pid is still in the process table. If this function # gives us an ENOENT or ESRCH, we can also safely return false (no process # to worry about). Defensively, if EPERM is raised, in a odd/rare # dying process situation (e.g., mentos is checking on the pid of a dead # process and the pid has already been re-used) we'll want to raise # that as a more informative Mentos exception. # # Returns true if the child is alive. def alive? return true if defined?(@pid) && @pid && Process.kill(0, @pid) false rescue Errno::ENOENT, Errno::ESRCH false rescue Errno::EPERM raise MentosError, "EPERM checking if child process is alive." end # Public: Get an array of available Pygments formatters # # Returns an array of formatters. def formatters mentos(:get_all_formatters).inject(Hash.new) do | hash, (name, desc, aliases) | # Remove the long-winded and repetitive 'Formatter' suffix name.sub!(/Formatter$/, '') hash[name] = { :name => name, :description => desc, :aliases => aliases } hash end end # Public: Get all lexers from a serialized array. This avoids needing to spawn # mentos when it's not really needed (e.g., one-off jobs, loading the Rails env, etc). # # Should be preferred to #lexers! # # Returns an array of lexers. def lexers begin lexer_file = File.expand_path('../../../lexers', __FILE__) raw = File.open(lexer_file, "rb").read Marshal.load(raw) rescue Errno::ENOENT raise MentosError, "Error loading lexer file. Was it created and vendored?" end end # Public: Get back all available lexers from mentos itself # # Returns an array of lexers. def lexers! mentos(:get_all_lexers).inject(Hash.new) do |hash, lxr| name = lxr[0] hash[name] = { :name => name, :aliases => lxr[1], :filenames => lxr[2], :mimetypes => lxr[3] } hash["dasm16"] = {:name=>"dasm16", :aliases=>["DASM16"], :filenames=>["*.dasm16", "*.dasm"], :mimetypes=>['text/x-dasm16']} hash["Puppet"] = {:name=>"Puppet", :aliases=>["puppet"], :filenames=>["*.pp"], :mimetypes=>[]} hash["Augeas"] = {:name=>"Augeas", :aliases=>["augeas"], :filenames=>["*.aug"], :mimetypes=>[]} hash["TOML"] = {:name=>"TOML", :aliases=>["toml"], :filenames=>["*.toml"], :mimetypes=>[]} hash["Slash"] = {:name=>"Slash", :aliases=>["slash"], :filenames=>["*.sl"], :mimetypes=>[]} hash end end # Public: Return an array of all available filters def filters mentos(:get_all_filters) end # Public: Return an array of all available styles def styles mentos(:get_all_styles) end # Public: Return css for highlighted code def css(klass='', opts={}) if klass.is_a?(Hash) opts = klass klass = '' end mentos(:css, ['html', klass], opts) end # Public: Return the name of a lexer. def lexer_name_for(*args) # Pop off the last arg if it's a hash, which becomes our opts if args.last.is_a?(Hash) opts = args.pop else opts = {} end if args.last.is_a?(String) code = args.pop else code = nil end mentos(:lexer_name_for, args, opts, code) end # Public: Highlight code. # # Takes a first-position argument of the code to be highlighted, and a # second-position hash of various arguments specifying highlighting properties. # # Returns the highlighted string # or nil when the request to the Python process timed out. def highlight(code, opts={}) # If the caller didn't give us any code, we have nothing to do, # so return right away. return code if code.nil? || code.empty? # Callers pass along options in the hash opts[:options] ||= {} # Default to utf-8 for the output encoding, if not given. opts[:options][:outencoding] ||= 'utf-8' # Get back the string from mentos and force encoding if we can str = mentos(:highlight, nil, opts, code) str.force_encoding(opts[:options][:outencoding]) if str.respond_to?(:force_encoding) str end private # Our 'rpc'-ish request to mentos. Requires a method name, and then optional # args, kwargs, code. def mentos(method, args=[], kwargs={}, original_code=nil) # Open the pipe if necessary start unless alive? begin # Timeout requests that take too long. # Invalid MENTOS_TIMEOUT results in just using default. timeout_time = Integer(ENV["MENTOS_TIMEOUT"]) rescue 8 Timeout::timeout(timeout_time) do # For sanity checking on both sides of the pipe when highlighting, we prepend and # append an id. mentos checks that these are 8 character ids and that they match. # It then returns the id's back to Rubyland. id = (0...8).map{65.+(rand(25)).chr}.join code = add_ids(original_code, id) if original_code # Add metadata to the header and generate it. if code bytesize = code.bytesize else bytesize = 0 end kwargs.freeze kwargs = kwargs.merge("fd" => @out.to_i, "id" => id, "bytes" => bytesize) out_header = MultiJson.dump(:method => method, :args => args, :kwargs => kwargs) # Get the size of the header itself and write that. bits = get_fixed_bits_from_header(out_header) @in.write(bits) # mentos is now waiting for the header, and, potentially, code. write_data(out_header, code) check_for_error # mentos will now return data to us. First it sends the header. header = get_header # Now handle the header, any read any more data required. res = handle_header_and_return(header, id) # Finally, return what we got. return_result(res, method) end rescue Timeout::Error # If we timeout, we need to clear out the pipe and start over. @log.error "Timeout on a mentos #{method} call" stop "Timeout on mentos #{method} call." end rescue Errno::EPIPE, EOFError stop "EPIPE" raise MentosError, "EPIPE" end def check_for_error return if @err.closed? timeout_time = 0.25 # set a very little timeout so that we do not hang the parser Timeout::timeout(timeout_time) do error_msg = @err.read unless error_msg.empty? @log.error "Error running python script: #{error_msg}" stop "Error running python script: #{error_msg}" raise MentosError, error_msg end end rescue Timeout::Error # during the specified time no error were found @err.close end # Based on the header we receive, determine if we need # to read more bytes, and read those bytes if necessary. # # Then, do a sanity check with the ids. # # Returns a result — either highlighted text or metadata. def handle_header_and_return(header, id) if header header = header_to_json(header) bytes = header[:bytes] # Read more bytes (the actual response body) res = @out.read(bytes.to_i) if header[:method] == "highlight" # Make sure we have a result back; else consider this an error. if res.nil? @log.warn "No highlight result back from mentos." stop "No highlight result back from mentos." raise MentosError, "No highlight result back from mentos." end # Remove the newline from Python res = res[0..-2] @log.info "Highlight in process." # Get the id's start_id = res[0..7] end_id = res[-8..-1] # Sanity check. if not (start_id == id and end_id == id) @log.error "ID's did not match. Aborting." stop "ID's did not match. Aborting." raise MentosError, "ID's did not match. Aborting." else # We're good. Remove the padding res = res[10..-11] @log.info "Highlighting complete." res end end res else @log.error "No header data back." stop "No header data back." raise MentosError, "No header received back." end end # With the code, prepend the id (with two spaces to avoid escaping weirdness if # the following text starts with a slash (like terminal code), and append the # id, with two padding also. This means we are sending over the 8 characters + # code + 8 characters. def add_ids(code, id) (id + " #{code} #{id}").freeze end # Write data to mentos, the Python process. # # Returns nothing. def write_data(out_header, code=nil) @in.write(out_header) @log.info "Out header: #{out_header}" @in.write(code) if code end # Sanity check for size (32-arity of 0's and 1's) def size_check(size) size_regex = /[0-1]{32}/ if size_regex.match(size) true else false end end # Read the header via the pipe. # # Returns a header. def get_header begin size = @out.read(33) size = size[0..-2] # Sanity check the size if not size_check(size) @log.error "Size returned from mentos.py invalid." stop "Size returned from mentos.py invalid." raise MentosError, "Size returned from mentos.py invalid." end # Read the amount of bytes we should be expecting. We first # convert the string of bits into an integer. header_bytes = size.to_s.to_i(2) + 1 @log.info "Size in: #{size.to_s} (#{header_bytes.to_s})" @out.read(header_bytes) rescue @log.error "Failed to get header." stop "Failed to get header." raise MentosError, "Failed to get header." end end # Return the final result for the API. Return Ruby objects for the methods that # want them, text otherwise. def return_result(res, method) unless method == :lexer_name_for || method == :highlight || method == :css res = MultiJson.load(res, :symbolize_keys => true) end res = res.rstrip if res.class == String res end # Convert a text header into JSON for easy access. def header_to_json(header) @log.info "[In header: #{header} " header = MultiJson.load(header, :symbolize_keys => true) if header[:error] # Raise this as a Ruby exception of the MentosError class. # Stop so we don't leave the pipe in an inconsistent state. @log.error "Failed to convert header to JSON." stop header[:error] raise MentosError, header[:error] else header end end def get_fixed_bits_from_header(out_header) size = out_header.bytesize # Fixed 32 bits to represent the int. We return a string # representation: e.g, "00000000000000000000000000011110" Array.new(32) { |i| size[i] }.reverse!.join end end end pygments.rb-1.2.0/lib/pygments/version.rb000066400000000000000000000001261315616372200204150ustar00rootroot00000000000000# coding: utf-8 # frozen_string_literal: true module Pygments VERSION = '1.2.0' end pygments.rb-1.2.0/pygments.rb.gemspec000066400000000000000000000013501315616372200176040ustar00rootroot00000000000000require File.expand_path('../lib/pygments/version', __FILE__) Gem::Specification.new do |s| s.name = 'pygments.rb' s.version = Pygments::VERSION s.summary = 'pygments wrapper for ruby' s.description = 'pygments.rb exposes the pygments syntax highlighter to Ruby' s.homepage = 'https://github.com/tmm1/pygments.rb' s.has_rdoc = false s.authors = ['Aman Gupta', 'Ted Nyman'] s.email = ['aman@tmm1.net'] s.license = 'MIT' s.add_dependency 'multi_json', '>= 1.0.0' s.add_development_dependency 'rake-compiler', '~> 0.7.6' s.add_development_dependency 'test-unit', '~> 3.0.0' # s.extensions = ['ext/extconf.rb'] s.require_paths = ['lib'] s.files = `git ls-files`.split("\n").select { |f| !File.symlink?(f) } end pygments.rb-1.2.0/test/000077500000000000000000000000001315616372200147475ustar00rootroot00000000000000pygments.rb-1.2.0/test/test_data.c000066400000000000000000003023031315616372200170640ustar00rootroot00000000000000/* * Copyright (c) 2009-2010, Salvatore Sanfilippo * 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. * * Neither the name of Redis nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 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. */ #include "redis.h" #include "slowlog.h" #include "bio.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Our shared "common" objects */ struct sharedObjectsStruct shared; /* Global vars that are actually used as constants. The following double * values are used for double on-disk serialization, and are initialized * at runtime to avoid strange compiler optimizations. */ double R_Zero, R_PosInf, R_NegInf, R_Nan; /*================================= Globals ================================= */ /* Global vars */ struct redisServer server; /* server global state */ struct redisCommand *commandTable; /* Our command table. * * Every entry is composed of the following fields: * * name: a string representing the command name. * function: pointer to the C function implementing the command. * arity: number of arguments, it is possible to use -N to say >= N * sflags: command flags as string. See below for a table of flags. * flags: flags as bitmask. Computed by Redis using the 'sflags' field. * get_keys_proc: an optional function to get key arguments from a command. * This is only used when the following three fields are not * enough to specify what arguments are keys. * first_key_index: first argument that is a key * last_key_index: last argument that is a key * key_step: step to get all the keys from first to last argument. For instance * in MSET the step is two since arguments are key,val,key,val,... * microseconds: microseconds of total execution time for this command. * calls: total number of calls of this command. * * The flags, microseconds and calls fields are computed by Redis and should * always be set to zero. * * Command flags are expressed using strings where every character represents * a flag. Later the populateCommandTable() function will take care of * populating the real 'flags' field using this characters. * * This is the meaning of the flags: * * w: write command (may modify the key space). * r: read command (will never modify the key space). * m: may increase memory usage once called. Don't allow if out of memory. * a: admin command, like SAVE or SHUTDOWN. * p: Pub/Sub related command. * f: force replication of this command, regarless of server.dirty. * s: command not allowed in scripts. * R: random command. Command is not deterministic, that is, the same command * with the same arguments, with the same key space, may have different * results. For instance SPOP and RANDOMKEY are two random commands. * S: Sort command output array if called from script, so that the output * is deterministic. */ struct redisCommand redisCommandTable[] = { {"get",getCommand,2,"r",0,NULL,1,1,1,0,0}, {"set",setCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"setnx",setnxCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"setex",setexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"psetex",psetexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0}, {"strlen",strlenCommand,2,"r",0,NULL,1,1,1,0,0}, {"del",delCommand,-2,"w",0,noPreloadGetKeys,1,-1,1,0,0}, {"exists",existsCommand,2,"r",0,NULL,1,1,1,0,0}, {"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0}, {"getbit",getbitCommand,3,"r",0,NULL,1,1,1,0,0}, {"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0}, {"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0}, {"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0}, {"incr",incrCommand,2,"wm",0,NULL,1,1,1,0,0}, {"decr",decrCommand,2,"wm",0,NULL,1,1,1,0,0}, {"mget",mgetCommand,-2,"r",0,NULL,1,-1,1,0,0}, {"rpush",rpushCommand,-3,"wm",0,NULL,1,1,1,0,0}, {"lpush",lpushCommand,-3,"wm",0,NULL,1,1,1,0,0}, {"rpushx",rpushxCommand,3,"wm",0,NULL,1,1,1,0,0}, {"lpushx",lpushxCommand,3,"wm",0,NULL,1,1,1,0,0}, {"linsert",linsertCommand,5,"wm",0,NULL,1,1,1,0,0}, {"rpop",rpopCommand,2,"w",0,NULL,1,1,1,0,0}, {"lpop",lpopCommand,2,"w",0,NULL,1,1,1,0,0}, {"brpop",brpopCommand,-3,"ws",0,NULL,1,1,1,0,0}, {"brpoplpush",brpoplpushCommand,4,"wms",0,NULL,1,2,1,0,0}, {"blpop",blpopCommand,-3,"ws",0,NULL,1,-2,1,0,0}, {"llen",llenCommand,2,"r",0,NULL,1,1,1,0,0}, {"lindex",lindexCommand,3,"r",0,NULL,1,1,1,0,0}, {"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0}, {"lrange",lrangeCommand,4,"r",0,NULL,1,1,1,0,0}, {"ltrim",ltrimCommand,4,"w",0,NULL,1,1,1,0,0}, {"lrem",lremCommand,4,"w",0,NULL,1,1,1,0,0}, {"rpoplpush",rpoplpushCommand,3,"wm",0,NULL,1,2,1,0,0}, {"sadd",saddCommand,-3,"wm",0,NULL,1,1,1,0,0}, {"srem",sremCommand,-3,"w",0,NULL,1,1,1,0,0}, {"smove",smoveCommand,4,"w",0,NULL,1,2,1,0,0}, {"sismember",sismemberCommand,3,"r",0,NULL,1,1,1,0,0}, {"scard",scardCommand,2,"r",0,NULL,1,1,1,0,0}, {"spop",spopCommand,2,"wRs",0,NULL,1,1,1,0,0}, {"srandmember",srandmemberCommand,2,"rR",0,NULL,1,1,1,0,0}, {"sinter",sinterCommand,-2,"rS",0,NULL,1,-1,1,0,0}, {"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0}, {"sunion",sunionCommand,-2,"rS",0,NULL,1,-1,1,0,0}, {"sunionstore",sunionstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0}, {"sdiff",sdiffCommand,-2,"rS",0,NULL,1,-1,1,0,0}, {"sdiffstore",sdiffstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0}, {"smembers",sinterCommand,2,"rS",0,NULL,1,1,1,0,0}, {"zadd",zaddCommand,-4,"wm",0,NULL,1,1,1,0,0}, {"zincrby",zincrbyCommand,4,"wm",0,NULL,1,1,1,0,0}, {"zrem",zremCommand,-3,"w",0,NULL,1,1,1,0,0}, {"zremrangebyscore",zremrangebyscoreCommand,4,"w",0,NULL,1,1,1,0,0}, {"zremrangebyrank",zremrangebyrankCommand,4,"w",0,NULL,1,1,1,0,0}, {"zunionstore",zunionstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0}, {"zinterstore",zinterstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0}, {"zrange",zrangeCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zrangebyscore",zrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zrevrangebyscore",zrevrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zcount",zcountCommand,4,"r",0,NULL,1,1,1,0,0}, {"zrevrange",zrevrangeCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zcard",zcardCommand,2,"r",0,NULL,1,1,1,0,0}, {"zscore",zscoreCommand,3,"r",0,NULL,1,1,1,0,0}, {"zrank",zrankCommand,3,"r",0,NULL,1,1,1,0,0}, {"zrevrank",zrevrankCommand,3,"r",0,NULL,1,1,1,0,0}, {"hset",hsetCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hsetnx",hsetnxCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hget",hgetCommand,3,"r",0,NULL,1,1,1,0,0}, {"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0}, {"hmget",hmgetCommand,-3,"r",0,NULL,1,1,1,0,0}, {"hincrby",hincrbyCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hincrbyfloat",hincrbyfloatCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hdel",hdelCommand,-3,"w",0,NULL,1,1,1,0,0}, {"hlen",hlenCommand,2,"r",0,NULL,1,1,1,0,0}, {"hkeys",hkeysCommand,2,"rS",0,NULL,1,1,1,0,0}, {"hvals",hvalsCommand,2,"rS",0,NULL,1,1,1,0,0}, {"hgetall",hgetallCommand,2,"r",0,NULL,1,1,1,0,0}, {"hexists",hexistsCommand,3,"r",0,NULL,1,1,1,0,0}, {"incrby",incrbyCommand,3,"wm",0,NULL,1,1,1,0,0}, {"decrby",decrbyCommand,3,"wm",0,NULL,1,1,1,0,0}, {"incrbyfloat",incrbyfloatCommand,3,"wm",0,NULL,1,1,1,0,0}, {"getset",getsetCommand,3,"wm",0,NULL,1,1,1,0,0}, {"mset",msetCommand,-3,"wm",0,NULL,1,-1,2,0,0}, {"msetnx",msetnxCommand,-3,"wm",0,NULL,1,-1,2,0,0}, {"randomkey",randomkeyCommand,1,"rR",0,NULL,0,0,0,0,0}, {"select",selectCommand,2,"r",0,NULL,0,0,0,0,0}, {"move",moveCommand,3,"w",0,NULL,1,1,1,0,0}, {"rename",renameCommand,3,"w",0,renameGetKeys,1,2,1,0,0}, {"renamenx",renamenxCommand,3,"w",0,renameGetKeys,1,2,1,0,0}, {"expire",expireCommand,3,"w",0,NULL,1,1,1,0,0}, {"expireat",expireatCommand,3,"w",0,NULL,1,1,1,0,0}, {"pexpire",pexpireCommand,3,"w",0,NULL,1,1,1,0,0}, {"pexpireat",pexpireatCommand,3,"w",0,NULL,1,1,1,0,0}, {"keys",keysCommand,2,"rS",0,NULL,0,0,0,0,0}, {"dbsize",dbsizeCommand,1,"r",0,NULL,0,0,0,0,0}, {"auth",authCommand,2,"rs",0,NULL,0,0,0,0,0}, {"ping",pingCommand,1,"r",0,NULL,0,0,0,0,0}, {"echo",echoCommand,2,"r",0,NULL,0,0,0,0,0}, {"save",saveCommand,1,"ars",0,NULL,0,0,0,0,0}, {"bgsave",bgsaveCommand,1,"ar",0,NULL,0,0,0,0,0}, {"bgrewriteaof",bgrewriteaofCommand,1,"ar",0,NULL,0,0,0,0,0}, {"shutdown",shutdownCommand,-1,"ar",0,NULL,0,0,0,0,0}, {"lastsave",lastsaveCommand,1,"r",0,NULL,0,0,0,0,0}, {"type",typeCommand,2,"r",0,NULL,1,1,1,0,0}, {"multi",multiCommand,1,"rs",0,NULL,0,0,0,0,0}, {"exec",execCommand,1,"s",0,NULL,0,0,0,0,0}, {"discard",discardCommand,1,"rs",0,NULL,0,0,0,0,0}, {"sync",syncCommand,1,"ars",0,NULL,0,0,0,0,0}, {"replconf",replconfCommand,-1,"ars",0,NULL,0,0,0,0,0}, {"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0}, {"flushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0}, {"sort",sortCommand,-2,"wmS",0,NULL,1,1,1,0,0}, {"info",infoCommand,-1,"r",0,NULL,0,0,0,0,0}, {"monitor",monitorCommand,1,"ars",0,NULL,0,0,0,0,0}, {"ttl",ttlCommand,2,"r",0,NULL,1,1,1,0,0}, {"pttl",pttlCommand,2,"r",0,NULL,1,1,1,0,0}, {"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0}, {"slaveof",slaveofCommand,3,"as",0,NULL,0,0,0,0,0}, {"debug",debugCommand,-2,"as",0,NULL,0,0,0,0,0}, {"config",configCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"subscribe",subscribeCommand,-2,"rps",0,NULL,0,0,0,0,0}, {"unsubscribe",unsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0}, {"psubscribe",psubscribeCommand,-2,"rps",0,NULL,0,0,0,0,0}, {"punsubscribe",punsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0}, {"publish",publishCommand,3,"pf",0,NULL,0,0,0,0,0}, {"watch",watchCommand,-2,"rs",0,noPreloadGetKeys,1,-1,1,0,0}, {"unwatch",unwatchCommand,1,"rs",0,NULL,0,0,0,0,0}, {"cluster",clusterCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"restore",restoreCommand,4,"awm",0,NULL,1,1,1,0,0}, {"migrate",migrateCommand,6,"aw",0,NULL,0,0,0,0,0}, {"asking",askingCommand,1,"r",0,NULL,0,0,0,0,0}, {"dump",dumpCommand,2,"ar",0,NULL,1,1,1,0,0}, {"object",objectCommand,-2,"r",0,NULL,2,2,2,0,0}, {"client",clientCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"eval",evalCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0}, {"evalsha",evalShaCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0}, {"slowlog",slowlogCommand,-2,"r",0,NULL,0,0,0,0,0}, {"script",scriptCommand,-2,"ras",0,NULL,0,0,0,0,0}, {"time",timeCommand,1,"rR",0,NULL,0,0,0,0,0}, {"bitop",bitopCommand,-4,"wm",0,NULL,2,-1,1,0,0}, {"bitcount",bitcountCommand,-2,"r",0,NULL,1,1,1,0,0} }; /*============================ Utility functions ============================ */ /* Low level logging. To use only for very big messages, otherwise * redisLog() is to prefer. */ void redisLogRaw(int level, const char *msg) { const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING }; const char *c = ".-*#"; FILE *fp; char buf[64]; int rawmode = (level & REDIS_LOG_RAW); level &= 0xff; /* clear flags */ if (level < server.verbosity) return; fp = (server.logfile == NULL) ? stdout : fopen(server.logfile,"a"); if (!fp) return; if (rawmode) { fprintf(fp,"%s",msg); } else { int off; struct timeval tv; gettimeofday(&tv,NULL); off = strftime(buf,sizeof(buf),"%d %b %H:%M:%S.",localtime(&tv.tv_sec)); snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000); fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg); } fflush(fp); if (server.logfile) fclose(fp); if (server.syslog_enabled) syslog(syslogLevelMap[level], "%s", msg); } /* Like redisLogRaw() but with printf-alike support. This is the funciton that * is used across the code. The raw version is only used in order to dump * the INFO output on crash. */ void redisLog(int level, const char *fmt, ...) { va_list ap; char msg[REDIS_MAX_LOGMSG_LEN]; if ((level&0xff) < server.verbosity) return; va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); redisLogRaw(level,msg); } /* Log a fixed message without printf-alike capabilities, in a way that is * safe to call from a signal handler. * * We actually use this only for signals that are not fatal from the point * of view of Redis. Signals that are going to kill the server anyway and * where we need printf-alike features are served by redisLog(). */ void redisLogFromHandler(int level, const char *msg) { int fd; char buf[64]; if ((level&0xff) < server.verbosity || (server.logfile == NULL && server.daemonize)) return; fd = server.logfile ? open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644) : STDOUT_FILENO; if (fd == -1) return; ll2string(buf,sizeof(buf),getpid()); if (write(fd,"[",1) == -1) goto err; if (write(fd,buf,strlen(buf)) == -1) goto err; if (write(fd," | signal handler] (",20) == -1) goto err; ll2string(buf,sizeof(buf),time(NULL)); if (write(fd,buf,strlen(buf)) == -1) goto err; if (write(fd,") ",2) == -1) goto err; if (write(fd,msg,strlen(msg)) == -1) goto err; if (write(fd,"\n",1) == -1) goto err; err: if (server.logfile) close(fd); } /* Redis generally does not try to recover from out of memory conditions * when allocating objects or strings, it is not clear if it will be possible * to report this condition to the client since the networking layer itself * is based on heap allocation for send buffers, so we simply abort. * At least the code will be simpler to read... */ void oom(const char *msg) { redisLog(REDIS_WARNING, "%s: Out of memory\n",msg); sleep(1); abort(); } /* Return the UNIX time in microseconds */ long long ustime(void) { struct timeval tv; long long ust; gettimeofday(&tv, NULL); ust = ((long long)tv.tv_sec)*1000000; ust += tv.tv_usec; return ust; } /* Return the UNIX time in milliseconds */ long long mstime(void) { return ustime()/1000; } /* After an RDB dump or AOF rewrite we exit from children using _exit() instead of * exit(), because the latter may interact with the same file objects used by * the parent process. However if we are testing the coverage normal exit() is * used in order to obtain the right coverage information. */ void exitFromChild(int retcode) { #ifdef COVERAGE_TEST exit(retcode); #else _exit(retcode); #endif } /*====================== Hash table type implementation ==================== */ /* This is an hash table type that uses the SDS dynamic strings libary as * keys and radis objects as values (objects can hold SDS strings, * lists, sets). */ void dictVanillaFree(void *privdata, void *val) { DICT_NOTUSED(privdata); zfree(val); } void dictListDestructor(void *privdata, void *val) { DICT_NOTUSED(privdata); listRelease((list*)val); } int dictSdsKeyCompare(void *privdata, const void *key1, const void *key2) { int l1,l2; DICT_NOTUSED(privdata); l1 = sdslen((sds)key1); l2 = sdslen((sds)key2); if (l1 != l2) return 0; return memcmp(key1, key2, l1) == 0; } /* A case insensitive version used for the command lookup table. */ int dictSdsKeyCaseCompare(void *privdata, const void *key1, const void *key2) { DICT_NOTUSED(privdata); return strcasecmp(key1, key2) == 0; } void dictRedisObjectDestructor(void *privdata, void *val) { DICT_NOTUSED(privdata); if (val == NULL) return; /* Values of swapped out keys as set to NULL */ decrRefCount(val); } void dictSdsDestructor(void *privdata, void *val) { DICT_NOTUSED(privdata); sdsfree(val); } int dictObjKeyCompare(void *privdata, const void *key1, const void *key2) { const robj *o1 = key1, *o2 = key2; return dictSdsKeyCompare(privdata,o1->ptr,o2->ptr); } unsigned int dictObjHash(const void *key) { const robj *o = key; return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); } unsigned int dictSdsHash(const void *key) { return dictGenHashFunction((unsigned char*)key, sdslen((char*)key)); } unsigned int dictSdsCaseHash(const void *key) { return dictGenCaseHashFunction((unsigned char*)key, sdslen((char*)key)); } int dictEncObjKeyCompare(void *privdata, const void *key1, const void *key2) { robj *o1 = (robj*) key1, *o2 = (robj*) key2; int cmp; if (o1->encoding == REDIS_ENCODING_INT && o2->encoding == REDIS_ENCODING_INT) return o1->ptr == o2->ptr; o1 = getDecodedObject(o1); o2 = getDecodedObject(o2); cmp = dictSdsKeyCompare(privdata,o1->ptr,o2->ptr); decrRefCount(o1); decrRefCount(o2); return cmp; } unsigned int dictEncObjHash(const void *key) { robj *o = (robj*) key; if (o->encoding == REDIS_ENCODING_RAW) { return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); } else { if (o->encoding == REDIS_ENCODING_INT) { char buf[32]; int len; len = ll2string(buf,32,(long)o->ptr); return dictGenHashFunction((unsigned char*)buf, len); } else { unsigned int hash; o = getDecodedObject(o); hash = dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); decrRefCount(o); return hash; } } } /* Sets type hash table */ dictType setDictType = { dictEncObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictEncObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ NULL /* val destructor */ }; /* Sorted sets hash (note: a skiplist is used in addition to the hash table) */ dictType zsetDictType = { dictEncObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictEncObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ NULL /* val destructor */ }; /* Db->dict, keys are sds strings, vals are Redis objects. */ dictType dbDictType = { dictSdsHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCompare, /* key compare */ dictSdsDestructor, /* key destructor */ dictRedisObjectDestructor /* val destructor */ }; /* Db->expires */ dictType keyptrDictType = { dictSdsHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCompare, /* key compare */ NULL, /* key destructor */ NULL /* val destructor */ }; /* Command table. sds string -> command struct pointer. */ dictType commandTableDictType = { dictSdsCaseHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCaseCompare, /* key compare */ dictSdsDestructor, /* key destructor */ NULL /* val destructor */ }; /* Hash type hash table (note that small hashes are represented with zimpaps) */ dictType hashDictType = { dictEncObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictEncObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ dictRedisObjectDestructor /* val destructor */ }; /* Keylist hash table type has unencoded redis objects as keys and * lists as values. It's used for blocking operations (BLPOP) and to * map swapped keys to a list of clients waiting for this keys to be loaded. */ dictType keylistDictType = { dictObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ dictListDestructor /* val destructor */ }; /* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to * clusterNode structures. */ dictType clusterNodesDictType = { dictSdsHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCompare, /* key compare */ dictSdsDestructor, /* key destructor */ NULL /* val destructor */ }; int htNeedsResize(dict *dict) { long long size, used; size = dictSlots(dict); used = dictSize(dict); return (size && used && size > DICT_HT_INITIAL_SIZE && (used*100/size < REDIS_HT_MINFILL)); } /* If the percentage of used slots in the HT reaches REDIS_HT_MINFILL * we resize the hash table to save memory */ void tryResizeHashTables(void) { int j; for (j = 0; j < server.dbnum; j++) { if (htNeedsResize(server.db[j].dict)) dictResize(server.db[j].dict); if (htNeedsResize(server.db[j].expires)) dictResize(server.db[j].expires); } } /* Our hash table implementation performs rehashing incrementally while * we write/read from the hash table. Still if the server is idle, the hash * table will use two tables for a long time. So we try to use 1 millisecond * of CPU time at every serverCron() loop in order to rehash some key. */ void incrementallyRehash(void) { int j; for (j = 0; j < server.dbnum; j++) { /* Keys dictionary */ if (dictIsRehashing(server.db[j].dict)) { dictRehashMilliseconds(server.db[j].dict,1); break; /* already used our millisecond for this loop... */ } /* Expires */ if (dictIsRehashing(server.db[j].expires)) { dictRehashMilliseconds(server.db[j].expires,1); break; /* already used our millisecond for this loop... */ } } } /* This function is called once a background process of some kind terminates, * as we want to avoid resizing the hash tables when there is a child in order * to play well with copy-on-write (otherwise when a resize happens lots of * memory pages are copied). The goal of this function is to update the ability * for dict.c to resize the hash tables accordingly to the fact we have o not * running childs. */ void updateDictResizePolicy(void) { if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) dictEnableResize(); else dictDisableResize(); } /* ======================= Cron: called every 100 ms ======================== */ /* Try to expire a few timed out keys. The algorithm used is adaptive and * will use few CPU cycles if there are few expiring keys, otherwise * it will get more aggressive to avoid that too much memory is used by * keys that can be removed from the keyspace. */ void activeExpireCycle(void) { int j, iteration = 0; long long start = ustime(), timelimit; /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time * per iteration. Since this function gets called with a frequency of * REDIS_HZ times per second, the following is the max amount of * microseconds we can spend in this function. */ timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/REDIS_HZ/100; if (timelimit <= 0) timelimit = 1; for (j = 0; j < server.dbnum; j++) { int expired; redisDb *db = server.db+j; /* Continue to expire if at the end of the cycle more than 25% * of the keys were expired. */ do { unsigned long num = dictSize(db->expires); unsigned long slots = dictSlots(db->expires); long long now = mstime(); /* When there are less than 1% filled slots getting random * keys is expensive, so stop here waiting for better times... * The dictionary will be resized asap. */ if (num && slots > DICT_HT_INITIAL_SIZE && (num*100/slots < 1)) break; /* The main collection cycle. Sample random keys among keys * with an expire set, checking for expired ones. */ expired = 0; if (num > REDIS_EXPIRELOOKUPS_PER_CRON) num = REDIS_EXPIRELOOKUPS_PER_CRON; while (num--) { dictEntry *de; long long t; if ((de = dictGetRandomKey(db->expires)) == NULL) break; t = dictGetSignedIntegerVal(de); if (now > t) { sds key = dictGetKey(de); robj *keyobj = createStringObject(key,sdslen(key)); propagateExpire(db,keyobj); dbDelete(db,keyobj); decrRefCount(keyobj); expired++; server.stat_expiredkeys++; } } /* We can't block forever here even if there are many keys to * expire. So after a given amount of milliseconds return to the * caller waiting for the other active expire cycle. */ iteration++; if ((iteration & 0xf) == 0 && /* check once every 16 cycles. */ (ustime()-start) > timelimit) return; } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4); } } void updateLRUClock(void) { server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) & REDIS_LRU_CLOCK_MAX; } /* Add a sample to the operations per second array of samples. */ void trackOperationsPerSecond(void) { long long t = mstime() - server.ops_sec_last_sample_time; long long ops = server.stat_numcommands - server.ops_sec_last_sample_ops; long long ops_sec; ops_sec = t > 0 ? (ops*1000/t) : 0; server.ops_sec_samples[server.ops_sec_idx] = ops_sec; server.ops_sec_idx = (server.ops_sec_idx+1) % REDIS_OPS_SEC_SAMPLES; server.ops_sec_last_sample_time = mstime(); server.ops_sec_last_sample_ops = server.stat_numcommands; } /* Return the mean of all the samples. */ long long getOperationsPerSecond(void) { int j; long long sum = 0; for (j = 0; j < REDIS_OPS_SEC_SAMPLES; j++) sum += server.ops_sec_samples[j]; return sum / REDIS_OPS_SEC_SAMPLES; } /* Check for timeouts. Returns non-zero if the client was terminated */ int clientsCronHandleTimeout(redisClient *c) { time_t now = server.unixtime; if (server.maxidletime && !(c->flags & REDIS_SLAVE) && /* no timeout for slaves */ !(c->flags & REDIS_MASTER) && /* no timeout for masters */ !(c->flags & REDIS_BLOCKED) && /* no timeout for BLPOP */ dictSize(c->pubsub_channels) == 0 && /* no timeout for pubsub */ listLength(c->pubsub_patterns) == 0 && (now - c->lastinteraction > server.maxidletime)) { redisLog(REDIS_VERBOSE,"Closing idle client"); freeClient(c); return 1; } else if (c->flags & REDIS_BLOCKED) { if (c->bpop.timeout != 0 && c->bpop.timeout < now) { addReply(c,shared.nullmultibulk); unblockClientWaitingData(c); } } return 0; } /* The client query buffer is an sds.c string that can end with a lot of * free space not used, this function reclaims space if needed. * * The funciton always returns 0 as it never terminates the client. */ int clientsCronResizeQueryBuffer(redisClient *c) { size_t querybuf_size = sdsAllocSize(c->querybuf); time_t idletime = server.unixtime - c->lastinteraction; /* There are two conditions to resize the query buffer: * 1) Query buffer is > BIG_ARG and too big for latest peak. * 2) Client is inactive and the buffer is bigger than 1k. */ if (((querybuf_size > REDIS_MBULK_BIG_ARG) && (querybuf_size/(c->querybuf_peak+1)) > 2) || (querybuf_size > 1024 && idletime > 2)) { /* Only resize the query buffer if it is actually wasting space. */ if (sdsavail(c->querybuf) > 1024) { c->querybuf = sdsRemoveFreeSpace(c->querybuf); } } /* Reset the peak again to capture the peak memory usage in the next * cycle. */ c->querybuf_peak = 0; return 0; } void clientsCron(void) { /* Make sure to process at least 1/(REDIS_HZ*10) of clients per call. * Since this function is called REDIS_HZ times per second we are sure that * in the worst case we process all the clients in 10 seconds. * In normal conditions (a reasonable number of clients) we process * all the clients in a shorter time. */ int numclients = listLength(server.clients); int iterations = numclients/(REDIS_HZ*10); if (iterations < 50) iterations = (numclients < 50) ? numclients : 50; while(listLength(server.clients) && iterations--) { redisClient *c; listNode *head; /* Rotate the list, take the current head, process. * This way if the client must be removed from the list it's the * first element and we don't incur into O(N) computation. */ listRotate(server.clients); head = listFirst(server.clients); c = listNodeValue(head); /* The following functions do different service checks on the client. * The protocol is that they return non-zero if the client was * terminated. */ if (clientsCronHandleTimeout(c)) continue; if (clientsCronResizeQueryBuffer(c)) continue; } } /* This is our timer interrupt, called REDIS_HZ times per second. * Here is where we do a number of things that need to be done asynchronously. * For instance: * * - Active expired keys collection (it is also performed in a lazy way on * lookup). * - Software watchdong. * - Update some statistic. * - Incremental rehashing of the DBs hash tables. * - Triggering BGSAVE / AOF rewrite, and handling of terminated children. * - Clients timeout of differnet kinds. * - Replication reconnection. * - Many more... * * Everything directly called here will be called REDIS_HZ times per second, * so in order to throttle execution of things we want to do less frequently * a macro is used: run_with_period(milliseconds) { .... } */ /* Using the following macro you can run code inside serverCron() with the * specified period, specified in milliseconds. * The actual resolution depends on REDIS_HZ. */ #define run_with_period(_ms_) if (!(loops % ((_ms_)/(1000/REDIS_HZ)))) int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { int j, loops = server.cronloops; REDIS_NOTUSED(eventLoop); REDIS_NOTUSED(id); REDIS_NOTUSED(clientData); /* Software watchdog: deliver the SIGALRM that will reach the signal * handler if we don't return here fast enough. */ if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period); /* We take a cached value of the unix time in the global state because * with virtual memory and aging there is to store the current time * in objects at every object access, and accuracy is not needed. * To access a global var is faster than calling time(NULL) */ server.unixtime = time(NULL); run_with_period(100) trackOperationsPerSecond(); /* We have just 22 bits per object for LRU information. * So we use an (eventually wrapping) LRU clock with 10 seconds resolution. * 2^22 bits with 10 seconds resoluton is more or less 1.5 years. * * Note that even if this will wrap after 1.5 years it's not a problem, * everything will still work but just some object will appear younger * to Redis. But for this to happen a given object should never be touched * for 1.5 years. * * Note that you can change the resolution altering the * REDIS_LRU_CLOCK_RESOLUTION define. */ updateLRUClock(); /* Record the max memory used since the server was started. */ if (zmalloc_used_memory() > server.stat_peak_memory) server.stat_peak_memory = zmalloc_used_memory(); /* We received a SIGTERM, shutting down here in a safe way, as it is * not ok doing so inside the signal handler. */ if (server.shutdown_asap) { if (prepareForShutdown(0) == REDIS_OK) exit(0); redisLog(REDIS_WARNING,"SIGTERM received but errors trying to shut down the server, check the logs for more information"); } /* Show some info about non-empty databases */ run_with_period(5000) { for (j = 0; j < server.dbnum; j++) { long long size, used, vkeys; size = dictSlots(server.db[j].dict); used = dictSize(server.db[j].dict); vkeys = dictSize(server.db[j].expires); if (used || vkeys) { redisLog(REDIS_VERBOSE,"DB %d: %lld keys (%lld volatile) in %lld slots HT.",j,used,vkeys,size); /* dictPrintStats(server.dict); */ } } } /* We don't want to resize the hash tables while a bacground saving * is in progress: the saving child is created using fork() that is * implemented with a copy-on-write semantic in most modern systems, so * if we resize the HT while there is the saving child at work actually * a lot of memory movements in the parent will cause a lot of pages * copied. */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) { tryResizeHashTables(); if (server.activerehashing) incrementallyRehash(); } /* Show information about connected clients */ run_with_period(5000) { redisLog(REDIS_VERBOSE,"%d clients connected (%d slaves), %zu bytes in use", listLength(server.clients)-listLength(server.slaves), listLength(server.slaves), zmalloc_used_memory()); } /* We need to do a few operations on clients asynchronously. */ clientsCron(); /* Start a scheduled AOF rewrite if this was requested by the user while * a BGSAVE was in progress. */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && server.aof_rewrite_scheduled) { rewriteAppendOnlyFileBackground(); } /* Check if a background saving or AOF rewrite in progress terminated. */ if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) { int statloc; pid_t pid; if ((pid = wait3(&statloc,WNOHANG,NULL)) != 0) { int exitcode = WEXITSTATUS(statloc); int bysignal = 0; if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc); if (pid == server.rdb_child_pid) { backgroundSaveDoneHandler(exitcode,bysignal); } else { backgroundRewriteDoneHandler(exitcode,bysignal); } updateDictResizePolicy(); } } else { /* If there is not a background saving/rewrite in progress check if * we have to save/rewrite now */ for (j = 0; j < server.saveparamslen; j++) { struct saveparam *sp = server.saveparams+j; if (server.dirty >= sp->changes && server.unixtime-server.lastsave > sp->seconds) { redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...", sp->changes, sp->seconds); rdbSaveBackground(server.rdb_filename); break; } } /* Trigger an AOF rewrite if needed */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && server.aof_rewrite_perc && server.aof_current_size > server.aof_rewrite_min_size) { long long base = server.aof_rewrite_base_size ? server.aof_rewrite_base_size : 1; long long growth = (server.aof_current_size*100/base) - 100; if (growth >= server.aof_rewrite_perc) { redisLog(REDIS_NOTICE,"Starting automatic rewriting of AOF on %lld%% growth",growth); rewriteAppendOnlyFileBackground(); } } } /* If we postponed an AOF buffer flush, let's try to do it every time the * cron function is called. */ if (server.aof_flush_postponed_start) flushAppendOnlyFile(0); /* Expire a few keys per cycle, only if this is a master. * On slaves we wait for DEL operations synthesized by the master * in order to guarantee a strict consistency. */ if (server.masterhost == NULL) activeExpireCycle(); /* Close clients that need to be closed asynchronous */ freeClientsInAsyncFreeQueue(); /* Replication cron function -- used to reconnect to master and * to detect transfer failures. */ run_with_period(1000) replicationCron(); /* Run other sub-systems specific cron jobs */ run_with_period(1000) { if (server.cluster_enabled) clusterCron(); } server.cronloops++; return 1000/REDIS_HZ; } /* This function gets called every time Redis is entering the * main loop of the event driven library, that is, before to sleep * for ready file descriptors. */ void beforeSleep(struct aeEventLoop *eventLoop) { REDIS_NOTUSED(eventLoop); listNode *ln; redisClient *c; /* Try to process pending commands for clients that were just unblocked. */ while (listLength(server.unblocked_clients)) { ln = listFirst(server.unblocked_clients); redisAssert(ln != NULL); c = ln->value; listDelNode(server.unblocked_clients,ln); c->flags &= ~REDIS_UNBLOCKED; /* Process remaining data in the input buffer. */ if (c->querybuf && sdslen(c->querybuf) > 0) { server.current_client = c; processInputBuffer(c); server.current_client = NULL; } } /* Write the AOF buffer on disk */ flushAppendOnlyFile(0); } /* =========================== Server initialization ======================== */ void createSharedObjects(void) { int j; shared.crlf = createObject(REDIS_STRING,sdsnew("\r\n")); shared.ok = createObject(REDIS_STRING,sdsnew("+OK\r\n")); shared.err = createObject(REDIS_STRING,sdsnew("-ERR\r\n")); shared.emptybulk = createObject(REDIS_STRING,sdsnew("$0\r\n\r\n")); shared.czero = createObject(REDIS_STRING,sdsnew(":0\r\n")); shared.cone = createObject(REDIS_STRING,sdsnew(":1\r\n")); shared.cnegone = createObject(REDIS_STRING,sdsnew(":-1\r\n")); shared.nullbulk = createObject(REDIS_STRING,sdsnew("$-1\r\n")); shared.nullmultibulk = createObject(REDIS_STRING,sdsnew("*-1\r\n")); shared.emptymultibulk = createObject(REDIS_STRING,sdsnew("*0\r\n")); shared.pong = createObject(REDIS_STRING,sdsnew("+PONG\r\n")); shared.queued = createObject(REDIS_STRING,sdsnew("+QUEUED\r\n")); shared.wrongtypeerr = createObject(REDIS_STRING,sdsnew( "-ERR Operation against a key holding the wrong kind of value\r\n")); shared.nokeyerr = createObject(REDIS_STRING,sdsnew( "-ERR no such key\r\n")); shared.syntaxerr = createObject(REDIS_STRING,sdsnew( "-ERR syntax error\r\n")); shared.sameobjecterr = createObject(REDIS_STRING,sdsnew( "-ERR source and destination objects are the same\r\n")); shared.outofrangeerr = createObject(REDIS_STRING,sdsnew( "-ERR index out of range\r\n")); shared.noscripterr = createObject(REDIS_STRING,sdsnew( "-NOSCRIPT No matching script. Please use EVAL.\r\n")); shared.loadingerr = createObject(REDIS_STRING,sdsnew( "-LOADING Redis is loading the dataset in memory\r\n")); shared.slowscripterr = createObject(REDIS_STRING,sdsnew( "-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\r\n")); shared.masterdownerr = createObject(REDIS_STRING,sdsnew( "-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.\r\n")); shared.bgsaveerr = createObject(REDIS_STRING,sdsnew( "-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.\r\n")); shared.roslaveerr = createObject(REDIS_STRING,sdsnew( "-READONLY You can't write against a read only slave.\r\n")); shared.oomerr = createObject(REDIS_STRING,sdsnew( "-OOM command not allowed when used memory > 'maxmemory'.\r\n")); shared.space = createObject(REDIS_STRING,sdsnew(" ")); shared.colon = createObject(REDIS_STRING,sdsnew(":")); shared.plus = createObject(REDIS_STRING,sdsnew("+")); for (j = 0; j < REDIS_SHARED_SELECT_CMDS; j++) { shared.select[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(),"select %d\r\n", j)); } shared.messagebulk = createStringObject("$7\r\nmessage\r\n",13); shared.pmessagebulk = createStringObject("$8\r\npmessage\r\n",14); shared.subscribebulk = createStringObject("$9\r\nsubscribe\r\n",15); shared.unsubscribebulk = createStringObject("$11\r\nunsubscribe\r\n",18); shared.psubscribebulk = createStringObject("$10\r\npsubscribe\r\n",17); shared.punsubscribebulk = createStringObject("$12\r\npunsubscribe\r\n",19); shared.del = createStringObject("DEL",3); shared.rpop = createStringObject("RPOP",4); shared.lpop = createStringObject("LPOP",4); for (j = 0; j < REDIS_SHARED_INTEGERS; j++) { shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j); shared.integers[j]->encoding = REDIS_ENCODING_INT; } for (j = 0; j < REDIS_SHARED_BULKHDR_LEN; j++) { shared.mbulkhdr[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(),"*%d\r\n",j)); shared.bulkhdr[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(),"$%d\r\n",j)); } } void initServerConfig() { getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE); server.runid[REDIS_RUN_ID_SIZE] = '\0'; server.arch_bits = (sizeof(long) == 8) ? 64 : 32; server.port = REDIS_SERVERPORT; server.bindaddr = NULL; server.unixsocket = NULL; server.unixsocketperm = 0; server.ipfd = -1; server.sofd = -1; server.dbnum = REDIS_DEFAULT_DBNUM; server.verbosity = REDIS_NOTICE; server.maxidletime = REDIS_MAXIDLETIME; server.client_max_querybuf_len = REDIS_MAX_QUERYBUF_LEN; server.saveparams = NULL; server.loading = 0; server.logfile = NULL; /* NULL = log on standard output */ server.syslog_enabled = 0; server.syslog_ident = zstrdup("redis"); server.syslog_facility = LOG_LOCAL0; server.daemonize = 0; server.aof_state = REDIS_AOF_OFF; server.aof_fsync = AOF_FSYNC_EVERYSEC; server.aof_no_fsync_on_rewrite = 0; server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC; server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE; server.aof_rewrite_base_size = 0; server.aof_rewrite_scheduled = 0; server.aof_last_fsync = time(NULL); server.aof_rewrite_time_last = -1; server.aof_rewrite_time_start = -1; server.aof_delayed_fsync = 0; server.aof_fd = -1; server.aof_selected_db = -1; /* Make sure the first time will not match */ server.aof_flush_postponed_start = 0; server.pidfile = zstrdup("/var/run/redis.pid"); server.rdb_filename = zstrdup("dump.rdb"); server.aof_filename = zstrdup("appendonly.aof"); server.requirepass = NULL; server.rdb_compression = 1; server.rdb_checksum = 1; server.activerehashing = 1; server.maxclients = REDIS_MAX_CLIENTS; server.bpop_blocked_clients = 0; server.maxmemory = 0; server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU; server.maxmemory_samples = 3; server.hash_max_ziplist_entries = REDIS_HASH_MAX_ZIPLIST_ENTRIES; server.hash_max_ziplist_value = REDIS_HASH_MAX_ZIPLIST_VALUE; server.list_max_ziplist_entries = REDIS_LIST_MAX_ZIPLIST_ENTRIES; server.list_max_ziplist_value = REDIS_LIST_MAX_ZIPLIST_VALUE; server.set_max_intset_entries = REDIS_SET_MAX_INTSET_ENTRIES; server.zset_max_ziplist_entries = REDIS_ZSET_MAX_ZIPLIST_ENTRIES; server.zset_max_ziplist_value = REDIS_ZSET_MAX_ZIPLIST_VALUE; server.shutdown_asap = 0; server.repl_ping_slave_period = REDIS_REPL_PING_SLAVE_PERIOD; server.repl_timeout = REDIS_REPL_TIMEOUT; server.cluster_enabled = 0; server.cluster.configfile = zstrdup("nodes.conf"); server.lua_caller = NULL; server.lua_time_limit = REDIS_LUA_TIME_LIMIT; server.lua_client = NULL; server.lua_timedout = 0; updateLRUClock(); resetServerSaveParams(); appendServerSaveParams(60*60,1); /* save after 1 hour and 1 change */ appendServerSaveParams(300,100); /* save after 5 minutes and 100 changes */ appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */ /* Replication related */ server.masterauth = NULL; server.masterhost = NULL; server.masterport = 6379; server.master = NULL; server.repl_state = REDIS_REPL_NONE; server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT; server.repl_serve_stale_data = 1; server.repl_slave_ro = 1; server.repl_down_since = time(NULL); /* Client output buffer limits */ server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].hard_limit_bytes = 0; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_bytes = 0; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_seconds = 0; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].hard_limit_bytes = 1024*1024*256; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_bytes = 1024*1024*64; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_seconds = 60; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].hard_limit_bytes = 1024*1024*32; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_bytes = 1024*1024*8; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_seconds = 60; /* Double constants initialization */ R_Zero = 0.0; R_PosInf = 1.0/R_Zero; R_NegInf = -1.0/R_Zero; R_Nan = R_Zero/R_Zero; /* Command table -- we intiialize it here as it is part of the * initial configuration, since command names may be changed via * redis.conf using the rename-command directive. */ server.commands = dictCreate(&commandTableDictType,NULL); populateCommandTable(); server.delCommand = lookupCommandByCString("del"); server.multiCommand = lookupCommandByCString("multi"); server.lpushCommand = lookupCommandByCString("lpush"); /* Slow log */ server.slowlog_log_slower_than = REDIS_SLOWLOG_LOG_SLOWER_THAN; server.slowlog_max_len = REDIS_SLOWLOG_MAX_LEN; /* Debugging */ server.assert_failed = ""; server.assert_file = ""; server.assert_line = 0; server.bug_report_start = 0; server.watchdog_period = 0; } /* This function will try to raise the max number of open files accordingly to * the configured max number of clients. It will also account for 32 additional * file descriptors as we need a few more for persistence, listening * sockets, log files and so forth. * * If it will not be possible to set the limit accordingly to the configured * max number of clients, the function will do the reverse setting * server.maxclients to the value that we can actually handle. */ void adjustOpenFilesLimit(void) { rlim_t maxfiles = server.maxclients+32; struct rlimit limit; if (getrlimit(RLIMIT_NOFILE,&limit) == -1) { redisLog(REDIS_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.", strerror(errno)); server.maxclients = 1024-32; } else { rlim_t oldlimit = limit.rlim_cur; /* Set the max number of files if the current limit is not enough * for our needs. */ if (oldlimit < maxfiles) { rlim_t f; f = maxfiles; while(f > oldlimit) { limit.rlim_cur = f; limit.rlim_max = f; if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break; f -= 128; } if (f < oldlimit) f = oldlimit; if (f != maxfiles) { server.maxclients = f-32; redisLog(REDIS_WARNING,"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.", (int) maxfiles, strerror(errno), (int) server.maxclients); } else { redisLog(REDIS_NOTICE,"Max number of open files set to %d", (int) maxfiles); } } } } void initServer() { int j; signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); setupSignalHandlers(); if (server.syslog_enabled) { openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT, server.syslog_facility); } server.current_client = NULL; server.clients = listCreate(); server.clients_to_close = listCreate(); server.slaves = listCreate(); server.monitors = listCreate(); server.unblocked_clients = listCreate(); createSharedObjects(); adjustOpenFilesLimit(); server.el = aeCreateEventLoop(server.maxclients+1024); server.db = zmalloc(sizeof(redisDb)*server.dbnum); if (server.port != 0) { server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr); if (server.ipfd == ANET_ERR) { redisLog(REDIS_WARNING, "Opening port %d: %s", server.port, server.neterr); exit(1); } } if (server.unixsocket != NULL) { unlink(server.unixsocket); /* don't care if this fails */ server.sofd = anetUnixServer(server.neterr,server.unixsocket,server.unixsocketperm); if (server.sofd == ANET_ERR) { redisLog(REDIS_WARNING, "Opening socket: %s", server.neterr); exit(1); } } if (server.ipfd < 0 && server.sofd < 0) { redisLog(REDIS_WARNING, "Configured to not listen anywhere, exiting."); exit(1); } for (j = 0; j < server.dbnum; j++) { server.db[j].dict = dictCreate(&dbDictType,NULL); server.db[j].expires = dictCreate(&keyptrDictType,NULL); server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL); server.db[j].watched_keys = dictCreate(&keylistDictType,NULL); server.db[j].id = j; } server.pubsub_channels = dictCreate(&keylistDictType,NULL); server.pubsub_patterns = listCreate(); listSetFreeMethod(server.pubsub_patterns,freePubsubPattern); listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern); server.cronloops = 0; server.rdb_child_pid = -1; server.aof_child_pid = -1; aofRewriteBufferReset(); server.aof_buf = sdsempty(); server.lastsave = time(NULL); server.rdb_save_time_last = -1; server.rdb_save_time_start = -1; server.dirty = 0; server.stat_numcommands = 0; server.stat_numconnections = 0; server.stat_expiredkeys = 0; server.stat_evictedkeys = 0; server.stat_starttime = time(NULL); server.stat_keyspace_misses = 0; server.stat_keyspace_hits = 0; server.stat_peak_memory = 0; server.stat_fork_time = 0; server.stat_rejected_conn = 0; memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples)); server.ops_sec_idx = 0; server.ops_sec_last_sample_time = mstime(); server.ops_sec_last_sample_ops = 0; server.unixtime = time(NULL); server.lastbgsave_status = REDIS_OK; server.stop_writes_on_bgsave_err = 1; aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL); if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE, acceptTcpHandler,NULL) == AE_ERR) oom("creating file event"); if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE, acceptUnixHandler,NULL) == AE_ERR) oom("creating file event"); if (server.aof_state == REDIS_AOF_ON) { server.aof_fd = open(server.aof_filename, O_WRONLY|O_APPEND|O_CREAT,0644); if (server.aof_fd == -1) { redisLog(REDIS_WARNING, "Can't open the append-only file: %s", strerror(errno)); exit(1); } } /* 32 bit instances are limited to 4GB of address space, so if there is * no explicit limit in the user provided configuration we set a limit * at 3.5GB using maxmemory with 'noeviction' policy'. This saves * useless crashes of the Redis instance. */ if (server.arch_bits == 32 && server.maxmemory == 0) { redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now."); server.maxmemory = 3584LL*(1024*1024); /* 3584 MB = 3.5 GB */ server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION; } if (server.cluster_enabled) clusterInit(); scriptingInit(); slowlogInit(); bioInit(); } /* Populates the Redis Command Table starting from the hard coded list * we have on top of redis.c file. */ void populateCommandTable(void) { int j; int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); for (j = 0; j < numcommands; j++) { struct redisCommand *c = redisCommandTable+j; char *f = c->sflags; int retval; while(*f != '\0') { switch(*f) { case 'w': c->flags |= REDIS_CMD_WRITE; break; case 'r': c->flags |= REDIS_CMD_READONLY; break; case 'm': c->flags |= REDIS_CMD_DENYOOM; break; case 'a': c->flags |= REDIS_CMD_ADMIN; break; case 'p': c->flags |= REDIS_CMD_PUBSUB; break; case 'f': c->flags |= REDIS_CMD_FORCE_REPLICATION; break; case 's': c->flags |= REDIS_CMD_NOSCRIPT; break; case 'R': c->flags |= REDIS_CMD_RANDOM; break; case 'S': c->flags |= REDIS_CMD_SORT_FOR_SCRIPT; break; default: redisPanic("Unsupported command flag"); break; } f++; } retval = dictAdd(server.commands, sdsnew(c->name), c); assert(retval == DICT_OK); } } void resetCommandTableStats(void) { int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); int j; for (j = 0; j < numcommands; j++) { struct redisCommand *c = redisCommandTable+j; c->microseconds = 0; c->calls = 0; } } /* ========================== Redis OP Array API ============================ */ void redisOpArrayInit(redisOpArray *oa) { oa->ops = NULL; oa->numops = 0; } int redisOpArrayAppend(redisOpArray *oa, struct redisCommand *cmd, int dbid, robj **argv, int argc, int target) { redisOp *op; oa->ops = zrealloc(oa->ops,sizeof(redisOp)*(oa->numops+1)); op = oa->ops+oa->numops; op->cmd = cmd; op->dbid = dbid; op->argv = argv; op->argc = argc; op->target = target; oa->numops++; return oa->numops; } void redisOpArrayFree(redisOpArray *oa) { while(oa->numops) { int j; redisOp *op; oa->numops--; op = oa->ops+oa->numops; for (j = 0; j < op->argc; j++) decrRefCount(op->argv[j]); zfree(op->argv); } zfree(oa->ops); } /* ====================== Commands lookup and execution ===================== */ struct redisCommand *lookupCommand(sds name) { return dictFetchValue(server.commands, name); } struct redisCommand *lookupCommandByCString(char *s) { struct redisCommand *cmd; sds name = sdsnew(s); cmd = dictFetchValue(server.commands, name); sdsfree(name); return cmd; } /* Propagate the specified command (in the context of the specified database id) * to AOF, Slaves and Monitors. * * flags are an xor between: * + REDIS_PROPAGATE_NONE (no propagation of command at all) * + REDIS_PROPAGATE_AOF (propagate into the AOF file if is enabled) * + REDIS_PROPAGATE_REPL (propagate into the replication link) */ void propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc, int flags) { if (server.aof_state != REDIS_AOF_OFF && flags & REDIS_PROPAGATE_AOF) feedAppendOnlyFile(cmd,dbid,argv,argc); if (flags & REDIS_PROPAGATE_REPL && listLength(server.slaves)) replicationFeedSlaves(server.slaves,dbid,argv,argc); } /* Used inside commands to schedule the propagation of additional commands * after the current command is propagated to AOF / Replication. */ void alsoPropagate(struct redisCommand *cmd, int dbid, robj **argv, int argc, int target) { redisOpArrayAppend(&server.also_propagate,cmd,dbid,argv,argc,target); } /* Call() is the core of Redis execution of a command */ void call(redisClient *c, int flags) { long long dirty, start = ustime(), duration; /* Sent the command to clients in MONITOR mode, only if the commands are * not geneated from reading an AOF. */ if (listLength(server.monitors) && !server.loading) replicationFeedMonitors(c,server.monitors,c->db->id,c->argv,c->argc); /* Call the command. */ redisOpArrayInit(&server.also_propagate); dirty = server.dirty; c->cmd->proc(c); dirty = server.dirty-dirty; duration = ustime()-start; /* When EVAL is called loading the AOF we don't want commands called * from Lua to go into the slowlog or to populate statistics. */ if (server.loading && c->flags & REDIS_LUA_CLIENT) flags &= ~(REDIS_CALL_SLOWLOG | REDIS_CALL_STATS); /* Log the command into the Slow log if needed, and populate the * per-command statistics that we show in INFO commandstats. */ if (flags & REDIS_CALL_SLOWLOG) slowlogPushEntryIfNeeded(c->argv,c->argc,duration); if (flags & REDIS_CALL_STATS) { c->cmd->microseconds += duration; c->cmd->calls++; } /* Propagate the command into the AOF and replication link */ if (flags & REDIS_CALL_PROPAGATE) { int flags = REDIS_PROPAGATE_NONE; if (c->cmd->flags & REDIS_CMD_FORCE_REPLICATION) flags |= REDIS_PROPAGATE_REPL; if (dirty) flags |= (REDIS_PROPAGATE_REPL | REDIS_PROPAGATE_AOF); if (flags != REDIS_PROPAGATE_NONE) propagate(c->cmd,c->db->id,c->argv,c->argc,flags); } /* Commands such as LPUSH or BRPOPLPUSH may propagate an additional * PUSH command. */ if (server.also_propagate.numops) { int j; redisOp *rop; for (j = 0; j < server.also_propagate.numops; j++) { rop = &server.also_propagate.ops[j]; propagate(rop->cmd, rop->dbid, rop->argv, rop->argc, rop->target); } redisOpArrayFree(&server.also_propagate); } server.stat_numcommands++; } /* If this function gets called we already read a whole * command, argments are in the client argv/argc fields. * processCommand() execute the command or prepare the * server for a bulk read from the client. * * If 1 is returned the client is still alive and valid and * and other operations can be performed by the caller. Otherwise * if 0 is returned the client was destroied (i.e. after QUIT). */ int processCommand(redisClient *c) { /* The QUIT command is handled separately. Normal command procs will * go through checking for replication and QUIT will cause trouble * when FORCE_REPLICATION is enabled and would be implemented in * a regular command proc. */ if (!strcasecmp(c->argv[0]->ptr,"quit")) { addReply(c,shared.ok); c->flags |= REDIS_CLOSE_AFTER_REPLY; return REDIS_ERR; } /* Now lookup the command and check ASAP about trivial error conditions * such as wrong arity, bad command name and so forth. */ c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr); if (!c->cmd) { addReplyErrorFormat(c,"unknown command '%s'", (char*)c->argv[0]->ptr); return REDIS_OK; } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) || (c->argc < -c->cmd->arity)) { addReplyErrorFormat(c,"wrong number of arguments for '%s' command", c->cmd->name); return REDIS_OK; } /* Check if the user is authenticated */ if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand) { addReplyError(c,"operation not permitted"); return REDIS_OK; } /* If cluster is enabled, redirect here */ if (server.cluster_enabled && !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0)) { int hashslot; if (server.cluster.state != REDIS_CLUSTER_OK) { addReplyError(c,"The cluster is down. Check with CLUSTER INFO for more information"); return REDIS_OK; } else { int ask; clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask); if (n == NULL) { addReplyError(c,"Multi keys request invalid in cluster"); return REDIS_OK; } else if (n != server.cluster.myself) { addReplySds(c,sdscatprintf(sdsempty(), "-%s %d %s:%d\r\n", ask ? "ASK" : "MOVED", hashslot,n->ip,n->port)); return REDIS_OK; } } } /* Handle the maxmemory directive. * * First we try to free some memory if possible (if there are volatile * keys in the dataset). If there are not the only thing we can do * is returning an error. */ if (server.maxmemory) { int retval = freeMemoryIfNeeded(); if ((c->cmd->flags & REDIS_CMD_DENYOOM) && retval == REDIS_ERR) { addReply(c, shared.oomerr); return REDIS_OK; } } /* Don't accept write commands if there are problems persisting on disk. */ if (server.stop_writes_on_bgsave_err && server.saveparamslen > 0 && server.lastbgsave_status == REDIS_ERR && c->cmd->flags & REDIS_CMD_WRITE) { addReply(c, shared.bgsaveerr); return REDIS_OK; } /* Don't accept wirte commands if this is a read only slave. But * accept write commands if this is our master. */ if (server.masterhost && server.repl_slave_ro && !(c->flags & REDIS_MASTER) && c->cmd->flags & REDIS_CMD_WRITE) { addReply(c, shared.roslaveerr); return REDIS_OK; } /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */ if ((dictSize(c->pubsub_channels) > 0 || listLength(c->pubsub_patterns) > 0) && c->cmd->proc != subscribeCommand && c->cmd->proc != unsubscribeCommand && c->cmd->proc != psubscribeCommand && c->cmd->proc != punsubscribeCommand) { addReplyError(c,"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context"); return REDIS_OK; } /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and * we are a slave with a broken link with master. */ if (server.masterhost && server.repl_state != REDIS_REPL_CONNECTED && server.repl_serve_stale_data == 0 && c->cmd->proc != infoCommand && c->cmd->proc != slaveofCommand) { addReply(c, shared.masterdownerr); return REDIS_OK; } /* Loading DB? Return an error if the command is not INFO */ if (server.loading && c->cmd->proc != infoCommand) { addReply(c, shared.loadingerr); return REDIS_OK; } /* Lua script too slow? Only allow SHUTDOWN NOSAVE and SCRIPT KILL. */ if (server.lua_timedout && !(c->cmd->proc == shutdownCommand && c->argc == 2 && tolower(((char*)c->argv[1]->ptr)[0]) == 'n') && !(c->cmd->proc == scriptCommand && c->argc == 2 && tolower(((char*)c->argv[1]->ptr)[0]) == 'k')) { addReply(c, shared.slowscripterr); return REDIS_OK; } /* Exec the command */ if (c->flags & REDIS_MULTI && c->cmd->proc != execCommand && c->cmd->proc != discardCommand && c->cmd->proc != multiCommand && c->cmd->proc != watchCommand) { queueMultiCommand(c); addReply(c,shared.queued); } else { call(c,REDIS_CALL_FULL); } return REDIS_OK; } /*================================== Shutdown =============================== */ int prepareForShutdown(int flags) { int save = flags & REDIS_SHUTDOWN_SAVE; int nosave = flags & REDIS_SHUTDOWN_NOSAVE; redisLog(REDIS_WARNING,"User requested shutdown..."); /* Kill the saving child if there is a background saving in progress. We want to avoid race conditions, for instance our saving child may overwrite the synchronous saving did by SHUTDOWN. */ if (server.rdb_child_pid != -1) { redisLog(REDIS_WARNING,"There is a child saving an .rdb. Killing it!"); kill(server.rdb_child_pid,SIGKILL); rdbRemoveTempFile(server.rdb_child_pid); } if (server.aof_state != REDIS_AOF_OFF) { /* Kill the AOF saving child as the AOF we already have may be longer * but contains the full dataset anyway. */ if (server.aof_child_pid != -1) { redisLog(REDIS_WARNING, "There is a child rewriting the AOF. Killing it!"); kill(server.aof_child_pid,SIGKILL); } /* Append only file: fsync() the AOF and exit */ redisLog(REDIS_NOTICE,"Calling fsync() on the AOF file."); aof_fsync(server.aof_fd); } if ((server.saveparamslen > 0 && !nosave) || save) { redisLog(REDIS_NOTICE,"Saving the final RDB snapshot before exiting."); /* Snapshotting. Perform a SYNC SAVE and exit */ if (rdbSave(server.rdb_filename) != REDIS_OK) { /* Ooops.. error saving! The best we can do is to continue * operating. Note that if there was a background saving process, * in the next cron() Redis will be notified that the background * saving aborted, handling special stuff like slaves pending for * synchronization... */ redisLog(REDIS_WARNING,"Error trying to save the DB, can't exit."); return REDIS_ERR; } } if (server.daemonize) { redisLog(REDIS_NOTICE,"Removing the pid file."); unlink(server.pidfile); } /* Close the listening sockets. Apparently this allows faster restarts. */ if (server.ipfd != -1) close(server.ipfd); if (server.sofd != -1) close(server.sofd); if (server.unixsocket) { redisLog(REDIS_NOTICE,"Removing the unix socket file."); unlink(server.unixsocket); /* don't care if this fails */ } redisLog(REDIS_WARNING,"Redis is now ready to exit, bye bye..."); return REDIS_OK; } /*================================== Commands =============================== */ /* Return zero if strings are the same, non-zero if they are not. * The comparison is performed in a way that prevents an attacker to obtain * information about the nature of the strings just monitoring the execution * time of the function. * * Note that limiting the comparison length to strings up to 512 bytes we * can avoid leaking any information about the password length and any * possible branch misprediction related leak. */ int time_independent_strcmp(char *a, char *b) { char bufa[REDIS_AUTHPASS_MAX_LEN], bufb[REDIS_AUTHPASS_MAX_LEN]; /* The above two strlen perform len(a) + len(b) operations where either * a or b are fixed (our password) length, and the difference is only * relative to the length of the user provided string, so no information * leak is possible in the following two lines of code. */ int alen = strlen(a); int blen = strlen(b); int j; int diff = 0; /* We can't compare strings longer than our static buffers. * Note that this will never pass the first test in practical circumstances * so there is no info leak. */ if (alen > sizeof(bufa) || blen > sizeof(bufb)) return 1; memset(bufa,0,sizeof(bufa)); /* Constant time. */ memset(bufb,0,sizeof(bufb)); /* Constant time. */ /* Again the time of the following two copies is proportional to * len(a) + len(b) so no info is leaked. */ memcpy(bufa,a,alen); memcpy(bufb,b,blen); /* Always compare all the chars in the two buffers without * conditional expressions. */ for (j = 0; j < sizeof(bufa); j++) { diff |= (bufa[j] ^ bufb[j]); } /* Length must be equal as well. */ diff |= alen ^ blen; return diff; /* If zero strings are the same. */ } void authCommand(redisClient *c) { if (!server.requirepass) { addReplyError(c,"Client sent AUTH, but no password is set"); } else if (!time_independent_strcmp(c->argv[1]->ptr, server.requirepass)) { c->authenticated = 1; addReply(c,shared.ok); } else { c->authenticated = 0; addReplyError(c,"invalid password"); } } void pingCommand(redisClient *c) { addReply(c,shared.pong); } void echoCommand(redisClient *c) { addReplyBulk(c,c->argv[1]); } void timeCommand(redisClient *c) { struct timeval tv; /* gettimeofday() can only fail if &tv is a bad addresss so we * don't check for errors. */ gettimeofday(&tv,NULL); addReplyMultiBulkLen(c,2); addReplyBulkLongLong(c,tv.tv_sec); addReplyBulkLongLong(c,tv.tv_usec); } /* Convert an amount of bytes into a human readable string in the form * of 100B, 2G, 100M, 4K, and so forth. */ void bytesToHuman(char *s, unsigned long long n) { double d; if (n < 1024) { /* Bytes */ sprintf(s,"%lluB",n); return; } else if (n < (1024*1024)) { d = (double)n/(1024); sprintf(s,"%.2fK",d); } else if (n < (1024LL*1024*1024)) { d = (double)n/(1024*1024); sprintf(s,"%.2fM",d); } else if (n < (1024LL*1024*1024*1024)) { d = (double)n/(1024LL*1024*1024); sprintf(s,"%.2fG",d); } } /* Create the string returned by the INFO command. This is decoupled * by the INFO command itself as we need to report the same information * on memory corruption problems. */ sds genRedisInfoString(char *section) { sds info = sdsempty(); time_t uptime = server.unixtime-server.stat_starttime; int j, numcommands; struct rusage self_ru, c_ru; unsigned long lol, bib; int allsections = 0, defsections = 0; int sections = 0; if (section) { allsections = strcasecmp(section,"all") == 0; defsections = strcasecmp(section,"default") == 0; } getrusage(RUSAGE_SELF, &self_ru); getrusage(RUSAGE_CHILDREN, &c_ru); getClientsMaxBuffers(&lol,&bib); /* Server */ if (allsections || defsections || !strcasecmp(section,"server")) { struct utsname name; if (sections++) info = sdscat(info,"\r\n"); uname(&name); info = sdscatprintf(info, "# Server\r\n" "redis_version:%s\r\n" "redis_git_sha1:%s\r\n" "redis_git_dirty:%d\r\n" "os:%s %s %s\r\n" "arch_bits:%d\r\n" "multiplexing_api:%s\r\n" "gcc_version:%d.%d.%d\r\n" "process_id:%ld\r\n" "run_id:%s\r\n" "tcp_port:%d\r\n" "uptime_in_seconds:%ld\r\n" "uptime_in_days:%ld\r\n" "lru_clock:%ld\r\n", REDIS_VERSION, redisGitSHA1(), strtol(redisGitDirty(),NULL,10) > 0, name.sysname, name.release, name.machine, server.arch_bits, aeGetApiName(), #ifdef __GNUC__ __GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__, #else 0,0,0, #endif (long) getpid(), server.runid, server.port, uptime, uptime/(3600*24), (unsigned long) server.lruclock); } /* Clients */ if (allsections || defsections || !strcasecmp(section,"clients")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Clients\r\n" "connected_clients:%lu\r\n" "client_longest_output_list:%lu\r\n" "client_biggest_input_buf:%lu\r\n" "blocked_clients:%d\r\n", listLength(server.clients)-listLength(server.slaves), lol, bib, server.bpop_blocked_clients); } /* Memory */ if (allsections || defsections || !strcasecmp(section,"memory")) { char hmem[64]; char peak_hmem[64]; bytesToHuman(hmem,zmalloc_used_memory()); bytesToHuman(peak_hmem,server.stat_peak_memory); if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Memory\r\n" "used_memory:%zu\r\n" "used_memory_human:%s\r\n" "used_memory_rss:%zu\r\n" "used_memory_peak:%zu\r\n" "used_memory_peak_human:%s\r\n" "used_memory_lua:%lld\r\n" "mem_fragmentation_ratio:%.2f\r\n" "mem_allocator:%s\r\n", zmalloc_used_memory(), hmem, zmalloc_get_rss(), server.stat_peak_memory, peak_hmem, ((long long)lua_gc(server.lua,LUA_GCCOUNT,0))*1024LL, zmalloc_get_fragmentation_ratio(), ZMALLOC_LIB ); } /* Persistence */ if (allsections || defsections || !strcasecmp(section,"persistence")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Persistence\r\n" "loading:%d\r\n" "rdb_changes_since_last_save:%lld\r\n" "rdb_bgsave_in_progress:%d\r\n" "rdb_last_save_time:%ld\r\n" "rdb_last_bgsave_status:%s\r\n" "rdb_last_bgsave_time_sec:%ld\r\n" "rdb_current_bgsave_time_sec:%ld\r\n" "aof_enabled:%d\r\n" "aof_rewrite_in_progress:%d\r\n" "aof_rewrite_scheduled:%d\r\n" "aof_last_rewrite_time_sec:%ld\r\n" "aof_current_rewrite_time_sec:%ld\r\n", server.loading, server.dirty, server.rdb_child_pid != -1, server.lastsave, server.lastbgsave_status == REDIS_OK ? "ok" : "err", server.rdb_save_time_last, (server.rdb_child_pid == -1) ? -1 : time(NULL)-server.rdb_save_time_start, server.aof_state != REDIS_AOF_OFF, server.aof_child_pid != -1, server.aof_rewrite_scheduled, server.aof_rewrite_time_last, (server.aof_child_pid == -1) ? -1 : time(NULL)-server.aof_rewrite_time_start); if (server.aof_state != REDIS_AOF_OFF) { info = sdscatprintf(info, "aof_current_size:%lld\r\n" "aof_base_size:%lld\r\n" "aof_pending_rewrite:%d\r\n" "aof_buffer_length:%zu\r\n" "aof_rewrite_buffer_length:%zu\r\n" "aof_pending_bio_fsync:%llu\r\n" "aof_delayed_fsync:%lu\r\n", (long long) server.aof_current_size, (long long) server.aof_rewrite_base_size, server.aof_rewrite_scheduled, sdslen(server.aof_buf), aofRewriteBufferSize(), bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC), server.aof_delayed_fsync); } if (server.loading) { double perc; time_t eta, elapsed; off_t remaining_bytes = server.loading_total_bytes- server.loading_loaded_bytes; perc = ((double)server.loading_loaded_bytes / server.loading_total_bytes) * 100; elapsed = server.unixtime-server.loading_start_time; if (elapsed == 0) { eta = 1; /* A fake 1 second figure if we don't have enough info */ } else { eta = (elapsed*remaining_bytes)/server.loading_loaded_bytes; } info = sdscatprintf(info, "loading_start_time:%ld\r\n" "loading_total_bytes:%llu\r\n" "loading_loaded_bytes:%llu\r\n" "loading_loaded_perc:%.2f\r\n" "loading_eta_seconds:%ld\r\n" ,(unsigned long) server.loading_start_time, (unsigned long long) server.loading_total_bytes, (unsigned long long) server.loading_loaded_bytes, perc, eta ); } } /* Stats */ if (allsections || defsections || !strcasecmp(section,"stats")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Stats\r\n" "total_connections_received:%lld\r\n" "total_commands_processed:%lld\r\n" "instantaneous_ops_per_sec:%lld\r\n" "rejected_connections:%lld\r\n" "expired_keys:%lld\r\n" "evicted_keys:%lld\r\n" "keyspace_hits:%lld\r\n" "keyspace_misses:%lld\r\n" "pubsub_channels:%ld\r\n" "pubsub_patterns:%lu\r\n" "latest_fork_usec:%lld\r\n", server.stat_numconnections, server.stat_numcommands, getOperationsPerSecond(), server.stat_rejected_conn, server.stat_expiredkeys, server.stat_evictedkeys, server.stat_keyspace_hits, server.stat_keyspace_misses, dictSize(server.pubsub_channels), listLength(server.pubsub_patterns), server.stat_fork_time); } /* Replication */ if (allsections || defsections || !strcasecmp(section,"replication")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Replication\r\n" "role:%s\r\n", server.masterhost == NULL ? "master" : "slave"); if (server.masterhost) { info = sdscatprintf(info, "master_host:%s\r\n" "master_port:%d\r\n" "master_link_status:%s\r\n" "master_last_io_seconds_ago:%d\r\n" "master_sync_in_progress:%d\r\n" ,server.masterhost, server.masterport, (server.repl_state == REDIS_REPL_CONNECTED) ? "up" : "down", server.master ? ((int)(server.unixtime-server.master->lastinteraction)) : -1, server.repl_state == REDIS_REPL_TRANSFER ); if (server.repl_state == REDIS_REPL_TRANSFER) { info = sdscatprintf(info, "master_sync_left_bytes:%ld\r\n" "master_sync_last_io_seconds_ago:%d\r\n" ,(long)server.repl_transfer_left, (int)(server.unixtime-server.repl_transfer_lastio) ); } if (server.repl_state != REDIS_REPL_CONNECTED) { info = sdscatprintf(info, "master_link_down_since_seconds:%ld\r\n", (long)server.unixtime-server.repl_down_since); } } info = sdscatprintf(info, "connected_slaves:%lu\r\n", listLength(server.slaves)); if (listLength(server.slaves)) { int slaveid = 0; listNode *ln; listIter li; listRewind(server.slaves,&li); while((ln = listNext(&li))) { redisClient *slave = listNodeValue(ln); char *state = NULL; char ip[32]; int port; if (anetPeerToString(slave->fd,ip,&port) == -1) continue; switch(slave->replstate) { case REDIS_REPL_WAIT_BGSAVE_START: case REDIS_REPL_WAIT_BGSAVE_END: state = "wait_bgsave"; break; case REDIS_REPL_SEND_BULK: state = "send_bulk"; break; case REDIS_REPL_ONLINE: state = "online"; break; } if (state == NULL) continue; info = sdscatprintf(info,"slave%d:%s,%d,%s\r\n", slaveid,ip,slave->slave_listening_port,state); slaveid++; } } } /* CPU */ if (allsections || defsections || !strcasecmp(section,"cpu")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# CPU\r\n" "used_cpu_sys:%.2f\r\n" "used_cpu_user:%.2f\r\n" "used_cpu_sys_children:%.2f\r\n" "used_cpu_user_children:%.2f\r\n", (float)self_ru.ru_stime.tv_sec+(float)self_ru.ru_stime.tv_usec/1000000, (float)self_ru.ru_utime.tv_sec+(float)self_ru.ru_utime.tv_usec/1000000, (float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000, (float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000); } /* cmdtime */ if (allsections || !strcasecmp(section,"commandstats")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Commandstats\r\n"); numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); for (j = 0; j < numcommands; j++) { struct redisCommand *c = redisCommandTable+j; if (!c->calls) continue; info = sdscatprintf(info, "cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n", c->name, c->calls, c->microseconds, (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls)); } } /* Cluster */ if (allsections || defsections || !strcasecmp(section,"cluster")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Cluster\r\n" "cluster_enabled:%d\r\n", server.cluster_enabled); } /* Key space */ if (allsections || defsections || !strcasecmp(section,"keyspace")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Keyspace\r\n"); for (j = 0; j < server.dbnum; j++) { long long keys, vkeys; keys = dictSize(server.db[j].dict); vkeys = dictSize(server.db[j].expires); if (keys || vkeys) { info = sdscatprintf(info, "db%d:keys=%lld,expires=%lld\r\n", j, keys, vkeys); } } } return info; } void infoCommand(redisClient *c) { char *section = c->argc == 2 ? c->argv[1]->ptr : "default"; if (c->argc > 2) { addReply(c,shared.syntaxerr); return; } sds info = genRedisInfoString(section); addReplySds(c,sdscatprintf(sdsempty(),"$%lu\r\n", (unsigned long)sdslen(info))); addReplySds(c,info); addReply(c,shared.crlf); } void monitorCommand(redisClient *c) { /* ignore MONITOR if aleady slave or in monitor mode */ if (c->flags & REDIS_SLAVE) return; c->flags |= (REDIS_SLAVE|REDIS_MONITOR); c->slaveseldb = 0; listAddNodeTail(server.monitors,c); addReply(c,shared.ok); } /* ============================ Maxmemory directive ======================== */ /* This function gets called when 'maxmemory' is set on the config file to limit * the max memory used by the server, before processing a command. * * The goal of the function is to free enough memory to keep Redis under the * configured memory limit. * * The function starts calculating how many bytes should be freed to keep * Redis under the limit, and enters a loop selecting the best keys to * evict accordingly to the configured policy. * * If all the bytes needed to return back under the limit were freed the * function returns REDIS_OK, otherwise REDIS_ERR is returned, and the caller * should block the execution of commands that will result in more memory * used by the server. */ int freeMemoryIfNeeded(void) { size_t mem_used, mem_tofree, mem_freed; int slaves = listLength(server.slaves); /* Remove the size of slaves output buffers and AOF buffer from the * count of used memory. */ mem_used = zmalloc_used_memory(); if (slaves) { listIter li; listNode *ln; listRewind(server.slaves,&li); while((ln = listNext(&li))) { redisClient *slave = listNodeValue(ln); unsigned long obuf_bytes = getClientOutputBufferMemoryUsage(slave); if (obuf_bytes > mem_used) mem_used = 0; else mem_used -= obuf_bytes; } } if (server.aof_state != REDIS_AOF_OFF) { mem_used -= sdslen(server.aof_buf); mem_used -= aofRewriteBufferSize(); } /* Check if we are over the memory limit. */ if (mem_used <= server.maxmemory) return REDIS_OK; if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION) return REDIS_ERR; /* We need to free memory, but policy forbids. */ /* Compute how much memory we need to free. */ mem_tofree = mem_used - server.maxmemory; mem_freed = 0; while (mem_freed < mem_tofree) { int j, k, keys_freed = 0; for (j = 0; j < server.dbnum; j++) { long bestval = 0; /* just to prevent warning */ sds bestkey = NULL; struct dictEntry *de; redisDb *db = server.db+j; dict *dict; if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU || server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM) { dict = server.db[j].dict; } else { dict = server.db[j].expires; } if (dictSize(dict) == 0) continue; /* volatile-random and allkeys-random policy */ if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM || server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_RANDOM) { de = dictGetRandomKey(dict); bestkey = dictGetKey(de); } /* volatile-lru and allkeys-lru policy */ else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU || server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU) { for (k = 0; k < server.maxmemory_samples; k++) { sds thiskey; long thisval; robj *o; de = dictGetRandomKey(dict); thiskey = dictGetKey(de); /* When policy is volatile-lru we need an additonal lookup * to locate the real key, as dict is set to db->expires. */ if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU) de = dictFind(db->dict, thiskey); o = dictGetVal(de); thisval = estimateObjectIdleTime(o); /* Higher idle time is better candidate for deletion */ if (bestkey == NULL || thisval > bestval) { bestkey = thiskey; bestval = thisval; } } } /* volatile-ttl */ else if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_TTL) { for (k = 0; k < server.maxmemory_samples; k++) { sds thiskey; long thisval; de = dictGetRandomKey(dict); thiskey = dictGetKey(de); thisval = (long) dictGetVal(de); /* Expire sooner (minor expire unix timestamp) is better * candidate for deletion */ if (bestkey == NULL || thisval < bestval) { bestkey = thiskey; bestval = thisval; } } } /* Finally remove the selected key. */ if (bestkey) { long long delta; robj *keyobj = createStringObject(bestkey,sdslen(bestkey)); propagateExpire(db,keyobj); /* We compute the amount of memory freed by dbDelete() alone. * It is possible that actually the memory needed to propagate * the DEL in AOF and replication link is greater than the one * we are freeing removing the key, but we can't account for * that otherwise we would never exit the loop. * * AOF and Output buffer memory will be freed eventually so * we only care about memory used by the key space. */ delta = (long long) zmalloc_used_memory(); dbDelete(db,keyobj); delta -= (long long) zmalloc_used_memory(); mem_freed += delta; server.stat_evictedkeys++; decrRefCount(keyobj); keys_freed++; /* When the memory to free starts to be big enough, we may * start spending so much time here that is impossible to * deliver data to the slaves fast enough, so we force the * transmission here inside the loop. */ if (slaves) flushSlavesOutputBuffers(); } } if (!keys_freed) return REDIS_ERR; /* nothing to free... */ } return REDIS_OK; } /* =================================== Main! ================================ */ #ifdef __linux__ int linuxOvercommitMemoryValue(void) { FILE *fp = fopen("/proc/sys/vm/overcommit_memory","r"); char buf[64]; if (!fp) return -1; if (fgets(buf,64,fp) == NULL) { fclose(fp); return -1; } fclose(fp); return atoi(buf); } void linuxOvercommitMemoryWarning(void) { if (linuxOvercommitMemoryValue() == 0) { redisLog(REDIS_WARNING,"WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect."); } } #endif /* __linux__ */ void createPidFile(void) { /* Try to write the pid file in a best-effort way. */ FILE *fp = fopen(server.pidfile,"w"); if (fp) { fprintf(fp,"%d\n",(int)getpid()); fclose(fp); } } void daemonize(void) { int fd; if (fork() != 0) exit(0); /* parent exits */ setsid(); /* create a new session */ /* Every output goes to /dev/null. If Redis is daemonized but * the 'logfile' is set to 'stdout' in the configuration file * it will not log at all. */ if ((fd = open("/dev/null", O_RDWR, 0)) != -1) { dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if (fd > STDERR_FILENO) close(fd); } } void version() { printf("Redis server v=%s sha=%s:%d malloc=%s bits=%d\n", REDIS_VERSION, redisGitSHA1(), atoi(redisGitDirty()) > 0, ZMALLOC_LIB, sizeof(long) == 4 ? 32 : 64); exit(0); } void usage() { fprintf(stderr,"Usage: ./redis-server [/path/to/redis.conf] [options]\n"); fprintf(stderr," ./redis-server - (read config from stdin)\n"); fprintf(stderr," ./redis-server -v or --version\n"); fprintf(stderr," ./redis-server -h or --help\n"); fprintf(stderr," ./redis-server --test-memory \n\n"); fprintf(stderr,"Examples:\n"); fprintf(stderr," ./redis-server (run the server with default conf)\n"); fprintf(stderr," ./redis-server /etc/redis/6379.conf\n"); fprintf(stderr," ./redis-server --port 7777\n"); fprintf(stderr," ./redis-server --port 7777 --slaveof 127.0.0.1 8888\n"); fprintf(stderr," ./redis-server /etc/myredis.conf --loglevel verbose\n"); exit(1); } void redisAsciiArt(void) { #include "asciilogo.h" char *buf = zmalloc(1024*16); snprintf(buf,1024*16,ascii_logo, REDIS_VERSION, redisGitSHA1(), strtol(redisGitDirty(),NULL,10) > 0, (sizeof(long) == 8) ? "64" : "32", server.cluster_enabled ? "cluster" : "stand alone", server.port, (long) getpid() ); redisLogRaw(REDIS_NOTICE|REDIS_LOG_RAW,buf); zfree(buf); } static void sigtermHandler(int sig) { REDIS_NOTUSED(sig); redisLogFromHandler(REDIS_WARNING,"Received SIGTERM, scheduling shutdown..."); server.shutdown_asap = 1; } void setupSignalHandlers(void) { struct sigaction act; /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used. * Otherwise, sa_handler is used. */ sigemptyset(&act.sa_mask); act.sa_flags = 0; act.sa_handler = sigtermHandler; sigaction(SIGTERM, &act, NULL); #ifdef HAVE_BACKTRACE sigemptyset(&act.sa_mask); act.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; act.sa_sigaction = sigsegvHandler; sigaction(SIGSEGV, &act, NULL); sigaction(SIGBUS, &act, NULL); sigaction(SIGFPE, &act, NULL); sigaction(SIGILL, &act, NULL); #endif return; } void memtest(size_t megabytes, int passes); int main(int argc, char **argv) { long long start; struct timeval tv; /* We need to initialize our libraries, and the server configuration. */ zmalloc_enable_thread_safeness(); srand(time(NULL)^getpid()); gettimeofday(&tv,NULL); dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid()); initServerConfig(); if (argc >= 2) { int j = 1; /* First option to parse in argv[] */ sds options = sdsempty(); char *configfile = NULL; /* Handle special options --help and --version */ if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) version(); if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) usage(); if (strcmp(argv[1], "--test-memory") == 0) { if (argc == 3) { memtest(atoi(argv[2]),50); exit(0); } else { fprintf(stderr,"Please specify the amount of memory to test in megabytes.\n"); fprintf(stderr,"Example: ./redis-server --test-memory 4096\n\n"); exit(1); } } /* First argument is the config file name? */ if (argv[j][0] != '-' || argv[j][1] != '-') configfile = argv[j++]; /* All the other options are parsed and conceptually appended to the * configuration file. For instance --port 6380 will generate the * string "port 6380\n" to be parsed after the actual file name * is parsed, if any. */ while(j != argc) { if (argv[j][0] == '-' && argv[j][1] == '-') { /* Option name */ if (sdslen(options)) options = sdscat(options,"\n"); options = sdscat(options,argv[j]+2); options = sdscat(options," "); } else { /* Option argument */ options = sdscatrepr(options,argv[j],strlen(argv[j])); options = sdscat(options," "); } j++; } resetServerSaveParams(); loadServerConfig(configfile,options); sdsfree(options); } else { redisLog(REDIS_WARNING,"Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'"); } if (server.daemonize) daemonize(); initServer(); if (server.daemonize) createPidFile(); redisAsciiArt(); redisLog(REDIS_WARNING,"Server started, Redis version " REDIS_VERSION); #ifdef __linux__ linuxOvercommitMemoryWarning(); #endif start = ustime(); if (server.aof_state == REDIS_AOF_ON) { if (loadAppendOnlyFile(server.aof_filename) == REDIS_OK) redisLog(REDIS_NOTICE,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start)/1000000); } else { if (rdbLoad(server.rdb_filename) == REDIS_OK) { redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds", (float)(ustime()-start)/1000000); } else if (errno != ENOENT) { redisLog(REDIS_WARNING,"Fatal error loading the DB. Exiting."); exit(1); } } if (server.ipfd > 0) redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port); if (server.sofd > 0) redisLog(REDIS_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket); aeSetBeforeSleepProc(server.el,beforeSleep); aeMain(server.el); aeDeleteEventLoop(server.el); return 0; } /* The End */ pygments.rb-1.2.0/test/test_data.py000066400000000000000000000362431315616372200173010ustar00rootroot00000000000000# -*- coding: utf-8 - # # This file is part of gunicorn released under the MIT license. # See the NOTICE for more information. from __future__ import with_statement import errno import os import select import signal import sys import time import traceback from gunicorn.errors import HaltServer from gunicorn.pidfile import Pidfile from gunicorn.sock import create_socket from gunicorn import util from gunicorn import __version__, SERVER_SOFTWARE class Arbiter(object): """ Arbiter maintain the workers processes alive. It launches or kills them if needed. It also manages application reloading via SIGHUP/USR2. """ # A flag indicating if a worker failed to # to boot. If a worker process exist with # this error code, the arbiter will terminate. WORKER_BOOT_ERROR = 3 START_CTX = {} LISTENER = None WORKERS = {} PIPE = [] # I love dynamic languages SIG_QUEUE = [] SIGNALS = map( lambda x: getattr(signal, "SIG%s" % x), "HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCH".split() ) SIG_NAMES = dict( (getattr(signal, name), name[3:].lower()) for name in dir(signal) if name[:3] == "SIG" and name[3] != "_" ) def __init__(self, app): os.environ["SERVER_SOFTWARE"] = SERVER_SOFTWARE self.setup(app) self.pidfile = None self.worker_age = 0 self.reexec_pid = 0 self.master_name = "Master" # get current path, try to use PWD env first try: a = os.stat(os.environ['PWD']) b = os.stat(os.getcwd()) if a.ino == b.ino and a.dev == b.dev: cwd = os.environ['PWD'] else: cwd = os.getcwd() except: cwd = os.getcwd() args = sys.argv[:] args.insert(0, sys.executable) # init start context self.START_CTX = { "args": args, "cwd": cwd, 0: sys.executable } def setup(self, app): self.app = app self.cfg = app.cfg self.log = self.cfg.logger_class(app.cfg) # reopen files if 'GUNICORN_FD' in os.environ: self.log.reopen_files() self.address = self.cfg.address self.num_workers = self.cfg.workers self.debug = self.cfg.debug self.timeout = self.cfg.timeout self.proc_name = self.cfg.proc_name self.worker_class = self.cfg.worker_class if self.cfg.debug: self.log.debug("Current configuration:") for config, value in sorted(self.cfg.settings.iteritems()): self.log.debug(" %s: %s", config, value.value) if self.cfg.preload_app: if not self.cfg.debug: self.app.wsgi() else: self.log.warning("debug mode: app isn't preloaded.") def start(self): """\ Initialize the arbiter. Start listening and set pidfile if needed. """ self.log.info("Starting gunicorn %s", __version__) self.cfg.on_starting(self) self.pid = os.getpid() self.init_signals() if not self.LISTENER: self.LISTENER = create_socket(self.cfg, self.log) if self.cfg.pidfile is not None: self.pidfile = Pidfile(self.cfg.pidfile) self.pidfile.create(self.pid) self.log.debug("Arbiter booted") self.log.info("Listening at: %s (%s)", self.LISTENER, self.pid) self.log.info("Using worker: %s", self.cfg.settings['worker_class'].get()) self.cfg.when_ready(self) def init_signals(self): """\ Initialize master signal handling. Most of the signals are queued. Child signals only wake up the master. """ if self.PIPE: map(os.close, self.PIPE) self.PIPE = pair = os.pipe() map(util.set_non_blocking, pair) map(util.close_on_exec, pair) self.log.close_on_exec() map(lambda s: signal.signal(s, self.signal), self.SIGNALS) signal.signal(signal.SIGCHLD, self.handle_chld) def signal(self, sig, frame): if len(self.SIG_QUEUE) < 5: self.SIG_QUEUE.append(sig) self.wakeup() def run(self): "Main master loop." self.start() util._setproctitle("master [%s]" % self.proc_name) self.manage_workers() while True: try: self.reap_workers() sig = self.SIG_QUEUE.pop(0) if len(self.SIG_QUEUE) else None if sig is None: self.sleep() self.murder_workers() self.manage_workers() continue if sig not in self.SIG_NAMES: self.log.info("Ignoring unknown signal: %s", sig) continue signame = self.SIG_NAMES.get(sig) handler = getattr(self, "handle_%s" % signame, None) if not handler: self.log.error("Unhandled signal: %s", signame) continue self.log.info("Handling signal: %s", signame) handler() self.wakeup() except StopIteration: self.halt() except KeyboardInterrupt: self.halt() except HaltServer, inst: self.halt(reason=inst.reason, exit_status=inst.exit_status) except SystemExit: raise except Exception: self.log.info("Unhandled exception in main loop:\n%s", traceback.format_exc()) self.stop(False) if self.pidfile is not None: self.pidfile.unlink() sys.exit(-1) def handle_chld(self, sig, frame): "SIGCHLD handling" self.wakeup() def handle_hup(self): """\ HUP handling. - Reload configuration - Start the new worker processes with a new configuration - Gracefully shutdown the old worker processes """ self.log.info("Hang up: %s", self.master_name) self.reload() def handle_quit(self): "SIGQUIT handling" raise StopIteration def handle_int(self): "SIGINT handling" self.stop(False) raise StopIteration def handle_term(self): "SIGTERM handling" self.stop(False) raise StopIteration def handle_ttin(self): """\ SIGTTIN handling. Increases the number of workers by one. """ self.num_workers += 1 self.manage_workers() def handle_ttou(self): """\ SIGTTOU handling. Decreases the number of workers by one. """ if self.num_workers <= 1: return self.num_workers -= 1 self.manage_workers() def handle_usr1(self): """\ SIGUSR1 handling. Kill all workers by sending them a SIGUSR1 """ self.kill_workers(signal.SIGUSR1) self.log.reopen_files() def handle_usr2(self): """\ SIGUSR2 handling. Creates a new master/worker set as a slave of the current master without affecting old workers. Use this to do live deployment with the ability to backout a change. """ self.reexec() def handle_winch(self): "SIGWINCH handling" if os.getppid() == 1 or os.getpgrp() != os.getpid(): self.log.info("graceful stop of workers") self.num_workers = 0 self.kill_workers(signal.SIGQUIT) else: self.log.info("SIGWINCH ignored. Not daemonized") def wakeup(self): """\ Wake up the arbiter by writing to the PIPE """ try: os.write(self.PIPE[1], '.') except IOError, e: if e.errno not in [errno.EAGAIN, errno.EINTR]: raise def halt(self, reason=None, exit_status=0): """ halt arbiter """ self.stop() self.log.info("Shutting down: %s", self.master_name) if reason is not None: self.log.info("Reason: %s", reason) if self.pidfile is not None: self.pidfile.unlink() sys.exit(exit_status) def sleep(self): """\ Sleep until PIPE is readable or we timeout. A readable PIPE means a signal occurred. """ try: ready = select.select([self.PIPE[0]], [], [], 1.0) if not ready[0]: return while os.read(self.PIPE[0], 1): pass except select.error, e: if e[0] not in [errno.EAGAIN, errno.EINTR]: raise except OSError, e: if e.errno not in [errno.EAGAIN, errno.EINTR]: raise except KeyboardInterrupt: sys.exit() def stop(self, graceful=True): """\ Stop workers :attr graceful: boolean, If True (the default) workers will be killed gracefully (ie. trying to wait for the current connection) """ try: self.LISTENER.close() except Exception: pass self.LISTENER = None sig = signal.SIGQUIT if not graceful: sig = signal.SIGTERM limit = time.time() + self.cfg.graceful_timeout while self.WORKERS and time.time() < limit: self.kill_workers(sig) time.sleep(0.1) self.reap_workers() self.kill_workers(signal.SIGKILL) def reexec(self): """\ Relaunch the master and workers. """ if self.pidfile is not None: self.pidfile.rename("%s.oldbin" % self.pidfile.fname) self.reexec_pid = os.fork() if self.reexec_pid != 0: self.master_name = "Old Master" return os.environ['GUNICORN_FD'] = str(self.LISTENER.fileno()) os.chdir(self.START_CTX['cwd']) self.cfg.pre_exec(self) util.closerange(3, self.LISTENER.fileno()) util.closerange(self.LISTENER.fileno()+1, util.get_maxfd()) os.execvpe(self.START_CTX[0], self.START_CTX['args'], os.environ) def reload(self): old_address = self.cfg.address # reload conf self.app.reload() self.setup(self.app) # reopen log files self.log.reopen_files() # do we need to change listener ? if old_address != self.cfg.address: self.LISTENER.close() self.LISTENER = create_socket(self.cfg, self.log) self.log.info("Listening at: %s", self.LISTENER) # do some actions on reload self.cfg.on_reload(self) # unlink pidfile if self.pidfile is not None: self.pidfile.unlink() # create new pidfile if self.cfg.pidfile is not None: self.pidfile = Pidfile(self.cfg.pidfile) self.pidfile.create(self.pid) # set new proc_name util._setproctitle("master [%s]" % self.proc_name) # spawn new workers for i in range(self.cfg.workers): self.spawn_worker() # manage workers self.manage_workers() def murder_workers(self): """\ Kill unused/idle workers """ for (pid, worker) in self.WORKERS.items(): try: if time.time() - worker.tmp.last_update() <= self.timeout: continue except ValueError: continue self.log.critical("WORKER TIMEOUT (pid:%s)", pid) self.kill_worker(pid, signal.SIGKILL) def reap_workers(self): """\ Reap workers to avoid zombie processes """ try: while True: wpid, status = os.waitpid(-1, os.WNOHANG) if not wpid: break if self.reexec_pid == wpid: self.reexec_pid = 0 else: # A worker said it cannot boot. We'll shutdown # to avoid infinite start/stop cycles. exitcode = status >> 8 if exitcode == self.WORKER_BOOT_ERROR: reason = "Worker failed to boot." raise HaltServer(reason, self.WORKER_BOOT_ERROR) worker = self.WORKERS.pop(wpid, None) if not worker: continue worker.tmp.close() except OSError, e: if e.errno == errno.ECHILD: pass def manage_workers(self): """\ Maintain the number of workers by spawning or killing as required. """ if len(self.WORKERS.keys()) < self.num_workers: self.spawn_workers() workers = self.WORKERS.items() workers.sort(key=lambda w: w[1].age) while len(workers) > self.num_workers: (pid, _) = workers.pop(0) self.kill_worker(pid, signal.SIGQUIT) def spawn_worker(self): self.worker_age += 1 worker = self.worker_class(self.worker_age, self.pid, self.LISTENER, self.app, self.timeout/2.0, self.cfg, self.log) self.cfg.pre_fork(self, worker) pid = os.fork() if pid != 0: self.WORKERS[pid] = worker return pid # Process Child worker_pid = os.getpid() try: util._setproctitle("worker [%s]" % self.proc_name) self.log.info("Booting worker with pid: %s", worker_pid) self.cfg.post_fork(self, worker) worker.init_process() sys.exit(0) except SystemExit: raise except: self.log.debug("Exception in worker process:\n%s", traceback.format_exc()) if not worker.booted: sys.exit(self.WORKER_BOOT_ERROR) sys.exit(-1) finally: self.log.info("Worker exiting (pid: %s)", worker_pid) try: worker.tmp.close() self.cfg.worker_exit(self, worker) except: pass def spawn_workers(self): """\ Spawn new workers as needed. This is where a worker process leaves the main loop of the master process. """ for i in range(self.num_workers - len(self.WORKERS.keys())): self.spawn_worker() def kill_workers(self, sig): """\ Kill all workers with the signal `sig` :attr sig: `signal.SIG*` value """ for pid in self.WORKERS.keys(): self.kill_worker(pid, sig) def kill_worker(self, pid, sig): """\ Kill a worker :attr pid: int, worker pid :attr sig: `signal.SIG*` value """ try: os.kill(pid, sig) except OSError, e: if e.errno == errno.ESRCH: try: worker = self.WORKERS.pop(pid) worker.tmp.close() self.cfg.worker_exit(self, worker) return except (KeyError, OSError): return raise pygments.rb-1.2.0/test/test_data_generated000066400000000000000000015622011315616372200206670ustar00rootroot00000000000000
/*
 * Copyright (c) 2009-2010, Salvatore Sanfilippo <antirez at gmail dot com>
 * 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.
 *   * Neither the name of Redis nor the names of its contributors may be used
 *     to endorse or promote products derived from this software without
 *     specific prior written permission.
 *
 * 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.
 */

#include "redis.h"
#include "slowlog.h"
#include "bio.h"

#include <time.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
#include <assert.h>
#include <ctype.h>
#include <stdarg.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/uio.h>
#include <limits.h>
#include <float.h>
#include <math.h>
#include <sys/resource.h>
#include <sys/utsname.h>

/* Our shared "common" objects */

struct sharedObjectsStruct shared;

/* Global vars that are actually used as constants. The following double
 * values are used for double on-disk serialization, and are initialized
 * at runtime to avoid strange compiler optimizations. */

double R_Zero, R_PosInf, R_NegInf, R_Nan;

/*================================= Globals ================================= */

/* Global vars */
struct redisServer server; /* server global state */
struct redisCommand *commandTable;

/* Our command table.
 *
 * Every entry is composed of the following fields:
 *
 * name: a string representing the command name.
 * function: pointer to the C function implementing the command.
 * arity: number of arguments, it is possible to use -N to say >= N
 * sflags: command flags as string. See below for a table of flags.
 * flags: flags as bitmask. Computed by Redis using the 'sflags' field.
 * get_keys_proc: an optional function to get key arguments from a command.
 *                This is only used when the following three fields are not
 *                enough to specify what arguments are keys.
 * first_key_index: first argument that is a key
 * last_key_index: last argument that is a key
 * key_step: step to get all the keys from first to last argument. For instance
 *           in MSET the step is two since arguments are key,val,key,val,...
 * microseconds: microseconds of total execution time for this command.
 * calls: total number of calls of this command.
 *
 * The flags, microseconds and calls fields are computed by Redis and should
 * always be set to zero.
 *
 * Command flags are expressed using strings where every character represents
 * a flag. Later the populateCommandTable() function will take care of
 * populating the real 'flags' field using this characters.
 *
 * This is the meaning of the flags:
 *
 * w: write command (may modify the key space).
 * r: read command  (will never modify the key space).
 * m: may increase memory usage once called. Don't allow if out of memory.
 * a: admin command, like SAVE or SHUTDOWN.
 * p: Pub/Sub related command.
 * f: force replication of this command, regarless of server.dirty.
 * s: command not allowed in scripts.
 * R: random command. Command is not deterministic, that is, the same command
 *    with the same arguments, with the same key space, may have different
 *    results. For instance SPOP and RANDOMKEY are two random commands.
 * S: Sort command output array if called from script, so that the output
 *    is deterministic.
 */
struct redisCommand redisCommandTable[] = {
    {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},
    {"set",setCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0},
    {"setnx",setnxCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0},
    {"setex",setexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},
    {"psetex",psetexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},
    {"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0},
    {"strlen",strlenCommand,2,"r",0,NULL,1,1,1,0,0},
    {"del",delCommand,-2,"w",0,noPreloadGetKeys,1,-1,1,0,0},
    {"exists",existsCommand,2,"r",0,NULL,1,1,1,0,0},
    {"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"getbit",getbitCommand,3,"r",0,NULL,1,1,1,0,0},
    {"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
    {"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
    {"incr",incrCommand,2,"wm",0,NULL,1,1,1,0,0},
    {"decr",decrCommand,2,"wm",0,NULL,1,1,1,0,0},
    {"mget",mgetCommand,-2,"r",0,NULL,1,-1,1,0,0},
    {"rpush",rpushCommand,-3,"wm",0,NULL,1,1,1,0,0},
    {"lpush",lpushCommand,-3,"wm",0,NULL,1,1,1,0,0},
    {"rpushx",rpushxCommand,3,"wm",0,NULL,1,1,1,0,0},
    {"lpushx",lpushxCommand,3,"wm",0,NULL,1,1,1,0,0},
    {"linsert",linsertCommand,5,"wm",0,NULL,1,1,1,0,0},
    {"rpop",rpopCommand,2,"w",0,NULL,1,1,1,0,0},
    {"lpop",lpopCommand,2,"w",0,NULL,1,1,1,0,0},
    {"brpop",brpopCommand,-3,"ws",0,NULL,1,1,1,0,0},
    {"brpoplpush",brpoplpushCommand,4,"wms",0,NULL,1,2,1,0,0},
    {"blpop",blpopCommand,-3,"ws",0,NULL,1,-2,1,0,0},
    {"llen",llenCommand,2,"r",0,NULL,1,1,1,0,0},
    {"lindex",lindexCommand,3,"r",0,NULL,1,1,1,0,0},
    {"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"lrange",lrangeCommand,4,"r",0,NULL,1,1,1,0,0},
    {"ltrim",ltrimCommand,4,"w",0,NULL,1,1,1,0,0},
    {"lrem",lremCommand,4,"w",0,NULL,1,1,1,0,0},
    {"rpoplpush",rpoplpushCommand,3,"wm",0,NULL,1,2,1,0,0},
    {"sadd",saddCommand,-3,"wm",0,NULL,1,1,1,0,0},
    {"srem",sremCommand,-3,"w",0,NULL,1,1,1,0,0},
    {"smove",smoveCommand,4,"w",0,NULL,1,2,1,0,0},
    {"sismember",sismemberCommand,3,"r",0,NULL,1,1,1,0,0},
    {"scard",scardCommand,2,"r",0,NULL,1,1,1,0,0},
    {"spop",spopCommand,2,"wRs",0,NULL,1,1,1,0,0},
    {"srandmember",srandmemberCommand,2,"rR",0,NULL,1,1,1,0,0},
    {"sinter",sinterCommand,-2,"rS",0,NULL,1,-1,1,0,0},
    {"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
    {"sunion",sunionCommand,-2,"rS",0,NULL,1,-1,1,0,0},
    {"sunionstore",sunionstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
    {"sdiff",sdiffCommand,-2,"rS",0,NULL,1,-1,1,0,0},
    {"sdiffstore",sdiffstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
    {"smembers",sinterCommand,2,"rS",0,NULL,1,1,1,0,0},
    {"zadd",zaddCommand,-4,"wm",0,NULL,1,1,1,0,0},
    {"zincrby",zincrbyCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"zrem",zremCommand,-3,"w",0,NULL,1,1,1,0,0},
    {"zremrangebyscore",zremrangebyscoreCommand,4,"w",0,NULL,1,1,1,0,0},
    {"zremrangebyrank",zremrangebyrankCommand,4,"w",0,NULL,1,1,1,0,0},
    {"zunionstore",zunionstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},
    {"zinterstore",zinterstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},
    {"zrange",zrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
    {"zrangebyscore",zrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},
    {"zrevrangebyscore",zrevrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},
    {"zcount",zcountCommand,4,"r",0,NULL,1,1,1,0,0},
    {"zrevrange",zrevrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
    {"zcard",zcardCommand,2,"r",0,NULL,1,1,1,0,0},
    {"zscore",zscoreCommand,3,"r",0,NULL,1,1,1,0,0},
    {"zrank",zrankCommand,3,"r",0,NULL,1,1,1,0,0},
    {"zrevrank",zrevrankCommand,3,"r",0,NULL,1,1,1,0,0},
    {"hset",hsetCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"hsetnx",hsetnxCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"hget",hgetCommand,3,"r",0,NULL,1,1,1,0,0},
    {"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0},
    {"hmget",hmgetCommand,-3,"r",0,NULL,1,1,1,0,0},
    {"hincrby",hincrbyCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"hincrbyfloat",hincrbyfloatCommand,4,"wm",0,NULL,1,1,1,0,0},
    {"hdel",hdelCommand,-3,"w",0,NULL,1,1,1,0,0},
    {"hlen",hlenCommand,2,"r",0,NULL,1,1,1,0,0},
    {"hkeys",hkeysCommand,2,"rS",0,NULL,1,1,1,0,0},
    {"hvals",hvalsCommand,2,"rS",0,NULL,1,1,1,0,0},
    {"hgetall",hgetallCommand,2,"r",0,NULL,1,1,1,0,0},
    {"hexists",hexistsCommand,3,"r",0,NULL,1,1,1,0,0},
    {"incrby",incrbyCommand,3,"wm",0,NULL,1,1,1,0,0},
    {"decrby",decrbyCommand,3,"wm",0,NULL,1,1,1,0,0},
    {"incrbyfloat",incrbyfloatCommand,3,"wm",0,NULL,1,1,1,0,0},
    {"getset",getsetCommand,3,"wm",0,NULL,1,1,1,0,0},
    {"mset",msetCommand,-3,"wm",0,NULL,1,-1,2,0,0},
    {"msetnx",msetnxCommand,-3,"wm",0,NULL,1,-1,2,0,0},
    {"randomkey",randomkeyCommand,1,"rR",0,NULL,0,0,0,0,0},
    {"select",selectCommand,2,"r",0,NULL,0,0,0,0,0},
    {"move",moveCommand,3,"w",0,NULL,1,1,1,0,0},
    {"rename",renameCommand,3,"w",0,renameGetKeys,1,2,1,0,0},
    {"renamenx",renamenxCommand,3,"w",0,renameGetKeys,1,2,1,0,0},
    {"expire",expireCommand,3,"w",0,NULL,1,1,1,0,0},
    {"expireat",expireatCommand,3,"w",0,NULL,1,1,1,0,0},
    {"pexpire",pexpireCommand,3,"w",0,NULL,1,1,1,0,0},
    {"pexpireat",pexpireatCommand,3,"w",0,NULL,1,1,1,0,0},
    {"keys",keysCommand,2,"rS",0,NULL,0,0,0,0,0},
    {"dbsize",dbsizeCommand,1,"r",0,NULL,0,0,0,0,0},
    {"auth",authCommand,2,"rs",0,NULL,0,0,0,0,0},
    {"ping",pingCommand,1,"r",0,NULL,0,0,0,0,0},
    {"echo",echoCommand,2,"r",0,NULL,0,0,0,0,0},
    {"save",saveCommand,1,"ars",0,NULL,0,0,0,0,0},
    {"bgsave",bgsaveCommand,1,"ar",0,NULL,0,0,0,0,0},
    {"bgrewriteaof",bgrewriteaofCommand,1,"ar",0,NULL,0,0,0,0,0},
    {"shutdown",shutdownCommand,-1,"ar",0,NULL,0,0,0,0,0},
    {"lastsave",lastsaveCommand,1,"r",0,NULL,0,0,0,0,0},
    {"type",typeCommand,2,"r",0,NULL,1,1,1,0,0},
    {"multi",multiCommand,1,"rs",0,NULL,0,0,0,0,0},
    {"exec",execCommand,1,"s",0,NULL,0,0,0,0,0},
    {"discard",discardCommand,1,"rs",0,NULL,0,0,0,0,0},
    {"sync",syncCommand,1,"ars",0,NULL,0,0,0,0,0},
    {"replconf",replconfCommand,-1,"ars",0,NULL,0,0,0,0,0},
    {"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},
    {"flushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0},
    {"sort",sortCommand,-2,"wmS",0,NULL,1,1,1,0,0},
    {"info",infoCommand,-1,"r",0,NULL,0,0,0,0,0},
    {"monitor",monitorCommand,1,"ars",0,NULL,0,0,0,0,0},
    {"ttl",ttlCommand,2,"r",0,NULL,1,1,1,0,0},
    {"pttl",pttlCommand,2,"r",0,NULL,1,1,1,0,0},
    {"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0},
    {"slaveof",slaveofCommand,3,"as",0,NULL,0,0,0,0,0},
    {"debug",debugCommand,-2,"as",0,NULL,0,0,0,0,0},
    {"config",configCommand,-2,"ar",0,NULL,0,0,0,0,0},
    {"subscribe",subscribeCommand,-2,"rps",0,NULL,0,0,0,0,0},
    {"unsubscribe",unsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0},
    {"psubscribe",psubscribeCommand,-2,"rps",0,NULL,0,0,0,0,0},
    {"punsubscribe",punsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0},
    {"publish",publishCommand,3,"pf",0,NULL,0,0,0,0,0},
    {"watch",watchCommand,-2,"rs",0,noPreloadGetKeys,1,-1,1,0,0},
    {"unwatch",unwatchCommand,1,"rs",0,NULL,0,0,0,0,0},
    {"cluster",clusterCommand,-2,"ar",0,NULL,0,0,0,0,0},
    {"restore",restoreCommand,4,"awm",0,NULL,1,1,1,0,0},
    {"migrate",migrateCommand,6,"aw",0,NULL,0,0,0,0,0},
    {"asking",askingCommand,1,"r",0,NULL,0,0,0,0,0},
    {"dump",dumpCommand,2,"ar",0,NULL,1,1,1,0,0},
    {"object",objectCommand,-2,"r",0,NULL,2,2,2,0,0},
    {"client",clientCommand,-2,"ar",0,NULL,0,0,0,0,0},
    {"eval",evalCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0},
    {"evalsha",evalShaCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0},
    {"slowlog",slowlogCommand,-2,"r",0,NULL,0,0,0,0,0},
    {"script",scriptCommand,-2,"ras",0,NULL,0,0,0,0,0},
    {"time",timeCommand,1,"rR",0,NULL,0,0,0,0,0},
    {"bitop",bitopCommand,-4,"wm",0,NULL,2,-1,1,0,0},
    {"bitcount",bitcountCommand,-2,"r",0,NULL,1,1,1,0,0}
};

/*============================ Utility functions ============================ */

/* Low level logging. To use only for very big messages, otherwise
 * redisLog() is to prefer. */
void redisLogRaw(int level, const char *msg) {
    const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING };
    const char *c = ".-*#";
    FILE *fp;
    char buf[64];
    int rawmode = (level & REDIS_LOG_RAW);

    level &= 0xff; /* clear flags */
    if (level < server.verbosity) return;

    fp = (server.logfile == NULL) ? stdout : fopen(server.logfile,"a");
    if (!fp) return;

    if (rawmode) {
        fprintf(fp,"%s",msg);
    } else {
        int off;
        struct timeval tv;

        gettimeofday(&tv,NULL);
        off = strftime(buf,sizeof(buf),"%d %b %H:%M:%S.",localtime(&tv.tv_sec));
        snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000);
        fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg);
    }
    fflush(fp);

    if (server.logfile) fclose(fp);

    if (server.syslog_enabled) syslog(syslogLevelMap[level], "%s", msg);
}

/* Like redisLogRaw() but with printf-alike support. This is the funciton that
 * is used across the code. The raw version is only used in order to dump
 * the INFO output on crash. */
void redisLog(int level, const char *fmt, ...) {
    va_list ap;
    char msg[REDIS_MAX_LOGMSG_LEN];

    if ((level&0xff) < server.verbosity) return;

    va_start(ap, fmt);
    vsnprintf(msg, sizeof(msg), fmt, ap);
    va_end(ap);

    redisLogRaw(level,msg);
}

/* Log a fixed message without printf-alike capabilities, in a way that is
 * safe to call from a signal handler.
 *
 * We actually use this only for signals that are not fatal from the point
 * of view of Redis. Signals that are going to kill the server anyway and
 * where we need printf-alike features are served by redisLog(). */
void redisLogFromHandler(int level, const char *msg) {
    int fd;
    char buf[64];

    if ((level&0xff) < server.verbosity ||
        (server.logfile == NULL && server.daemonize)) return;
    fd = server.logfile ?
        open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644) :
        STDOUT_FILENO;
    if (fd == -1) return;
    ll2string(buf,sizeof(buf),getpid());
    if (write(fd,"[",1) == -1) goto err;
    if (write(fd,buf,strlen(buf)) == -1) goto err;
    if (write(fd," | signal handler] (",20) == -1) goto err;
    ll2string(buf,sizeof(buf),time(NULL));
    if (write(fd,buf,strlen(buf)) == -1) goto err;
    if (write(fd,") ",2) == -1) goto err;
    if (write(fd,msg,strlen(msg)) == -1) goto err;
    if (write(fd,"\n",1) == -1) goto err;
err:
    if (server.logfile) close(fd);
}

/* Redis generally does not try to recover from out of memory conditions
 * when allocating objects or strings, it is not clear if it will be possible
 * to report this condition to the client since the networking layer itself
 * is based on heap allocation for send buffers, so we simply abort.
 * At least the code will be simpler to read... */
void oom(const char *msg) {
    redisLog(REDIS_WARNING, "%s: Out of memory\n",msg);
    sleep(1);
    abort();
}

/* Return the UNIX time in microseconds */
long long ustime(void) {
    struct timeval tv;
    long long ust;

    gettimeofday(&tv, NULL);
    ust = ((long long)tv.tv_sec)*1000000;
    ust += tv.tv_usec;
    return ust;
}

/* Return the UNIX time in milliseconds */
long long mstime(void) {
    return ustime()/1000;
}

/* After an RDB dump or AOF rewrite we exit from children using _exit() instead of
 * exit(), because the latter may interact with the same file objects used by
 * the parent process. However if we are testing the coverage normal exit() is
 * used in order to obtain the right coverage information. */
void exitFromChild(int retcode) {
#ifdef COVERAGE_TEST
    exit(retcode);
#else
    _exit(retcode);
#endif
}

/*====================== Hash table type implementation  ==================== */

/* This is an hash table type that uses the SDS dynamic strings libary as
 * keys and radis objects as values (objects can hold SDS strings,
 * lists, sets). */

void dictVanillaFree(void *privdata, void *val)
{
    DICT_NOTUSED(privdata);
    zfree(val);
}

void dictListDestructor(void *privdata, void *val)
{
    DICT_NOTUSED(privdata);
    listRelease((list*)val);
}

int dictSdsKeyCompare(void *privdata, const void *key1,
        const void *key2)
{
    int l1,l2;
    DICT_NOTUSED(privdata);

    l1 = sdslen((sds)key1);
    l2 = sdslen((sds)key2);
    if (l1 != l2) return 0;
    return memcmp(key1, key2, l1) == 0;
}

/* A case insensitive version used for the command lookup table. */
int dictSdsKeyCaseCompare(void *privdata, const void *key1,
        const void *key2)
{
    DICT_NOTUSED(privdata);

    return strcasecmp(key1, key2) == 0;
}

void dictRedisObjectDestructor(void *privdata, void *val)
{
    DICT_NOTUSED(privdata);

    if (val == NULL) return; /* Values of swapped out keys as set to NULL */
    decrRefCount(val);
}

void dictSdsDestructor(void *privdata, void *val)
{
    DICT_NOTUSED(privdata);

    sdsfree(val);
}

int dictObjKeyCompare(void *privdata, const void *key1,
        const void *key2)
{
    const robj *o1 = key1, *o2 = key2;
    return dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);
}

unsigned int dictObjHash(const void *key) {
    const robj *o = key;
    return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));
}

unsigned int dictSdsHash(const void *key) {
    return dictGenHashFunction((unsigned char*)key, sdslen((char*)key));
}

unsigned int dictSdsCaseHash(const void *key) {
    return dictGenCaseHashFunction((unsigned char*)key, sdslen((char*)key));
}

int dictEncObjKeyCompare(void *privdata, const void *key1,
        const void *key2)
{
    robj *o1 = (robj*) key1, *o2 = (robj*) key2;
    int cmp;

    if (o1->encoding == REDIS_ENCODING_INT &&
        o2->encoding == REDIS_ENCODING_INT)
            return o1->ptr == o2->ptr;

    o1 = getDecodedObject(o1);
    o2 = getDecodedObject(o2);
    cmp = dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);
    decrRefCount(o1);
    decrRefCount(o2);
    return cmp;
}

unsigned int dictEncObjHash(const void *key) {
    robj *o = (robj*) key;

    if (o->encoding == REDIS_ENCODING_RAW) {
        return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));
    } else {
        if (o->encoding == REDIS_ENCODING_INT) {
            char buf[32];
            int len;

            len = ll2string(buf,32,(long)o->ptr);
            return dictGenHashFunction((unsigned char*)buf, len);
        } else {
            unsigned int hash;

            o = getDecodedObject(o);
            hash = dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));
            decrRefCount(o);
            return hash;
        }
    }
}

/* Sets type hash table */
dictType setDictType = {
    dictEncObjHash,            /* hash function */
    NULL,                      /* key dup */
    NULL,                      /* val dup */
    dictEncObjKeyCompare,      /* key compare */
    dictRedisObjectDestructor, /* key destructor */
    NULL                       /* val destructor */
};

/* Sorted sets hash (note: a skiplist is used in addition to the hash table) */
dictType zsetDictType = {
    dictEncObjHash,            /* hash function */
    NULL,                      /* key dup */
    NULL,                      /* val dup */
    dictEncObjKeyCompare,      /* key compare */
    dictRedisObjectDestructor, /* key destructor */
    NULL                       /* val destructor */
};

/* Db->dict, keys are sds strings, vals are Redis objects. */
dictType dbDictType = {
    dictSdsHash,                /* hash function */
    NULL,                       /* key dup */
    NULL,                       /* val dup */
    dictSdsKeyCompare,          /* key compare */
    dictSdsDestructor,          /* key destructor */
    dictRedisObjectDestructor   /* val destructor */
};

/* Db->expires */
dictType keyptrDictType = {
    dictSdsHash,               /* hash function */
    NULL,                      /* key dup */
    NULL,                      /* val dup */
    dictSdsKeyCompare,         /* key compare */
    NULL,                      /* key destructor */
    NULL                       /* val destructor */
};

/* Command table. sds string -> command struct pointer. */
dictType commandTableDictType = {
    dictSdsCaseHash,           /* hash function */
    NULL,                      /* key dup */
    NULL,                      /* val dup */
    dictSdsKeyCaseCompare,     /* key compare */
    dictSdsDestructor,         /* key destructor */
    NULL                       /* val destructor */
};

/* Hash type hash table (note that small hashes are represented with zimpaps) */
dictType hashDictType = {
    dictEncObjHash,             /* hash function */
    NULL,                       /* key dup */
    NULL,                       /* val dup */
    dictEncObjKeyCompare,       /* key compare */
    dictRedisObjectDestructor,  /* key destructor */
    dictRedisObjectDestructor   /* val destructor */
};

/* Keylist hash table type has unencoded redis objects as keys and
 * lists as values. It's used for blocking operations (BLPOP) and to
 * map swapped keys to a list of clients waiting for this keys to be loaded. */
dictType keylistDictType = {
    dictObjHash,                /* hash function */
    NULL,                       /* key dup */
    NULL,                       /* val dup */
    dictObjKeyCompare,          /* key compare */
    dictRedisObjectDestructor,  /* key destructor */
    dictListDestructor          /* val destructor */
};

/* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to
 * clusterNode structures. */
dictType clusterNodesDictType = {
    dictSdsHash,                /* hash function */
    NULL,                       /* key dup */
    NULL,                       /* val dup */
    dictSdsKeyCompare,          /* key compare */
    dictSdsDestructor,          /* key destructor */
    NULL                        /* val destructor */
};

int htNeedsResize(dict *dict) {
    long long size, used;

    size = dictSlots(dict);
    used = dictSize(dict);
    return (size && used && size > DICT_HT_INITIAL_SIZE &&
            (used*100/size < REDIS_HT_MINFILL));
}

/* If the percentage of used slots in the HT reaches REDIS_HT_MINFILL
 * we resize the hash table to save memory */
void tryResizeHashTables(void) {
    int j;

    for (j = 0; j < server.dbnum; j++) {
        if (htNeedsResize(server.db[j].dict))
            dictResize(server.db[j].dict);
        if (htNeedsResize(server.db[j].expires))
            dictResize(server.db[j].expires);
    }
}

/* Our hash table implementation performs rehashing incrementally while
 * we write/read from the hash table. Still if the server is idle, the hash
 * table will use two tables for a long time. So we try to use 1 millisecond
 * of CPU time at every serverCron() loop in order to rehash some key. */
void incrementallyRehash(void) {
    int j;

    for (j = 0; j < server.dbnum; j++) {
        /* Keys dictionary */
        if (dictIsRehashing(server.db[j].dict)) {
            dictRehashMilliseconds(server.db[j].dict,1);
            break; /* already used our millisecond for this loop... */
        }
        /* Expires */
        if (dictIsRehashing(server.db[j].expires)) {
            dictRehashMilliseconds(server.db[j].expires,1);
            break; /* already used our millisecond for this loop... */
        }
    }
}

/* This function is called once a background process of some kind terminates,
 * as we want to avoid resizing the hash tables when there is a child in order
 * to play well with copy-on-write (otherwise when a resize happens lots of
 * memory pages are copied). The goal of this function is to update the ability
 * for dict.c to resize the hash tables accordingly to the fact we have o not
 * running childs. */
void updateDictResizePolicy(void) {
    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1)
        dictEnableResize();
    else
        dictDisableResize();
}

/* ======================= Cron: called every 100 ms ======================== */

/* Try to expire a few timed out keys. The algorithm used is adaptive and
 * will use few CPU cycles if there are few expiring keys, otherwise
 * it will get more aggressive to avoid that too much memory is used by
 * keys that can be removed from the keyspace. */
void activeExpireCycle(void) {
    int j, iteration = 0;
    long long start = ustime(), timelimit;

    /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time
     * per iteration. Since this function gets called with a frequency of
     * REDIS_HZ times per second, the following is the max amount of
     * microseconds we can spend in this function. */
    timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/REDIS_HZ/100;
    if (timelimit <= 0) timelimit = 1;

    for (j = 0; j < server.dbnum; j++) {
        int expired;
        redisDb *db = server.db+j;

        /* Continue to expire if at the end of the cycle more than 25%
         * of the keys were expired. */
        do {
            unsigned long num = dictSize(db->expires);
            unsigned long slots = dictSlots(db->expires);
            long long now = mstime();

            /* When there are less than 1% filled slots getting random
             * keys is expensive, so stop here waiting for better times...
             * The dictionary will be resized asap. */
            if (num && slots > DICT_HT_INITIAL_SIZE &&
                (num*100/slots < 1)) break;

            /* The main collection cycle. Sample random keys among keys
             * with an expire set, checking for expired ones. */
            expired = 0;
            if (num > REDIS_EXPIRELOOKUPS_PER_CRON)
                num = REDIS_EXPIRELOOKUPS_PER_CRON;
            while (num--) {
                dictEntry *de;
                long long t;

                if ((de = dictGetRandomKey(db->expires)) == NULL) break;
                t = dictGetSignedIntegerVal(de);
                if (now > t) {
                    sds key = dictGetKey(de);
                    robj *keyobj = createStringObject(key,sdslen(key));

                    propagateExpire(db,keyobj);
                    dbDelete(db,keyobj);
                    decrRefCount(keyobj);
                    expired++;
                    server.stat_expiredkeys++;
                }
            }
            /* We can't block forever here even if there are many keys to
             * expire. So after a given amount of milliseconds return to the
             * caller waiting for the other active expire cycle. */
            iteration++;
            if ((iteration & 0xf) == 0 && /* check once every 16 cycles. */
                (ustime()-start) > timelimit) return;
        } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4);
    }
}

void updateLRUClock(void) {
    server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) &
                                                REDIS_LRU_CLOCK_MAX;
}


/* Add a sample to the operations per second array of samples. */
void trackOperationsPerSecond(void) {
    long long t = mstime() - server.ops_sec_last_sample_time;
    long long ops = server.stat_numcommands - server.ops_sec_last_sample_ops;
    long long ops_sec;

    ops_sec = t > 0 ? (ops*1000/t) : 0;

    server.ops_sec_samples[server.ops_sec_idx] = ops_sec;
    server.ops_sec_idx = (server.ops_sec_idx+1) % REDIS_OPS_SEC_SAMPLES;
    server.ops_sec_last_sample_time = mstime();
    server.ops_sec_last_sample_ops = server.stat_numcommands;
}

/* Return the mean of all the samples. */
long long getOperationsPerSecond(void) {
    int j;
    long long sum = 0;

    for (j = 0; j < REDIS_OPS_SEC_SAMPLES; j++)
        sum += server.ops_sec_samples[j];
    return sum / REDIS_OPS_SEC_SAMPLES;
}

/* Check for timeouts. Returns non-zero if the client was terminated */
int clientsCronHandleTimeout(redisClient *c) {
    time_t now = server.unixtime;

    if (server.maxidletime &&
        !(c->flags & REDIS_SLAVE) &&    /* no timeout for slaves */
        !(c->flags & REDIS_MASTER) &&   /* no timeout for masters */
        !(c->flags & REDIS_BLOCKED) &&  /* no timeout for BLPOP */
        dictSize(c->pubsub_channels) == 0 && /* no timeout for pubsub */
        listLength(c->pubsub_patterns) == 0 &&
        (now - c->lastinteraction > server.maxidletime))
    {
        redisLog(REDIS_VERBOSE,"Closing idle client");
        freeClient(c);
        return 1;
    } else if (c->flags & REDIS_BLOCKED) {
        if (c->bpop.timeout != 0 && c->bpop.timeout < now) {
            addReply(c,shared.nullmultibulk);
            unblockClientWaitingData(c);
        }
    }
    return 0;
}

/* The client query buffer is an sds.c string that can end with a lot of
 * free space not used, this function reclaims space if needed.
 *
 * The funciton always returns 0 as it never terminates the client. */
int clientsCronResizeQueryBuffer(redisClient *c) {
    size_t querybuf_size = sdsAllocSize(c->querybuf);
    time_t idletime = server.unixtime - c->lastinteraction;

    /* There are two conditions to resize the query buffer:
     * 1) Query buffer is > BIG_ARG and too big for latest peak.
     * 2) Client is inactive and the buffer is bigger than 1k. */
    if (((querybuf_size > REDIS_MBULK_BIG_ARG) &&
         (querybuf_size/(c->querybuf_peak+1)) > 2) ||
         (querybuf_size > 1024 && idletime > 2))
    {
        /* Only resize the query buffer if it is actually wasting space. */
        if (sdsavail(c->querybuf) > 1024) {
            c->querybuf = sdsRemoveFreeSpace(c->querybuf);
        }
    }
    /* Reset the peak again to capture the peak memory usage in the next
     * cycle. */
    c->querybuf_peak = 0;
    return 0;
}

void clientsCron(void) {
    /* Make sure to process at least 1/(REDIS_HZ*10) of clients per call.
     * Since this function is called REDIS_HZ times per second we are sure that
     * in the worst case we process all the clients in 10 seconds.
     * In normal conditions (a reasonable number of clients) we process
     * all the clients in a shorter time. */
    int numclients = listLength(server.clients);
    int iterations = numclients/(REDIS_HZ*10);

    if (iterations < 50)
        iterations = (numclients < 50) ? numclients : 50;
    while(listLength(server.clients) && iterations--) {
        redisClient *c;
        listNode *head;

        /* Rotate the list, take the current head, process.
         * This way if the client must be removed from the list it's the
         * first element and we don't incur into O(N) computation. */
        listRotate(server.clients);
        head = listFirst(server.clients);
        c = listNodeValue(head);
        /* The following functions do different service checks on the client.
         * The protocol is that they return non-zero if the client was
         * terminated. */
        if (clientsCronHandleTimeout(c)) continue;
        if (clientsCronResizeQueryBuffer(c)) continue;
    }
}

/* This is our timer interrupt, called REDIS_HZ times per second.
 * Here is where we do a number of things that need to be done asynchronously.
 * For instance:
 *
 * - Active expired keys collection (it is also performed in a lazy way on
 *   lookup).
 * - Software watchdong.
 * - Update some statistic.
 * - Incremental rehashing of the DBs hash tables.
 * - Triggering BGSAVE / AOF rewrite, and handling of terminated children.
 * - Clients timeout of differnet kinds.
 * - Replication reconnection.
 * - Many more...
 *
 * Everything directly called here will be called REDIS_HZ times per second,
 * so in order to throttle execution of things we want to do less frequently
 * a macro is used: run_with_period(milliseconds) { .... }
 */

/* Using the following macro you can run code inside serverCron() with the
 * specified period, specified in milliseconds.
 * The actual resolution depends on REDIS_HZ. */
#define run_with_period(_ms_) if (!(loops % ((_ms_)/(1000/REDIS_HZ))))

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
    int j, loops = server.cronloops;
    REDIS_NOTUSED(eventLoop);
    REDIS_NOTUSED(id);
    REDIS_NOTUSED(clientData);

    /* Software watchdog: deliver the SIGALRM that will reach the signal
     * handler if we don't return here fast enough. */
    if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period);

    /* We take a cached value of the unix time in the global state because
     * with virtual memory and aging there is to store the current time
     * in objects at every object access, and accuracy is not needed.
     * To access a global var is faster than calling time(NULL) */
    server.unixtime = time(NULL);

    run_with_period(100) trackOperationsPerSecond();

    /* We have just 22 bits per object for LRU information.
     * So we use an (eventually wrapping) LRU clock with 10 seconds resolution.
     * 2^22 bits with 10 seconds resoluton is more or less 1.5 years.
     *
     * Note that even if this will wrap after 1.5 years it's not a problem,
     * everything will still work but just some object will appear younger
     * to Redis. But for this to happen a given object should never be touched
     * for 1.5 years.
     *
     * Note that you can change the resolution altering the
     * REDIS_LRU_CLOCK_RESOLUTION define.
     */
    updateLRUClock();

    /* Record the max memory used since the server was started. */
    if (zmalloc_used_memory() > server.stat_peak_memory)
        server.stat_peak_memory = zmalloc_used_memory();

    /* We received a SIGTERM, shutting down here in a safe way, as it is
     * not ok doing so inside the signal handler. */
    if (server.shutdown_asap) {
        if (prepareForShutdown(0) == REDIS_OK) exit(0);
        redisLog(REDIS_WARNING,"SIGTERM received but errors trying to shut down the server, check the logs for more information");
    }

    /* Show some info about non-empty databases */
    run_with_period(5000) {
        for (j = 0; j < server.dbnum; j++) {
            long long size, used, vkeys;

            size = dictSlots(server.db[j].dict);
            used = dictSize(server.db[j].dict);
            vkeys = dictSize(server.db[j].expires);
            if (used || vkeys) {
                redisLog(REDIS_VERBOSE,"DB %d: %lld keys (%lld volatile) in %lld slots HT.",j,used,vkeys,size);
                /* dictPrintStats(server.dict); */
            }
        }
    }

    /* We don't want to resize the hash tables while a bacground saving
     * is in progress: the saving child is created using fork() that is
     * implemented with a copy-on-write semantic in most modern systems, so
     * if we resize the HT while there is the saving child at work actually
     * a lot of memory movements in the parent will cause a lot of pages
     * copied. */
    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) {
        tryResizeHashTables();
        if (server.activerehashing) incrementallyRehash();
    }

    /* Show information about connected clients */
    run_with_period(5000) {
        redisLog(REDIS_VERBOSE,"%d clients connected (%d slaves), %zu bytes in use",
            listLength(server.clients)-listLength(server.slaves),
            listLength(server.slaves),
            zmalloc_used_memory());
    }

    /* We need to do a few operations on clients asynchronously. */
    clientsCron();

    /* Start a scheduled AOF rewrite if this was requested by the user while
     * a BGSAVE was in progress. */
    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 &&
        server.aof_rewrite_scheduled)
    {
        rewriteAppendOnlyFileBackground();
    }

    /* Check if a background saving or AOF rewrite in progress terminated. */
    if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) {
        int statloc;
        pid_t pid;

        if ((pid = wait3(&statloc,WNOHANG,NULL)) != 0) {
            int exitcode = WEXITSTATUS(statloc);
            int bysignal = 0;

            if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc);

            if (pid == server.rdb_child_pid) {
                backgroundSaveDoneHandler(exitcode,bysignal);
            } else {
                backgroundRewriteDoneHandler(exitcode,bysignal);
            }
            updateDictResizePolicy();
        }
    } else {
        /* If there is not a background saving/rewrite in progress check if
         * we have to save/rewrite now */
         for (j = 0; j < server.saveparamslen; j++) {
            struct saveparam *sp = server.saveparams+j;

            if (server.dirty >= sp->changes &&
                server.unixtime-server.lastsave > sp->seconds) {
                redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...",
                    sp->changes, sp->seconds);
                rdbSaveBackground(server.rdb_filename);
                break;
            }
         }

         /* Trigger an AOF rewrite if needed */
         if (server.rdb_child_pid == -1 &&
             server.aof_child_pid == -1 &&
             server.aof_rewrite_perc &&
             server.aof_current_size > server.aof_rewrite_min_size)
         {
            long long base = server.aof_rewrite_base_size ?
                            server.aof_rewrite_base_size : 1;
            long long growth = (server.aof_current_size*100/base) - 100;
            if (growth >= server.aof_rewrite_perc) {
                redisLog(REDIS_NOTICE,"Starting automatic rewriting of AOF on %lld%% growth",growth);
                rewriteAppendOnlyFileBackground();
            }
         }
    }


    /* If we postponed an AOF buffer flush, let's try to do it every time the
     * cron function is called. */
    if (server.aof_flush_postponed_start) flushAppendOnlyFile(0);

    /* Expire a few keys per cycle, only if this is a master.
     * On slaves we wait for DEL operations synthesized by the master
     * in order to guarantee a strict consistency. */
    if (server.masterhost == NULL) activeExpireCycle();

    /* Close clients that need to be closed asynchronous */
    freeClientsInAsyncFreeQueue();

    /* Replication cron function -- used to reconnect to master and
     * to detect transfer failures. */
    run_with_period(1000) replicationCron();

    /* Run other sub-systems specific cron jobs */
    run_with_period(1000) {
        if (server.cluster_enabled) clusterCron();
    }

    server.cronloops++;
    return 1000/REDIS_HZ;
}

/* This function gets called every time Redis is entering the
 * main loop of the event driven library, that is, before to sleep
 * for ready file descriptors. */
void beforeSleep(struct aeEventLoop *eventLoop) {
    REDIS_NOTUSED(eventLoop);
    listNode *ln;
    redisClient *c;

    /* Try to process pending commands for clients that were just unblocked. */
    while (listLength(server.unblocked_clients)) {
        ln = listFirst(server.unblocked_clients);
        redisAssert(ln != NULL);
        c = ln->value;
        listDelNode(server.unblocked_clients,ln);
        c->flags &= ~REDIS_UNBLOCKED;

        /* Process remaining data in the input buffer. */
        if (c->querybuf && sdslen(c->querybuf) > 0) {
            server.current_client = c;
            processInputBuffer(c);
            server.current_client = NULL;
        }
    }

    /* Write the AOF buffer on disk */
    flushAppendOnlyFile(0);
}

/* =========================== Server initialization ======================== */

void createSharedObjects(void) {
    int j;

    shared.crlf = createObject(REDIS_STRING,sdsnew("\r\n"));
    shared.ok = createObject(REDIS_STRING,sdsnew("+OK\r\n"));
    shared.err = createObject(REDIS_STRING,sdsnew("-ERR\r\n"));
    shared.emptybulk = createObject(REDIS_STRING,sdsnew("$0\r\n\r\n"));
    shared.czero = createObject(REDIS_STRING,sdsnew(":0\r\n"));
    shared.cone = createObject(REDIS_STRING,sdsnew(":1\r\n"));
    shared.cnegone = createObject(REDIS_STRING,sdsnew(":-1\r\n"));
    shared.nullbulk = createObject(REDIS_STRING,sdsnew("$-1\r\n"));
    shared.nullmultibulk = createObject(REDIS_STRING,sdsnew("*-1\r\n"));
    shared.emptymultibulk = createObject(REDIS_STRING,sdsnew("*0\r\n"));
    shared.pong = createObject(REDIS_STRING,sdsnew("+PONG\r\n"));
    shared.queued = createObject(REDIS_STRING,sdsnew("+QUEUED\r\n"));
    shared.wrongtypeerr = createObject(REDIS_STRING,sdsnew(
        "-ERR Operation against a key holding the wrong kind of value\r\n"));
    shared.nokeyerr = createObject(REDIS_STRING,sdsnew(
        "-ERR no such key\r\n"));
    shared.syntaxerr = createObject(REDIS_STRING,sdsnew(
        "-ERR syntax error\r\n"));
    shared.sameobjecterr = createObject(REDIS_STRING,sdsnew(
        "-ERR source and destination objects are the same\r\n"));
    shared.outofrangeerr = createObject(REDIS_STRING,sdsnew(
        "-ERR index out of range\r\n"));
    shared.noscripterr = createObject(REDIS_STRING,sdsnew(
        "-NOSCRIPT No matching script. Please use EVAL.\r\n"));
    shared.loadingerr = createObject(REDIS_STRING,sdsnew(
        "-LOADING Redis is loading the dataset in memory\r\n"));
    shared.slowscripterr = createObject(REDIS_STRING,sdsnew(
        "-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\r\n"));
    shared.masterdownerr = createObject(REDIS_STRING,sdsnew(
        "-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.\r\n"));
    shared.bgsaveerr = createObject(REDIS_STRING,sdsnew(
        "-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.\r\n"));
    shared.roslaveerr = createObject(REDIS_STRING,sdsnew(
        "-READONLY You can't write against a read only slave.\r\n"));
    shared.oomerr = createObject(REDIS_STRING,sdsnew(
        "-OOM command not allowed when used memory > 'maxmemory'.\r\n"));
    shared.space = createObject(REDIS_STRING,sdsnew(" "));
    shared.colon = createObject(REDIS_STRING,sdsnew(":"));
    shared.plus = createObject(REDIS_STRING,sdsnew("+"));

    for (j = 0; j < REDIS_SHARED_SELECT_CMDS; j++) {
        shared.select[j] = createObject(REDIS_STRING,
            sdscatprintf(sdsempty(),"select %d\r\n", j));
    }
    shared.messagebulk = createStringObject("$7\r\nmessage\r\n",13);
    shared.pmessagebulk = createStringObject("$8\r\npmessage\r\n",14);
    shared.subscribebulk = createStringObject("$9\r\nsubscribe\r\n",15);
    shared.unsubscribebulk = createStringObject("$11\r\nunsubscribe\r\n",18);
    shared.psubscribebulk = createStringObject("$10\r\npsubscribe\r\n",17);
    shared.punsubscribebulk = createStringObject("$12\r\npunsubscribe\r\n",19);
    shared.del = createStringObject("DEL",3);
    shared.rpop = createStringObject("RPOP",4);
    shared.lpop = createStringObject("LPOP",4);
    for (j = 0; j < REDIS_SHARED_INTEGERS; j++) {
        shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j);
        shared.integers[j]->encoding = REDIS_ENCODING_INT;
    }
    for (j = 0; j < REDIS_SHARED_BULKHDR_LEN; j++) {
        shared.mbulkhdr[j] = createObject(REDIS_STRING,
            sdscatprintf(sdsempty(),"*%d\r\n",j));
        shared.bulkhdr[j] = createObject(REDIS_STRING,
            sdscatprintf(sdsempty(),"$%d\r\n",j));
    }
}

void initServerConfig() {
    getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE);
    server.runid[REDIS_RUN_ID_SIZE] = '\0';
    server.arch_bits = (sizeof(long) == 8) ? 64 : 32;
    server.port = REDIS_SERVERPORT;
    server.bindaddr = NULL;
    server.unixsocket = NULL;
    server.unixsocketperm = 0;
    server.ipfd = -1;
    server.sofd = -1;
    server.dbnum = REDIS_DEFAULT_DBNUM;
    server.verbosity = REDIS_NOTICE;
    server.maxidletime = REDIS_MAXIDLETIME;
    server.client_max_querybuf_len = REDIS_MAX_QUERYBUF_LEN;
    server.saveparams = NULL;
    server.loading = 0;
    server.logfile = NULL; /* NULL = log on standard output */
    server.syslog_enabled = 0;
    server.syslog_ident = zstrdup("redis");
    server.syslog_facility = LOG_LOCAL0;
    server.daemonize = 0;
    server.aof_state = REDIS_AOF_OFF;
    server.aof_fsync = AOF_FSYNC_EVERYSEC;
    server.aof_no_fsync_on_rewrite = 0;
    server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC;
    server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE;
    server.aof_rewrite_base_size = 0;
    server.aof_rewrite_scheduled = 0;
    server.aof_last_fsync = time(NULL);
    server.aof_rewrite_time_last = -1;
    server.aof_rewrite_time_start = -1;
    server.aof_delayed_fsync = 0;
    server.aof_fd = -1;
    server.aof_selected_db = -1; /* Make sure the first time will not match */
    server.aof_flush_postponed_start = 0;
    server.pidfile = zstrdup("/var/run/redis.pid");
    server.rdb_filename = zstrdup("dump.rdb");
    server.aof_filename = zstrdup("appendonly.aof");
    server.requirepass = NULL;
    server.rdb_compression = 1;
    server.rdb_checksum = 1;
    server.activerehashing = 1;
    server.maxclients = REDIS_MAX_CLIENTS;
    server.bpop_blocked_clients = 0;
    server.maxmemory = 0;
    server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU;
    server.maxmemory_samples = 3;
    server.hash_max_ziplist_entries = REDIS_HASH_MAX_ZIPLIST_ENTRIES;
    server.hash_max_ziplist_value = REDIS_HASH_MAX_ZIPLIST_VALUE;
    server.list_max_ziplist_entries = REDIS_LIST_MAX_ZIPLIST_ENTRIES;
    server.list_max_ziplist_value = REDIS_LIST_MAX_ZIPLIST_VALUE;
    server.set_max_intset_entries = REDIS_SET_MAX_INTSET_ENTRIES;
    server.zset_max_ziplist_entries = REDIS_ZSET_MAX_ZIPLIST_ENTRIES;
    server.zset_max_ziplist_value = REDIS_ZSET_MAX_ZIPLIST_VALUE;
    server.shutdown_asap = 0;
    server.repl_ping_slave_period = REDIS_REPL_PING_SLAVE_PERIOD;
    server.repl_timeout = REDIS_REPL_TIMEOUT;
    server.cluster_enabled = 0;
    server.cluster.configfile = zstrdup("nodes.conf");
    server.lua_caller = NULL;
    server.lua_time_limit = REDIS_LUA_TIME_LIMIT;
    server.lua_client = NULL;
    server.lua_timedout = 0;

    updateLRUClock();
    resetServerSaveParams();

    appendServerSaveParams(60*60,1);  /* save after 1 hour and 1 change */
    appendServerSaveParams(300,100);  /* save after 5 minutes and 100 changes */
    appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */
    /* Replication related */
    server.masterauth = NULL;
    server.masterhost = NULL;
    server.masterport = 6379;
    server.master = NULL;
    server.repl_state = REDIS_REPL_NONE;
    server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT;
    server.repl_serve_stale_data = 1;
    server.repl_slave_ro = 1;
    server.repl_down_since = time(NULL);

    /* Client output buffer limits */
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].hard_limit_bytes = 0;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_bytes = 0;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_seconds = 0;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].hard_limit_bytes = 1024*1024*256;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_bytes = 1024*1024*64;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_seconds = 60;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].hard_limit_bytes = 1024*1024*32;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_bytes = 1024*1024*8;
    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_seconds = 60;

    /* Double constants initialization */
    R_Zero = 0.0;
    R_PosInf = 1.0/R_Zero;
    R_NegInf = -1.0/R_Zero;
    R_Nan = R_Zero/R_Zero;

    /* Command table -- we intiialize it here as it is part of the
     * initial configuration, since command names may be changed via
     * redis.conf using the rename-command directive. */
    server.commands = dictCreate(&commandTableDictType,NULL);
    populateCommandTable();
    server.delCommand = lookupCommandByCString("del");
    server.multiCommand = lookupCommandByCString("multi");
    server.lpushCommand = lookupCommandByCString("lpush");

    /* Slow log */
    server.slowlog_log_slower_than = REDIS_SLOWLOG_LOG_SLOWER_THAN;
    server.slowlog_max_len = REDIS_SLOWLOG_MAX_LEN;

    /* Debugging */
    server.assert_failed = "<no assertion failed>";
    server.assert_file = "<no file>";
    server.assert_line = 0;
    server.bug_report_start = 0;
    server.watchdog_period = 0;
}

/* This function will try to raise the max number of open files accordingly to
 * the configured max number of clients. It will also account for 32 additional
 * file descriptors as we need a few more for persistence, listening
 * sockets, log files and so forth.
 *
 * If it will not be possible to set the limit accordingly to the configured
 * max number of clients, the function will do the reverse setting
 * server.maxclients to the value that we can actually handle. */
void adjustOpenFilesLimit(void) {
    rlim_t maxfiles = server.maxclients+32;
    struct rlimit limit;

    if (getrlimit(RLIMIT_NOFILE,&limit) == -1) {
        redisLog(REDIS_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.",
            strerror(errno));
        server.maxclients = 1024-32;
    } else {
        rlim_t oldlimit = limit.rlim_cur;

        /* Set the max number of files if the current limit is not enough
         * for our needs. */
        if (oldlimit < maxfiles) {
            rlim_t f;

            f = maxfiles;
            while(f > oldlimit) {
                limit.rlim_cur = f;
                limit.rlim_max = f;
                if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;
                f -= 128;
            }
            if (f < oldlimit) f = oldlimit;
            if (f != maxfiles) {
                server.maxclients = f-32;
                redisLog(REDIS_WARNING,"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.",
                    (int) maxfiles, strerror(errno), (int) server.maxclients);
            } else {
                redisLog(REDIS_NOTICE,"Max number of open files set to %d",
                    (int) maxfiles);
            }
        }
    }
}

void initServer() {
    int j;

    signal(SIGHUP, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    setupSignalHandlers();

    if (server.syslog_enabled) {
        openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
            server.syslog_facility);
    }

    server.current_client = NULL;
    server.clients = listCreate();
    server.clients_to_close = listCreate();
    server.slaves = listCreate();
    server.monitors = listCreate();
    server.unblocked_clients = listCreate();

    createSharedObjects();
    adjustOpenFilesLimit();
    server.el = aeCreateEventLoop(server.maxclients+1024);
    server.db = zmalloc(sizeof(redisDb)*server.dbnum);

    if (server.port != 0) {
        server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr);
        if (server.ipfd == ANET_ERR) {
            redisLog(REDIS_WARNING, "Opening port %d: %s",
                server.port, server.neterr);
            exit(1);
        }
    }
    if (server.unixsocket != NULL) {
        unlink(server.unixsocket); /* don't care if this fails */
        server.sofd = anetUnixServer(server.neterr,server.unixsocket,server.unixsocketperm);
        if (server.sofd == ANET_ERR) {
            redisLog(REDIS_WARNING, "Opening socket: %s", server.neterr);
            exit(1);
        }
    }
    if (server.ipfd < 0 && server.sofd < 0) {
        redisLog(REDIS_WARNING, "Configured to not listen anywhere, exiting.");
        exit(1);
    }
    for (j = 0; j < server.dbnum; j++) {
        server.db[j].dict = dictCreate(&dbDictType,NULL);
        server.db[j].expires = dictCreate(&keyptrDictType,NULL);
        server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);
        server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);
        server.db[j].id = j;
    }
    server.pubsub_channels = dictCreate(&keylistDictType,NULL);
    server.pubsub_patterns = listCreate();
    listSetFreeMethod(server.pubsub_patterns,freePubsubPattern);
    listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);
    server.cronloops = 0;
    server.rdb_child_pid = -1;
    server.aof_child_pid = -1;
    aofRewriteBufferReset();
    server.aof_buf = sdsempty();
    server.lastsave = time(NULL);
    server.rdb_save_time_last = -1;
    server.rdb_save_time_start = -1;
    server.dirty = 0;
    server.stat_numcommands = 0;
    server.stat_numconnections = 0;
    server.stat_expiredkeys = 0;
    server.stat_evictedkeys = 0;
    server.stat_starttime = time(NULL);
    server.stat_keyspace_misses = 0;
    server.stat_keyspace_hits = 0;
    server.stat_peak_memory = 0;
    server.stat_fork_time = 0;
    server.stat_rejected_conn = 0;
    memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples));
    server.ops_sec_idx = 0;
    server.ops_sec_last_sample_time = mstime();
    server.ops_sec_last_sample_ops = 0;
    server.unixtime = time(NULL);
    server.lastbgsave_status = REDIS_OK;
    server.stop_writes_on_bgsave_err = 1;
    aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL);
    if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE,
        acceptTcpHandler,NULL) == AE_ERR) oom("creating file event");
    if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,
        acceptUnixHandler,NULL) == AE_ERR) oom("creating file event");

    if (server.aof_state == REDIS_AOF_ON) {
        server.aof_fd = open(server.aof_filename,
                               O_WRONLY|O_APPEND|O_CREAT,0644);
        if (server.aof_fd == -1) {
            redisLog(REDIS_WARNING, "Can't open the append-only file: %s",
                strerror(errno));
            exit(1);
        }
    }

    /* 32 bit instances are limited to 4GB of address space, so if there is
     * no explicit limit in the user provided configuration we set a limit
     * at 3.5GB using maxmemory with 'noeviction' policy'. This saves
     * useless crashes of the Redis instance. */
    if (server.arch_bits == 32 && server.maxmemory == 0) {
        redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now.");
        server.maxmemory = 3584LL*(1024*1024); /* 3584 MB = 3.5 GB */
        server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;
    }

    if (server.cluster_enabled) clusterInit();
    scriptingInit();
    slowlogInit();
    bioInit();
}

/* Populates the Redis Command Table starting from the hard coded list
 * we have on top of redis.c file. */
void populateCommandTable(void) {
    int j;
    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);

    for (j = 0; j < numcommands; j++) {
        struct redisCommand *c = redisCommandTable+j;
        char *f = c->sflags;
        int retval;

        while(*f != '\0') {
            switch(*f) {
            case 'w': c->flags |= REDIS_CMD_WRITE; break;
            case 'r': c->flags |= REDIS_CMD_READONLY; break;
            case 'm': c->flags |= REDIS_CMD_DENYOOM; break;
            case 'a': c->flags |= REDIS_CMD_ADMIN; break;
            case 'p': c->flags |= REDIS_CMD_PUBSUB; break;
            case 'f': c->flags |= REDIS_CMD_FORCE_REPLICATION; break;
            case 's': c->flags |= REDIS_CMD_NOSCRIPT; break;
            case 'R': c->flags |= REDIS_CMD_RANDOM; break;
            case 'S': c->flags |= REDIS_CMD_SORT_FOR_SCRIPT; break;
            default: redisPanic("Unsupported command flag"); break;
            }
            f++;
        }

        retval = dictAdd(server.commands, sdsnew(c->name), c);
        assert(retval == DICT_OK);
    }
}

void resetCommandTableStats(void) {
    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
    int j;

    for (j = 0; j < numcommands; j++) {
        struct redisCommand *c = redisCommandTable+j;

        c->microseconds = 0;
        c->calls = 0;
    }
}

/* ========================== Redis OP Array API ============================ */

void redisOpArrayInit(redisOpArray *oa) {
    oa->ops = NULL;
    oa->numops = 0;
}

int redisOpArrayAppend(redisOpArray *oa, struct redisCommand *cmd, int dbid,
                       robj **argv, int argc, int target)
{
    redisOp *op;

    oa->ops = zrealloc(oa->ops,sizeof(redisOp)*(oa->numops+1));
    op = oa->ops+oa->numops;
    op->cmd = cmd;
    op->dbid = dbid;
    op->argv = argv;
    op->argc = argc;
    op->target = target;
    oa->numops++;
    return oa->numops;
}

void redisOpArrayFree(redisOpArray *oa) {
    while(oa->numops) {
        int j;
        redisOp *op;

        oa->numops--;
        op = oa->ops+oa->numops;
        for (j = 0; j < op->argc; j++)
            decrRefCount(op->argv[j]);
        zfree(op->argv);
    }
    zfree(oa->ops);
}

/* ====================== Commands lookup and execution ===================== */

struct redisCommand *lookupCommand(sds name) {
    return dictFetchValue(server.commands, name);
}

struct redisCommand *lookupCommandByCString(char *s) {
    struct redisCommand *cmd;
    sds name = sdsnew(s);

    cmd = dictFetchValue(server.commands, name);
    sdsfree(name);
    return cmd;
}

/* Propagate the specified command (in the context of the specified database id)
 * to AOF, Slaves and Monitors.
 *
 * flags are an xor between:
 * + REDIS_PROPAGATE_NONE (no propagation of command at all)
 * + REDIS_PROPAGATE_AOF (propagate into the AOF file if is enabled)
 * + REDIS_PROPAGATE_REPL (propagate into the replication link)
 */
void propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,
               int flags)
{
    if (server.aof_state != REDIS_AOF_OFF && flags & REDIS_PROPAGATE_AOF)
        feedAppendOnlyFile(cmd,dbid,argv,argc);
    if (flags & REDIS_PROPAGATE_REPL && listLength(server.slaves))
        replicationFeedSlaves(server.slaves,dbid,argv,argc);
}

/* Used inside commands to schedule the propagation of additional commands
 * after the current command is propagated to AOF / Replication. */
void alsoPropagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,
                   int target)
{
    redisOpArrayAppend(&server.also_propagate,cmd,dbid,argv,argc,target);
}

/* Call() is the core of Redis execution of a command */
void call(redisClient *c, int flags) {
    long long dirty, start = ustime(), duration;

    /* Sent the command to clients in MONITOR mode, only if the commands are
     * not geneated from reading an AOF. */
    if (listLength(server.monitors) && !server.loading)
        replicationFeedMonitors(c,server.monitors,c->db->id,c->argv,c->argc);

    /* Call the command. */
    redisOpArrayInit(&server.also_propagate);
    dirty = server.dirty;
    c->cmd->proc(c);
    dirty = server.dirty-dirty;
    duration = ustime()-start;

    /* When EVAL is called loading the AOF we don't want commands called
     * from Lua to go into the slowlog or to populate statistics. */
    if (server.loading && c->flags & REDIS_LUA_CLIENT)
        flags &= ~(REDIS_CALL_SLOWLOG | REDIS_CALL_STATS);

    /* Log the command into the Slow log if needed, and populate the
     * per-command statistics that we show in INFO commandstats. */
    if (flags & REDIS_CALL_SLOWLOG)
        slowlogPushEntryIfNeeded(c->argv,c->argc,duration);
    if (flags & REDIS_CALL_STATS) {
        c->cmd->microseconds += duration;
        c->cmd->calls++;
    }

    /* Propagate the command into the AOF and replication link */
    if (flags & REDIS_CALL_PROPAGATE) {
        int flags = REDIS_PROPAGATE_NONE;

        if (c->cmd->flags & REDIS_CMD_FORCE_REPLICATION)
            flags |= REDIS_PROPAGATE_REPL;
        if (dirty)
            flags |= (REDIS_PROPAGATE_REPL | REDIS_PROPAGATE_AOF);
        if (flags != REDIS_PROPAGATE_NONE)
            propagate(c->cmd,c->db->id,c->argv,c->argc,flags);
    }
    /* Commands such as LPUSH or BRPOPLPUSH may propagate an additional
     * PUSH command. */
    if (server.also_propagate.numops) {
        int j;
        redisOp *rop;

        for (j = 0; j < server.also_propagate.numops; j++) {
            rop = &server.also_propagate.ops[j];
            propagate(rop->cmd, rop->dbid, rop->argv, rop->argc, rop->target);
        }
        redisOpArrayFree(&server.also_propagate);
    }
    server.stat_numcommands++;
}

/* If this function gets called we already read a whole
 * command, argments are in the client argv/argc fields.
 * processCommand() execute the command or prepare the
 * server for a bulk read from the client.
 *
 * If 1 is returned the client is still alive and valid and
 * and other operations can be performed by the caller. Otherwise
 * if 0 is returned the client was destroied (i.e. after QUIT). */
int processCommand(redisClient *c) {
    /* The QUIT command is handled separately. Normal command procs will
     * go through checking for replication and QUIT will cause trouble
     * when FORCE_REPLICATION is enabled and would be implemented in
     * a regular command proc. */
    if (!strcasecmp(c->argv[0]->ptr,"quit")) {
        addReply(c,shared.ok);
        c->flags |= REDIS_CLOSE_AFTER_REPLY;
        return REDIS_ERR;
    }

    /* Now lookup the command and check ASAP about trivial error conditions
     * such as wrong arity, bad command name and so forth. */
    c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);
    if (!c->cmd) {
        addReplyErrorFormat(c,"unknown command '%s'",
            (char*)c->argv[0]->ptr);
        return REDIS_OK;
    } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) ||
               (c->argc < -c->cmd->arity)) {
        addReplyErrorFormat(c,"wrong number of arguments for '%s' command",
            c->cmd->name);
        return REDIS_OK;
    }

    /* Check if the user is authenticated */
    if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand)
    {
        addReplyError(c,"operation not permitted");
        return REDIS_OK;
    }

    /* If cluster is enabled, redirect here */
    if (server.cluster_enabled &&
                !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0)) {
        int hashslot;

        if (server.cluster.state != REDIS_CLUSTER_OK) {
            addReplyError(c,"The cluster is down. Check with CLUSTER INFO for more information");
            return REDIS_OK;
        } else {
            int ask;
            clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask);
            if (n == NULL) {
                addReplyError(c,"Multi keys request invalid in cluster");
                return REDIS_OK;
            } else if (n != server.cluster.myself) {
                addReplySds(c,sdscatprintf(sdsempty(),
                    "-%s %d %s:%d\r\n", ask ? "ASK" : "MOVED",
                    hashslot,n->ip,n->port));
                return REDIS_OK;
            }
        }
    }

    /* Handle the maxmemory directive.
     *
     * First we try to free some memory if possible (if there are volatile
     * keys in the dataset). If there are not the only thing we can do
     * is returning an error. */
    if (server.maxmemory) {
        int retval = freeMemoryIfNeeded();
        if ((c->cmd->flags & REDIS_CMD_DENYOOM) && retval == REDIS_ERR) {
            addReply(c, shared.oomerr);
            return REDIS_OK;
        }
    }

    /* Don't accept write commands if there are problems persisting on disk. */
    if (server.stop_writes_on_bgsave_err &&
        server.saveparamslen > 0
        && server.lastbgsave_status == REDIS_ERR &&
        c->cmd->flags & REDIS_CMD_WRITE)
    {
        addReply(c, shared.bgsaveerr);
        return REDIS_OK;
    }

    /* Don't accept wirte commands if this is a read only slave. But
     * accept write commands if this is our master. */
    if (server.masterhost && server.repl_slave_ro &&
        !(c->flags & REDIS_MASTER) &&
        c->cmd->flags & REDIS_CMD_WRITE)
    {
        addReply(c, shared.roslaveerr);
        return REDIS_OK;
    }

    /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */
    if ((dictSize(c->pubsub_channels) > 0 || listLength(c->pubsub_patterns) > 0)
        &&
        c->cmd->proc != subscribeCommand &&
        c->cmd->proc != unsubscribeCommand &&
        c->cmd->proc != psubscribeCommand &&
        c->cmd->proc != punsubscribeCommand) {
        addReplyError(c,"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context");
        return REDIS_OK;
    }

    /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and
     * we are a slave with a broken link with master. */
    if (server.masterhost && server.repl_state != REDIS_REPL_CONNECTED &&
        server.repl_serve_stale_data == 0 &&
        c->cmd->proc != infoCommand && c->cmd->proc != slaveofCommand)
    {
        addReply(c, shared.masterdownerr);
        return REDIS_OK;
    }

    /* Loading DB? Return an error if the command is not INFO */
    if (server.loading && c->cmd->proc != infoCommand) {
        addReply(c, shared.loadingerr);
        return REDIS_OK;
    }

    /* Lua script too slow? Only allow SHUTDOWN NOSAVE and SCRIPT KILL. */
    if (server.lua_timedout &&
        !(c->cmd->proc == shutdownCommand &&
          c->argc == 2 &&
          tolower(((char*)c->argv[1]->ptr)[0]) == 'n') &&
        !(c->cmd->proc == scriptCommand &&
          c->argc == 2 &&
          tolower(((char*)c->argv[1]->ptr)[0]) == 'k'))
    {
        addReply(c, shared.slowscripterr);
        return REDIS_OK;
    }

    /* Exec the command */
    if (c->flags & REDIS_MULTI &&
        c->cmd->proc != execCommand && c->cmd->proc != discardCommand &&
        c->cmd->proc != multiCommand && c->cmd->proc != watchCommand)
    {
        queueMultiCommand(c);
        addReply(c,shared.queued);
    } else {
        call(c,REDIS_CALL_FULL);
    }
    return REDIS_OK;
}

/*================================== Shutdown =============================== */

int prepareForShutdown(int flags) {
    int save = flags & REDIS_SHUTDOWN_SAVE;
    int nosave = flags & REDIS_SHUTDOWN_NOSAVE;

    redisLog(REDIS_WARNING,"User requested shutdown...");
    /* Kill the saving child if there is a background saving in progress.
       We want to avoid race conditions, for instance our saving child may
       overwrite the synchronous saving did by SHUTDOWN. */
    if (server.rdb_child_pid != -1) {
        redisLog(REDIS_WARNING,"There is a child saving an .rdb. Killing it!");
        kill(server.rdb_child_pid,SIGKILL);
        rdbRemoveTempFile(server.rdb_child_pid);
    }
    if (server.aof_state != REDIS_AOF_OFF) {
        /* Kill the AOF saving child as the AOF we already have may be longer
         * but contains the full dataset anyway. */
        if (server.aof_child_pid != -1) {
            redisLog(REDIS_WARNING,
                "There is a child rewriting the AOF. Killing it!");
            kill(server.aof_child_pid,SIGKILL);
        }
        /* Append only file: fsync() the AOF and exit */
        redisLog(REDIS_NOTICE,"Calling fsync() on the AOF file.");
        aof_fsync(server.aof_fd);
    }
    if ((server.saveparamslen > 0 && !nosave) || save) {
        redisLog(REDIS_NOTICE,"Saving the final RDB snapshot before exiting.");
        /* Snapshotting. Perform a SYNC SAVE and exit */
        if (rdbSave(server.rdb_filename) != REDIS_OK) {
            /* Ooops.. error saving! The best we can do is to continue
             * operating. Note that if there was a background saving process,
             * in the next cron() Redis will be notified that the background
             * saving aborted, handling special stuff like slaves pending for
             * synchronization... */
            redisLog(REDIS_WARNING,"Error trying to save the DB, can't exit.");
            return REDIS_ERR;
        }
    }
    if (server.daemonize) {
        redisLog(REDIS_NOTICE,"Removing the pid file.");
        unlink(server.pidfile);
    }
    /* Close the listening sockets. Apparently this allows faster restarts. */
    if (server.ipfd != -1) close(server.ipfd);
    if (server.sofd != -1) close(server.sofd);
    if (server.unixsocket) {
        redisLog(REDIS_NOTICE,"Removing the unix socket file.");
        unlink(server.unixsocket); /* don't care if this fails */
    }

    redisLog(REDIS_WARNING,"Redis is now ready to exit, bye bye...");
    return REDIS_OK;
}

/*================================== Commands =============================== */

/* Return zero if strings are the same, non-zero if they are not.
 * The comparison is performed in a way that prevents an attacker to obtain
 * information about the nature of the strings just monitoring the execution
 * time of the function.
 *
 * Note that limiting the comparison length to strings up to 512 bytes we
 * can avoid leaking any information about the password length and any
 * possible branch misprediction related leak.
 */
int time_independent_strcmp(char *a, char *b) {
    char bufa[REDIS_AUTHPASS_MAX_LEN], bufb[REDIS_AUTHPASS_MAX_LEN];
    /* The above two strlen perform len(a) + len(b) operations where either
     * a or b are fixed (our password) length, and the difference is only
     * relative to the length of the user provided string, so no information
     * leak is possible in the following two lines of code. */
    int alen = strlen(a);
    int blen = strlen(b);
    int j;
    int diff = 0;

    /* We can't compare strings longer than our static buffers.
     * Note that this will never pass the first test in practical circumstances
     * so there is no info leak. */
    if (alen > sizeof(bufa) || blen > sizeof(bufb)) return 1;

    memset(bufa,0,sizeof(bufa));        /* Constant time. */
    memset(bufb,0,sizeof(bufb));        /* Constant time. */
    /* Again the time of the following two copies is proportional to
     * len(a) + len(b) so no info is leaked. */
    memcpy(bufa,a,alen);
    memcpy(bufb,b,blen);

    /* Always compare all the chars in the two buffers without
     * conditional expressions. */
    for (j = 0; j < sizeof(bufa); j++) {
        diff |= (bufa[j] ^ bufb[j]);
    }
    /* Length must be equal as well. */
    diff |= alen ^ blen;
    return diff; /* If zero strings are the same. */
}

void authCommand(redisClient *c) {
    if (!server.requirepass) {
        addReplyError(c,"Client sent AUTH, but no password is set");
    } else if (!time_independent_strcmp(c->argv[1]->ptr, server.requirepass)) {
      c->authenticated = 1;
      addReply(c,shared.ok);
    } else {
      c->authenticated = 0;
      addReplyError(c,"invalid password");
    }
}

void pingCommand(redisClient *c) {
    addReply(c,shared.pong);
}

void echoCommand(redisClient *c) {
    addReplyBulk(c,c->argv[1]);
}

void timeCommand(redisClient *c) {
    struct timeval tv;

    /* gettimeofday() can only fail if &tv is a bad addresss so we
     * don't check for errors. */
    gettimeofday(&tv,NULL);
    addReplyMultiBulkLen(c,2);
    addReplyBulkLongLong(c,tv.tv_sec);
    addReplyBulkLongLong(c,tv.tv_usec);
}

/* Convert an amount of bytes into a human readable string in the form
 * of 100B, 2G, 100M, 4K, and so forth. */
void bytesToHuman(char *s, unsigned long long n) {
    double d;

    if (n < 1024) {
        /* Bytes */
        sprintf(s,"%lluB",n);
        return;
    } else if (n < (1024*1024)) {
        d = (double)n/(1024);
        sprintf(s,"%.2fK",d);
    } else if (n < (1024LL*1024*1024)) {
        d = (double)n/(1024*1024);
        sprintf(s,"%.2fM",d);
    } else if (n < (1024LL*1024*1024*1024)) {
        d = (double)n/(1024LL*1024*1024);
        sprintf(s,"%.2fG",d);
    }
}

/* Create the string returned by the INFO command. This is decoupled
 * by the INFO command itself as we need to report the same information
 * on memory corruption problems. */
sds genRedisInfoString(char *section) {
    sds info = sdsempty();
    time_t uptime = server.unixtime-server.stat_starttime;
    int j, numcommands;
    struct rusage self_ru, c_ru;
    unsigned long lol, bib;
    int allsections = 0, defsections = 0;
    int sections = 0;

    if (section) {
        allsections = strcasecmp(section,"all") == 0;
        defsections = strcasecmp(section,"default") == 0;
    }

    getrusage(RUSAGE_SELF, &self_ru);
    getrusage(RUSAGE_CHILDREN, &c_ru);
    getClientsMaxBuffers(&lol,&bib);

    /* Server */
    if (allsections || defsections || !strcasecmp(section,"server")) {
        struct utsname name;

        if (sections++) info = sdscat(info,"\r\n");
        uname(&name);
        info = sdscatprintf(info,
            "# Server\r\n"
            "redis_version:%s\r\n"
            "redis_git_sha1:%s\r\n"
            "redis_git_dirty:%d\r\n"
            "os:%s %s %s\r\n"
            "arch_bits:%d\r\n"
            "multiplexing_api:%s\r\n"
            "gcc_version:%d.%d.%d\r\n"
            "process_id:%ld\r\n"
            "run_id:%s\r\n"
            "tcp_port:%d\r\n"
            "uptime_in_seconds:%ld\r\n"
            "uptime_in_days:%ld\r\n"
            "lru_clock:%ld\r\n",
            REDIS_VERSION,
            redisGitSHA1(),
            strtol(redisGitDirty(),NULL,10) > 0,
            name.sysname, name.release, name.machine,
            server.arch_bits,
            aeGetApiName(),
#ifdef __GNUC__
            __GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,
#else
            0,0,0,
#endif
            (long) getpid(),
            server.runid,
            server.port,
            uptime,
            uptime/(3600*24),
            (unsigned long) server.lruclock);
    }

    /* Clients */
    if (allsections || defsections || !strcasecmp(section,"clients")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info,
            "# Clients\r\n"
            "connected_clients:%lu\r\n"
            "client_longest_output_list:%lu\r\n"
            "client_biggest_input_buf:%lu\r\n"
            "blocked_clients:%d\r\n",
            listLength(server.clients)-listLength(server.slaves),
            lol, bib,
            server.bpop_blocked_clients);
    }

    /* Memory */
    if (allsections || defsections || !strcasecmp(section,"memory")) {
        char hmem[64];
        char peak_hmem[64];

        bytesToHuman(hmem,zmalloc_used_memory());
        bytesToHuman(peak_hmem,server.stat_peak_memory);
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info,
            "# Memory\r\n"
            "used_memory:%zu\r\n"
            "used_memory_human:%s\r\n"
            "used_memory_rss:%zu\r\n"
            "used_memory_peak:%zu\r\n"
            "used_memory_peak_human:%s\r\n"
            "used_memory_lua:%lld\r\n"
            "mem_fragmentation_ratio:%.2f\r\n"
            "mem_allocator:%s\r\n",
            zmalloc_used_memory(),
            hmem,
            zmalloc_get_rss(),
            server.stat_peak_memory,
            peak_hmem,
            ((long long)lua_gc(server.lua,LUA_GCCOUNT,0))*1024LL,
            zmalloc_get_fragmentation_ratio(),
            ZMALLOC_LIB
            );
    }

    /* Persistence */
    if (allsections || defsections || !strcasecmp(section,"persistence")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info,
            "# Persistence\r\n"
            "loading:%d\r\n"
            "rdb_changes_since_last_save:%lld\r\n"
            "rdb_bgsave_in_progress:%d\r\n"
            "rdb_last_save_time:%ld\r\n"
            "rdb_last_bgsave_status:%s\r\n"
            "rdb_last_bgsave_time_sec:%ld\r\n"
            "rdb_current_bgsave_time_sec:%ld\r\n"
            "aof_enabled:%d\r\n"
            "aof_rewrite_in_progress:%d\r\n"
            "aof_rewrite_scheduled:%d\r\n"
            "aof_last_rewrite_time_sec:%ld\r\n"
            "aof_current_rewrite_time_sec:%ld\r\n",
            server.loading,
            server.dirty,
            server.rdb_child_pid != -1,
            server.lastsave,
            server.lastbgsave_status == REDIS_OK ? "ok" : "err",
            server.rdb_save_time_last,
            (server.rdb_child_pid == -1) ?
                -1 : time(NULL)-server.rdb_save_time_start,
            server.aof_state != REDIS_AOF_OFF,
            server.aof_child_pid != -1,
            server.aof_rewrite_scheduled,
            server.aof_rewrite_time_last,
            (server.aof_child_pid == -1) ?
                -1 : time(NULL)-server.aof_rewrite_time_start);

        if (server.aof_state != REDIS_AOF_OFF) {
            info = sdscatprintf(info,
                "aof_current_size:%lld\r\n"
                "aof_base_size:%lld\r\n"
                "aof_pending_rewrite:%d\r\n"
                "aof_buffer_length:%zu\r\n"
                "aof_rewrite_buffer_length:%zu\r\n"
                "aof_pending_bio_fsync:%llu\r\n"
                "aof_delayed_fsync:%lu\r\n",
                (long long) server.aof_current_size,
                (long long) server.aof_rewrite_base_size,
                server.aof_rewrite_scheduled,
                sdslen(server.aof_buf),
                aofRewriteBufferSize(),
                bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC),
                server.aof_delayed_fsync);
        }

        if (server.loading) {
            double perc;
            time_t eta, elapsed;
            off_t remaining_bytes = server.loading_total_bytes-
                                    server.loading_loaded_bytes;

            perc = ((double)server.loading_loaded_bytes /
                   server.loading_total_bytes) * 100;

            elapsed = server.unixtime-server.loading_start_time;
            if (elapsed == 0) {
                eta = 1; /* A fake 1 second figure if we don't have
                            enough info */
            } else {
                eta = (elapsed*remaining_bytes)/server.loading_loaded_bytes;
            }

            info = sdscatprintf(info,
                "loading_start_time:%ld\r\n"
                "loading_total_bytes:%llu\r\n"
                "loading_loaded_bytes:%llu\r\n"
                "loading_loaded_perc:%.2f\r\n"
                "loading_eta_seconds:%ld\r\n"
                ,(unsigned long) server.loading_start_time,
                (unsigned long long) server.loading_total_bytes,
                (unsigned long long) server.loading_loaded_bytes,
                perc,
                eta
            );
        }
    }

    /* Stats */
    if (allsections || defsections || !strcasecmp(section,"stats")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info,
            "# Stats\r\n"
            "total_connections_received:%lld\r\n"
            "total_commands_processed:%lld\r\n"
            "instantaneous_ops_per_sec:%lld\r\n"
            "rejected_connections:%lld\r\n"
            "expired_keys:%lld\r\n"
            "evicted_keys:%lld\r\n"
            "keyspace_hits:%lld\r\n"
            "keyspace_misses:%lld\r\n"
            "pubsub_channels:%ld\r\n"
            "pubsub_patterns:%lu\r\n"
            "latest_fork_usec:%lld\r\n",
            server.stat_numconnections,
            server.stat_numcommands,
            getOperationsPerSecond(),
            server.stat_rejected_conn,
            server.stat_expiredkeys,
            server.stat_evictedkeys,
            server.stat_keyspace_hits,
            server.stat_keyspace_misses,
            dictSize(server.pubsub_channels),
            listLength(server.pubsub_patterns),
            server.stat_fork_time);
    }

    /* Replication */
    if (allsections || defsections || !strcasecmp(section,"replication")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info,
            "# Replication\r\n"
            "role:%s\r\n",
            server.masterhost == NULL ? "master" : "slave");
        if (server.masterhost) {
            info = sdscatprintf(info,
                "master_host:%s\r\n"
                "master_port:%d\r\n"
                "master_link_status:%s\r\n"
                "master_last_io_seconds_ago:%d\r\n"
                "master_sync_in_progress:%d\r\n"
                ,server.masterhost,
                server.masterport,
                (server.repl_state == REDIS_REPL_CONNECTED) ?
                    "up" : "down",
                server.master ?
                ((int)(server.unixtime-server.master->lastinteraction)) : -1,
                server.repl_state == REDIS_REPL_TRANSFER
            );

            if (server.repl_state == REDIS_REPL_TRANSFER) {
                info = sdscatprintf(info,
                    "master_sync_left_bytes:%ld\r\n"
                    "master_sync_last_io_seconds_ago:%d\r\n"
                    ,(long)server.repl_transfer_left,
                    (int)(server.unixtime-server.repl_transfer_lastio)
                );
            }

            if (server.repl_state != REDIS_REPL_CONNECTED) {
                info = sdscatprintf(info,
                    "master_link_down_since_seconds:%ld\r\n",
                    (long)server.unixtime-server.repl_down_since);
            }
        }
        info = sdscatprintf(info,
            "connected_slaves:%lu\r\n",
            listLength(server.slaves));
        if (listLength(server.slaves)) {
            int slaveid = 0;
            listNode *ln;
            listIter li;

            listRewind(server.slaves,&li);
            while((ln = listNext(&li))) {
                redisClient *slave = listNodeValue(ln);
                char *state = NULL;
                char ip[32];
                int port;

                if (anetPeerToString(slave->fd,ip,&port) == -1) continue;
                switch(slave->replstate) {
                case REDIS_REPL_WAIT_BGSAVE_START:
                case REDIS_REPL_WAIT_BGSAVE_END:
                    state = "wait_bgsave";
                    break;
                case REDIS_REPL_SEND_BULK:
                    state = "send_bulk";
                    break;
                case REDIS_REPL_ONLINE:
                    state = "online";
                    break;
                }
                if (state == NULL) continue;
                info = sdscatprintf(info,"slave%d:%s,%d,%s\r\n",
                    slaveid,ip,slave->slave_listening_port,state);
                slaveid++;
            }
        }
    }

    /* CPU */
    if (allsections || defsections || !strcasecmp(section,"cpu")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info,
        "# CPU\r\n"
        "used_cpu_sys:%.2f\r\n"
        "used_cpu_user:%.2f\r\n"
        "used_cpu_sys_children:%.2f\r\n"
        "used_cpu_user_children:%.2f\r\n",
        (float)self_ru.ru_stime.tv_sec+(float)self_ru.ru_stime.tv_usec/1000000,
        (float)self_ru.ru_utime.tv_sec+(float)self_ru.ru_utime.tv_usec/1000000,
        (float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000,
        (float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000);
    }

    /* cmdtime */
    if (allsections || !strcasecmp(section,"commandstats")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info, "# Commandstats\r\n");
        numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
        for (j = 0; j < numcommands; j++) {
            struct redisCommand *c = redisCommandTable+j;

            if (!c->calls) continue;
            info = sdscatprintf(info,
                "cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n",
                c->name, c->calls, c->microseconds,
                (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls));
        }
    }

    /* Cluster */
    if (allsections || defsections || !strcasecmp(section,"cluster")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info,
        "# Cluster\r\n"
        "cluster_enabled:%d\r\n",
        server.cluster_enabled);
    }

    /* Key space */
    if (allsections || defsections || !strcasecmp(section,"keyspace")) {
        if (sections++) info = sdscat(info,"\r\n");
        info = sdscatprintf(info, "# Keyspace\r\n");
        for (j = 0; j < server.dbnum; j++) {
            long long keys, vkeys;

            keys = dictSize(server.db[j].dict);
            vkeys = dictSize(server.db[j].expires);
            if (keys || vkeys) {
                info = sdscatprintf(info, "db%d:keys=%lld,expires=%lld\r\n",
                    j, keys, vkeys);
            }
        }
    }
    return info;
}

void infoCommand(redisClient *c) {
    char *section = c->argc == 2 ? c->argv[1]->ptr : "default";

    if (c->argc > 2) {
        addReply(c,shared.syntaxerr);
        return;
    }
    sds info = genRedisInfoString(section);
    addReplySds(c,sdscatprintf(sdsempty(),"$%lu\r\n",
        (unsigned long)sdslen(info)));
    addReplySds(c,info);
    addReply(c,shared.crlf);
}

void monitorCommand(redisClient *c) {
    /* ignore MONITOR if aleady slave or in monitor mode */
    if (c->flags & REDIS_SLAVE) return;

    c->flags |= (REDIS_SLAVE|REDIS_MONITOR);
    c->slaveseldb = 0;
    listAddNodeTail(server.monitors,c);
    addReply(c,shared.ok);
}

/* ============================ Maxmemory directive  ======================== */

/* This function gets called when 'maxmemory' is set on the config file to limit
 * the max memory used by the server, before processing a command.
 *
 * The goal of the function is to free enough memory to keep Redis under the
 * configured memory limit.
 *
 * The function starts calculating how many bytes should be freed to keep
 * Redis under the limit, and enters a loop selecting the best keys to
 * evict accordingly to the configured policy.
 *
 * If all the bytes needed to return back under the limit were freed the
 * function returns REDIS_OK, otherwise REDIS_ERR is returned, and the caller
 * should block the execution of commands that will result in more memory
 * used by the server.
 */
int freeMemoryIfNeeded(void) {
    size_t mem_used, mem_tofree, mem_freed;
    int slaves = listLength(server.slaves);

    /* Remove the size of slaves output buffers and AOF buffer from the
     * count of used memory. */
    mem_used = zmalloc_used_memory();
    if (slaves) {
        listIter li;
        listNode *ln;

        listRewind(server.slaves,&li);
        while((ln = listNext(&li))) {
            redisClient *slave = listNodeValue(ln);
            unsigned long obuf_bytes = getClientOutputBufferMemoryUsage(slave);
            if (obuf_bytes > mem_used)
                mem_used = 0;
            else
                mem_used -= obuf_bytes;
        }
    }
    if (server.aof_state != REDIS_AOF_OFF) {
        mem_used -= sdslen(server.aof_buf);
        mem_used -= aofRewriteBufferSize();
    }

    /* Check if we are over the memory limit. */
    if (mem_used <= server.maxmemory) return REDIS_OK;

    if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION)
        return REDIS_ERR; /* We need to free memory, but policy forbids. */

    /* Compute how much memory we need to free. */
    mem_tofree = mem_used - server.maxmemory;
    mem_freed = 0;
    while (mem_freed < mem_tofree) {
        int j, k, keys_freed = 0;

        for (j = 0; j < server.dbnum; j++) {
            long bestval = 0; /* just to prevent warning */
            sds bestkey = NULL;
            struct dictEntry *de;
            redisDb *db = server.db+j;
            dict *dict;

            if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||
                server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM)
            {
                dict = server.db[j].dict;
            } else {
                dict = server.db[j].expires;
            }
            if (dictSize(dict) == 0) continue;

            /* volatile-random and allkeys-random policy */
            if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM ||
                server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_RANDOM)
            {
                de = dictGetRandomKey(dict);
                bestkey = dictGetKey(de);
            }

            /* volatile-lru and allkeys-lru policy */
            else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||
                server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
            {
                for (k = 0; k < server.maxmemory_samples; k++) {
                    sds thiskey;
                    long thisval;
                    robj *o;

                    de = dictGetRandomKey(dict);
                    thiskey = dictGetKey(de);
                    /* When policy is volatile-lru we need an additonal lookup
                     * to locate the real key, as dict is set to db->expires. */
                    if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
                        de = dictFind(db->dict, thiskey);
                    o = dictGetVal(de);
                    thisval = estimateObjectIdleTime(o);

                    /* Higher idle time is better candidate for deletion */
                    if (bestkey == NULL || thisval > bestval) {
                        bestkey = thiskey;
                        bestval = thisval;
                    }
                }
            }

            /* volatile-ttl */
            else if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_TTL) {
                for (k = 0; k < server.maxmemory_samples; k++) {
                    sds thiskey;
                    long thisval;

                    de = dictGetRandomKey(dict);
                    thiskey = dictGetKey(de);
                    thisval = (long) dictGetVal(de);

                    /* Expire sooner (minor expire unix timestamp) is better
                     * candidate for deletion */
                    if (bestkey == NULL || thisval < bestval) {
                        bestkey = thiskey;
                        bestval = thisval;
                    }
                }
            }

            /* Finally remove the selected key. */
            if (bestkey) {
                long long delta;

                robj *keyobj = createStringObject(bestkey,sdslen(bestkey));
                propagateExpire(db,keyobj);
                /* We compute the amount of memory freed by dbDelete() alone.
                 * It is possible that actually the memory needed to propagate
                 * the DEL in AOF and replication link is greater than the one
                 * we are freeing removing the key, but we can't account for
                 * that otherwise we would never exit the loop.
                 *
                 * AOF and Output buffer memory will be freed eventually so
                 * we only care about memory used by the key space. */
                delta = (long long) zmalloc_used_memory();
                dbDelete(db,keyobj);
                delta -= (long long) zmalloc_used_memory();
                mem_freed += delta;
                server.stat_evictedkeys++;
                decrRefCount(keyobj);
                keys_freed++;

                /* When the memory to free starts to be big enough, we may
                 * start spending so much time here that is impossible to
                 * deliver data to the slaves fast enough, so we force the
                 * transmission here inside the loop. */
                if (slaves) flushSlavesOutputBuffers();
            }
        }
        if (!keys_freed) return REDIS_ERR; /* nothing to free... */
    }
    return REDIS_OK;
}

/* =================================== Main! ================================ */

#ifdef __linux__
int linuxOvercommitMemoryValue(void) {
    FILE *fp = fopen("/proc/sys/vm/overcommit_memory","r");
    char buf[64];

    if (!fp) return -1;
    if (fgets(buf,64,fp) == NULL) {
        fclose(fp);
        return -1;
    }
    fclose(fp);

    return atoi(buf);
}

void linuxOvercommitMemoryWarning(void) {
    if (linuxOvercommitMemoryValue() == 0) {
        redisLog(REDIS_WARNING,"WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.");
    }
}
#endif /* __linux__ */

void createPidFile(void) {
    /* Try to write the pid file in a best-effort way. */
    FILE *fp = fopen(server.pidfile,"w");
    if (fp) {
        fprintf(fp,"%d\n",(int)getpid());
        fclose(fp);
    }
}

void daemonize(void) {
    int fd;

    if (fork() != 0) exit(0); /* parent exits */
    setsid(); /* create a new session */

    /* Every output goes to /dev/null. If Redis is daemonized but
     * the 'logfile' is set to 'stdout' in the configuration file
     * it will not log at all. */
    if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
        if (fd > STDERR_FILENO) close(fd);
    }
}

void version() {
    printf("Redis server v=%s sha=%s:%d malloc=%s bits=%d\n",
        REDIS_VERSION,
        redisGitSHA1(),
        atoi(redisGitDirty()) > 0,
        ZMALLOC_LIB,
        sizeof(long) == 4 ? 32 : 64);
    exit(0);
}

void usage() {
    fprintf(stderr,"Usage: ./redis-server [/path/to/redis.conf] [options]\n");
    fprintf(stderr,"       ./redis-server - (read config from stdin)\n");
    fprintf(stderr,"       ./redis-server -v or --version\n");
    fprintf(stderr,"       ./redis-server -h or --help\n");
    fprintf(stderr,"       ./redis-server --test-memory <megabytes>\n\n");
    fprintf(stderr,"Examples:\n");
    fprintf(stderr,"       ./redis-server (run the server with default conf)\n");
    fprintf(stderr,"       ./redis-server /etc/redis/6379.conf\n");
    fprintf(stderr,"       ./redis-server --port 7777\n");
    fprintf(stderr,"       ./redis-server --port 7777 --slaveof 127.0.0.1 8888\n");
    fprintf(stderr,"       ./redis-server /etc/myredis.conf --loglevel verbose\n");
    exit(1);
}

void redisAsciiArt(void) {
#include "asciilogo.h"
    char *buf = zmalloc(1024*16);

    snprintf(buf,1024*16,ascii_logo,
        REDIS_VERSION,
        redisGitSHA1(),
        strtol(redisGitDirty(),NULL,10) > 0,
        (sizeof(long) == 8) ? "64" : "32",
        server.cluster_enabled ? "cluster" : "stand alone",
        server.port,
        (long) getpid()
    );
    redisLogRaw(REDIS_NOTICE|REDIS_LOG_RAW,buf);
    zfree(buf);
}

static void sigtermHandler(int sig) {
    REDIS_NOTUSED(sig);

    redisLogFromHandler(REDIS_WARNING,"Received SIGTERM, scheduling shutdown...");
    server.shutdown_asap = 1;
}

void setupSignalHandlers(void) {
    struct sigaction act;

    /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.
     * Otherwise, sa_handler is used. */
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    act.sa_handler = sigtermHandler;
    sigaction(SIGTERM, &act, NULL);

#ifdef HAVE_BACKTRACE
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
    act.sa_sigaction = sigsegvHandler;
    sigaction(SIGSEGV, &act, NULL);
    sigaction(SIGBUS, &act, NULL);
    sigaction(SIGFPE, &act, NULL);
    sigaction(SIGILL, &act, NULL);
#endif
    return;
}

void memtest(size_t megabytes, int passes);

int main(int argc, char **argv) {
    long long start;
    struct timeval tv;

    /* We need to initialize our libraries, and the server configuration. */
    zmalloc_enable_thread_safeness();
    srand(time(NULL)^getpid());
    gettimeofday(&tv,NULL);
    dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
    initServerConfig();

    if (argc >= 2) {
        int j = 1; /* First option to parse in argv[] */
        sds options = sdsempty();
        char *configfile = NULL;

        /* Handle special options --help and --version */
        if (strcmp(argv[1], "-v") == 0 ||
            strcmp(argv[1], "--version") == 0) version();
        if (strcmp(argv[1], "--help") == 0 ||
            strcmp(argv[1], "-h") == 0) usage();
        if (strcmp(argv[1], "--test-memory") == 0) {
            if (argc == 3) {
                memtest(atoi(argv[2]),50);
                exit(0);
            } else {
                fprintf(stderr,"Please specify the amount of memory to test in megabytes.\n");
                fprintf(stderr,"Example: ./redis-server --test-memory 4096\n\n");
                exit(1);
            }
        }

        /* First argument is the config file name? */
        if (argv[j][0] != '-' || argv[j][1] != '-')
            configfile = argv[j++];
        /* All the other options are parsed and conceptually appended to the
         * configuration file. For instance --port 6380 will generate the
         * string "port 6380\n" to be parsed after the actual file name
         * is parsed, if any. */
        while(j != argc) {
            if (argv[j][0] == '-' && argv[j][1] == '-') {
                /* Option name */
                if (sdslen(options)) options = sdscat(options,"\n");
                options = sdscat(options,argv[j]+2);
                options = sdscat(options," ");
            } else {
                /* Option argument */
                options = sdscatrepr(options,argv[j],strlen(argv[j]));
                options = sdscat(options," ");
            }
            j++;
        }
        resetServerSaveParams();
        loadServerConfig(configfile,options);
        sdsfree(options);
    } else {
        redisLog(REDIS_WARNING,"Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'");
    }
    if (server.daemonize) daemonize();
    initServer();
    if (server.daemonize) createPidFile();
    redisAsciiArt();
    redisLog(REDIS_WARNING,"Server started, Redis version " REDIS_VERSION);
#ifdef __linux__
    linuxOvercommitMemoryWarning();
#endif
    start = ustime();
    if (server.aof_state == REDIS_AOF_ON) {
        if (loadAppendOnlyFile(server.aof_filename) == REDIS_OK)
            redisLog(REDIS_NOTICE,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start)/1000000);
    } else {
        if (rdbLoad(server.rdb_filename) == REDIS_OK) {
            redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds",
                (float)(ustime()-start)/1000000);
        } else if (errno != ENOENT) {
            redisLog(REDIS_WARNING,"Fatal error loading the DB. Exiting.");
            exit(1);
        }
    }
    if (server.ipfd > 0)
        redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port);
    if (server.sofd > 0)
        redisLog(REDIS_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket);
    aeSetBeforeSleepProc(server.el,beforeSleep);
    aeMain(server.el);
    aeDeleteEventLoop(server.el);
    return 0;
}

/* The End */
pygments.rb-1.2.0/test/test_pygments.rb000066400000000000000000000224031315616372200202020ustar00rootroot00000000000000# coding: utf-8 # frozen_string_literal: true require 'test/unit' require File.join(File.dirname(__FILE__), '..', '/lib/pygments.rb') ENV['mentos-test'] = "yes" P = Pygments PE = Pygments.engine class PygmentsHighlightTest < Test::Unit::TestCase RUBY_CODE = "#!/usr/bin/ruby\nputs 'foo'" RUBY_CODE_TRAILING_NEWLINE = "#!/usr/bin/ruby\nputs 'foo'\n" REDIS_CODE = File.read(File.join(File.dirname(__FILE__), '..', '/test/test_data.c')) def test_highlight_defaults_to_html code = P.highlight(RUBY_CODE) assert_match '#!/usr/bin/ruby', code assert_equal '
#!/usr/bin/ruby', code assert_equal "
#!/usr/bin/ruby\nputs 'foo'\n
", code end def test_full_table_highlight code = P.highlight(RUBY_CODE, :options => {:linenos => true}) assert_match '#!/usr/bin/ruby', code assert_equal "
1\n2
#!/usr/bin/ruby\nputs 'foo'\n
\n
", code end def test_highlight_works_with_larger_files code = P.highlight(REDIS_CODE) assert_match 'used_memory_peak_human', code assert_equal 458511, code.bytesize.to_i end def test_returns_nil_on_timeout large_code = REDIS_CODE * 300 code = P.highlight(large_code) # a 30 mb highlight request will timeout assert_equal nil, code end def test_highlight_works_with_null_bytes code = P.highlight("\0hello", :lexer => 'rb') assert_match "hello", code end def test_highlight_works_on_utf8 code = P.highlight('# ø', :lexer => 'rb', :options => {:encoding => 'utf-8'}) assert_match "# ø", code end def test_highlight_works_on_utf8_automatically code = P.highlight('# ø', :lexer => 'rb') assert_match "# ø", code end def test_highlight_works_on_utf8_all_chars_automatically code = P.highlight('def foo: # ø', :lexer => 'py') assert_equal "
 'rb', :options => {:encoding => 'utf-8'})
    assert_match "# ø ø ø", code
  end

  def test_highlight_works_with_multiple_utf8_and_trailing_newline
    code = P.highlight("#!/usr/bin/ruby\nputs 'ø..ø'\n", :lexer => 'rb')
    assert_match "ø..ø", code
  end

  def test_highlight_formatter_bbcode
    code = P.highlight(RUBY_CODE, :formatter => 'bbcode')
    assert_match 'color=#408080][i]#!/usr/bin/ruby[/i]', code
  end

  def test_highlight_formatter_terminal
    code = P.highlight(RUBY_CODE, :formatter => 'terminal')
    assert_match '39;49;00m', code
  end

  def test_highlight_options
    code = P.highlight(RUBY_CODE, :options => {:full => true, :title => 'test'})
    assert_match 'test', code
  end

  def test_highlight_works_with_single_character_input
    code = P.highlight("a")
    assert_match "a\n
", code end def test_highlight_works_with_trailing_newline code = P.highlight(RUBY_CODE_TRAILING_NEWLINE) assert_match '#!/usr/bin/ruby', code end def test_highlight_works_with_multiple_newlines code = P.highlight(RUBY_CODE_TRAILING_NEWLINE + "derp\n\n") assert_match '#!/usr/bin/ruby', code end def test_highlight_works_with_trailing_cr code = P.highlight(RUBY_CODE_TRAILING_NEWLINE + "\r") assert_match '#!/usr/bin/ruby', code end def test_highlight_still_works_with_invalid_code code = P.highlight("importr python; wat?", :lexer => 'py') assert_match ">importr", code end def test_highlight_on_multi_threads 10.times.map do Thread.new do test_full_html_highlight end end.each do |thread| thread.join end end end # Philosophically, I'm not the biggest fan of testing private # methods, but given the relative delicacy of validity checking # over the pipe I think it's necessary and informative. class PygmentsValidityTest < Test::Unit::TestCase def test_add_ids_with_padding res = PE.send(:add_ids, "herp derp baz boo foo", "ABCDEFGH") assert_equal "ABCDEFGH herp derp baz boo foo ABCDEFGH", res end def test_add_ids_on_empty_string res = PE.send(:add_ids, "", "ABCDEFGH") assert_equal "ABCDEFGH ABCDEFGH", res end def test_add_ids_with_unicode_data res = PE.send(:add_ids, "# ø ø ø", "ABCDEFGH") assert_equal "ABCDEFGH # ø ø ø ABCDEFGH", res end def test_add_ids_with_starting_slashes res = PE.send(:add_ids, '\\# ø ø ø..//', "ABCDEFGH") assert_equal "ABCDEFGH \\# ø ø ø..// ABCDEFGH", res end def test_get_fixed_bits_from_header bits = PE.send(:get_fixed_bits_from_header, '{"herp": "derp"}') assert_equal "00000000000000000000000000010000", bits end def test_get_fixed_bits_from_header_works_with_large_headers bits = PE.send(:get_fixed_bits_from_header, '{"herp": "derp"}' * 10000) assert_equal "00000000000000100111000100000000", bits end def test_size_check size = "00000000000000000000000000100110" res = PE.send(:size_check, size) assert_equal res, true end def test_size_check_bad size = "some random thing" res = PE.send(:size_check, size) assert_equal res, false end end class PygmentsLexerTest < Test::Unit::TestCase RUBY_CODE = "#!/usr/bin/ruby\nputs 'foo'" def test_lexer_by_mimetype assert_equal 'rb', P.lexer_name_for(:mimetype => 'text/x-ruby') assert_equal 'json', P.lexer_name_for(:mimetype => 'application/json') end def test_lexer_by_filename assert_equal 'rb', P.lexer_name_for(:filename => 'test.rb') assert_equal 'scala', P.lexer_name_for(:filename => 'test.scala') end def test_lexer_by_name assert_equal 'rb', P.lexer_name_for(:lexer => 'ruby') assert_equal 'python', P.lexer_name_for(:lexer => 'python') assert_equal 'c', P.lexer_name_for(:lexer => 'c') end def test_lexer_by_filename_and_content assert_equal 'rb', P.lexer_name_for(RUBY_CODE, :filename => 'test.rb') end def test_lexer_by_content assert_equal 'rb', P.lexer_name_for(RUBY_CODE) end def test_lexer_by_nothing assert_raise MentosError do P.lexer_name_for(:invalid => true) end end end class PygmentsLexerClassTest < Test::Unit::TestCase def test_find assert_equal 'Ruby', P::Lexer['Ruby'].name assert_equal 'Ruby', P::Lexer['ruby'].name assert_equal 'Ruby', P::Lexer['rb'].name assert_equal 'Ruby', P::Lexer['rake'].name assert_equal 'Ruby', P::Lexer['gemspec'].name end def test_find_by_name assert_equal P::Lexer['Ruby'], P::Lexer.find_by_name('Ruby') assert_equal P::Lexer['C'], P::Lexer.find_by_name('C') end def test_find_by_alias assert_equal P::Lexer['Ruby'], P::Lexer.find_by_alias('rb') assert_equal P::Lexer['Ruby'], P::Lexer.find_by_alias('ruby') assert_equal P::Lexer['Scala'], P::Lexer.find_by_alias('scala') assert_equal P::Lexer['Go'], P::Lexer.find_by_alias('go') end def test_find_lexer_by_extname assert_equal P::Lexer['Ruby'], P::Lexer.find_by_extname('.rb') assert_equal P::Lexer['PHP'], P::Lexer.find_by_extname('.php4') assert_equal P::Lexer['PHP'], P::Lexer.find_by_extname('.php5') assert_equal P::Lexer['Groff'], P::Lexer.find_by_extname('.1') assert_equal P::Lexer['Groff'], P::Lexer.find_by_extname('.3') assert_equal P::Lexer['C'], P::Lexer.find_by_extname('.c') assert_equal P::Lexer['Python'], P::Lexer.find_by_extname('.py') assert_equal P::Lexer['Java'], P::Lexer.find_by_extname('.java') end def test_find_lexer_by_mimetype assert_equal P::Lexer['Ruby'], P::Lexer.find_by_mimetype('text/x-ruby') assert_equal P::Lexer['JSON'], P::Lexer.find_by_mimetype('application/json') assert_equal P::Lexer['Python'], P::Lexer.find_by_mimetype('text/x-python') end end class PygmentsCssTest < Test::Unit::TestCase include Pygments def test_css assert_match(/^\.err \{/, P.css) end def test_css_prefix assert_match(/^\.highlight \.err \{/, P.css('.highlight')) end def test_css_options assert_match(/^\.codeerr \{/, P.css(:classprefix => 'code')) end def test_css_prefix_and_options assert_match(/^\.mycode \.codeerr \{/, P.css('.mycode', :classprefix => 'code')) end def test_css_default assert_match '.c { color: #408080; font-style: italic }', P.css end def test_css_colorful assert_match '.c { color: #888888 }', P.css(:style => 'colorful') end end class PygmentsConfigTest < Test::Unit::TestCase def test_styles assert P.styles.include?('colorful') end def test_filters assert P.filters.include?('codetagify') end def test_lexers list = P.lexers assert list.has_key?('Ruby') assert list['Ruby'][:aliases].include?('duby') end def test_formatters list = P.formatters assert list.has_key?('Html') assert list['Html'][:aliases].include?('html') end end pygments.rb-1.2.0/vendor/000077500000000000000000000000001315616372200152655ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/custom_lexers/000077500000000000000000000000001315616372200201615ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/custom_lexers/github.py000066400000000000000000000510201315616372200220130ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ pygments.lexers.github ~~~~~~~~~~~~~~~~~~~ Custom lexers for GitHub.com :copyright: Copyright 2012 by GitHub, Inc :license: BSD, see LICENSE for details. """ import re from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \ using, DelegatingLexer from pygments.token import Text, Name, Number, String, Comment, Punctuation, \ Other, Keyword, Operator, Literal, Whitespace __all__ = ['Dasm16Lexer', 'PuppetLexer', 'AugeasLexer', "TOMLLexer", "SlashLexer"] class Dasm16Lexer(RegexLexer): """ Simple lexer for DCPU-16 Assembly Check http://0x10c.com/doc/dcpu-16.txt """ name = 'dasm16' aliases = ['DASM16'] filenames = ['*.dasm16', '*.dasm'] mimetypes = ['text/x-dasm16'] INSTRUCTIONS = [ 'SET', 'ADD', 'SUB', 'MUL', 'MLI', 'DIV', 'DVI', 'MOD', 'MDI', 'AND', 'BOR', 'XOR', 'SHR', 'ASR', 'SHL', 'IFB', 'IFC', 'IFE', 'IFN', 'IFG', 'IFA', 'IFL', 'IFU', 'ADX', 'SBX', 'STI', 'STD', 'JSR', 'INT', 'IAG', 'IAS', 'RFI', 'IAQ', 'HWN', 'HWQ', 'HWI', ] REGISTERS = [ 'A', 'B', 'C', 'X', 'Y', 'Z', 'I', 'J', 'SP', 'PC', 'EX', 'POP', 'PEEK', 'PUSH' ] # Regexes yo char = r'[a-zA-Z$._0-9@]' identifier = r'(?:[a-zA-Z$_]' + char + '*|\.' + char + '+)' number = r'[+-]?(?:0[xX][a-zA-Z0-9]+|\d+)' binary_number = r'0b[01_]+' instruction = r'(?i)(' + '|'.join(INSTRUCTIONS) + ')' single_char = r"'\\?" + char + "'" string = r'"(\\"|[^"])*"' def guess_identifier(lexer, match): ident = match.group(0) klass = Name.Variable if ident.upper() in lexer.REGISTERS else Name.Label yield match.start(), klass, ident tokens = { 'root': [ include('whitespace'), (':' + identifier, Name.Label), (identifier + ':', Name.Label), (instruction, Name.Function, 'instruction-args'), (r'\.' + identifier, Name.Function, 'data-args'), (r'[\r\n]+', Text) ], 'numeric' : [ (binary_number, Number.Integer), (number, Number.Integer), (single_char, String), ], 'arg' : [ (identifier, guess_identifier), include('numeric') ], 'deref' : [ (r'\+', Punctuation), (r'\]', Punctuation, '#pop'), include('arg'), include('whitespace') ], 'instruction-line' : [ (r'[\r\n]+', Text, '#pop'), (r';.*?$', Comment, '#pop'), include('whitespace') ], 'instruction-args': [ (r',', Punctuation), (r'\[', Punctuation, 'deref'), include('arg'), include('instruction-line') ], 'data-args' : [ (r',', Punctuation), include('numeric'), (string, String), include('instruction-line') ], 'whitespace': [ (r'\n', Text), (r'\s+', Text), (r';.*?\n', Comment) ], } class PuppetLexer(RegexLexer): name = 'Puppet' aliases = ['puppet'] filenames = ['*.pp'] tokens = { 'root': [ include('puppet'), ], 'puppet': [ include('comments'), (r'(class)(\s*)(\{)', bygroups(Name.Class, Text, Punctuation), ('type', 'namevar')), (r'(class|define)', Keyword.Declaration, ('block','class_name')), (r'node', Keyword.Declaration, ('block', 'node_name')), (r'elsif', Keyword.Reserved, ('block', 'conditional')), (r'if', Keyword.Reserved, ('block', 'conditional')), (r'unless', Keyword.Reserved, ('block', 'conditional')), (r'(else)(\s*)(\{)', bygroups(Keyword.Reserved, Text, Punctuation), 'block'), (r'case', Keyword.Reserved, ('case', 'conditional')), (r'(::)?([A-Z][\w:]+)+(\s*)(<{1,2}\|)', bygroups(Name.Class, Name.Class, Text, Punctuation), 'spaceinvader'), (r'(::)?([A-Z][\w:]+)+(\s*)(\{)', bygroups(Name.Class, Name.Class, Text, Punctuation), 'type'), (r'(::)?([A-Z][\w:]+)+(\s*)(\[)', bygroups(Name.Class, Name.Class, Text, Punctuation), ('type', 'override_name')), (r'(@{0,2}[\w:]+)(\s*)(\{)(\s*)', bygroups(Name.Class, Text, Punctuation, Text), ('type', 'namevar')), (r'\$(::)?(\w+::)*\w+', Name.Variable, 'var_assign'), (r'(include|require)', Keyword.Namespace, 'include'), (r'import', Keyword.Namespace, 'import'), (r'(\w+)(\()', bygroups(Name.Function, Punctuation), 'function'), (r'\s', Text), ], 'block': [ include('puppet'), (r'\}', Text, '#pop'), ], 'override_name': [ include('strings'), include('variables'), (r'\]', Punctuation), (r'\s', Text), (r'\{', Punctuation, '#pop'), ], 'node_name': [ (r'inherits', Keyword.Declaration), (r'[\w\.]+', String), include('strings'), include('variables'), (r',', Punctuation), (r'\s', Text), (r'\{', Punctuation, '#pop'), ], 'class_name': [ (r'inherits', Keyword.Declaration), (r'[\w:]+', Name.Class), (r'\s', Text), (r'\{', Punctuation, '#pop'), (r'\(', Punctuation, 'paramlist'), ], 'include': [ (r'\n', Text, '#pop'), (r'[\w:-]+', Name.Class), include('value'), (r'\s', Text), ], 'import': [ (r'\n', Text, '#pop'), (r'[\/\w\.]+', String), include('value'), (r'\s', Text), ], 'case': [ (r'(default)(:)(\s*)(\{)', bygroups(Keyword.Reserved, Punctuation, Text, Punctuation), 'block'), include('case_values'), (r'(:)(\s*)(\{)', bygroups(Punctuation, Text, Punctuation), 'block'), (r'\s', Text), (r'\}', Punctuation, '#pop'), ], 'case_values': [ include('value'), (r',', Punctuation), ], 'comments': [ (r'\s*#.*\n', Comment.Singleline), ], 'strings': [ (r"'.*?'", String.Single), (r'\w+', String.Symbol), (r'"', String.Double, 'dblstring'), (r'\/.+?\/', String.Regex), ], 'dblstring': [ (r'\$\{.+?\}', String.Interpol), (r'(?:\\(?:[bdefnrstv\'"\$\\/]|[0-7][0-7]?[0-7]?|\^[a-zA-Z]))', String.Escape), (r'[^"\\\$]+', String.Double), (r'\$', String.Double), (r'"', String.Double, '#pop'), ], 'variables': [ (r'\$(::)?(\w+::)*\w+', Name.Variable), ], 'var_assign': [ (r'\[', Punctuation, ('#pop', 'array')), (r'\{', Punctuation, ('#pop', 'hash')), (r'(\s*)(=)(\s*)', bygroups(Text, Operator, Text)), (r'(\(|\))', Punctuation), include('operators'), include('value'), (r'\s', Text, '#pop'), ], 'booleans': [ (r'(true|false)', Literal), ], 'operators': [ (r'(\s*)(==|=~|\*|-|\+|<<|>>|!=|!~|!|>=|<=|<|>|and|or|in)(\s*)', bygroups(Text, Operator, Text)), ], 'conditional': [ include('operators'), include('strings'), include('variables'), (r'\[', Punctuation, 'array'), (r'\(', Punctuation, 'conditional'), (r'\{', Punctuation, '#pop'), (r'\)', Punctuation, '#pop'), (r'\s', Text), ], 'spaceinvader': [ include('operators'), include('strings'), include('variables'), (r'\[', Punctuation, 'array'), (r'\(', Punctuation, 'conditional'), (r'\s', Text), (r'\|>{1,2}', Punctuation, '#pop'), ], 'namevar': [ include('value'), (r'\[', Punctuation, 'array'), (r'\s', Text), (r':', Punctuation, '#pop'), (r'\}', Punctuation, '#pop'), ], 'function': [ (r'\[', Punctuation, 'array'), include('value'), (r',', Punctuation), (r'\s', Text), (r'\)', Punctuation, '#pop'), ], 'paramlist': [ include('value'), (r'=', Punctuation), (r',', Punctuation), (r'\s', Text), (r'\[', Punctuation, 'array'), (r'\)', Punctuation, '#pop'), ], 'type': [ (r'(\w+)(\s*)(=>)(\s*)', bygroups(Name.Tag, Text, Punctuation, Text), 'param_value'), (r'\}', Punctuation, '#pop'), (r'\s', Text), include('comments'), (r'', Text, 'namevar'), ], 'value': [ (r'[\d\.]', Number), (r'([A-Z][\w:]+)+(\[)', bygroups(Name.Class, Punctuation), 'array'), (r'(\w+)(\()', bygroups(Name.Function, Punctuation), 'function'), include('strings'), include('variables'), include('comments'), include('booleans'), (r'(\s*)(\?)(\s*)(\{)', bygroups(Text, Punctuation, Text, Punctuation), 'selector'), (r'\{', Punctuation, 'hash'), ], 'selector': [ (r'default', Keyword.Reserved), include('value'), (r'=>', Punctuation), (r',', Punctuation), (r'\s', Text), (r'\}', Punctuation, '#pop'), ], 'param_value': [ include('value'), (r'\[', Punctuation, 'array'), (r',', Punctuation, '#pop'), (r';', Punctuation, '#pop'), (r'\s', Text, '#pop'), (r'', Text, '#pop'), ], 'array': [ include('value'), (r'\[', Punctuation, 'array'), (r',', Punctuation), (r'\s', Text), (r'\]', Punctuation, '#pop'), ], 'hash': [ include('value'), (r'\s', Text), (r'=>', Punctuation), (r',', Punctuation), (r'\}', Punctuation, '#pop'), ], } class AugeasLexer(RegexLexer): name = 'Augeas' aliases = ['augeas'] filenames = ['*.aug'] tokens = { 'root': [ (r'(module)(\s*)([^\s=]+)', bygroups(Keyword.Namespace, Text, Name.Namespace)), (r'(let)(\s*)([^\s=]+)', bygroups(Keyword.Declaration, Text, Name.Variable)), (r'(del|store|value|counter|seq|key|label|autoload|incl|excl|transform|test|get|put)(\s+)', bygroups(Name.Builtin, Text)), (r'(\()([^\:]+)(\:)(unit|string|regexp|lens|tree|filter)(\))', bygroups(Punctuation, Name.Variable, Punctuation, Keyword.Type, Punctuation)), (r'\(\*', Comment.Multiline, 'comment'), (r'[\+=\|\.\*\;\?-]', Operator), (r'[\[\]\(\)\{\}]', Operator), (r'"', String.Double, 'string'), (r'\/', String.Regex, 'regex'), (r'([A-Z]\w*)(\.)(\w+)', bygroups(Name.Namespace, Punctuation, Name.Variable)), (r'.', Name.Variable), (r'\s', Text), ], 'string': [ (r'\\.', String.Escape), (r'[^"]', String.Double), (r'"', String.Double, '#pop'), ], 'regex': [ (r'\\.', String.Escape), (r'[^\/]', String.Regex), (r'\/', String.Regex, '#pop'), ], 'comment': [ (r'[^*\)]', Comment.Multiline), (r'\(\*', Comment.Multiline, '#push'), (r'\*\)', Comment.Multiline, '#pop'), (r'[\*\)]', Comment.Multiline) ], } class TOMLLexer(RegexLexer): """ Lexer for TOML, a simple language for config files """ name = 'TOML' aliases = ['toml'] filenames = ['*.toml'] tokens = { 'root': [ # Basics, comments, strings (r'\s+', Text), (r'#.*?$', Comment.Single), (r'"(\\\\|\\"|[^"])*"', String), (r'(true|false)$', Keyword.Constant), ('[a-zA-Z_][a-zA-Z0-9_\-]*', Name), # Datetime (r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z', Number.Integer), # Numbers (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?', Number.Float), (r'\d+[eE][+-]?[0-9]+j?', Number.Float), (r'\-?\d+', Number.Integer), # Punctuation (r'[]{}:(),;[]', Punctuation), (r'\.', Punctuation), # Operators (r'=', Operator) ] } class SlashLanguageLexer(ExtendedRegexLexer): _nkw = r'(?=[^a-zA-Z_0-9])' def move_state(new_state): return ("#pop", new_state) def right_angle_bracket(lexer, match, ctx): if len(ctx.stack) > 1 and ctx.stack[-2] == "string": ctx.stack.pop() yield match.start(), String.Interpol, u"}" ctx.pos = match.end() pass tokens = { "root": [ (r"<%=", Comment.Preproc, move_state("slash")), (r"<%!!", Comment.Preproc, move_state("slash")), (r"<%#.*?%>", Comment.Multiline), (r"<%", Comment.Preproc, move_state("slash")), (r".|\n", Other), ], "string": [ (r"\\", String.Escape, move_state("string_e")), (r"\"", String, move_state("slash")), (r"#\{", String.Interpol, "slash"), (r'.|\n', String), ], "string_e": [ (r'n', String.Escape, move_state("string")), (r't', String.Escape, move_state("string")), (r'r', String.Escape, move_state("string")), (r'e', String.Escape, move_state("string")), (r'x[a-fA-F0-9]{2}', String.Escape, move_state("string")), (r'.', String.Escape, move_state("string")), ], "regexp": [ (r'}[a-z]*', String.Regex, move_state("slash")), (r'\\(.|\n)', String.Regex), (r'{', String.Regex, "regexp_r"), (r'.|\n', String.Regex), ], "regexp_r": [ (r'}[a-z]*', String.Regex, "#pop"), (r'\\(.|\n)', String.Regex), (r'{', String.Regex, "regexp_r"), ], "slash": [ (r"%>", Comment.Preproc, move_state("root")), (r"\"", String, move_state("string")), (r"'[a-zA-Z0-9_]+", String), (r'%r{', String.Regex, move_state("regexp")), (r'/\*.*?\*/', Comment.Multiline), (r"(#|//).*?\n", Comment.Single), (r'-?[0-9]+e[+-]?[0-9]+', Number.Float), (r'-?[0-9]+\.[0-9]+(e[+-]?[0-9]+)?', Number.Float), (r'-?[0-9]+', Number.Integer), (r'nil'+_nkw, Name.Builtin), (r'true'+_nkw, Name.Builtin), (r'false'+_nkw, Name.Builtin), (r'self'+_nkw, Name.Builtin), (r'(class)(\s+)([A-Z][a-zA-Z0-9_\']*)', bygroups(Keyword, Whitespace, Name.Class)), (r'class'+_nkw, Keyword), (r'extends'+_nkw, Keyword), (r'(def)(\s+)(self)(\s*)(\.)(\s*)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)', bygroups(Keyword, Whitespace, Name.Builtin, Whitespace, Punctuation, Whitespace, Name.Function)), (r'(def)(\s+)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)', bygroups(Keyword, Whitespace, Name.Function)), (r'def'+_nkw, Keyword), (r'if'+_nkw, Keyword), (r'elsif'+_nkw, Keyword), (r'else'+_nkw, Keyword), (r'unless'+_nkw, Keyword), (r'for'+_nkw, Keyword), (r'in'+_nkw, Keyword), (r'while'+_nkw, Keyword), (r'until'+_nkw, Keyword), (r'and'+_nkw, Keyword), (r'or'+_nkw, Keyword), (r'not'+_nkw, Keyword), (r'lambda'+_nkw, Keyword), (r'try'+_nkw, Keyword), (r'catch'+_nkw, Keyword), (r'return'+_nkw, Keyword), (r'next'+_nkw, Keyword), (r'last'+_nkw, Keyword), (r'throw'+_nkw, Keyword), (r'use'+_nkw, Keyword), (r'switch'+_nkw, Keyword), (r'\\', Keyword), (r'λ', Keyword), (r'__FILE__'+_nkw, Name.Builtin.Pseudo), (r'__LINE__'+_nkw, Name.Builtin.Pseudo), (r'[A-Z][a-zA-Z0-9_\']*'+_nkw, Name.Constant), (r'[a-z_][a-zA-Z0-9_\']*'+_nkw, Name), (r'@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Instance), (r'@@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Class), (r'\(', Punctuation), (r'\)', Punctuation), (r'\[', Punctuation), (r'\]', Punctuation), (r'\{', Punctuation), (r'\}', right_angle_bracket), (r';', Punctuation), (r',', Punctuation), (r'<<=', Operator), (r'>>=', Operator), (r'<<', Operator), (r'>>', Operator), (r'==', Operator), (r'!=', Operator), (r'=>', Operator), (r'=', Operator), (r'<=>', Operator), (r'<=', Operator), (r'>=', Operator), (r'<', Operator), (r'>', Operator), (r'\+\+', Operator), (r'\+=', Operator), (r'-=', Operator), (r'\*\*=', Operator), (r'\*=', Operator), (r'\*\*', Operator), (r'\*', Operator), (r'/=', Operator), (r'\+', Operator), (r'-', Operator), (r'/', Operator), (r'%=', Operator), (r'%', Operator), (r'^=', Operator), (r'&&=', Operator), (r'&=', Operator), (r'&&', Operator), (r'&', Operator), (r'\|\|=', Operator), (r'\|=', Operator), (r'\|\|', Operator), (r'\|', Operator), (r'!', Operator), (r'\.\.\.', Operator), (r'\.\.', Operator), (r'\.', Operator), (r'::', Operator), (r':', Operator), (r'(\s|\n)+', Whitespace), (r'[a-z_][a-zA-Z0-9_\']*', Name.Variable), ], } class SlashLexer(DelegatingLexer): """ Lexer for the Slash programming language. """ name = 'Slash' aliases = ['slash'] filenames = ['*.sl'] def __init__(self, **options): from pygments.lexers.web import HtmlLexer super(SlashLexer, self).__init__(HtmlLexer, SlashLanguageLexer, **options) pygments.rb-1.2.0/vendor/pygments-main/000077500000000000000000000000001315616372200200555ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/AUTHORS000066400000000000000000000175651315616372200211430ustar00rootroot00000000000000Pygments is written and maintained by Georg Brandl . Major developers are Tim Hatch and Armin Ronacher . Other contributors, listed alphabetically, are: * Sam Aaron -- Ioke lexer * Ali Afshar -- image formatter * Thomas Aglassinger -- Easytrieve, JCL, Rexx and Transact-SQL lexers * Muthiah Annamalai -- Ezhil lexer * Kumar Appaiah -- Debian control lexer * Andreas Amann -- AppleScript lexer * Timothy Armstrong -- Dart lexer fixes * Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers * Jeremy Ashkenas -- CoffeeScript lexer * José Joaquín Atria -- Praat lexer * Stefan Matthias Aust -- Smalltalk lexer * Lucas Bajolet -- Nit lexer * Ben Bangert -- Mako lexers * Max Battcher -- Darcs patch lexer * Thomas Baruchel -- APL lexer * Tim Baumann -- (Literate) Agda lexer * Paul Baumgart, 280 North, Inc. -- Objective-J lexer * Michael Bayer -- Myghty lexers * Thomas Beale -- Archetype lexers * John Benediktsson -- Factor lexer * Trevor Bergeron -- mIRC formatter * Vincent Bernat -- LessCSS lexer * Christopher Bertels -- Fancy lexer * Sébastien Bigaret -- QVT Operational lexer * Jarrett Billingsley -- MiniD lexer * Adam Blinkinsop -- Haskell, Redcode lexers * Frits van Bommel -- assembler lexers * Pierre Bourdon -- bugfixes * Matthias Bussonnier -- ANSI style handling for terminal-256 formatter * chebee7i -- Python traceback lexer improvements * Hiram Chirino -- Scaml and Jade lexers * Mauricio Caceres -- SAS and Stata lexers. * Ian Cooper -- VGL lexer * David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers * Leaf Corcoran -- MoonScript lexer * Christopher Creutzig -- MuPAD lexer * Daniël W. Crompton -- Pike lexer * Pete Curry -- bugfixes * Bryan Davis -- EBNF lexer * Bruno Deferrari -- Shen lexer * Giedrius Dubinskas -- HTML formatter improvements * Owen Durni -- Haxe lexer * Alexander Dutton, Oxford University Computing Services -- SPARQL lexer * James Edwards -- Terraform lexer * Nick Efford -- Python 3 lexer * Sven Efftinge -- Xtend lexer * Artem Egorkine -- terminal256 formatter * Matthew Fernandez -- CAmkES lexer * Michael Ficarra -- CPSA lexer * James H. Fisher -- PostScript lexer * William S. Fulton -- SWIG lexer * Carlos Galdino -- Elixir and Elixir Console lexers * Michael Galloy -- IDL lexer * Naveen Garg -- Autohotkey lexer * Laurent Gautier -- R/S lexer * Alex Gaynor -- PyPy log lexer * Richard Gerkin -- Igor Pro lexer * Alain Gilbert -- TypeScript lexer * Alex Gilding -- BlitzBasic lexer * Bertrand Goetzmann -- Groovy lexer * Krzysiek Goj -- Scala lexer * Andrey Golovizin -- BibTeX lexers * Matt Good -- Genshi, Cheetah lexers * Michał Górny -- vim modeline support * Alex Gosse -- TrafficScript lexer * Patrick Gotthardt -- PHP namespaces support * Olivier Guibe -- Asymptote lexer * Jordi Gutiérrez Hermoso -- Octave lexer * Florian Hahn -- Boogie lexer * Martin Harriman -- SNOBOL lexer * Matthew Harrison -- SVG formatter * Steven Hazel -- Tcl lexer * Dan Michael Heggø -- Turtle lexer * Aslak Hellesøy -- Gherkin lexer * Greg Hendershott -- Racket lexer * Justin Hendrick -- ParaSail lexer * David Hess, Fish Software, Inc. -- Objective-J lexer * Varun Hiremath -- Debian control lexer * Rob Hoelz -- Perl 6 lexer * Doug Hogan -- Mscgen lexer * Ben Hollis -- Mason lexer * Max Horn -- GAP lexer * Alastair Houghton -- Lexer inheritance facility * Tim Howard -- BlitzMax lexer * Dustin Howett -- Logos lexer * Ivan Inozemtsev -- Fantom lexer * Hiroaki Itoh -- Shell console rewrite, Lexers for PowerShell session, MSDOS session, BC, WDiff * Brian R. Jackson -- Tea lexer * Christian Jann -- ShellSession lexer * Dennis Kaarsemaker -- sources.list lexer * Dmitri Kabak -- Inferno Limbo lexer * Igor Kalnitsky -- vhdl lexer * Alexander Kit -- MaskJS lexer * Pekka Klärck -- Robot Framework lexer * Gerwin Klein -- Isabelle lexer * Eric Knibbe -- Lasso lexer * Stepan Koltsov -- Clay lexer * Adam Koprowski -- Opa lexer * Benjamin Kowarsch -- Modula-2 lexer * Domen Kožar -- Nix lexer * Oleh Krekel -- Emacs Lisp lexer * Alexander Kriegisch -- Kconfig and AspectJ lexers * Marek Kubica -- Scheme lexer * Jochen Kupperschmidt -- Markdown processor * Gerd Kurzbach -- Modelica lexer * Jon Larimer, Google Inc. -- Smali lexer * Olov Lassus -- Dart lexer * Matt Layman -- TAP lexer * Kristian Lyngstøl -- Varnish lexers * Sylvestre Ledru -- Scilab lexer * Chee Sing Lee -- Flatline lexer * Mark Lee -- Vala lexer * Valentin Lorentz -- C++ lexer improvements * Ben Mabey -- Gherkin lexer * Angus MacArthur -- QML lexer * Louis Mandel -- X10 lexer * Louis Marchand -- Eiffel lexer * Simone Margaritelli -- Hybris lexer * Kirk McDonald -- D lexer * Gordon McGregor -- SystemVerilog lexer * Stephen McKamey -- Duel/JBST lexer * Brian McKenna -- F# lexer * Charles McLaughlin -- Puppet lexer * Lukas Meuser -- BBCode formatter, Lua lexer * Cat Miller -- Pig lexer * Paul Miller -- LiveScript lexer * Hong Minhee -- HTTP lexer * Michael Mior -- Awk lexer * Bruce Mitchener -- Dylan lexer rewrite * Reuben Morais -- SourcePawn lexer * Jon Morton -- Rust lexer * Paulo Moura -- Logtalk lexer * Mher Movsisyan -- DTD lexer * Dejan Muhamedagic -- Crmsh lexer * Ana Nelson -- Ragel, ANTLR, R console lexers * Kurt Neufeld -- Markdown lexer * Nam T. Nguyen -- Monokai style * Jesper Noehr -- HTML formatter "anchorlinenos" * Mike Nolta -- Julia lexer * Jonas Obrist -- BBCode lexer * Edward O'Callaghan -- Cryptol lexer * David Oliva -- Rebol lexer * Pat Pannuto -- nesC lexer * Jon Parise -- Protocol buffers and Thrift lexers * Benjamin Peterson -- Test suite refactoring * Ronny Pfannschmidt -- BBCode lexer * Dominik Picheta -- Nimrod lexer * Andrew Pinkham -- RTF Formatter Refactoring * Clément Prévost -- UrbiScript lexer * Tanner Prynn -- cmdline -x option and loading lexers from files * Oleh Prypin -- Crystal lexer (based on Ruby lexer) * Elias Rabel -- Fortran fixed form lexer * raichoo -- Idris lexer * Kashif Rasul -- CUDA lexer * Justin Reidy -- MXML lexer * Norman Richards -- JSON lexer * Corey Richardson -- Rust lexer updates * Lubomir Rintel -- GoodData MAQL and CL lexers * Andre Roberge -- Tango style * Georg Rollinger -- HSAIL lexer * Michiel Roos -- TypoScript lexer * Konrad Rudolph -- LaTeX formatter enhancements * Mario Ruggier -- Evoque lexers * Miikka Salminen -- Lovelace style, Hexdump lexer, lexer enhancements * Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers * Matteo Sasso -- Common Lisp lexer * Joe Schafer -- Ada lexer * Ken Schutte -- Matlab lexers * René Schwaiger -- Rainbow Dash style * Sebastian Schweizer -- Whiley lexer * Tassilo Schweyer -- Io, MOOCode lexers * Ted Shaw -- AutoIt lexer * Joerg Sieker -- ABAP lexer * Robert Simmons -- Standard ML lexer * Kirill Simonov -- YAML lexer * Corbin Simpson -- Monte lexer * Alexander Smishlajev -- Visual FoxPro lexer * Steve Spigarelli -- XQuery lexer * Jerome St-Louis -- eC lexer * Camil Staps -- Clean and NuSMV lexers * James Strachan -- Kotlin lexer * Tom Stuart -- Treetop lexer * Colin Sullivan -- SuperCollider lexer * Ben Swift -- Extempore lexer * Edoardo Tenani -- Arduino lexer * Tiberius Teng -- default style overhaul * Jeremy Thurgood -- Erlang, Squid config lexers * Brian Tiffin -- OpenCOBOL lexer * Bob Tolbert -- Hy lexer * Matthias Trute -- Forth lexer * Erick Tryzelaar -- Felix lexer * Alexander Udalov -- Kotlin lexer improvements * Thomas Van Doren -- Chapel lexer * Daniele Varrazzo -- PostgreSQL lexers * Abe Voelker -- OpenEdge ABL lexer * Pepijn de Vos -- HTML formatter CTags support * Matthias Vallentin -- Bro lexer * Benoît Vinot -- AMPL lexer * Linh Vu Hong -- RSL lexer * Nathan Weizenbaum -- Haml and Sass lexers * Nathan Whetsell -- Csound lexers * Dietmar Winkler -- Modelica lexer * Nils Winter -- Smalltalk lexer * Davy Wybiral -- Clojure lexer * Whitney Young -- ObjectiveC lexer * Diego Zamboni -- CFengine3 lexer * Enrique Zamudio -- Ceylon lexer * Alex Zimin -- Nemerle lexer * Rob Zimmerman -- Kal lexer * Vincent Zurczak -- Roboconf lexer Many thanks for all contributions! pygments.rb-1.2.0/vendor/pygments-main/CHANGES000066400000000000000000000747101315616372200210610ustar00rootroot00000000000000Pygments changelog ================== Issue numbers refer to the tracker at , pull request numbers to the requests at . Version 2.2.0 ------------- (release Jan 22, 2017) - Added lexers: * AMPL * TypoScript (#1173) * Varnish config (PR#554) * Clean (PR#503) * WDiff (PR#513) * Flatline (PR#551) * Silver (PR#537) * HSAIL (PR#518) * JSGF (PR#546) * NCAR command language (PR#536) * Extempore (PR#530) * Cap'n Proto (PR#595) * Whiley (PR#573) * Monte (PR#592) * Crystal (PR#576) * Snowball (PR#589) * CapDL (PR#579) * NuSMV (PR#564) * SAS, Stata (PR#593) - Added the ability to load lexer and formatter classes directly from files with the `-x` command line option and the `lexers.load_lexer_from_file()` and `formatters.load_formatter_from_file()` functions. (PR#559) - Added `lexers.find_lexer_class_by_name()`. (#1203) - Added new token types and lexing for magic methods and variables in Python and PHP. - Added a new token type for string affixes and lexing for them in Python, C++ and Postgresql lexers. - Added a new token type for heredoc (and similar) string delimiters and lexing for them in C++, Perl, PHP, Postgresql and Ruby lexers. - Styles can now define colors with ANSI colors for use in the 256-color terminal formatter. (PR#531) - Improved the CSS lexer. (#1083, #1130) - Added "Rainbow Dash" style. (PR#623) - Delay loading `pkg_resources`, which takes a long while to import. (PR#690) Version 2.1.3 ------------- (released Mar 2, 2016) - Fixed regression in Bash lexer (PR#563) Version 2.1.2 ------------- (released Feb 29, 2016) - Fixed Python 3 regression in image formatter (#1215) - Fixed regression in Bash lexer (PR#562) Version 2.1.1 ------------- (relased Feb 14, 2016) - Fixed Jython compatibility (#1205) - Fixed HTML formatter output with leading empty lines (#1111) - Added a mapping table for LaTeX encodings and added utf8 (#1152) - Fixed image formatter font searching on Macs (#1188) - Fixed deepcopy-ing of Token instances (#1168) - Fixed Julia string interpolation (#1170) - Fixed statefulness of HttpLexer between get_tokens calls - Many smaller fixes to various lexers Version 2.1 ----------- (released Jan 17, 2016) - Added lexers: * Emacs Lisp (PR#431) * Arduino (PR#442) * Modula-2 with multi-dialect support (#1090) * Fortran fixed format (PR#213) * Archetype Definition language (PR#483) * Terraform (PR#432) * Jcl, Easytrieve (PR#208) * ParaSail (PR#381) * Boogie (PR#420) * Turtle (PR#425) * Fish Shell (PR#422) * Roboconf (PR#449) * Test Anything Protocol (PR#428) * Shen (PR#385) * Component Pascal (PR#437) * SuperCollider (PR#472) * Shell consoles (Tcsh, PowerShell, MSDOS) (PR#479) * Elm and J (PR#452) * Crmsh (PR#440) * Praat (PR#492) * CSound (PR#494) * Ezhil (PR#443) * Thrift (PR#469) * QVT Operational (PR#204) * Hexdump (PR#508) * CAmkES Configuration (PR#462) - Added styles: * Lovelace (PR#456) * Algol and Algol-nu (#1090) - Added formatters: * IRC (PR#458) * True color (24-bit) terminal ANSI sequences (#1142) (formatter alias: "16m") - New "filename" option for HTML formatter (PR#527). - Improved performance of the HTML formatter for long lines (PR#504). - Updated autopygmentize script (PR#445). - Fixed style inheritance for non-standard token types in HTML output. - Added support for async/await to Python 3 lexer. - Rewrote linenos option for TerminalFormatter (it's better, but slightly different output than before) (#1147). - Javascript lexer now supports most of ES6 (#1100). - Cocoa builtins updated for iOS 8.1 (PR#433). - Combined BashSessionLexer and ShellSessionLexer, new version should support the prompt styles of either. - Added option to pygmentize to show a full traceback on exceptions. - Fixed incomplete output on Windows and Python 3 (e.g. when using iPython Notebook) (#1153). - Allowed more traceback styles in Python console lexer (PR#253). - Added decorators to TypeScript (PR#509). - Fix highlighting of certain IRC logs formats (#1076). Version 2.0.2 ------------- (released Jan 20, 2015) - Fix Python tracebacks getting duplicated in the console lexer (#1068). - Backquote-delimited identifiers are now recognized in F# (#1062). Version 2.0.1 ------------- (released Nov 10, 2014) - Fix an encoding issue when using ``pygmentize`` with the ``-o`` option. Version 2.0 ----------- (released Nov 9, 2014) - Default lexer encoding is now "guess", i.e. UTF-8 / Locale / Latin1 is tried in that order. - Major update to Swift lexer (PR#410). - Multiple fixes to lexer guessing in conflicting cases: * recognize HTML5 by doctype * recognize XML by XML declaration * don't recognize C/C++ as SystemVerilog - Simplified regexes and builtin lists. Version 2.0rc1 -------------- (released Oct 16, 2014) - Dropped Python 2.4 and 2.5 compatibility. This is in favor of single-source compatibility between Python 2.6, 2.7 and 3.3+. - New website and documentation based on Sphinx (finally!) - Lexers added: * APL (#969) * Agda and Literate Agda (PR#203) * Alloy (PR#355) * AmbientTalk * BlitzBasic (PR#197) * ChaiScript (PR#24) * Chapel (PR#256) * Cirru (PR#275) * Clay (PR#184) * ColdFusion CFC (PR#283) * Cryptol and Literate Cryptol (PR#344) * Cypher (PR#257) * Docker config files * EBNF (PR#193) * Eiffel (PR#273) * GAP (PR#311) * Golo (PR#309) * Handlebars (PR#186) * Hy (PR#238) * Idris and Literate Idris (PR#210) * Igor Pro (PR#172) * Inform 6/7 (PR#281) * Intel objdump (PR#279) * Isabelle (PR#386) * Jasmin (PR#349) * JSON-LD (PR#289) * Kal (PR#233) * Lean (PR#399) * LSL (PR#296) * Limbo (PR#291) * Liquid (#977) * MQL (PR#285) * MaskJS (PR#280) * Mozilla preprocessors * Mathematica (PR#245) * NesC (PR#166) * Nit (PR#375) * Nix (PR#267) * Pan * Pawn (PR#211) * Perl 6 (PR#181) * Pig (PR#304) * Pike (PR#237) * QBasic (PR#182) * Red (PR#341) * ResourceBundle (#1038) * Rexx (PR#199) * Rql (PR#251) * Rsl * SPARQL (PR#78) * Slim (PR#366) * Swift (PR#371) * Swig (PR#168) * TADS 3 (PR#407) * Todo.txt todo lists * Twig (PR#404) - Added a helper to "optimize" regular expressions that match one of many literal words; this can save 20% and more lexing time with lexers that highlight many keywords or builtins. - New styles: "xcode" and "igor", similar to the default highlighting of the respective IDEs. - The command-line "pygmentize" tool now tries a little harder to find the correct encoding for files and the terminal (#979). - Added "inencoding" option for lexers to override "encoding" analogous to "outencoding" (#800). - Added line-by-line "streaming" mode for pygmentize with the "-s" option. (PR#165) Only fully works for lexers that have no constructs spanning lines! - Added an "envname" option to the LaTeX formatter to select a replacement verbatim environment (PR#235). - Updated the Makefile lexer to yield a little more useful highlighting. - Lexer aliases passed to ``get_lexer_by_name()`` are now case-insensitive. - File name matching in lexers and formatters will now use a regex cache for speed (PR#205). - Pygments will now recognize "vim" modelines when guessing the lexer for a file based on content (PR#118). - Major restructure of the ``pygments.lexers`` module namespace. There are now many more modules with less lexers per module. Old modules are still around and re-export the lexers they previously contained. - The NameHighlightFilter now works with any Name.* token type (#790). - Python 3 lexer: add new exceptions from PEP 3151. - Opa lexer: add new keywords (PR#170). - Julia lexer: add keywords and underscore-separated number literals (PR#176). - Lasso lexer: fix method highlighting, update builtins. Fix guessing so that plain XML isn't always taken as Lasso (PR#163). - Objective C/C++ lexers: allow "@" prefixing any expression (#871). - Ruby lexer: fix lexing of Name::Space tokens (#860) and of symbols in hashes (#873). - Stan lexer: update for version 2.4.0 of the language (PR#162, PR#255, PR#377). - JavaScript lexer: add the "yield" keyword (PR#196). - HTTP lexer: support for PATCH method (PR#190). - Koka lexer: update to newest language spec (PR#201). - Haxe lexer: rewrite and support for Haxe 3 (PR#174). - Prolog lexer: add different kinds of numeric literals (#864). - F# lexer: rewrite with newest spec for F# 3.0 (#842), fix a bug with dotted chains (#948). - Kotlin lexer: general update (PR#271). - Rebol lexer: fix comment detection and analyse_text (PR#261). - LLVM lexer: update keywords to v3.4 (PR#258). - PHP lexer: add new keywords and binary literals (PR#222). - external/markdown-processor.py updated to newest python-markdown (PR#221). - CSS lexer: some highlighting order fixes (PR#231). - Ceylon lexer: fix parsing of nested multiline comments (#915). - C family lexers: fix parsing of indented preprocessor directives (#944). - Rust lexer: update to 0.9 language version (PR#270, PR#388). - Elixir lexer: update to 0.15 language version (PR#392). - Fix swallowing incomplete tracebacks in Python console lexer (#874). Version 1.6 ----------- (released Feb 3, 2013) - Lexers added: * Dylan console (PR#149) * Logos (PR#150) * Shell sessions (PR#158) - Fix guessed lexers not receiving lexer options (#838). - Fix unquoted HTML attribute lexing in Opa (#841). - Fixes to the Dart lexer (PR#160). Version 1.6rc1 -------------- (released Jan 9, 2013) - Lexers added: * AspectJ (PR#90) * AutoIt (PR#122) * BUGS-like languages (PR#89) * Ceylon (PR#86) * Croc (new name for MiniD) * CUDA (PR#75) * Dg (PR#116) * IDL (PR#115) * Jags (PR#89) * Julia (PR#61) * Kconfig (#711) * Lasso (PR#95, PR#113) * LiveScript (PR#84) * Monkey (PR#117) * Mscgen (PR#80) * NSIS scripts (PR#136) * OpenCOBOL (PR#72) * QML (PR#123) * Puppet (PR#133) * Racket (PR#94) * Rdoc (PR#99) * Robot Framework (PR#137) * RPM spec files (PR#124) * Rust (PR#67) * Smali (Dalvik assembly) * SourcePawn (PR#39) * Stan (PR#89) * Treetop (PR#125) * TypeScript (PR#114) * VGL (PR#12) * Visual FoxPro (#762) * Windows Registry (#819) * Xtend (PR#68) - The HTML formatter now supports linking to tags using CTags files, when the python-ctags package is installed (PR#87). - The HTML formatter now has a "linespans" option that wraps every line in a tag with a specific id (PR#82). - When deriving a lexer from another lexer with token definitions, definitions for states not in the child lexer are now inherited. If you override a state in the child lexer, an "inherit" keyword has been added to insert the base state at that position (PR#141). - The C family lexers now inherit token definitions from a common base class, removing code duplication (PR#141). - Use "colorama" on Windows for console color output (PR#142). - Fix Template Haskell highlighting (PR#63). - Fix some S/R lexer errors (PR#91). - Fix a bug in the Prolog lexer with names that start with 'is' (#810). - Rewrite Dylan lexer, add Dylan LID lexer (PR#147). - Add a Java quickstart document (PR#146). - Add a "external/autopygmentize" file that can be used as .lessfilter (#802). Version 1.5 ----------- (codename Zeitdilatation, released Mar 10, 2012) - Lexers added: * Awk (#630) * Fancy (#633) * PyPy Log * eC * Nimrod * Nemerle (#667) * F# (#353) * Groovy (#501) * PostgreSQL (#660) * DTD * Gosu (#634) * Octave (PR#22) * Standard ML (PR#14) * CFengine3 (#601) * Opa (PR#37) * HTTP sessions (PR#42) * JSON (PR#31) * SNOBOL (PR#30) * MoonScript (PR#43) * ECL (PR#29) * Urbiscript (PR#17) * OpenEdge ABL (PR#27) * SystemVerilog (PR#35) * Coq (#734) * PowerShell (#654) * Dart (#715) * Fantom (PR#36) * Bro (PR#5) * NewLISP (PR#26) * VHDL (PR#45) * Scilab (#740) * Elixir (PR#57) * Tea (PR#56) * Kotlin (PR#58) - Fix Python 3 terminal highlighting with pygmentize (#691). - In the LaTeX formatter, escape special &, < and > chars (#648). - In the LaTeX formatter, fix display problems for styles with token background colors (#670). - Enhancements to the Squid conf lexer (#664). - Several fixes to the reStructuredText lexer (#636). - Recognize methods in the ObjC lexer (#638). - Fix Lua "class" highlighting: it does not have classes (#665). - Fix degenerate regex in Scala lexer (#671) and highlighting bugs (#713, 708). - Fix number pattern order in Ocaml lexer (#647). - Fix generic type highlighting in ActionScript 3 (#666). - Fixes to the Clojure lexer (PR#9). - Fix degenerate regex in Nemerle lexer (#706). - Fix infinite looping in CoffeeScript lexer (#729). - Fix crashes and analysis with ObjectiveC lexer (#693, #696). - Add some Fortran 2003 keywords. - Fix Boo string regexes (#679). - Add "rrt" style (#727). - Fix infinite looping in Darcs Patch lexer. - Lots of misc fixes to character-eating bugs and ordering problems in many different lexers. Version 1.4 ----------- (codename Unschärfe, released Jan 03, 2011) - Lexers added: * Factor (#520) * PostScript (#486) * Verilog (#491) * BlitzMax Basic (#478) * Ioke (#465) * Java properties, split out of the INI lexer (#445) * Scss (#509) * Duel/JBST * XQuery (#617) * Mason (#615) * GoodData (#609) * SSP (#473) * Autohotkey (#417) * Google Protocol Buffers * Hybris (#506) - Do not fail in analyse_text methods (#618). - Performance improvements in the HTML formatter (#523). - With the ``noclasses`` option in the HTML formatter, some styles present in the stylesheet were not added as inline styles. - Four fixes to the Lua lexer (#480, #481, #482, #497). - More context-sensitive Gherkin lexer with support for more i18n translations. - Support new OO keywords in Matlab lexer (#521). - Small fix in the CoffeeScript lexer (#519). - A bugfix for backslashes in ocaml strings (#499). - Fix unicode/raw docstrings in the Python lexer (#489). - Allow PIL to work without PIL.pth (#502). - Allow seconds as a unit in CSS (#496). - Support ``application/javascript`` as a JavaScript mime type (#504). - Support `Offload `_ C++ Extensions as keywords in the C++ lexer (#484). - Escape more characters in LaTeX output (#505). - Update Haml/Sass lexers to version 3 (#509). - Small PHP lexer string escaping fix (#515). - Support comments before preprocessor directives, and unsigned/ long long literals in C/C++ (#613, #616). - Support line continuations in the INI lexer (#494). - Fix lexing of Dylan string and char literals (#628). - Fix class/procedure name highlighting in VB.NET lexer (#624). Version 1.3.1 ------------- (bugfix release, released Mar 05, 2010) - The ``pygmentize`` script was missing from the distribution. Version 1.3 ----------- (codename Schneeglöckchen, released Mar 01, 2010) - Added the ``ensurenl`` lexer option, which can be used to suppress the automatic addition of a newline to the lexer input. - Lexers added: * Ada * Coldfusion * Modula-2 * Haxe * R console * Objective-J * Haml and Sass * CoffeeScript - Enhanced reStructuredText highlighting. - Added support for PHP 5.3 namespaces in the PHP lexer. - Added a bash completion script for `pygmentize`, to the external/ directory (#466). - Fixed a bug in `do_insertions()` used for multi-lexer languages. - Fixed a Ruby regex highlighting bug (#476). - Fixed regex highlighting bugs in Perl lexer (#258). - Add small enhancements to the C lexer (#467) and Bash lexer (#469). - Small fixes for the Tcl, Debian control file, Nginx config, Smalltalk, Objective-C, Clojure, Lua lexers. - Gherkin lexer: Fixed single apostrophe bug and added new i18n keywords. Version 1.2.2 ------------- (bugfix release, released Jan 02, 2010) * Removed a backwards incompatibility in the LaTeX formatter that caused Sphinx to produce invalid commands when writing LaTeX output (#463). * Fixed a forever-backtracking regex in the BashLexer (#462). Version 1.2.1 ------------- (bugfix release, released Jan 02, 2010) * Fixed mishandling of an ellipsis in place of the frames in a Python console traceback, resulting in clobbered output. Version 1.2 ----------- (codename Neujahr, released Jan 01, 2010) - Dropped Python 2.3 compatibility. - Lexers added: * Asymptote * Go * Gherkin (Cucumber) * CMake * Ooc * Coldfusion * Haxe * R console - Added options for rendering LaTeX in source code comments in the LaTeX formatter (#461). - Updated the Logtalk lexer. - Added `line_number_start` option to image formatter (#456). - Added `hl_lines` and `hl_color` options to image formatter (#457). - Fixed the HtmlFormatter's handling of noclasses=True to not output any classes (#427). - Added the Monokai style (#453). - Fixed LLVM lexer identifier syntax and added new keywords (#442). - Fixed the PythonTracebackLexer to handle non-traceback data in header or trailer, and support more partial tracebacks that start on line 2 (#437). - Fixed the CLexer to not highlight ternary statements as labels. - Fixed lexing of some Ruby quoting peculiarities (#460). - A few ASM lexer fixes (#450). Version 1.1.1 ------------- (bugfix release, released Sep 15, 2009) - Fixed the BBCode lexer (#435). - Added support for new Jinja2 keywords. - Fixed test suite failures. - Added Gentoo-specific suffixes to Bash lexer. Version 1.1 ----------- (codename Brillouin, released Sep 11, 2009) - Ported Pygments to Python 3. This needed a few changes in the way encodings are handled; they may affect corner cases when used with Python 2 as well. - Lexers added: * Antlr/Ragel, thanks to Ana Nelson * (Ba)sh shell * Erlang shell * GLSL * Prolog * Evoque * Modelica * Rebol * MXML * Cython * ABAP * ASP.net (VB/C#) * Vala * Newspeak - Fixed the LaTeX formatter's output so that output generated for one style can be used with the style definitions of another (#384). - Added "anchorlinenos" and "noclobber_cssfile" (#396) options to HTML formatter. - Support multiline strings in Lua lexer. - Rewrite of the JavaScript lexer by Pumbaa80 to better support regular expression literals (#403). - When pygmentize is asked to highlight a file for which multiple lexers match the filename, use the analyse_text guessing engine to determine the winner (#355). - Fixed minor bugs in the JavaScript lexer (#383), the Matlab lexer (#378), the Scala lexer (#392), the INI lexer (#391), the Clojure lexer (#387) and the AS3 lexer (#389). - Fixed three Perl heredoc lexing bugs (#379, #400, #422). - Fixed a bug in the image formatter which misdetected lines (#380). - Fixed bugs lexing extended Ruby strings and regexes. - Fixed a bug when lexing git diffs. - Fixed a bug lexing the empty commit in the PHP lexer (#405). - Fixed a bug causing Python numbers to be mishighlighted as floats (#397). - Fixed a bug when backslashes are used in odd locations in Python (#395). - Fixed various bugs in Matlab and S-Plus lexers, thanks to Winston Chang (#410, #411, #413, #414) and fmarc (#419). - Fixed a bug in Haskell single-line comment detection (#426). - Added new-style reStructuredText directive for docutils 0.5+ (#428). Version 1.0 ----------- (codename Dreiundzwanzig, released Nov 23, 2008) - Don't use join(splitlines()) when converting newlines to ``\n``, because that doesn't keep all newlines at the end when the ``stripnl`` lexer option is False. - Added ``-N`` option to command-line interface to get a lexer name for a given filename. - Added Tango style, written by Andre Roberge for the Crunchy project. - Added Python3TracebackLexer and ``python3`` option to PythonConsoleLexer. - Fixed a few bugs in the Haskell lexer. - Fixed PythonTracebackLexer to be able to recognize SyntaxError and KeyboardInterrupt (#360). - Provide one formatter class per image format, so that surprises like:: pygmentize -f gif -o foo.gif foo.py creating a PNG file are avoided. - Actually use the `font_size` option of the image formatter. - Fixed numpy lexer that it doesn't listen for `*.py` any longer. - Fixed HTML formatter so that text options can be Unicode strings (#371). - Unified Diff lexer supports the "udiff" alias now. - Fixed a few issues in Scala lexer (#367). - RubyConsoleLexer now supports simple prompt mode (#363). - JavascriptLexer is smarter about what constitutes a regex (#356). - Add Applescript lexer, thanks to Andreas Amann (#330). - Make the codetags more strict about matching words (#368). - NginxConfLexer is a little more accurate on mimetypes and variables (#370). Version 0.11.1 -------------- (released Aug 24, 2008) - Fixed a Jython compatibility issue in pygments.unistring (#358). Version 0.11 ------------ (codename Straußenei, released Aug 23, 2008) Many thanks go to Tim Hatch for writing or integrating most of the bug fixes and new features. - Lexers added: * Nasm-style assembly language, thanks to delroth * YAML, thanks to Kirill Simonov * ActionScript 3, thanks to Pierre Bourdon * Cheetah/Spitfire templates, thanks to Matt Good * Lighttpd config files * Nginx config files * Gnuplot plotting scripts * Clojure * POV-Ray scene files * Sqlite3 interactive console sessions * Scala source files, thanks to Krzysiek Goj - Lexers improved: * C lexer highlights standard library functions now and supports C99 types. * Bash lexer now correctly highlights heredocs without preceding whitespace. * Vim lexer now highlights hex colors properly and knows a couple more keywords. * Irc logs lexer now handles xchat's default time format (#340) and correctly highlights lines ending in ``>``. * Support more delimiters for perl regular expressions (#258). * ObjectiveC lexer now supports 2.0 features. - Added "Visual Studio" style. - Updated markdown processor to Markdown 1.7. - Support roman/sans/mono style defs and use them in the LaTeX formatter. - The RawTokenFormatter is no longer registered to ``*.raw`` and it's documented that tokenization with this lexer may raise exceptions. - New option ``hl_lines`` to HTML formatter, to highlight certain lines. - New option ``prestyles`` to HTML formatter. - New option *-g* to pygmentize, to allow lexer guessing based on filetext (can be slowish, so file extensions are still checked first). - ``guess_lexer()`` now makes its decision much faster due to a cache of whether data is xml-like (a check which is used in several versions of ``analyse_text()``. Several lexers also have more accurate ``analyse_text()`` now. Version 0.10 ------------ (codename Malzeug, released May 06, 2008) - Lexers added: * Io * Smalltalk * Darcs patches * Tcl * Matlab * Matlab sessions * FORTRAN * XSLT * tcsh * NumPy * Python 3 * S, S-plus, R statistics languages * Logtalk - In the LatexFormatter, the *commandprefix* option is now by default 'PY' instead of 'C', since the latter resulted in several collisions with other packages. Also, the special meaning of the *arg* argument to ``get_style_defs()`` was removed. - Added ImageFormatter, to format code as PNG, JPG, GIF or BMP. (Needs the Python Imaging Library.) - Support doc comments in the PHP lexer. - Handle format specifications in the Perl lexer. - Fix comment handling in the Batch lexer. - Add more file name extensions for the C++, INI and XML lexers. - Fixes in the IRC and MuPad lexers. - Fix function and interface name highlighting in the Java lexer. - Fix at-rule handling in the CSS lexer. - Handle KeyboardInterrupts gracefully in pygmentize. - Added BlackWhiteStyle. - Bash lexer now correctly highlights math, does not require whitespace after semicolons, and correctly highlights boolean operators. - Makefile lexer is now capable of handling BSD and GNU make syntax. Version 0.9 ----------- (codename Herbstzeitlose, released Oct 14, 2007) - Lexers added: * Erlang * ActionScript * Literate Haskell * Common Lisp * Various assembly languages * Gettext catalogs * Squid configuration * Debian control files * MySQL-style SQL * MOOCode - Lexers improved: * Greatly improved the Haskell and OCaml lexers. * Improved the Bash lexer's handling of nested constructs. * The C# and Java lexers exhibited abysmal performance with some input code; this should now be fixed. * The IRC logs lexer is now able to colorize weechat logs too. * The Lua lexer now recognizes multi-line comments. * Fixed bugs in the D and MiniD lexer. - The encoding handling of the command line mode (pygmentize) was enhanced. You shouldn't get UnicodeErrors from it anymore if you don't give an encoding option. - Added a ``-P`` option to the command line mode which can be used to give options whose values contain commas or equals signs. - Added 256-color terminal formatter. - Added an experimental SVG formatter. - Added the ``lineanchors`` option to the HTML formatter, thanks to Ian Charnas for the idea. - Gave the line numbers table a CSS class in the HTML formatter. - Added a Vim 7-like style. Version 0.8.1 ------------- (released Jun 27, 2007) - Fixed POD highlighting in the Ruby lexer. - Fixed Unicode class and namespace name highlighting in the C# lexer. - Fixed Unicode string prefix highlighting in the Python lexer. - Fixed a bug in the D and MiniD lexers. - Fixed the included MoinMoin parser. Version 0.8 ----------- (codename Maikäfer, released May 30, 2007) - Lexers added: * Haskell, thanks to Adam Blinkinsop * Redcode, thanks to Adam Blinkinsop * D, thanks to Kirk McDonald * MuPad, thanks to Christopher Creutzig * MiniD, thanks to Jarrett Billingsley * Vim Script, by Tim Hatch - The HTML formatter now has a second line-numbers mode in which it will just integrate the numbers in the same ``
`` tag as the
  code.

- The `CSharpLexer` now is Unicode-aware, which means that it has an
  option that can be set so that it correctly lexes Unicode
  identifiers allowed by the C# specs.

- Added a `RaiseOnErrorTokenFilter` that raises an exception when the
  lexer generates an error token, and a `VisibleWhitespaceFilter` that
  converts whitespace (spaces, tabs, newlines) into visible
  characters.

- Fixed the `do_insertions()` helper function to yield correct
  indices.

- The ReST lexer now automatically highlights source code blocks in
  ".. sourcecode:: language" and ".. code:: language" directive
  blocks.

- Improved the default style (thanks to Tiberius Teng). The old
  default is still available as the "emacs" style (which was an alias
  before).

- The `get_style_defs` method of HTML formatters now uses the
  `cssclass` option as the default selector if it was given.

- Improved the ReST and Bash lexers a bit.

- Fixed a few bugs in the Makefile and Bash lexers, thanks to Tim
  Hatch.

- Fixed a bug in the command line code that disallowed ``-O`` options
  when using the ``-S`` option.

- Fixed a bug in the `RawTokenFormatter`.


Version 0.7.1
-------------
(released Feb 15, 2007)

- Fixed little highlighting bugs in the Python, Java, Scheme and
  Apache Config lexers.

- Updated the included manpage.

- Included a built version of the documentation in the source tarball.


Version 0.7
-----------
(codename Faschingskrapfn, released Feb 14, 2007)

- Added a MoinMoin parser that uses Pygments. With it, you get
  Pygments highlighting in Moin Wiki pages.

- Changed the exception raised if no suitable lexer, formatter etc. is
  found in one of the `get_*_by_*` functions to a custom exception,
  `pygments.util.ClassNotFound`. It is, however, a subclass of
  `ValueError` in order to retain backwards compatibility.

- Added a `-H` command line option which can be used to get the
  docstring of a lexer, formatter or filter.

- Made the handling of lexers and formatters more consistent. The
  aliases and filename patterns of formatters are now attributes on
  them.

- Added an OCaml lexer, thanks to Adam Blinkinsop.

- Made the HTML formatter more flexible, and easily subclassable in
  order to make it easy to implement custom wrappers, e.g. alternate
  line number markup. See the documentation.

- Added an `outencoding` option to all formatters, making it possible
  to override the `encoding` (which is used by lexers and formatters)
  when using the command line interface. Also, if using the terminal
  formatter and the output file is a terminal and has an encoding
  attribute, use it if no encoding is given.

- Made it possible to just drop style modules into the `styles`
  subpackage of the Pygments installation.

- Added a "state" keyword argument to the `using` helper.

- Added a `commandprefix` option to the `LatexFormatter` which allows
  to control how the command names are constructed.

- Added quite a few new lexers, thanks to Tim Hatch:

  * Java Server Pages
  * Windows batch files
  * Trac Wiki markup
  * Python tracebacks
  * ReStructuredText
  * Dylan
  * and the Befunge esoteric programming language (yay!)

- Added Mako lexers by Ben Bangert.

- Added "fruity" style, another dark background originally vim-based
  theme.

- Added sources.list lexer by Dennis Kaarsemaker.

- Added token stream filters, and a pygmentize option to use them.

- Changed behavior of `in` Operator for tokens.

- Added mimetypes for all lexers.

- Fixed some problems lexing Python strings.

- Fixed tickets: #167, #178, #179, #180, #185, #201.


Version 0.6
-----------
(codename Zimtstern, released Dec 20, 2006)

- Added option for the HTML formatter to write the CSS to an external
  file in "full document" mode.

- Added RTF formatter.

- Added Bash and Apache configuration lexers (thanks to Tim Hatch).

- Improved guessing methods for various lexers.

- Added `@media` support to CSS lexer (thanks to Tim Hatch).

- Added a Groff lexer (thanks to Tim Hatch).

- License change to BSD.

- Added lexers for the Myghty template language.

- Added a Scheme lexer (thanks to Marek Kubica).

- Added some functions to iterate over existing lexers, formatters and
  lexers.

- The HtmlFormatter's `get_style_defs()` can now take a list as an
  argument to generate CSS with multiple prefixes.

- Support for guessing input encoding added.

- Encoding support added: all processing is now done with Unicode
  strings, input and output are converted from and optionally to byte
  strings (see the ``encoding`` option of lexers and formatters).

- Some improvements in the C(++) lexers handling comments and line
  continuations.


Version 0.5.1
-------------
(released Oct 30, 2006)

- Fixed traceback in ``pygmentize -L`` (thanks to Piotr Ozarowski).


Version 0.5
-----------
(codename PyKleur, released Oct 30, 2006)

- Initial public release.
pygments.rb-1.2.0/vendor/pygments-main/LICENSE000066400000000000000000000024631315616372200210670ustar00rootroot00000000000000Copyright (c) 2006-2017 by the respective authors (see AUTHORS file).
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.
pygments.rb-1.2.0/vendor/pygments-main/MANIFEST.in000066400000000000000000000002421315616372200216110ustar00rootroot00000000000000include pygmentize
include external/*
include Makefile CHANGES LICENSE AUTHORS TODO
recursive-include tests *
recursive-include doc *
recursive-include scripts *
pygments.rb-1.2.0/vendor/pygments-main/Makefile000066400000000000000000000032271315616372200215210ustar00rootroot00000000000000#
# Makefile for Pygments
# ~~~~~~~~~~~~~~~~~~~~~
#
# Combines scripts for common tasks.
#
# :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
# :license: BSD, see LICENSE for details.
#

PYTHON ?= python

export PYTHONPATH = $(shell echo "$$PYTHONPATH"):$(shell python -c 'import os; print ":".join(os.path.abspath(line.strip()) for line in file("PYTHONPATH"))' 2>/dev/null)

.PHONY: all check clean clean-pyc codetags docs mapfiles \
	pylint reindent test test-coverage

all: clean-pyc check test

check:
	@$(PYTHON) scripts/detect_missing_analyse_text.py || true
	@pyflakes pygments | grep -v 'but unused' || true
	@$(PYTHON) scripts/check_sources.py -i build -i dist -i pygments/lexers/_mapping.py \
		   -i docs/build -i pygments/formatters/_mapping.py -i pygments/unistring.py

clean: clean-pyc
	-rm -rf build
	-rm -f codetags.html

clean-pyc:
	find . -name '*.pyc' -exec rm -f {} +
	find . -name '*.pyo' -exec rm -f {} +
	find . -name '*~' -exec rm -f {} +

codetags:
	@$(PYTHON) scripts/find_codetags.py -i tests/examplefiles -i scripts/pylintrc \
		   -i scripts/find_codetags.py -o codetags.html .

docs:
	make -C doc html

mapfiles:
	(cd pygments/formatters; $(PYTHON) _mapping.py)
	(cd pygments/lexers; $(PYTHON) _mapping.py)

pylint:
	@pylint --rcfile scripts/pylintrc pygments

reindent:
	@$(PYTHON) scripts/reindent.py -r -B .

test:
	@$(PYTHON) tests/run.py -d $(TEST)

test-coverage:
	@$(PYTHON) tests/run.py -d --with-coverage --cover-package=pygments --cover-erase $(TEST)

test-examplefiles:
	nosetests tests/test_examplefiles.py

tox-test:
	@tox -- $(TEST)

tox-test-coverage:
	@tox -- --with-coverage --cover-package=pygments --cover-erase $(TEST)
pygments.rb-1.2.0/vendor/pygments-main/README.rst000066400000000000000000000020601315616372200215420ustar00rootroot00000000000000README for Pygments
===================

This is the source of Pygments.  It is a generic syntax highlighter that
supports over 300 languages and text formats, for use in code hosting, forums,
wikis or other applications that need to prettify source code.

Installing
----------

... works as usual, use ``python setup.py install``.

Documentation
-------------

... can be found online at http://pygments.org/ or created by ::

   cd doc
   make html

Development
-----------

... takes place on `Bitbucket
`_, where the Mercurial
repository, tickets and pull requests can be viewed.

Continuous testing runs on drone.io:

.. image:: https://drone.io/bitbucket.org/birkenfeld/pygments-main/status.png
   :target: https://drone.io/bitbucket.org/birkenfeld/pygments-main

The authors
-----------

Pygments is maintained by **Georg Brandl**, e-mail address *georg*\ *@*\ *python.org*.

Many lexers and fixes have been contributed by **Armin Ronacher**, the rest of
the `Pocoo `_ team and **Tim Hatch**.
pygments.rb-1.2.0/vendor/pygments-main/REVISION000066400000000000000000000000151315616372200212320ustar00rootroot000000000000007941677dc77d
pygments.rb-1.2.0/vendor/pygments-main/TODO000066400000000000000000000006461315616372200205530ustar00rootroot00000000000000Todo
====

- lexers that need work:
  * review perl lexer (numerous bugs, but so far no one had complaints ;)
  * readd property support for C# lexer? that is, find a regex that doesn't
    backtrack to death...
  * add support for function name highlighting to C++ lexer

- allow "overlay" token types to highlight specials: nth line, a word etc.

- pygmentize option presets, more sophisticated method to output styles?
pygments.rb-1.2.0/vendor/pygments-main/doc/000077500000000000000000000000001315616372200206225ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/doc/Makefile000066400000000000000000000127221315616372200222660ustar00rootroot00000000000000# Makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = PYTHONPATH=.. sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext

help:
	@echo "Please use \`make ' where  is one of"
	@echo "  html       to make standalone HTML files"
	@echo "  dirhtml    to make HTML files named index.html in directories"
	@echo "  singlehtml to make a single large HTML file"
	@echo "  pickle     to make pickle files"
	@echo "  json       to make JSON files"
	@echo "  htmlhelp   to make HTML files and a HTML help project"
	@echo "  qthelp     to make HTML files and a qthelp project"
	@echo "  devhelp    to make HTML files and a Devhelp project"
	@echo "  epub       to make an epub"
	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
	@echo "  text       to make text files"
	@echo "  man        to make manual pages"
	@echo "  texinfo    to make Texinfo files"
	@echo "  info       to make Texinfo files and run them through makeinfo"
	@echo "  gettext    to make PO message catalogs"
	@echo "  changes    to make an overview of all changed/added/deprecated items"
	@echo "  linkcheck  to check all external links for integrity"
	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"

clean:
	-rm -rf $(BUILDDIR)/*

html:
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

dirhtml:
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."

singlehtml:
	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
	@echo
	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."

pickle:
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
	@echo
	@echo "Build finished; now you can process the pickle files."

json:
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
	@echo
	@echo "Build finished; now you can process the JSON files."

htmlhelp:
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
	@echo
	@echo "Build finished; now you can run HTML Help Workshop with the" \
	      ".hhp project file in $(BUILDDIR)/htmlhelp."

qthelp:
	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
	@echo
	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Pygments.qhcp"
	@echo "To view the help file:"
	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Pygments.qhc"

devhelp:
	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
	@echo
	@echo "Build finished."
	@echo "To view the help file:"
	@echo "# mkdir -p $$HOME/.local/share/devhelp/Pygments"
	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Pygments"
	@echo "# devhelp"

epub:
	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
	@echo
	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."

latex:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo
	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
	@echo "Run \`make' in that directory to run these through (pdf)latex" \
	      "(use \`make latexpdf' here to do that automatically)."

latexpdf:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through pdflatex..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

text:
	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
	@echo
	@echo "Build finished. The text files are in $(BUILDDIR)/text."

man:
	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
	@echo
	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."

texinfo:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo
	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
	@echo "Run \`make' in that directory to run these through makeinfo" \
	      "(use \`make info' here to do that automatically)."

info:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo "Running Texinfo files through makeinfo..."
	make -C $(BUILDDIR)/texinfo info
	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."

gettext:
	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
	@echo
	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."

changes:
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
	@echo
	@echo "The overview file is in $(BUILDDIR)/changes."

linkcheck:
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
	@echo
	@echo "Link check complete; look for any errors in the above output " \
	      "or in $(BUILDDIR)/linkcheck/output.txt."

doctest:
	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
	@echo "Testing of doctests in the sources finished, look at the " \
	      "results in $(BUILDDIR)/doctest/output.txt."
pygments.rb-1.2.0/vendor/pygments-main/doc/_static/000077500000000000000000000000001315616372200222505ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/doc/_static/favicon.ico000066400000000000000000000410761315616372200244010ustar00rootroot00000000000000@@ (B(@€ 	$6FMMMF5""5FMMMF6$	2OmƒŒŒŒ‚iH*)Hi‚ŒŒŒƒmP2:`ˆ¨¾5Æ8(tÆ
:Ƽ wJJw ¼!&ÆhvÆ8AÆ		¾¨ˆa:<f”»HÖDÍæFèêEèêEèêAÌâ.ÊŸjjŸÉ	¼âÎöêÍöêÍõêÅêæVdÖ¼”g<<g—Â#[ßKèðIè÷HèùGèùFèùDèòB ÒÝ´~~´ŽªÜÍ÷ñÍöøÍõøÍõøÍô÷Îóð€•à˜h=<g˜ÃVáLèóJèúIèýHèýGèýFèûEèòDèÝ)´~~´´×ÜÍöñÍöúÍõýÍôýÍóýÍóûÍòók}âØh> <h˜Ã/uâMèóJçûKèýIèýIèýHèýGèûEèòEèÝ
	´~~´¬ÏÜÍöñÍõúÍôýÍôýÍóýÍòýÍñûÍðó
ƒ—â

ÙkC&=h˜Ã:ŒâNèóMèûLèýKèýJèýJèýHèýGèûEèò;#›Û±{z¯q…ÙÍöðÍõúÍôýÍóýÍóýÍñýÍñýÍïûÍïó™°âÅžuO.	 >h˜Ã4‹âNèóOèûNèýMèýLèýKèýJèýIèüHèö=µçÈ—b_‘À’®áÍõóÍóûÍóýÍñýÍñýÍðýÍïýÍîûÍîôˆœä˪‚X3&DlšÃ:”âQèóQèûOèýOèýMèýMèýLèýKèûIèõ8Ÿè
ΦrA;f—”áÍóóÍòûÍñýÍðýÍïýÍîýÍíýÍíûÍìõ”©éÔ³Š^8/OuŸÆL"»âRèóRèûQèýPèýOèýOèýMèýMèûLèô-‡äʦyK%<g—Â	w‹áÍñóÍñûÍïýÍîýÍíýÍíýÍìýÍëüÍêø
ªÀíÙ¹‘d;7\„ªÌC«åSèôSèûRèýRèýQèýPèýOèýOèûNèó9—âÅsK)<g—ÂizáÍïóÍîûÍîýÍìýÍìþÍëþÍêþÍêýÍèù¯ÄïÝ¿–g<;d·
	
ÕF³éVèõUèûTèýTèýSèýRèýRèýPèûPèó,qâØjB%<g—ÂdráÍíóÌëûÍìýÍêþÍêþÍéþÍèþÍèýÍçú­Âòá˜h=<g–À	ÝY"ØîVèøVèüVèýVèýUèýTèýTèýRèûSèó&gâØh=<g—ÂiuáÍìóÍêûÍêþÍéþÍèþÍçþÍçþÍæþÍæû³ÇóâØh=<g˜ÂáLÀòXèúXèýXèþWèþVèþUèýUèýTèûUèó2wâØg<<g—ÂGQáÆáóÍéûÍèþÍçþÍçþÍæþÍåþÍåþÍäûÂÕó	-0âØh=<g˜Ã"áTÑóZèûZèþYèþYèþXèþXèþWèýWèûUçó
FâØg<<g—ÂBJáÎçóÌåûÍåþÍåþÍäþÍäþÍãþÍãþÍâû½Ñó*-âØh=<g˜Ã
/â^äó[èû[èþZèþZèþZèþYèþYèþXèûWàó!OâØg<<g—ÂAFáÏæóÍäûÍäþÍãþÍãþÍâþÍâþÍáþÍáûÆÙóâØh=<g˜Ã.âVÒó\èû\èþ\èþ[èþ[èþ[èþZèþZèûYÞó%OâØg<<g—Â7<á½ÒóÍâûÍáþÍâþÍàþÍáþÍßþÍàýÍàûÂÒóFKâØh=<g˜Ã%Fâ[áó^èû^èþ]èþ]èþ]èþ]èþ\èþ\èûUÔó&âØg<<g—Â"áÎáóÍàûÍàýÍßþÍßþÍßþÍÞþÍÞþÍÞûÊÚó>AâØh=	:f—Ã%Lâ`æó_èû^èþ^èþ^èþ^èþ^èþ]èþ]èûYÕó
7âØg<<g—Áß	ÁÑðÍßùÍÞýÍÞýÍÞþÍÝþÍÝþÍÝþÍÜûÍÜó;>âØh<2`”Â%Uá_áó_èû`èþ`èþ`èþ`èþ_èþ_èþ^èûSÁó
+âØg<<f”¼
(+Ù¹ÇìÍÜ÷ÍÜüÍÜþÍÛþÍÛþÍÛþÍÛþÍÛûÊØóQVâØf:#O‡»0fß`çóaèûaèþaèÿaèÿ`èÿ`èþ`èþ`èûSÄó
âØg<:aбÓ¸ÃêÍÛ÷ÍÛýÍÛþÍÚþÍÚþÍÚþÍÚþÍÚûÍÚóY]áÁ“^/4j¦/^ÕeèðcèúbèþbèÿbèÿbèÿbèÿaèþaèüWÂô
âØg<4V€­
Ô«µìÍÙøÍÙýÍÙþÍÙþÍÙþÍÙþÍÙþÌØûÍØóaeÞ·E?{	¸hèâeèöeèýeèÿdèÿdèÿdèÿdèÿdèýH ö
åÅ™h<
-Rƒ´Ù±ºïÍ×ùÍ×ýÍ×þÍ×ÿÍ×ÿÍ×ÿÍ×þÍ×ùÁÊë"$É‘Q?{5^¸gèâhèöhèýhèÿhèÿhèÿhèÿhèþ^ÏûîÑ¢m>1]‘ÀâÅÍõÍÖüÍÖþÍÖÿÍÖÿÍÖÿÍÖþÍÖùÍÕëHJÉ‘Q?{5^¸jèâkèökèýkèÿkèÿkèÿkèÿkèþdÓøçÂŽ[3>lžËèÁÈøÍÕýÍÕÿÍÕÿÍÕÿÍÕÿÍÕþÍÕùÍÔë	ILÉ‘Q?{¸q éâmèönèýnèÿnèÿnèÿoèÿoèþpèûdÃðײ‡\8<h˜Äã	µºôÍÓüÍÓþÍÓÿÍÓÿÍÓÿÍÓÿÍÔþÍÔùÁÇë  É‘Q4j¦1]Õrèðpèúqèþqèÿqèÿrèÿrèþrèýrèøm Ðë
Ö·d<<g˜Ã⧪óÍÒûÍÒþÍÒþÍÒÿÍÒÿÍÒÿÍÓþÍÓûÊÐóSUÞ·E#N‡»8eßtèótèûtèþuèþuèþvèþvèývèývèød¿ïÝÀ–g<<g˜Ã
00â°²óÍÐûÍÐþÍÑþÍÐþÍÐþÍÐþÍÑþÍÑûÈÌóEGáÁ“^/2`”Á:áwèówèûxèþxèþyèþyèþzèþ{èý{èúuÖòáØh=<g˜Ã++â¾¾óÍÎûÍÎþÍÎþÍÏþÍÏþÍÏþÍÏþÍÐûÌÏóJKâ×f:	:f—Â+Náyâózèû{èý{èþ}èþ}èþ}èþèþèû‚!åó+âØh=<g˜Ã'&⻺óÍÌûÍÌþÍÍþÍÍþÍÍþÍÎþÍÎþÍÎû¿ÀóLLâ×g<<g—Â.Má éó}èû~èþèþ€èþèþ‚èþƒèþƒèû{Óó'âØh=<g˜ÃONâÄÂóÌÉûÌÊþÌÊþÌËþÍËþÍËþÍÌþÍÌû½¼ó**âØg<<g—Â
,á}ßóèû‚èþƒèþ„èþ„èþ†èþ†èþ‡çû‡ãó!/âØh=<g˜Ã;9âÆ¿óÌÅûÌÆýÌÈþÌÉþÌÉþÌÊþÌÊþÍËûÍËó**â×g<<g—Â5á{×ó„èû…èþ†èþ‡çþˆæþ‰åþŠäþ‹ãû‹ Ýó0FâØh=<g˜ÃE@âʼóʾûËÁýËÂýÌÄþÌÅþÌÇþÌÈýÌÉú°­ñ''à—g<<g—Â&áˆ#áó‡çûˆæþŠåþŠäþŒâþáþŽßþ Ýû$×ó0CâØh=<h˜Ãh]âDzóÉ·ûɹý	ʼýʾýÊÀýËÂýËÃýËÄø°¬ïÜ¿–g<<g—Â!à ÑñŠäú‹âýáþàþ Ýþ!Ûþ‘"Ùþ“%×û•'Ôó/@âØh=
=h˜ÃOCâƪóÇ­ûDZýÈ´ý
É·ýɺý	Ê»ýʾüÊÀ÷½´ì׸c;<f•¿#Ýx¿ïßù Þý!Üþ‘"Úþ’$Øþ”%Õþ•'Óý—*Ïû—,ÉóDUâØh= ?i˜ÃcOâ#ÄŸóĤûƨýƬýǯýȲýȶý
É·ûʺõ˜èѰ‡\7;cºÚ|"ºï!Ûù’#Øý“%×þ•&Ôþ–(Ñþ—*Îý™,Ëýš/Çûœ2ÃóZ)iâØh="BlšÄ){_â/Á–ó)™û%ßý Ä£ýŧýÆ«ýÆ®ýDZûȳôŽäʧ~U28^Œ¹Û}%¶ï“%Õø•'Óü–)Ñý—+Íý™-Êýš/Çýœ2Ãýž5¾ûŸ7ºóS"\âØh<
 BoÆ&mMâ9¿Šó3Àû.Á•ý)Á™ý%Þý"Ä¡ýÅ¥ýÆ©ûƬóœŠâÄrK,	5]¸
×n!˜ê—)Ïö˜+Íû™-Êý›/Æý2Ãýž5¾ýŸ7ºý¢;¶û¢=±óQ TâØf:>l	Ç2|SäC¼€ô<¼„û8¾‹ý3Àý.À”ý*Á™ý&Ãý"áûĤó{jâØjA$
5\†¬Ìh‹äš-Êô›0Æûœ2Ãýž5¾ýŸ7»ý :·ý£>³ý¤A¯û¥C©ó@~áÁ“^1;gšÆF“_äM¹wôGº}ûB¼‚ý<½‡ý8¾‹ý3Àý.À”ý*Á˜û&ÜóydâØh=
1Qvž	Åu)”â2Ãóž5¿ûŸ7»ý¡:¸ý¢=³ý¤@¯ý¦C«ý§F§û¨H£óm5fÞ·I]’
ÁHWâT·oôP¹uûJºyýE»~ý@¼ƒý;½‡ý7¾Œý3Àû/Á•ó#s^âØg<	'Cj˜Ãn/‚áŸ6¼ó¡9¸û¢<µý£?±ý¥B­ý¦E©ý¨H¤ý©K ù«Oë@!:É’Xy°A|GÚZ¶iñV·múR¸rýN¹výIºzýE»ý?½ƒý:½‡û7¿ŒóUAâØg<=g—Â`$ná¡;´ó£?±û¥A®ý¦Dªý§G¦ý©J£ýªLŸù«N›ë’FÉ’X€¸Y¦^ß\µgóY¶kúU·oýQ¸sýL¹wýG»{ýC»û?½†óG3âØg<<g—Âa'ká¤A¯ó¥B«û¦E¨ý¨H¤ý©K ýªNù«O™ë£RÉ’X€!¸\«_ß]µfóZ¶iúV·mýR¸qýN¹uýJºyûH¹}ó!N9á×g<<g—ÂU'Xá§G©ò¨G¥ù¨J¢ùªLŸù«Nœø¬P™ê^0SÉ’X€¸S™Tß_µdó\µhùX¶kùT·oùQ¸søN¹wð,ß—g<<g—ÁV)VÞžDšë¦Iœë¨Kšë¦M–ê†BwÚµJo¥"Î[¨^ä[°dêX³gêT±jêL¦fæ$Ö»”f<<f“¶É:7É<7É.*ɵŽ]2O}¥¿ ;"Ç @%Ç8"Ǿ¨‡`:9]~‘‘‘‘~\7-Mm…ƒlO2/DQQQQD/$8HMMMF6$		!!!!	
				ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿüÀ?ÿÿÿÿø€ÿÿÿÿð€ÿÿÿÿà€ÿÿÿÿÀ€ÿÿÿÿ€€ÿÿÿÿ€ÿÿþÀ?ÿÿüàÿÿððÿÿàøÿÿÀ?üÿÿ€þÿÿÿÿÿþÿÿ€üÿÿÀ?øÿÿàðÿÿðàÿÿøÀ?ÿÿüÀÿÿþÀÿÿÿÿÀÿÿÿÿ€Àÿÿÿÿ€ÀÿÿÿÿÀÿÿþÀ?ÿÿüàÿÿøðÿÿðøÿÿàüÿÿÀ?þÿÿ€ÿÿÿÿÿ€þÿÿÀ?üÿÿàøÿÿððÿÿøà?ÿÿüÀÿÿÿ€ÿÿÿÿ€€ÿÿÿÿÀÿÿÿÿàÿÿÿÿðÿÿÿÿø€ÿÿÿÿüÀ?ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpygments.rb-1.2.0/vendor/pygments-main/doc/_static/logo_new.png000066400000000000000000001177601315616372200246030ustar00rootroot00000000000000‰PNG


IHDRñ¦¿!cbKGDÿÿÿ ½§“	pHYsšœtIMEÞ.3w6 IDATxÚì½{œg}ïÿ}âu"9ñ­ãÆIœH¹K@€Ù¤µ
vñBsÊšR=mL)­}z¸lZèù™]n»Ý_
x[ g·ð+Y—"JH,.]°ÛvKv 7ɹJ	O'ÞqÖ±%;vžó‡4Òh4º=I3ÚÏûõòË+if¤gfvž·¾Æ9'€{9»w‰€ËÄÀå@âàr ñp9x¸H<\$.—‰€ËÄÀå@âàr ñp9x¸H<\$.—‰€ËéÃ.Ð˨ªJÉdro*•Úäõß%Q(b~¿Ÿ$I¢P(„A`À8çØ eN™3G©ìhbùÿ^Y‹äb;òpñç_-ý¢ÿâW­_2_²z=ùW®ÂNž$›ÍÒìì,Ïd2=ÿ»dÞÆ`0x ‰`ðèA ñ€Ï>t˜~ù_ÚÓG2G/yö¡ç‰„]ñbDŒŠR+Υ5—ŸOëo”Øe7Jtö¹+±»À‰—OУ‹ÐÏýüñG<|Åböùü… 0RŒ8凎,§U+ýtåÀutåÀµ—¾þ¢Á_ø!e7˜ššâš¦-»ßÛçóQ$‡Ãzôx a^zî8=øõú?Ñ©ã/çµ+veÏYä+¾¾þF‰^ûÛW0	Qzá…ìôÇö$ïîgá§O”I;CÖ3“Ð+.S’{÷¯§¤7_y㺷<á_y.v.p%sss4??¿ìÿÀ’e™E£Qòûý80ð0x .Ï=x˜ü—îÁÃ%WŒ¸£ÊçªDãÙ­+½v-ýúû_Ï.¸üUØÑmàÄË'è;ïù›ù'ç>V”r6’®ø¿%
Õ{«V®¢7¯¿éão¾ì¿ßæïƒÌîbrr’뺎QÀçóQ4…ÌÀÃ@⪜zéýüîãéù§J2Έ¸c¦ø­ZÑxvÏ´ãy9vݘ»v{Ý9=ò}ég_âÙ—Sqϳ*òŽ‹Â³{~Uß*zç5ÛØàºÍØéÀhšFSSSøãfƒÏ磡¡!F±3ðxÀ–Ã&å3?á'Ÿ¢º‘wÔX4žñœ±œUîI‘µô¶¿ü5vêåµÌþ_í§¯>ðœ™Zä%1b•R®™(¼’ÄË/ψSäÂè=¯ýCTè6étšfffðÇ­’$Q,c’$agàÎÂ.V’_{莽ÛËO½tŠòî†þÏS”<Ï•þ'›é³yù‚3*{^K>O‰Oþ?yüeBÜqðóÕþÑÒ(ØØáå2®bËà1Ó@ÙGç•–Oþ)MáÚ±'1¸#ZQQì<$(ãÞÛ~ÊS_KÆÊ$•äUºÒs¼ø3/À-mɯøÂ“/Òþ¿ÿB ûµŸæŸœÿX#Ë–Æ·r€¬|µ~fÅŸ9éÙÃôŸàÚ±H$x<Íf³Ø¸HǶËåhÏž={±—pˆÄ[&,=¾H>ú#~ê¥SùH8Ûšw…èºZiµ-“_7¿kJnÝh55ųÙ,v "H¼žgéñEúé‡çùéc§ˆÈ$ኒÎÜ„ ÿ‚5­¶(þ,™†€3§ÙšE VÚ\™Ø£ò·*û 5ª6´ŠÂ³ïFñûþ'?üÒc`Âï÷ÓÐÐPK×Ôd2‰Z,t	H¼àñ©{ùÃã?)†GØ‹¼òè»â²Ô`}<2ÉšºÑ|­Eã?Ÿ}îJºzózp¼ãª­¬V»æ£ð*›YÔ^ÖrŒÔ¨ƒgxvµñŒè¼S§—è›÷ÿOþÄÿŽÀ!dY¦V¢ñ2™e³YìHº$žÇyä³?á¿úFŠÊ¤Y;ÁRCi´5ëãÕH³¥ŠÇÑxT¹½×ýöèJÛ o¸è´ÆmÔeþçúQxõW”-[7¶J<YWzÎ’^ˈN^¢ï$ÿ‚|ö»aŒ2ÎÐj4
*Ð ñ<Ì£ŸQø³ß}Ü$ç*ÓhÍbÎ,â¨ð¸‘úxÖºziµÆ{°*ëV>æ¯Ç©ÿÂUôÚw\9†QnŒU+WÑðUï´LÌ+Óc©bÌlä^ÕfͤÑV—zÔÀs¥h½üãùG><øìwÞ„‘ udY&ŸÏ'¼~&“Ù€½@çÄó(~FáÏ}çñRÄ5&òì"ììD3ùŸ²´Z^=­¶\Й¢ï¬ÉîqùÏ¿ö׳³Ï]‰n‚
ÿ7ºzÍ5–:…•é³Õ¢ëŒ4GÐ1‹œ+ßfe*lù¶j5²(oŒÁ,Ë1²¤Ü2N?zôÓêÃÏ& p€H$"ü%É¡C‡öcÐy ñ<ÈcŸþ~ø;ùÎŒSã"Ê›OXÓo™%ËÕ6–ju¯­]k¯Ñh¼«7_F—Ý(a ØñưU+W‘X^šxµÒhÉÁÇl^³ˆ9»î´vË‘%ÝöÇ~jÿ½OÍä0Ò´F8.WÉd°èxâô±S”ü“ïç7‰9nfÕD^5áfÓè¢Vô^Í´ZKJ.ñæ¢ñ.¸ü|úËèH+Ȫ•«èÖw²U+WUw5¢ðÊŽÆ-rÎô•K·juð¨J'ÚÚÏñòšy¦Ÿ‰8-übúœ½~2hH$ÒÒúº®c'Ða ñ<Âéc§(õ'ßã/ªÏT¤Â•Džùq-‘W)öª7º(m¯|½ZiµÅÏDGã­	¾Šnú«7CàµÈ%ý—ÒÈ;™¿ ò¬;´"
Y¢í,RÏš*Ë,r®l«Ôc6
.˜%ú®ì9‹À+„g•m“è‘çî¦}ŽBäÐÁ`PxÝÅÅEì@:$ž8}ìüà÷øñGŽ”¤G"Ï
W­é«YWÔÇ+¾géaþ¹M.¬]t×ϧ›þê-¨ƒç—ô¯§[oüóRkkvšµ¤ÏUJ;sméõZuðì£òêK=¢zÏx¿GŸ»›þ
"aB¡ð—&èP@çÄs9§¢‡ÿø»G¦¬ÆÆE3‰¼Ê=k¯¨gޏ+mÓ>­¶š4o«ø¸°5—ŸO¿5	ç4÷¯§‘F"ÏØÿ•Qx¥16GÏYó¡+^ÔJ™5×¼«ŒÊ³J=KT^UW™ºûèá»èßû?uú€&ÀNÀC@⹘3ÇNÑÃø.?aDàY"èZyÄ«4¯à&ÃË…[ùã:iµÆûSµFD—ŸOoÿ!ðÚÅÅýëé£7Œå›]ÔŒÂ+¯{WZÆ>Ö>âŽ*RmY•¨<[YXWàQÙ{ïñøswÑwüC~êô€&Âëjš¶{€Î‰çRN^#iµÁ¡Ëé×þüF¼.ã_y.ýù†Ï±Áu›¨²™EéÿZi´Ö.³õÒjEžd,k¶Á¬ò±´ÎËg–h.ù>ˆ<êÐJ]<@gÄs/þøIzâ–‚À3	0kZ"û.°v{ˆ¼âsÅ÷ª\¯V£‹b—[ªŸV{ã_ÜÀn„Àsï‰|ˆ
®Ûl#ÖxÕ(=²‰Ú³_¾²v^e³‹üñSMà5ÓØ¢¬>^!2ïåÓ/Ò’ïå:D€ » »,ÞõÈ;ù‰}wq"bĈ³¼ôâĉ1F¼ Å8ã…ç1FÄyþõb	;ƉsãµB7PΈLËr2‰·ÂºùíËU®GŒ•­Ãó4È
NŽsâ…í×'*|p¢ÁßÈ.
b°]H,òaƈóŸi?²M£µ‹°£Z,ò®ªÀ˿ּÀ£
G–m––§‚È‹ñ·Fâ,pîup,d2ìÐ54M£l6[w9¿ß¨Q—N§—íx5ò»H’„æA@×uZ\\¬»ÜÀÀì0Ž
®ï4$^7/nw=òÎ_íÜw—¹Ø¿!Ðò‚—:ðÒ2%YÇ.® ÚydzlºÊuŒÏXpyÜ,ù
J’É¿Ñçn~/ò¶jå¹ïÿÅÝW”5¶°þ̪ÿáà…ïþ"F:;‘;tèišFš¦íÍf³›Z‘Ç’$‘Ïç£P(Ä$I¢uëÖarÞ¦qK§Ó¤iÚ†C‡í3óx
$I®Ÿ°§Óiãwoùxõù|$I
Œ‰P(Á×$Ùl–4M£t:Mº®...Ž·2&Á`°lÝzë­Ì
“]×iaaEáݺñ®·¯"‘ÈØÐÐЄW#<›9oš•몪ÒÜÜï¦0±»¶D£Ñ‰vM2³Ù,)Šâêc6²h4ºl¢óÒé4ÍÍÍq7Öh•eÙ3×v^+4M£={ö¸nŒÂáð¾h4ºÙ-)ÑÙl–‰Ä¨ªªãn>V
wý>KUUZXXpÕqå•ûH¼N^\ÿ÷ùÑo?LfñFd…gyT&ûŠ¢­¸¼uf!çȳl«ry¢«Ï¡
×<òüº;u?yf© Â^iLàÙDÓ‰<»´ÕÒj«‹=Óÿ¬ôØxîÊ×|^ÙgÑ1rªŒå$ñEú˜ˆhË–-lhh¨©u&''–>ŸvîÜÉ–Ë$¶Ù¨HÑHÈå6Qñêd\ô¼!"ŠÅbu#Y5M£x<ZÇøÖ­[:U…æææ\)ïª]g{Yæ¹YÞyñúÑŽk…W®õí¸^4=Ï×4šžžöÌõEô^Ωs?‘H¸úo[Ž«jœ…é^gxæ/Ì_¼óá’t0ݪ3Ή8/ö¶`œ—aFo^ZǨgW\¾¸
Ó²Ååò¯•–-Èóz…eYÙz¼lÛÅÏkZƼüÊóΦx=Ã5k7ж7}ŽùûΫÒèÂ*ë¬uôxÜFàÙ?W«.žL¤¢‘
륟ù2ýì‰à[°lÑu}ƒèºÍN*UU¥f&¹\ŽTU]6c1777ÚÌò™L†ºuó;77G“““ÜK¯pŽONNòD"±¡‘ޏn‘ÍFÉ-,,ðzã755åúÉS&“¡©©)GÆËˆPJ$žš`ÏÏÏóÉÉI®(J¯ýí¡ééi>33ýÒ!ݸ~ÌÍÍ-›kE2™ô̵ÞÉë…(ñxÜS×ã“L&;ö~Ùl–âñøèÌÌŒëÿ™«x<>ê¶ûH¼ðÌ_þˆ¿øíƒåÒx™3Ë7"CÞ™[qÒëeâ¯ðz¹Èã"σԀÈ3oÏ,þȲüÙçM¿þw[X?^OñêÕ!úÃ7~žùûεitA±g¤±R™ˆ«'ðªu¯µm¦Á*›lTKŸ-Eó•GåYEßÓ/|ƒ~–þ0DX–¤Óéý¢ë6û­d:mö=EYçf¡ÑGÓ“¤NÞx›EÈüü¼ç&*–ãjÿää$ïôþ˜‹L:ªgÓÓÓ¼‘”í^/UUizzÚF;r¹%	>==íª´çÆ“víÚåyg'=Ü(Á¼Våë³îÞ½Ûs×zEQöOMMq‘ýÑ
ªª’W¯1ú›`ÜCxíÀÂøŽ»í¾¯Í<û—?âKw>\=g4ñ´Få£Þˆ,Qy¦¨:³|+._mÜòºù1/ÖkVäQŶóË÷_9@7~aë¿rƒÝƒ¼zõôoœb¾•çÖ”oÄʣߌHºÚx¬J_µÔ\c;vïYÜ&¥ä/Ÿÿý<ý!ˆ<°¬h´èr5š»æ/..6}ÓftŒìu¼q¨(Š'¢·š#»wïæ³³³{½•çÄäÉ«âįD"ÑTôp<J¶ê IDATõbtL5á²k×.îÕk¢!‘½
Yí|šžžæ½-nŒS­KnG×uš™™éhk2™Üëåã¹Ý_¨ªJSSSžþ"Âø;ä–¨]&¿ˆ,é¬ÔxT^CéµdoåRŽÈ9‘×ÅÝð÷oc+Ï;¾x•ïÕô¾7~]´:/òJá™õÙ
ºŽ[/ˆ‰NîõãµW#pj‰"¯ŠQ¥5Ø}6TFßQÅë…óˆ¬]j©¬s­5:ïØ‰‡èÞƒÿ¿64ÍúW½ƒzŠVk°‰H<"¢h4ÊDº éºNªª’,Ë=5­D²v}®ÙÙÙ¶¼`0HëÖ­Ûèóù˜'óÏš¦‘ieüœN§¹¦iÔΉA<ç’$±n‰'Ð4Z-L)
1I’Èï÷7tÞ
sŒÿÓét[ëk©ª:.IÒD4¥d2INã7ŽSI’2öE#ûߨš¦¦ÓéñvMòöìÙãºãUÓ´¶éºNj¹\ŽfggùöíÛY»Ëœ˜Äs€SŸ§ç?öC~êàÅh9nD¶±’È3‹:cV·3dg<ÿzÉß奛!ç¨$á˜qÆëy	gˆ<óö¬‚.ÿ?+yÅÏdy¯þí+éêOþ7†ÑC×|Š1ÆùÃÏ&*šXP¨ºÊfDöÏšjKÑwDT}g•reÿÛ¾NÛZÊ>Dßįýë_õ:8è	Z½±
‡ÃÂ)#ƒƒƒ4??/*¼¸,Ë=õ7H4Â0´MhÆãñÑvL $I¢p8Ì"‘HÃQKæåL“AfLÈ“É$¥R©¶Çééi¾cÇÏŠ<‘&ŸÏG‘Hd,Oˆ¦j›e_a̘¤§R©
û–'‰D‚K’Äœ’F²,…Ãá‰P($\wÒ8n
ûb‚ˆ&t]§t:MŽJ
£ÁÂÈȈ+®FI§·(‰l”eù€“×UU¢‰Çã<0Ñ/»:ÍwÜÁ[“h4ÊB¡PKѨv׌Âõ}4™LŽ;uÍh÷¹‹Å˜×ê?nÙ²…9]šC×uù¶Þß'I’Š_,
4tÌuê•Â{·mÛÖ±ˆLÆù²‰tn§>Oϼç_ù+K'‹JZ€J‰³ÌœDkșℬë™"ùŒ§9"éŠËدÏeX±ZYéý¯×µ®W¶\^ð]øŽ+éªOÿ°åÇ~Š?ò잊yµž]ý;ª*úœŒ¾«.íŠg(3?GÔ·¢Ÿn¸öûl5DžgH§Ó433#ôÇí¶ÛnëÙk]6›¥ÉÉÉ–n0c±kE ÅãñQÑ´;w²n¤á´ƒd2I»wï:F·lÙ†††ÿLíH“ey,N´S†¢Îì Ó߬[™››s|2d79ŠF£,R'~WUUinnÎUÝr;½t]§¹¹¹Q'SÛu]höoŒÓ©ø¸†¤ÓiRUÕ±ñ422ÒÑkG'®æ1‘ey¢¢2›ÍR*•rôšÑÎs%›ÍR"‘u{C¨@ @ÃÃìµu[¹Ï³;ÖZùb©Úõ·_¨mß¾½c¯N|žž}“¿rì$•Wº+I²’N(*ËUÈ:*eše^Q70Ó¶M‚Ð,çŒmfå"°ìgf/òÖ_EWBà:ìO߯<ôµ¯²+­}¤]µî³Ü"×xÓÑw²Î.
™êUZDÞàµ÷@äyH<{fgg÷¶Ò±ÑçóÑÎ;[š˜´26Ñhtãððð^‹ééiá›ÇvÈL]×i×®]ŽEȲ<6444ÑIéšÍfi~~~ƒ“)•Ý>æÚ=1F£·lÙr ¢RQš››ëjÔJ§åÝywÇw86‘ìö‰D±ó¯×'ÇC–å±X,6Ñ+×
¢|
óÖ­[»¡œÍfIQG~G'îeù¼ÈìBmϦ§ááaáq°¦;ý{ò“Ÿä^9ÿu]'EQ‹‡Ãû:‡tZAN|žž‹}“s#¯:›ÿ©T¿Ž3f›bk^®˜b[L¡5Õº£RJly­ï¸ã¾cÇŽ®\#ªI(I
wåØtr‹)/8þ–Íl½jFˆrÕEïºû­×}‰ùúVÓYõÄ[µçª	¼ZÑw¦õ*#ó*›cØ¥í–Ä{!bЦ.#N?ù'±g!ò€ËI§ÓäT§4Ñè¹j7àƒƒƒEÖ-tó온ª*üMm4u<:^Q”–¿9nµÙI;	…BŽˆ‘^ˆÚðù|®x–ãhs»e[žyÙêñªªêx'›†8щҭ×'dÑÜÜœ'¿xr£ð·ŽM,ké\é…/ÝD+÷fݪµXãž—n¹å–¦¯P(Ô±¨rH¼9þ¯Éé·þàdgæ™Wж£
IGfW±•¥ÔÖO±%û¨ïÜÜÜh/_CZ=.½gÔ%sóõÂ8WZù‚Q×uO)è6DSù¹ñ‰Dš¾wêØßH¼È¼{¾`ŽêqRæ•ÄÕ¨—Wžbk~­ZT^CéµDÔwÞ9´~â-7­yçÕ÷`´Sœ{-½íµÿÌÎî[m+êNŸeÕÓbKrª¦Þ–§ÎÖwÔ˜¼3¯ÿÈ“{ôÉâ›<àt]§ééiîD}"ÓM‰ã`@€‚Á èuÜ‹QQš¦	§šntzBÕj^4Ýèvg8¬ÅýåÙh¼h4ºÑö@["N
)á•ñ’eYøúHD¤ªjGîK
‚j\týááaæ…kH héúᵈ¯n7|iòÚÖê¹²€#är¹
‚cèÚk³Q§¯‘(ÁN§CâÕáÄ7“;:rÏÊ.ge^cõòZ‹Ê+EÞ•§×öw6]9ûÚÁÀ¹×ÑÛ"_g>Cä±W²«xžle 5Q÷®¦¼cË»âÏŒèÙ#ÿD>õÇy «d³Y𛛣]»v9Ò•³“Ñ·\.G©TÊscÔJa+‘‹í˜XƒAöTíÜH$B­4»ðj
%ŸÏG[¶lñÌX


9^W(zFJ¼ç=ï>V5M£N¤Ô¶…‡÷¹¥YB£×Ñ,^*!Ëò˜×:ê¶òEc:ÞOÀ:$´/Ý~¼
˜ªÉbŸÏG·ÜrKÇ¿€Ä«Á±]û¹~ë÷ÿ†L`ÍÍ*ÊêmYd^Qè9!ó,ò®\Ø™¥\sQy}«Ï¡Ðîaæ¿æ6hßÅïÜëè¦ë¿Ïλ®¹ôYª_ÏNÐÕê8Ûœ¼«ˆfyG¦ÏøÜÿD=õˆ<Ðqt]§D"±arr’ÏÏÏs';c¶Nþ#‘ˆðdÝku†²Ù,%“I¡ˆ•p8¼ÏiÑJm>ŸÏ×’`è¶ j¥îŽk(E£Q×§Å99)·;^½$‹Ì×ßVºö¶;¥6›Í
GáŠØoöÚ˜O´Ð”Éõe |>
Oxm\B¡p4^§„7¨ŽÛ§Øá÷ûiÇŽÌhzaü‹ÅblçÎ,‰tü3AâUáè­ßçÇvýÄÔ¥2?ñ7§»šeQ¹@³
¦ežM“kŠmµÆe{d•××:ǹç\L¿޳s¯k0úÎ&…–ñ|}=j¤k­òŽlÖ!“¼£²÷ÈBÓ4R…¦¦¦øää$We;ÚÚÇb±¶OþE£ñt]®¿Ò
R©”°4“eÙñÉ®hm>c̼Õd=®E×õZ
%¯
,Y–É©Úx^”˜­ÔWJ§Ó{ÛùÙZ‰JíÄß–vMäEÿf‰~‰ÓI¼|®
_×:„Ë.áµ{‰BÆâ?Y–©[ç$ž
GG¾Ï³ñ‡
ʻΚ;ÊVÊ<Ó„¿U™gÛü¢±Û²ˆ=kTõõŸC—ïÞÊ|×BàÎqv_?mÿ+˜"ò΢WÊÜYuWÔO%›×M祠¼3w©5Ë;ëµáð»é¾ƒoâ§ÏÅ€aAeü›››£D"±azzšñ©©)žH$x;eÂðð0ëDŠC+骪z¦Á…hä`  §¿áÕu]¸6_  ¡¡!OŸ_’$µáä¥Jí¨¥Ø)"‘ˆ#]þ¼(1Íç›h„Q:ÞÔÎÏ&•©Q+NF…s.—ëhÑfñªð7ßKˆŠÿL&ƒºx]¼Æ1ú°Ê9:ò=žýæCDÄŠÑk¼hÙòÓuC¢åƒÞxéYF¦ªx†Œ+(VŠ–ã…ãÄM[åF$+=fĉ3Óû"oȉ³ü68ÏK
^üü…7Ê/@¾kÖÐkþú­x +¬ìë§M×}‹ýûÁßá/O–œU¶?›Î;ñFU^/¼T:MË™—©\¾|jË–“ùj@ŒˆNœx€’þ&\ýcÖ·â|ºÇøØÇ>¶ì£)eYëÔͼßï'Y–ÇDÒ²TUžp»¤H§ÓÂé:í(øÜÊD²MNºÁÐÐЄh*`2™Ü?<<̲F’¤Í-¬K^O4É	!!«ëºãÇ©h*m è‰(¼VÇÄ¢„¿qŒ‰FïB$9rNÝÇ¥R©Qì½æYÖ/åhñæá§SÏ–	2““#[9W¶}t^Yª-/Oµ%‹hYæQu™ç»öºä_~¸–7„¾ÈB¯Ù^!äΪҴ¢š¼#V]ØÙ§Ù’m7ÛryW.ôËÏ]*‰;f/þ<õ=üØ&~"¸”h4º1‹uµ¶\+E©UUÝëÖ}ÛJñ÷vDFˆÊ§^¨-æääUÓ4×wšìaÒÊï IÒX¯§’$		ÙÅÅEÇSQÙу‘¼Bc¢iÚ†^ù]\z®à¦®KˆÞ#¨ª:î…ncÙJ¼’À{Îü¬¥£%	EçYV¬Z7Ï€YRm›–yU:Ùöÿîµ´îë7Cà÷ß­ÿ+v}ðK_´«{g[3Ï8o*¢èªDÛUé4k>ÿÌçjeÊlõ¨;û™å׌3gŽÒAˆ<à2|>ÝrË-lxxØ7𢓼T*µÉ7€ÉdR8uJ42±	¸Ð¤¾j‹Ù!­æöJ@ '¢ÐZÙ½rœŠFŒ¶#M0™L
}1á厴vˆ
æBWÑKâkݺu¢Q«¸)ìÒ9AD´gÏž½ØƒÍ±,%^^àý3?z–̲ͲT…Lk4:¯~ª-/˜³¾g‹2ˆ¨ÿw¯£ÿfx†‹×¾ïïþý—­M-ÈVÞñšòŽÙÊ;nûQýFDÝ•]l®yÀeò‚n½õV榉Õàà ðº®ÛÇ¢‚>Ÿ¯-©«­Ôcê…ÚbNO:Üœ~ÕŽŽ¤^û=zILˆ§íÍ™LFh,z嘴þíÄþk'½”v^øû)µŠCŽ%ÑŒŠT*µIQìÄ&Xvïtê9Z¼ùk–¼ÒäÛNè‰Gç5‘jKÎɼÕ7_GkoB«là9Ö­ýý?}]ðÿ|¹2­¶9ygßi–,b°z£ŠŠÈ½¢î˜­Ø7_Gˆ^9s”~l×Þý[mЭIq,c;vì`n›TµÒ1T´ãj»ÐuR©Ô&‘uÛ•v&Ú©2R/¦ÒµÖ4ÀÍõDk¹õš%:¶½D«z@T
ŠÖsý=«`Ô—›®@`_/	Òi»K$.cH$x+u„—ËJ╼êÒ®úk–”:Ûè<ÞD#Œëæ5!óÎûÝëhíç ð€‡oŠ.øý?}Õ_—Ï^Ñߤ¼3ƒUëÝ5֨®IEùº6×*e_>"ïñô»¾ÿ‘Y„ŽƒŽN·lÙÂFFF˜›Ȳ,”§ë:¹é毕ÈÀV"Û4ïé{
ÑÚinO©íz1‚Ë«rB4ú´š¬T96=ŸŽßJó7Ò«_8y…Vº¾ÅãqŽˆ¼ÆX6ïtêYZ¼ùŸ8_Ê’œsZè5W?Õ¶ì½êȼóÞ}]ð¹·AàÏsaà?“¯½‡­ìë¯"ïx¥¼«Ù¬¢z£ŠÚQwV'&îìÈ<õþMy àááa¶sçN644äúÜP($÷Ýá/âp½F^äýÐ$òª5«°—pµ¢îiRQ«Î¨¸³òäSïßôÜá¿Åd´|#F7nß¾³X,6áÕè‡p8,\ÿIQ”
Ýþü¢@ ­+"o9LÀ!ÜÍÀÀÀö‚;öƒH¨$IûzuLñêÎ{!Ð]¢Ñ¨#5ýË:qâ~ùe·#šTÅçóoPC¡3Šò÷ÚDÂï÷ÓàààFEQšŽúXXXØ?<<ܵóH×uáˆ~.Pt›Bºó8öCw÷C6›¥\.×ôz½Vs
¸ÿþt¶nÝÊâñ¸#
™L†fffx0¤¡¡!yž§g%^6~ÿèÒÈžñúÓëÎ
=nØ7¢bÛZV¦"ŒÈ<“‚`&yGéljvÝôñUx`9È‹sÖÓõ×̱ÝÂ_:ñ@}Yg:£Ü*îÊ–gDGg‰1â—­E¹ IDAT‡Èë&·Ývö¿ˆF£DŠçr9RU•ºÕ¼C4ÐçóQ8nÛçZ\\Z¯×›Z
ôÜï„IpÑf½x~õˆ\í@–eJ&“ûR©Ô&§¶iȼ@ @CCC,/kiÛ“é´yw÷¸}ê¬1™¯—&Ûjj­ýóeÅøk6è¬g<^Ñ6vÝôñU¿¹
—	°\è[q>½îêyvÞª×UÔ¾ã5kÝ‘MgÚZuîM•eÔ\ZmÙ:6+¾pd–žúÅû‘Z–=@€‚Á ÐºŠ¢tíZXXØ/²ÞàààÆvÞŒŠFâ-‡dD€ók¹‚È5Ð.b±Øævœÿº®S<ç“““<.×Nñ='ñ²ñû
Ï –˜«÷z§„žy;¹P’y+VŸCkþõ},Gò"ïGì¼U¯+“Þ•µîª7©¨VçNDÜ5‚YÚ±V6DÞ™3G1à`YF…¢À4M£nÜÔ©ª*”nVø]´ó³‰Fâ!J@ä®fnBôË&z¿ßOÛ¶mcNÔdz£y1>55Å'''ùÜÜœ+š›ulNÜK¿L¥À3O£
j¥ÏÖz½‘çͯ5³*õó/«ÇúÏ¡o½—­_ˆ+X¶ô­8ŸÞpÝÏØãOýþ…ÝÅSÉ>ÅÖz~U¿2Ô¢•4Y‘õŽ™¥ì‰ûùUWíc+VœAË’H$B@@è¦LQ”ÑX,6ÑÉÏ+­èIÒétOÀå$
hI’hÇŽlzzš‹~ÉÙèy8??ÏçççI’$’e™÷=;î•_ä¥ÏïãÇ?ÿoU^mD´Ù͸EÖãu–o\èq^zî¬Wù(ð­÷²•á‹pE€ˆ®¼ì«ŒñçÌÚœ]w­J;;Ndï§ÇÛ‘–5Ñh”%‰¦åX2™žèTªP+Ñ¢‡MÞàŽŠÞ€@.—ª÷9??!,c:%òÌ÷c‰D‚'	’$‰¢ÑhOÖÏë‰tÚ¥‘»øñÏï£ÊÔØFjâñž·{]ôùzËš'øùÔ¿³ú}øÖû ð°pÅe_e®Ùf›.[~.9Ÿ*[«¶]#Ûoä=‘‡ÔZ°\mP‘Ëå(•Juìs*Š"$ÉE"‘¶¾ÅÅE¡®–¨— ":tèÐ~쀆Èëtdœ¦iÇù'?ùI>;;»WUUÊf³=±O=/ñ–F¾Í³ñŸSó®Ú2<_k»­
½òçúÂÑÀxT#tÙWÙk.üHMyW‹¦w"d!òÀ2Æï÷“,Ëc"ëÎÍÍu$$›ÍR2™’dˆÂè&’$ÑÈÈëVÉT*µÉÜÃëiþž–xywŸé™V¢ðê½.¥×Œè«|®/|!
Üùû¬€š¬¿dŠ/»}Q}iÖL4\'¢íj­ËŠ’à~J&/çÙìýl°ìˆF£Bµít]ïH-¦T*%ÜÐB4Ò€7ÀNË¿ßO;vì`ÃÃÃmkxQ£!ÆÌÌŒ§bxVâ•Gà5ý&Ò¶ÖëNuµµ./ðþcý>œñ4ÀÚ5Û6‡
"ÏJÓi²MDÛ9)íjqæÌQzì±My`Ù!I’p@UUGÛýùD#þdYssºj·n° —A##°Ü‰F£të­·²nww6bx1:Ïs/åèèýKAàÙ.Aí‘võ^oT$ÖZ>ÿ8ŸBûx4Ék¶mn4"ÏÀ6M¶‘婽ÒΈ<°\J;UUu¼õOÒé´ð7¸¢†M-ÀyB¡vXöÚ±cÛ¾};sƒØ6¢ó¦§§¹ªª®ßž’x|)G‹7ÿÿüä’x‹F%[+¯7¥Wz®/üj<Zà‚5Û6_ºë¦Z]›‰¶ë¦´³ÛÎ+gŽÒãy`™!˲pdX;oÆD#ý‚Á $,3Âáð>ìJ„B!Ú¹s'‹Åb®y™L†ŒÚyn–yž‘xy÷~:¥QãBM¤.^;¤_c)¹þØë!ðp€Àùï¼çš«ö1Cä5m'*Þ9#íÙΙ‚È[<2»£
–¢M EiKƒ‹l6Kªª
5´,àé¿c›±¨D–å¢Ìëvš-Q>Õ6óééiîÆ4[OH¼’À{Æú
5/ÕD–qJêUλžú§¶Bàà«V]O×\½õõßT´]£tJØUãÌ™£ô‹_¼DX.
߈%“IÇ?è7´>Ÿ
-`™‘J@dY.¦Ùʲ<ÖíÏ“Édhff†ÇãñÑv–gi×K¼¼Àû²%¯Ö—ê{N
¿|^ÿÔV|+€Ã¬ò_OW›"òDÄY«ÒΩH=ëöž†ÈË„@ @¢7tªª:~ŽˆFø‰FvÑŽ»Ê‘$‰¶mÛ†¹

…(‹M|ö³ŸeÃÃìÛ%HTUŸœœäíøRXWK¼3¿Ôï›W99WOt™FÖ­-õòxïÄE€6±Ê=…¯½ë¿¾¹µä\-<§êáUÛDX.Ȳ,Ô"•Jmm@aG2™nh!QØi4MÃ-hË–-ldd„¹¹9nÅï÷S4¥‘‘622¢ÑèÆnÕÎËår´{÷nžH$6t{¿ô¹uÀN§4Z¼ù+œ/eëLo­ð–³.Ëël§Ö{ñºÏûco€À œ}öetÕUûØcmâ'lB8ç­lçé_¼S6û_wñ®) g	…B„ÚÂÂ


9ò9D#ûdYsCáfèÛ·o_¶÷$„ë=Î!I
fÉd’R©Ôh2™ït怢(û:DÛ¶mëšœw¥Ä˼/›^µë#"®™åª-Ëx­ÚúöëöOýΘ?ö†	œŽt†+Î/мV:»:q7Ú®;Úçÿ-9s”_ºþvˆ<г

±x<Þt*«ªª|hh¨åsC×uJ¥R›DÖ$/‚p€v‰D(‰LÄb±‰n=£VÞöíÛ»"ò\—N[)ðˆšKmfy'Òq›mŠÁ!ðè†Èóû¯ohy'Òb®…Wï=ô#³ôË_¼Ÿc´A¯‡Éçk¾	”®ëÂÍ(Ì,,,­0¡x¿ß¿Od=¤åÚM$¡X,61>>În¹å&Ëò˜È}¢Èõmff†w£á…«$^^àýçK'H\®µ£6^«/J¯AàÐ]V¬8Ÿ®½ö>¶fͶ²çÛQÏIaÇšxEˆ<ÐÛ“IÜ(²îÂÂBËç…ªªBÛp"
P”P($ôÞét€$IÚ,²ž›º9zCèíܹ“Åb1‡÷µóý‘×éßÓ5ïÔtAàU»Øw2¯=móïx¸€õëogkÖlëzãŠF¶-²ýÅ#³ôTæ]üÌ™£lÐsD£Ñ"ëe2j¥Á…ªªBëû|>
‡Ã8€6ã÷ûI–eÚ¶mÛf£Ãm»jTjšFnvá
‰—«£úïÎT‰À•u­Fï9·ë?‡ú§n†ÀÀe¬_;°Dä™iWt£öGî½xônJ?¶	"ô@€‚Á ÐºŠ¢ßh‰FòE"‘1/v&t²£/ÀÛb\C^½~E£QÚ¹s'Û¾};“eyÌé÷Pe2™ìØïÔu‰—/Œ.Ü1^INívõ–_†õŸCw~AààNÖ¯¿]xáGjuõÞ/—½Ÿ2y ‰F£B§ÓÂÂÂ~ÑÉh&“ú¬CCC]½­Å·¸¸ˆ
@’$áð<¡P¨˜në´ÌK$«×U‰—xñ‚Àã$&êÚ)øÄäë÷ÑÀÂú¯Á€‹Ywñ»týíB5:%ꉋÁ,DèA"‘‰¤Fär9¡¢|Á`Ú•ÂÑn4MÛ‹#
 Š®ë£Ø·—yº®“¢(ùü]“x¥¼F¨äëtÊ-'Öï§;?€GX³ms5‘׉¨:Öæ÷1DÞ©SOa°AÏ §(JÓi±¢|¢ŸÑID#ñt]ß„£ z
Ñ4m{àV™·}ûvGjæ)ŠÒ‘h¼®H¼_ù§+Sh[Ä#r>å–7¹|a2^xÎ<„!òÚ!êÚ-é!›½Ÿø
<›½ƒ
zY–E'–¤iZÃË«ªJ¹\Nèæ0‰xvÿ6³½ÏçÃ5Г„B!i9*/—ËQ*•jûçí¸Ä[ù?ö©»/i^е7åÖ™´Û¾ðk
)´xx‘5Û6_¼ë¦+Îoj=7HºF>Ó+gŽÒ“mâ9ˆ<к	Ýp)Š2ÚIJB
-dYfnÙW¢@Òé44€p]<\C^¹§ŒÅbÃÃÃ-Ý»‰Þ36CG%ÞÒÈ7x6¾PåUN‰Æk_T^^àý)çUç¿óžÐUû˜Uä¹EÒ±ÿUãÌ™£”È=B4j‘L&ÇIyh6jÏòÙ\³Ÿ„d'"iDDëÖ­Ûˆk`ÜWR+"OÓ´¶wæî˜Ä˼{I\ÎtRö5¾N^àmg¬ß#€À￞BWíc}+ÎkUÎ5Dè$IŠ2k4å¡™ˆ=3²,ùý~7í'!Ù™N§ÑÜ@’$Y/™Lrì=€—ˆF£‡÷‰®ßîäŽH¼’À«'çSÛklݾ°Dwî€À Çðû¯§ MD^³tRÎ5Dè…N¡¹¹¹š7Ùl–’ɤPavÑÁ6NÀEoDÑÜ |
Éd2Ô‰Bïà$±Xl³H-P""MÓ6´ó³µ]âeã÷Žfã?¥æ¤Z«µí:—‚@oã÷_OW^{óû¯¯xÍ­rÎŽjŸÍ¨‘‡®µÀËȲ,Tt]×õšß–¦R)¡†’$	OxÛ…hwÉ\.GÉdËI’HtBÛ‰BïàìÐOÑhTh*wèСýíülm•x§S‡hiäë‚­Å99'ëÚ#ý1€eÀÙg_FÁ«ö1¿ÿzWÈ9&ð¯gÎ¥§ÓïBºð4¢7ZªªVM—­©çôgi7¢Í-R©Ô(Ž0@(J/[XXÀ=Às
­×îZ m•xÇ>õmî\zl#8!þ[Ϥþ©÷Bà°LX±â|
^µùl"òZÁi!'J.{?~æÓ¸ÉËîFKUUÛétZ¨0±Ïç#Y–Ý:º„ˆ¦z‹P(´Yd½L&ÓöBïà4@@(³B$‹£Ú&ñ²ñŸŽž:ðDƒKóÿµBóïçÝ@ýSïe8¬X^ÔyŒÜ#äD9røïiµÀË7Z²,u`UUÕî9¡è3·Fá&àBëår9Û}Ô´»ø4½D$^wnn½Ï!ZF ´MâßuÏxçä\ç$ Ë›+Χ+¯½
¬ÙæZ'Ê™3Géùg>ƒh<àYdYj&¡(JÙqŸÍfIUU¡è3шÀN
…„oF{5.‘Hàš@ƒ
B몪:Žh<€×Íbh'm‘x'ð`ÿ™_.:°%îà¿Öß'/ðÞ uëog5Û\ùÙXÿ޽›Îœ9Š^½Ñš`êº^Ö¼A4ê,ïàvŠH$"­˜Édz.jMQ”¶×­ ×ˆD"E×E4Àkär¹
nûLí‘x?|ðÅÎÈ·fhísôO½o`Æ	‘ÇÚð¯Μ9JÇŽÞ½£¼ÊÐÐhƒ‹âqoÌk”h4ºÙíû'Oˆ®+ÚèÃhš†(<Ä®sD×UUu)ì´"Z;K»;͊Љ—»çA·ÆÛü¯>ýS¿?æÝ8C`eÝúÛÙ~´'jâ,½¸gFx•p8,”2šJ¥6y"7È@@¸æ\'‰D"Â)µ™L¦,bÑ«d³Yš…À@ÑBïñxœÛ54Æâ⢫>O2™¤x<>:==ͧ§§y"‘ØÐK²¾ÝM*Dp\âNýŠøÒ	j¿|s*j¯^ 6¯¾xŠ­}ͧzæ÷9vôn*ð,~¿Ÿ…Ò½Ê"òšA4°ˆî¢|
9¯OÀggg9"§•>º®ÓüüüìEÄpKzg6›¥ééi¾{÷n®ªêx&“¡L&CŠ¢ìŸ™™á³³³{½~¿Íf…Ên´»†ãïÔÇŸîÞnvV
žóö× .|ͧٹ«ßÒ;7Ùû1¨ÀËL¡t/UUy*•j:ÕçóQ8îùýÓðx<>šÉdp’в,·4IUe/v¼Fª0h†¡õÜÞ™Ífiff†×ú{šJ¥6ÍÌÌxú‹¿T*%´^+ÑÊÐçô_Y:q‰³µìœ¦ñ/ŽVæfÔÀ4ÌÚWŠ?öoM]Ýz‘yùäS¿åó_Fx‘@ @Á`š•5¢ÑY‘HdÌï÷÷üþ1OÀ%Ib²,{금Ç㣢]‡åD£Q6??Ï[8¹$I¬Ý“Ýv377Gªª–E÷J’DÑhÔs×HÐù¿Å"d2Êf³ÔÍûŽFCišF333|ûöíÌK÷IB׸uëÖmlççjC:í!—EcQxgo¸‚V\²W@Ü»ú-Ô·â|Ï×Ä#"Êeïÿ>Fx}‚Ù©÷ò\Ô~«é¿{öìá^êì
€ãר–SƦ§§¹W;DëºNSSS|~~¾"=_Ó4ŠÇã<£/¨‰¨ÄsŠf€išF“““ž;×Óé´ð—’$hçgs\âu¯ž³ÿúÂãªhߪë±p‘HDø[îfƒy§	…B…×Ïårž˜€g³Y<Ú€ßïoù˯\G¬¨ªJ»víªû¹UUO$¨ÿª"IÒ˜Èz¢bN iZÓÍŒsÝ+iô…{á}ÜîFggáÔ±‡õû±Ó‰h¼NFü9M«ÑxnŸ€ëºN333€¶]ÿZþ#—ËÑÔÔ”'&÷…ÎÖ{ãñ8oTb(вt@5$IŠäÏd2]«Á(Zã.—ËQ<÷DË™™áX@ í_î:.ñX¿z!ïtê—¸ªšæå“OõD:-½@»ëŠD"žÝ?¡PˆdYkenýv=™L6)Çï÷Óðð°#·3Fú©['÷Š¢Ðää¤Pó£……,À–Vî!âñxWšF´ZÛ.•JmšœœäÉdÒuãatÜmåÞ!‰ll÷çt\âåÓP½/ñNx¬
Nf³÷Ó˧žjjæÒ+Vœ=1ÁlURÕB–eÏ»øááá‰VëZß®'‰
Ýž€ëºN³³³{wïÞÍ›M÷ˆIˆp8¼Ï‰m©ª:>55ÅÝÔå5NÓÔÔO$Â×MÓöâHv´µ¥ë:%‰Ž×]”$É‘ÜÝ»wóééiלïFŽV;ØG£Ñíþ¬ŽK¼³úý=ÂÆ—NÐñ¯ìå
òÂ3Ÿé™k†Ï=AOF'Ú¸mÏï¿ßO[·nuä|We·Òâ²Ù,ÍÍÍÑ®]»„"eâÄb±Í­~``¤Áw{rŸN§izzšÏÌÌ´Ñ›ÍfqMUiåAUUÇ»‘žêÔ—˜™L¦x¾w+2O×uŠÇã£SSS-Ÿëª“ÜçôÏÞpÕ¥”g«‚wæ¸'¾òcò½ýõÔ¾W@M^<2»÷ØÑ»{æ÷9
:@ IƒAjõ›U›رVSJ\4 d2¹Ï	ùU¸æsss444ÄÚÒ¬ë:-,,¢(ˆ¼ Køý~ŠÅbl÷îÝŽMôŒÉ}0¤h4Ê:Qº ›ÍR*•"EQMÅ…BøbTeppæçç…×O¥R›¦¦¦øðð0ëT‰¡¡!J¥RäÔy’Éd(“ÉðB™’²,íÜÛ(étšTUu´ñU«µ†Åq‰×¾„X¿¿K©¨Î
B¾tœoþ<¸óÏD /™ÝûÌ/Þ¿©]WíNõáó_tZÐk7È,“É8z*ɲ<ÑKû(‹mv"âÄÀ,óœ¾!7&ÚÉdr/¢îp‘H„¶lÙÂæçç½Ö“{ŸÏGƒƒƒƒÁà'E…®ë”N§Ûz=ñríTÐ~ɲ<ÖŠLÒuvïÞÍE£Q&IRÛ;¤nß¾MNN:úš®ë¤(Ê~EQÈçóQ$“$i"
Q«÷ƹžN§GÓéô¸Ó
gÂáð¾vïsƒ¾vlÔ÷[¯§lü€ÇO§üߟ¼Èû¸ó/ ò¯ïÑé¯oÏ]ý,è)dY¦={öS7š¸9î4F$Íôôt[oÈC¡Ð>I’6‡B!h(íDÓ4Z\\$MÓ(Ns§£*Î044Dº®µ£#t.—+^KˆòikëÖ­Û(IÒ@ P÷z’ÍfIÓ´âÿš¦íÕ4mS»;Çʲ<Öîˆ"à}¢Ñè„çM¡N·»o‘$iL–å	§î_ü~?íØ±Ãñûó9_Ø'ãæßÃçóѺuë6ú|¾ºÂ)Ns"¢vß7ø|>ÚºuëæN/í‘xïþu–è@ðHgâSøÒ	Z¼ùs|õgbcþÿÛÞý·qæw‚ÿ5IKliD‹@Ä™ ÙC|›£
tÕÐGŒu¸ž'ÁÕÉ3eÁ­’":“AI—©¡é]'’V²­gëâŠ9Ìî–½˜É˜\úªŒ‘Íøv"רuõn8Eæ…û¨Œ$ˆÎˆ)S–Z’Eõ½Z
 ÿ¡Ñ¾Ÿ*—K
  /Më!â÷ûk²¸\.:zô(3::Z–¬;wîÐÂÂB`aaA”’.ÌsYÖíý…Ãá"¢r·«l½ì~NÝ¿?îAÕ±RοGÙàzxvvvØï÷ïÝ¿ÿ³>w9ƒ<¥ï‘mÿ¶jûáp˜±b.uôèQx ‰4­…ï5;;;læêÏ,ËÒ‘#G˜zkóÝÝݧÌêÕ¨EÙB<6üìȦgŸ"ë‚7¹ò½/‚<€ú•à™ÁN!à–m½´óáAm_lîuå÷û/ÔIYÑÑ£Gk2ÈCk„Ãá‘}ûöÕMXÞÜÜLáp˜A_ÐkÏž=ä÷û-ù±pzzúœ™ûˆ#û÷ï¯és®“NUª­7”sçÛN÷3L˯¶²çöϰ6ôÃkC!âTP?ÌðÌ`VØØ¸¾úÄ»è•5­££ƒŒÌYÒÙÙÉY9çI¥¹\.z饗jjˆzÈX«¯¯Ž9Ró7õíííôÒK/1µ<ÝXcÿþý¬èÑV®Õ˜ý~?½ôÒKL{{{ÍÖ‘ßïß[ɰ¾¬!^Sç.Úv:|ªr!\.ó?ƒûˆäÔ¾ë7(ÍĵÌxÕ‹UKúümîQî±MO¢²¡n(u7Y¿ßÿ\½•Wkk+


1ÕÞ›=d*§££ƒNœ8ÁtvvrµöÝš››iÿþýÌÑ£G™zú‘ʫڇ£·¶¶ÒÑ£G™Z›šCº–¨ÄÚ\Må~6¼wäþ?\¾ý£MÞ³=²3!ö‘Ø2ú]ô`¨AÖoÐÕâ]ábÑçi9Ø-ùÜ9@;j&œp8º/8ŠuûýûúúhÏž=L,¥Õ᪅´XGµõ(ÔÓ[°Öz;¡j§X–¥ç)‹‰«««U_/~¿ï¾}û.Tºg/ÚÉÆï¥u•T»ö̇Ã#­­­#~ø¡X®²*·îînêììd¦§§izzÚ’lË¥½½úûûmÖ7Yñ&ÛN÷3âÚm1xUÉm­zR·íô¿60|ìFm€§•¿Çô•FÛÚÚJ.—‹´
{öìÙ‹£¾öMOOëjV~¿¿î¬s¹\444ÄÌÎÎÒÙ³gmÞÜÜL}}}Œßï¯ÊòÖwttÔTO'”A핃Ô+¯ZÎ#‚‰S}}}#vùñídã÷Ò:LÔÎ?ÐõõõQGGSŽàÛªc€eYêëë#¿ß_•a^kk+íß¿Ÿ±zÚbš¬z£–ÑßgˆÄA^õbÿ>Ÿ¿":⌠ uøðaÛŸWÐNêèèP½ºkss3õ÷÷Wŵ°€8q‚Ù·oŸáyæ*y°,K~¿ŸNœ8Á9rÄví¾³³““Ú¼]ÀeDÑúa¬B죓kC1lŸb0·š:wzäT§»ÂEJ¬ß¨’3ŽŽݶi‡{´.†ž={¶è¯–Òµvê"eºözýõ×u
á8qâB^•e¼°°@óóóçV—inn¦={öœêììÑÛŽ_~ùeͧåööv:zô¨%çÑ¥¥%*5á¾}û˜¾¾¾š=¶PõU‹‹‹´°°ðìâââGV÷ÐËÎj蜂ãÃþ×Õ:Wj®ùùyZXX89???¬åï­]ùùyºté’åí^ºŽèèèéì쬊+âYäYÿ›:wÓã?ü.ÓÔ¹WõUâ®p‘®)x•8K–ë=¿òÄ»\K
-b¡Æêê*ÍÏÏÓüüü£beY–Û³gÏsÕòÇŒ›¥X,fë°¦‡ÅÅEZZZ:¹´´4lÆEyss3¹\.êèè`:::L™ËÈî!^î1^9Ï^jîsßÔûEŸž/;‘9
ÐDRÏ¢‡sWÊ\ ‹§­Æ•1àáÍy­Îëʤ6_ïm¿¡Ò`Ó³ÿ‚ñ?b˜–
-Qy¢îÏ&y÷® ÕØpó<-}Åõ¦ß9Vzñé½àA½›Õµ Eww7zZÕ85½wì¢ÁÂ>AèëŠî5ä	±ÿv‡€}ÜÌŒŸ[â7öÀ³*t³"àkhÜN_F€unuu•fgguMÝá÷ûQ€`
vù Öy"•+¬+ö~âÚ-ZúѰ›F`73ãç®_~! öùVö¨3#àkhÜNî§8Ô»¿û»¿ÓõºîîîSXô¤öéN˲,‡Ò«5ØéÃHAž9óÇYÔ{ÏÖ†~Œ  ÂnfÆÏ-_~!`FgõPY5ážàmfŸFeC]¦§§uýñïîîA	Ö>½Ãi].~ Ë5Øíiò¬îUWê½ÕAP9R€'ßnfW‰yð¤÷hD€ðÈÂÂݹsGóë\.&L¯KKKçP
P-ìø¡˜–-² ¯RAycÖ†~<¼6ôc‡ €uV?yM\68„ÖйÊ?ÞNxœ={V×ßY¿ß-êÄÒÒR@Ïëò@%4Øõƒ}äí²øË~±_!öZú‚<,_~A¼ñÉiÃáY9B83öùئ'àä˜Õ5ßYss3uww£ëÀêꪑ9ñP€`¹;¸‡AÞ1fÓ³ÿ¢{·ªw_ñý±iye¶|ùñ³Ìxþ9†Ê3|Ö”ó©÷6³OÓ®ßü{x9ôöÂ{æ™gö¢ôêÃââ¢î׺\. X®ÁîiÙB­SÇ6ü¿Ø‹µ+Ñj})È×nãˆ0Ù?ðÏ7dN WÎ!³òý6³OÓΧ8¦¡q;* Ko/<""¿ß%Xæççu͇‡*¥¡Z>hËè¨ò¬œ;Ϭ÷y8´v%ô:‚<Iž‘@­œ‹]µ™}š\ðòèí…×ÝÝ}ªµµXA ……½óá¡·&TDC5}Øü ÏêÅ.Ì|¯üýÜ_¸Œ ÀÖoÐ?ñ‚=ðìê)íKËþà(3Ò¯»»{%X¦§§u¿¶½½½5 "ªíäY1\¹B»ÂûB`̃õôëâÝ›çU‡bv	õ”ö§´Ov[/<‚ ÐOúS]°ÛÛÛ±âh™Õ}a‡ã*¥¡?tËè0-£pÊܽšÝ«Oÿ¾yÿ§xá2ŽP
¤ïžpñÑ6=›‘P®Ü«×¶8ÈåA€ dzzšîܹ£ëµ}}}J°~޽½5].V¦€ŠiªÖΆý#DDkC?Ö·‡r­DkÎë¥ ÏÿwLSç8RJP
ðä­•1¡•3&)¶9hÇï"hP°´´D~ø!záé$ÍÎÎÒüüü£2dY–Û³gÏsÝÝÝ5õ=õΙHDÔÝÝs0TLS5xmAžC»âû×n#ÈPáÁú
ºþq@ü\¸ø(0+Õ:-¹R¡<€âb±˜î?ÊõÞoqq‘ÆÇÇE…^Œ……qzzš˜ZXô#‹ÓÛ[“ˆhÏž=hlP1
ÕþذDyhm9¼0cŸÚö!yZ ìžp‘–æ¿–×OËpÖJωWjðŠ;{ö,---ézm½÷Â[ZZ¢wÞyG,l---Ñ[o½%ê-c»˜Õ½"-Qgg'‡Õ‹ ’jáK°aÿˆóÃa†iaÉüUjÍõîãákĵ[´…Ø/NâøÂçÂEZþ8 >X¿QôyZC6³æÄÓ+w·½ˆ ˆùùyÝÃh‰Ðo||\UÙݹs‡Þ~ûíª
ò–––t/z"ñûýÏ¡Å@%5ÔÊiêÜMŽø	†iÙbpOfõà3ÜÉ_'®Ý¦µ¡ÿ4Œ à¡Ï…‹t=àéíuGex~¡×êyýŽ'ÞåœîQx,--FÛÙÙÉÕs/¼ÙÙYM}1*ÞýÙ/Mºý¶ò¶_Ýs›:Ÿ GüôlÅ‘
5áæ'¯‰7?9­º%˜Ô•»e74n§/#Àxdii‰iqqñÜââbÀÌ`¦¹¹™Nœ8^U2‚ Ð;ï¼cZPªÄårQGGÇ^—Ëu¡µµ•ôO]]]¥••éø/]ºTÖr	‡Ã³»©›O²6…Ø/LØ“ýu´÷/jê|AÔ„—_ogÆuµŒr„tf·xxPo¤žu+++DD´´´tNZuuu•Ê9ŸzU•®›ryJu’[‡ãTkkëÈ;wž½víÚGÒörJöïßÏøý~`;uâ	òÌœ«|ñ‚<¨v7.¿ 
™qSÂ:±B-´ØëàA½™žž¦³gÏŠfyT½ªJ«DgGÝÝݧÂáðŽ°£ºñˆ´yvéu§öy"5u>Iÿð(ÓÔù$Žr¨*R€§å¨¯ÔœxzÎ›Ø§©í)Žih܎ʆºðÁ<;==ýQ¥ÞžzõäaѰ»º
ñˆˆ>û³¿oýÙ_™x{®çuæ†w*·e+9⯠ȃªñi‘!´jZÝW«E€õfqq‘ÞyçŠ]h ÀÓNúàƒNÎÎÎ×Ó÷ƱÕ ®C<""!ö‹“kCÑa}·íå¼Ý×òÜÂÏAÕàÁú
ºqé;â½›çUùv_àBéùð •kåÓRš››éùçŸG(cÀôô4}ðÁ5‘ˆù šÔ}ˆG$yÿIÇ/Îö
ïrŸó0È{AØ’¸~ƒV>ˆŸ5áÕæ!ÀƒzõòË/[~‘PÆòªiUZõ·Œþ!zäAE‰ë7hµÀZ5Gt5¬V‹€èõ×_WWWËúÝÝݧúúúFZ[[QàX]]¥jóÞ@­@ˆ§àa7,*÷È3ãVßìA{ܱíôÀÕ-ßûßv£¶Áòö%\¤Õ¢¸~£ä,–±e”£%J¶ À ¢‡Ã0?üðò\htvvr~¿ÿ¹ŽŽt‚@ÓÓÓ4;;[ö V/—ËE~¿ŸéììDx5!^êƒ<»†w¥‰
¨eô4€uíJ!ÀSw´–·¥˜Ù2·:¨=z^ýuÓæRknn¦gžyf¯ßï¿€žwö±´´D³³³ÏÎÏÏTé@ÏårQGGލIñŠ(äUox—AXÖž„‹t#à•#°³C˜‡ ßÒÒëî­%…2Ðë®:ê{qq‘Ï-..ʽ†Ëå"—Ëuª££c¤££ƒÜ@-CˆWêF}í6­„†Åû—©¼säY17žòcl¸—ZF¿àÊ&7ÀSs´VãJµ­O¼Ëmu<‡Úȧfèekk+µ¶¶’Ãá8ÕÚÚ:ÒÑÑA.—à «Üêê*­¬¬Ðââ"ݹsçÙk×®}DDtéÒ%ÕûŽ
–e9—ËõœÃá ÖÖVB¨õ!žšôµÛ´ú“l§å¶ÞÊçë¿´ù·ÿgzü‡ßg˜–­¨p0Õç7ÏÓڥÐ?rõ·*3[hëïr[à@5 JcZ¶#þ
ÓÔù„Ê[~³‡ÎŠ/ýº»?ûï´zU×n¡ÂÁ4w2ãç>åöÀcˆH©»g¡íTd»šÇJu-Uó5ÏC€V@O<
Š÷ÈÓ:øÎŒç™ÝOI¤¦Î¯‘#þ'葆ÝÍŒŸ»yù…€¶#Ðü£]m‹ÓÓ*à€Uâé°6ôŽ(Äþ_·þZž+–ññÒñ	‚<0ênfüÜgÙOÔ}$ZÛ2´¶ÒíðÀBñtZz;'È3+(çÊ´Ú¢‘Æ]m´ý'Ì4u~
•
šäxæ•Æ3ã9
ÛÉùÇ<Æ>ÊË Ä3 tg‡ðNÏc·1-[ÉFª	Ÿ¼&
Ÿœ6­÷]¥{åÉŸ‡*!žAÊAžÙClË;|¶Øvy Ö­Ë/ˆw3ã&yæÀ#"Zúóa!öó“¨mäxDÊ=ÚŠõ¼ÓÓ[Ïh¯<-=÷cŸ¦{þ@étš¤y"¢d29Ž_æçBœk±\3™Ì£ˆ(‘Hˆ™Lu‚cÀRM(ó°áÞ"¢üyví}Wì1å>UkC>üð»~=ò꘸~ƒn]úŽøùÍóy1
GSä¨b4nWóX©£žQñøcìÓÔúÇ44nG…W±d2I‚ ;·³,9Nòx<(P¥²5ZÞ8‚ËueeEq›ÓéD€e♌
÷Ž4<¾õÏ?}ñíOŵÏT¾ªœƒÍð$kC>,®ÝŠlùÞþݨñú#®ß Ï>ˆëÂEÍœží¤ã±bûTózxµ!w¸‡Y<ϲ×ëmëêê"–eQÈ`§-ƒÍ¿ýÌš#þ
ôl-ñLµ‹[è}\ë¢ŶotóÕïZÄŠu&7À“˜µ€E9¶Ð:|–^­÷0Ïó;âñ¸øÆoˆÉd
–AˆW&MO’#þj‘ ÏŒá³å›ÿ®øö‡Û„ØÏ	A^ý×oЭ⃜Obç OíãB[[Ê=´CŠÇãb<?Œa$`7™L†8Ž#Žã¨ÞæmC½@-ÃpÚrn6È[	ŵ[Ù­f-n¡çqó¼G7²±Ÿ‘(¶Œ¾È Æk—àI=ð
Í{gÅZ½sá•zœuPËïâ8M²:G"ÃkÀxž§h4š»E"s»¢^ ú!Ä+wgƒ¼O_üâý…_©x…æ¿+´]y›û9=øô–øø_T1„ªÍºp‘n}Åõ¶—3È+õ"csáÉG€W<Ïr$iÓòA(NÏó»R©Ô¥_ÍÓé4%‰Ã¡Ph¥•Æóü.¥mç*JõÕ
Ãi-ð0È{iê|²È³Ôµ_€'¹û³$­„Näô8„Z°.\¤ÛD’xÅTÃ\x¹#ÀƒbX–%ÇCÁ`ðê±cǘ`0¨x¬$“Éqžç«ê»	‚@ÇQ*•BET1´eËd2oªÙ¨œªB<‹0-[‹y•ZÜBívuÓÞÝ_X¤•Ðqy5B
ð¤xJÉEµÏ…‡´
‰DŽã®WÓ…îo¼!&	qrrRä8•P¥7­hË çv»ûÕlÔÎ…Õ!ž…òƒ¼J®N«v»¶}Ü_¸„ ¯<xŽa¥ãºÐñnÒv5éym3<Ð)Û3/ïØáy~G:®ŠïL&7,þÁq)¨BhË $P ØÍ²,±,K@`w @Á ^p.¨˜ÏbRwã÷ÿT¼wa¡È3í27žÚç~±íþÂ%Êìû¸ý'ÿŽiêlG¥W™õ›çI¸ôÍCh­XԢؑªeÑ‹–'ÞåšÏ¡¶ÁÈ…x*•"yh—J¥v¹ÝÛ+ìÔ´eƒÁ«…¦€ÔÎ…Õ=ñ*€iÙJ­S§6\è——ê[ÜBnýê?ÑJè˜xá*¼Š|ž?w›¯Þ!´j†×"À³ôôô(õÆ»‚’€r@ˆWA-£¨äU€'m×n!È«"ŸgÆÏݹü‚ª>ývò
=¾
˜¨««+o[µ§€êƒ¯Â¾òŒÎg¯ïÑ¿ÖnÑJèäÙÜç™ñsw/¿¨DÏ;«µ@€fcY–œNgÞöL&ƒÂÓ!ijåy¹J|åðŒI\»E™}ß…؇'QÛö#xÅžSíA<(‡Ã±,ß¶²²‚‚Ó!ij‰–Ñï3-£ß?•ÿH¥W§-´]$­ŸumhtAž½Üûä5QàU*°+ÇðY¦q;µþæß3ð ÚauZaÃ"¢µ¡ÿ0üpKµxùÛÖ†Þ~ø]÷ Æ+ëîåÄû™qÅÇ2¿O¦šý—ZaVÔ°O¦q;=þÇ4±O£²¡âA t:Mn·›X–-Ë{d2Ün·-¿?Ïó”Édˆçùë¹y<ž6""·ÛMÇ’zH§Ó$®t:ýKé1§Óù²Ãá˜p:´sçNÅ¡ÒzðžJ¥(™L^/ö¹£Ñèuù6ÇÓfäB0“ÉÐùóç'“Éñ"ဘPWW×@ooï„Y!šôýçææÞO¥Rá"Ÿcœˆ}N·ÛM===LWW—îïÇ}wŸÏ7
…&ìV6F$“Iš™™‹,èÎ-s§ÓI===ŒÚcÊmÇnõie[N§Ó433sxnnn\º1,UÇR»ñù|šŽ£x<.J¯D"ŒÑ›ÏT*ESSS¢ ät:é{ßûSÉvS‰ö^ìxÕZÌÍÍ•j늟ßëõN”3¤©Æó¨õ‚:±þº†çyJ&“¥®#6|/ŸÏ·»§§çªÞcã8J$"Q0d€bY+£9Ž£ãÇ3òj#Š"JÁ†„ع“_ôÈS¸™ÔiÝ®oþ—Ô2úoÔ¶µ”<±BG“Þ×{œiÜN-ðêÏóFEÙ…Ûr$i3í<-ôÊ+¯äŠo¾ù&#¿ˆäyþÑÅe© @Ïó™3g6|ŽH$ÂHéJe¡E Ø¯ª-g齓É$%	±ÈÍÉ÷
W\€¦ÓiJ$Ê_+§ÓIÁ`ñz½šß{lllCÙ2n·Ûecô˜‹ÇãºË•eY
y7$J7`•l;v«Ïr¶eù¹-‘H½	/ÅívS(Rº¾òÊ+ÊÎh=g2Û°O#!–Þ¿9•<;^µH¥R”H$D#6y½ÞØúõœ¯ìV®Å>Uõ‚:±î\håß;5ŸŽ;öèLjÜ 
Q
þ 6`N<›bÃÏ´Ný	ôl5!Ö°gÏ<á/?¤µ¡?CŠl¡{zàÙq¾;­«Ï!ÀkIÃêä7®*.ÀÃf®`{þüùÃJ7á¹7
FäS+‘HìŠÇãº/䉈8Ž»"õÂÒ#™LR4xÒ…ôää¤ÇkyÒçΆ#/£å166f¨\³å ¹L­n;v«O+Ú²2	ð¤ýD£Q1•Jin+©T*Ìqœî÷ŽÇã×åû¼}ûöïTâïD¥Ú{¡ãUëgŸœœ¶¹T*~ã7D£Ç¯ÝþÆè=÷©Ô‰µ×5©Tªbï”I[YY!AhllL,੽&…ê„á´6¶éÙ=äˆÿ	³zE×>+ñìr¯B[ž¡µÂ_~HD$¢G^y‰ë7èÞ¥ïˆë7Ï—ý½¬Z+¼‰}šZžâ¦q;*,‘;Œ#ç‚i@¾Íãñ´å±.Íøu4;¤fÃͶ47•ÄëõÇq¤÷ÂZšãE-žçó~–†Ë8Ž	ùEevÅ!*ét𦦦Þ×Ú+'wx^¡[·Û=àp8&rÊrW:þe¡‹u)Ô0Ò›Çec”R@";^–eŸsG¡ç—*ÓJ·fÙÈ%MIDAT»Õg¹Ûrîðe%Ùù"cn·»?ç¦òp:Wº©¦¦¦D‡ÃQ´§Q Ø-/ÇD"!z<Í=Ç8Ž#¥6ìóù,m'ÕÞÞs‡|jçn·ûë,Ë^ÍùŒï_»vM1h¢Ñ¨hÆøZ8¢Nì}.T{áñxv«-o3®!ˆˆ¦¦¦ÞWbƒA¦ÚæõâÙ½‚:¿–
òN‰âÚ-aœžNn¢IûQ‘ôHDþòCz°ö™øøè¿a˜–/¡ÒM&®ß »ÄÂE]™Þ€4¾ÆH׈¬¿9S¼Qôx<
7”H$ä7šb 0üãÅÜÜ\ÞElWW×@îP§ÓIƒƒƒLnžç󆆃A¦ÀEªÖ›è+¹ñÁ`°èüXÙý÷g2™þD"‘wQŸJ¥ÂÉd²_í[étºà…·Ïç+6ïÎU"j’É$q—f$“Éq‡Ã1¡7DªtÙ•J¥{¯×ý…n3™¥R)š™™ÉëA’L&ÇÍÑTé¶c·ú,g[
õ¢ñù|===êw‚ˆ&
̓%½÷Þ{â±cǘ"7›W¥…3r½÷Þ{âàà ê9xž4”nf«µ½'“IR
‹¤aEæë'¢~žç‰ã¸¼ãR

ÍOXíçQÔ‰½Ï…Òu„Ò¹D*o¯×[h¡‰~"ê/4•‡ÑkˆT*uX^VÒÜ{n·ûª™‹rB<0%ÈVòôxF‡Ëjy®ºmwvV®þZtLý)‚¼2xzY± …Þý!À«¥Óišœœ•.*•æMË^`
ä^€KA‘Ñ›†™™™¼ÏÑÛÛ;¡ôÙdy=œÌž7ÅívÓÁƒUß8N:tèP<ÿ¯ò›•óçÏ‹>Ÿ¯dp#Jû>xð ªÞÙ‹tòù|L4Ín¤·‡P¥ËÆ<Ïç

…B%1Ž?ŸÏÇp—×c£Ð
¢vh;v«Ïrµåd2™¢±,KP5¤Óé¤P(4áõz'&''7„™L†8Ž+ú¹<ÈÈç±Ëd2”H$«é¹"‚âyÙãñ,WzN¨jjïÒÐ?¥ï vÁÇC§Mi~´lX|ÝŒùi«õ<Š:±÷¹0ûw>¯Ç¹–y>³uÓ–»0…„ã8Ñëõê
MåeTéùq¡r0'^•hêü9?|‹iêüZ‰pMïcZúT‰ž'*Lföðy÷ÿa‘V~÷TU¥¿~ƒîðôÎC§å5zæÁ+µ?ùcðÀjÒdÊJ½Uz{{Ú===y7¡©T꺑ϒŽ’wÃj‡_aY–Õt!/…&äC23™Œª9pæææHÞÓKú,ZC·b«¡&‰ëÕV6&ÿãò-aZ¶‡ÆÕP(Ään+¶»·j®O5Ç¿Ö]<8p ï\¨šÊoÈ•^—L&Ç“ÉdÉ÷ššz_~^fY–:ÔVçB½’É$)…zVöù|ŠuÊóü¥9eÑîP'v¨“d2™×ã\*o­×@ ¯7  ¤f®PeƃAxu
!^iÜÕFŽø0ÓÔùd±èFÇcåê™§Ýý…EZùÝ—äT,À+ÅŠ€ÏiŸðÀJ©TŠ&''ß/ày<žåbADvøÆ²ü¢ÙÈäÔ333‡.ÐÛìP^@ÀÐÐ¥ï¡æãüùóyŒ:¤»×œdÈ/’Ô]¥ÊÆòïìõzߎ;ÆD"æøñãEoDíÞvª¹>åu"}b¶^¯—|>߀Ör¯×K@`·|{©•89Ž#¥¹µ:ÄTú·šŽAˆã8Q)˜Ñ[Ž^¯WqHc2™|¿^ÊuR]u¢t
…t—w Èâ*¯S­J
W†Ú‡á´U†iÙJŽø³:)Þ_øGytS,Ö1i»Úçjë…—»ýþÂ"Ý|í±å­‹Å.tú<=¤{¼¢ÇY³hE©Ï¶Ù9@[Ü£ð@“t:½#jêÁ#ÂŽR7žn·[Uo¯×›7ÔcfffW0¼ªçÂ^>)¡á¼•`ôâÒëõ˲zð<=,çT*•2y<že£saIsàȇÄè­»J”9NÕs÷عíÔJ}²,KÇŽcxž'·ÛMFÃ/¯×;!ú%í»ÄÍiÞüxÒ0ùÁÁAFá¼n«yðªùøPš'Òh0#•|‚T*¡_ïqV/çQÔ‰µu’N§ó®#|>߀х?z{{™Ü¹z¥ÞxzþîØaЍ<ôÄ«BR÷ÅÐZ"k<Ñ‚o'­Z{–nÿø¯xÔ¶vë7þúwÖ3ãêŽ%ÛõìKïk
=¶É9@[Ÿxh&‚4dDõj<µ¿ˆ+Mäs^z<že³†#»Ýî¼^³z¿G=µ;ÔIÚêò¾"?™1ϰÓéÌë…Ìóüu=û±Ëˆ¨,„xUŒiÙJÛrœaÃß,ðŒJ,p!ªKcJí!×>£[oýg5­ÞýON‹âú
mÇi¯2«zÝå>†ìÂçó
êšPXéâ«Ô„ï
™ŠÃ=ì2¹±Yk8M¿~+¥•û†|ee¥*ÊÆ,^¯7ï}ãñ¸Èqœïm»¶SíõióólÞ¼zDDSSS¢àʇëÙc¼j<>AP:‡š†îܹSé=w¡Ý¡NìT'òÐÐëõî6k߇#&»~ÐÜËPþCÔ/̉WZFÀ‘(Ä~ž³µRóã©}}ñ^xÒs„ÿç,m}é÷¨ÑýeTt©R^¿Aë×Xðq3çÀÓû½mvÐx`˲y=CT^œ¾ìp8&²ì¾©óz½±ÜIØ¥•2Õι’J¥«	W*YÎVSšüÚ¬ž9ûS¼à×rLTû*r‡<ϲ|å¾D"!ÎÌÌPoooÙ&Û¶cÛÁª€å'Òéô¸|~¼h4ª¸Ð…]æÁ«ÆãC©Ç“ÑyÀäíWá=IDmhw¨»–7˲WÍÚ¿ÛíîÏýû¥g8-~ð	B¼±1È«Ôüx&õ“¹õÖ[ÞzN	ë™qÝi«]Â:¥ÇX÷(mn{õf\@-G"‘гòù|ýò•gff»Ýî’gÙ(ãò‹z;ݸÖê
´Ãá@¡Ñ¡C‡Ú¢Ñ¨(¿áÉd2ÇÅD"A>Ÿo·×ë½jæ
'ÚNeonAÐ<´MOOy…BŒ|Up¥ÏÉÞíÔ‰ÉçJ•þFØì:D„¯¦´Œþ€aZ¶ˆ·ôAgTb½ðdÛïüÍjAõ–ô 3ñ¨øô®úªõ5zö§åý¶<ñ.·É9ðjj‰Çã!§Ó¹áWع¹¹ñ`08Qê]i0»,hQéAάá=Åö—N§ß'¢þz*k–e)‰0JAžt#ÄqÜŽã¤Þs»{zz®šQh;ÖI¥R477÷>Ïóa¥›[+oZƒÁ £´€Eî1i—yðjéŠÀuRïåF1­ØæÄ«1ÛNÿÓ2:x*ÿ‘rŸƒÌî…÷Å6qí3ºû7mFí)Á{¿¢ÂECû0ûNÆèœzð –õööæMÒ?77Wòuò9À²+Ì¡@+D„ºŸ'çP©ÅJìÞ¯6L£w˜«UóÜ{ŒE€õpŽfYêêêÈ£+NÏóoHçææÞ—oëé鹊҄Jr:
…&‚ÁàÄÜÜÍÌÌˆÅæN“æÎ›™™¡ƒ2Z{# í”G2™¤BCV¥EÜn÷×µLô>33cJ (%	±Ðñ”H$‡B!LøUÁëõÆ‚Á ÎY B¼Z¾IÌy7_ýѰ¸vKö¨YÃkMš¯†èÁÚg¨Ðb%+ToÈ)yLãvÚÒþ_˜¦m½¨P¨½½½ò‰öS©Ôa¥'™L†äú{½Þ†cTøï,ËžC)<*iØ#“=^)•JôÒé4‰‘H„Ñ:ÏÚŽ¹¤`U¾ÝétZq˜çùåL&³Ãè盚šz¿X˜L&Ç=Ï„×ëEe€i"‘ƒž¾`GN[ëÕáoŽ8â¯3LËV•¯° žÆ¡´D"Ý_XDe+ñõê‹Óf=ð¶>Å!Àƒº’¶,¿Ušƒ*•JåmëêêêG)>¤™=$Pin·uPàØ488È;vŒ	»•†Û
‚@ò•GÑv¬wþüùÃJmjpp©ô¼Çå…°J¦¦¦l9¸šÚ¬œÖÕˆuRk×v…¯4u¶ÓÆ Ïf«ÔÛ†u㪊®ì6à5²O£¡îø|¾¼•æ“Ïù•]õX„Ùò¯¬¬ PuÞˆƒÁ«ÇW\#;Tò0ÚNåÚ‰¼W£´q¥‹H§ÓÄq\ÞÅb(b¼^oLþ=Þ{ï=¬$©S¡P'õ¡)ØB¼:ñE·¥À3´^÷	öLí…—}¸åK¨D“•«W–÷d·ÓxPǼ^oÞ¯íòÐ!™LæõëééÁO9”†»¤Óé÷Ë}1_îµÝJ½óä7§…zÑ¡íTæ&Õçóí®t€'Åãñ¼^š^¯7æóùèÀýòϘ
ýP©:(Ë` Nê½¼WVV£dÀŽâÕ‘‡AÞ†Ö™3wžhxÛc¨Àb
ùK¿¥¸½\w*f„|ð”C…L&C<Ï?úw*•ºžû¸4÷l$txž›¹¥PÐáp àuÜ(ÆŒ›S´SŽë¼mÇ”E?xž×=Çq»äŸÍétÒú¥ºM[óïà)†
ÉdòýœPbÃpWW×@¥{ÉØ‘×ëÝûoAçCÓ#»¯
¡ Ûí&,Ž`Þ1¯'ÄCÛ±/#=†R©qwE¾=
mèÅéõz)ì–?orrRİCí<OLVa”#ê¤ÎÊ{ ÷ßò†ì!^bZ¶’#þF6È3qúÅäF犴2MÿSûj®HCÞÖûœ¦j1R¥÷ÛÀ>M[žâ˜†MO¢âèQï ù…z&“¡™™™]òç÷ôôL Ôò¹Ýî¼ÞCÉdòºûVškÍãñìF©ë?æÑvjÛÌÌŒ®ah™L†¦¦¦ò.Àn¥aó@àª|œ 455…KÚŒ~5ç>=0ÌuR%å=¡PN×Q2`»{A}Úä)1y‘‹’‰Oñ°oó·öîA­)ÞMO£3³rÈ­à1ÛQi9¼^oÞ…c*•¢d2yEv¹\®yتý×}¥9ÒxžßaôWtA'×ïéé¹ZOÇh"‘Ø566&&‰]F3WµCÛ±-õ£T&<Ïï2òþét:o±µâñøuùçw»ÝÛ˲
……c ŒB›®®.R0÷j,´@	 Nìt.”®#ä?2ñ<¿ç°„xuìawF!È3k­Š¿
*†ÒnúF†ÓªÐè,ÏÜ«Fzãå>Ž 0Ç“w3H$”&uo3ãý
ܸW}9öööæ–Œ­›œœÌ<Ïr=
¥M&“ÄqÜ•ìß•h4j¨L•zÉé
جn;vc´-+½>™L^Ñ[¿‚ P4Õp—7ºPH'ÿJ+'	¨§Ô³ÕH}=‹Œž/쮜ß
ubýuÒœ­fœK8Ž£W^yE_^o<é†GëE³ 499ù¾ÒäüÁ`°­žŽMùÍ^:¦7ÞxCÔ3ç Êm¥¡’vl;Õp㪥-gË~Y©Íh½ÉçyžÆÆÆt…<ÏS"‘PF˨	x@Þ÷ "Ån¡°ÞÞÞ	¥U£Ñèu­å˜L&k.,*°ú.ÔIõŸ‹]G‰zzäe2ŠF£×¥—2™½÷Þ{è™
† ÄbZ¶RËèP6ȳA/¼œ×oúFmúF*IM=6n§Æ¶ÁòìÛÀk79਼p,6W˜Ò¯Ãz)ݸó<¿crrò}3‡:VÂÁƒW>F£"Çq%‡r
‚@Éd’ÆÆÆDùbDDÁ`©—a™ÅŽÍlÈ)F£ÑëÉd²d¹¦R)ŠF£×ãñ¸hö±meÛ±3Úr hSj3Ù6 ê&5ŽF£bî{ªûPR:.¼^o,¨.‹P(Ô¦v$‰Ãª8NÅöÂóüŽ7ÞxCL&“%{žñ<ÿ¨­×CXÄqÜ•rödGX{]S¬÷o"‘£Ñèu5çÅt:Mñxüð™3gDù·o߯ÉiB€¤etˆ!"Qˆ}hÞNKöÂ+ü¦åK´í•ÿ½ð´4课Æ<¸ñSñpQ±XÅÅ.¨f¥×>æ ÍO¼‹:PFìVZ•1{Ckê{6žçEYÐN¥Ra·ÛM,Ë.û|¾6³ß׊¬P(ÄÈCA(‘Hˆ‰D‚Ün7y<žÝ,Ë^•]ð_Wêy—S?ZB…Zº9ŠD"ŒRŽì¼ƒ¢t³ép8佺vëét:Mé%geÛ±£mÙãñÏçÏc—ÉdhrrRdY–Ün÷²ÇãÙö­¬¬æy~\éÙëõÆAx®X{’LMMåÝd³,Kè×v8p€™œœÜPÉdrÜãñLÔúq`âñD+++yǃ¶fÏ¡yÇC:~ÿÚµka¥ãÁívS­!ôz½L:ÞpŒE£QQ:ÿ•ãï&êÄÚëÇ£x‘û7O:/ºÝî¯ç^Kð<=Nï(–*
ÿÐtÏ"€\ÊA^zá©xî¶Wþ ©³•¢µQ?ù.óùÇQ\¿aê~µ†|ð´ëé鹪4\Ãçó
˜=›Çã¡@  |d/ìwðŸfffòzKç?žçÅH$™"uRùëé:BiŽUY™«¾–`Y–‚Á S«Ó;€u0œò´Œ1ÛNG²¿(8·ë…WtA‘¶|7Dìï~ëߣ6t4jöizLçðU³æÆ{¬íExPQJ7,Ëž³ûçv:Šó:)­Ài†`0xU>i¶Üµk×´–³euZê|ppÐðÐW–eéСCŒÖÏÎe£—Ûí¦ÁÁA&Þ<ϲõcUÛ±{}mËDD‘H¤Íh‘@ °{ppaYVÕ9Wéæ8ì6€ƒÁ	ù
z¹§	¨†ö®õu¡Ph"
jë^¯7‰D3?s¥ËUÍZz¸iù>¨kÎ…¹×Ù@vÙèwñù|ƒƒƒðÀœû}(Ùò½oïn:Ã0-[<£|½ð¶½ztaÛ«GiØ‚<£…Zêõ
Û©¹ý¿7»GQPQÙá’˲Ãþjøìétz‡B8Q¶÷…B….RK-8 /gdzlV(#ŸçLϼfRè
…¯×ÓòZ§ÓIÁ`9~ü8£gh”ÝËÆ`PCÇgôÌèñx–C¡‰DÚÌî!WζS
õi¤-çÖí±cÇŸÏ7 åZºA
ƒWs¶õËžÓ¦T®¹åèv»)\5zã/YÀn+ÿæTúø¯Ú,/g-ï-µu-íÕãñ,G"æÐ¡CýF»¶;éo‹Òß–e©ØÐu£õ‚:±æ\˜û}#‘H[$Ñ|!­.œ½™ÐX_yÇJ9¯¡º0¢ˆÅQ 0qí}ú⟉wö·òGЇxªzámÜδ|‰ëß6oþÖÞ»(y“êïÞ¯èóÅïl˜#¯T‹×ûxã¶^ÚüÄ»³éI<؆4á³×ë¥jR—L&ó&x…B–ýr›ÉdheeåQ/‚R}±„Úçký<©TÊ´ÕE³Ã_¤ïy8“ɼ™s±}Îív÷Køf/ÕT6F?ÏóRù^—ÝÄœs»ÝýR V®V´jªO=mY	Ïó”N§I„]étú—ZëUz}±Ðr•«ÕmÄnÇG9>Ov*Ŷîv»¿îp8®:¾üòË¢B¨ÔVííN„G墿3šý}P'֜՜³eØ–ý?
7ËYÎPÝâ*÷.¤èÖ[ÿ·xïBŠTõÂÓâmþÖ^ÚöÚQ¦ÑýevÜÿä5qýúIóä™ä1›ž¤ÍO¼Ë4nëEAF7,¬À²,?~œÁ…Ú@5Óê6 ʦg½´éY/sïBŠnÿÅ_‹wv¡ð“5x›¿µ—¶|÷;̦ot¡ËÙпúÓØö"­_ÿá†0ψÆíߦÇv"¼0I¶7Ó†á€]]]!Ðvª½Ê¹ÝdP' ãÞEZHaž¸öÝùÙß¾|÷oþöOï]H‘¸vSý>¾ÑE›û¾ñÿmþí½ô¼³Ó¸š¾úÓôÕ×hýÆ_ÿÎú§?M<¸yžÄ{¿Ê.å÷Æc·Sö^j|üy®qû·ŸÓ³pvþüùÃòm½½½(´€j¦´Ë²WQ2¨Ð!è´|‰ØµïMö_í{“ˆhýê¯i=ýkº÷·sŠ#1Ý_þ£Æ]_~=îì¡qû·ÿkãöo?\øÞ¯H¼û+ïýê܃{¿
l¨çMOr̦'ŸkØü$a®;€òÉd2”L&Çs·y<žåj˜ÇmŠáy>/h7k1@Ô„x`ŠÆ]_¦Æ]_¦MßðbUÒ*ÃlzÐ=׈⨈D"ñ¾|[ À¼4h;UMš››—oG`„:}âTÏó”J¥Â¹Û<Ïr¡•m \‰Ä.Žã®8N:xð c4Øá8n— ¶y½Þæ¬D€>
(€ÊÈd2499™7
z íX-•JÇqW¤6FÅt:­{ÉdòÑþrù|¾~”6êôAˆPét𯯯Dù¯á@`7z íXM¾b© 466&r§i?‚ P"‘ØÇó‚vô–E€1Œ(Š(/Ègffv)ýîv»)‰0Ò€¶P‰6¦9Nêééa¼^/Z8&NÏóÄqœâ>X–¥ÁÁAÏ N@?„xeÄqñ<={1½Cé"ZºŽD"&–@Û¨”t:MÑhT,ÔÞ$g9÷ß<Ïï(ö|´SÔ	˜!@™$“IRº‚i´»J§ÓôÞ{ï‰ò¡œz¹Ýn
…Bh§¨0V§(“•••]¥žãõzcèÇ0@´;p»Ý488ÈdA(Ù¬–e)0>ŸÐNQ'`ôÄ(žç)*þ¡õz½1ŸÏ×ɤÐvìJ𛛣T*u½ÔðLIv¡„6E¨0B<€2âyžÒé4=üÜét´€jm—‚ ä­š*
ËDE@y!ݹ€½!İ9„x6‡ÀæâØB<›Cˆ`sÿ?öॊŒ¡ýIEND®B`‚pygments.rb-1.2.0/vendor/pygments-main/doc/_static/logo_only.png000066400000000000000000000400501315616372200247560ustar00rootroot00000000000000‰PNG


IHDR^^Í+wbKGDÿÿÿ ½§“	pHYsšœtIMEÞ!د§¶ IDATxÚíy|TÕÝÿ¿'		Ì‚Š@²A7ªþ´B]ÐÖŠåicíò€KŸöi]Rmk¥€Ð>}ÜbíæR
­µ+¢µU%¶
mqa‘°ÊŽì	É„dHH8¿?f&¹Ë¹wî>÷Þù¼_/–ܹ3“33÷=Ÿó½çžC€»0«wäœãÕËB:ÛŽSÓ¶fâ‚OÑ©ãËBßþeÛ—D§Ÿâï¾¹qCÏÿ÷ÄvÒþå=?-*§HŸB|ÀÍ
”YS(ÄtÙÿñAÚý¯½»·5Ýÿñ!âÉOLϿĈõˆø¤“ûQéðb*Ÿ<˜ULLùýú²Ý×þn˦Æ
#›â‡’
ïý—%þeÉW °O„F•Œ£Q%c‡M©¸z·~ÿöãí´©i#­9ðmjÜ@&ÛAN>J"e8 ^àG´ÑÚ?5ð]ÿü”:ÛŽ'U&—¬l›TÄLrx3¢òɃéÌ/Œdƒ†k×<µnõ+Û»Úe‚J‰©çgÆU“ŠlH´œÎüÙQ—V|þ¯Ûp8~˜^Ýü
­>ð!9Ôš|Ú¥éÓÄÜàÀÚƒ´öÙ~`íÁ^ö$[RoÓH½¢û>³Œ.˜5
Þßwí®[ÿÜýK·¿yW€BÒJ‰LGd…}
é³åWß=mäWð"ᾺåZºýMr©ôÙŠÏS$†x#tí¤_Å·.ÝÑ+ÐT²e’œ¤—zEâ•r¥ÃûÓï»$#ò}~ýs÷/ݾô.­î·“)‘%_¥”´J"etÏ%O0‡ÚAK·/¥Lµcæ¤Ñà¢á¯r Ÿìdåÿæ
Ϭ«JW’oaÞû.ø–æÉ¿¸à››ù&OÜñðöZòÿÊÈ·wJºFS	4L™0õþϨW\Gâiβl·{ùžå=ÒÍT;ÿÇ´·u&ˆáýþÍw¼¹Mu€õÈ”+Z.Ø&9†¹âqzƒ«ö•þ»wÝ!z¿ný^—DrQ	Šäß<Ê䨙±í‰&ÞÕFs—}Õ²|wÅvÑÓkž"?´ã‰÷LÛš>ÆAñ}éþ‹ïxc›L°ŒsÝÔËL¦^+¼ýƒ6Ì?¼½Å“¶Ï{w.'B®ŠøN¥D’¤DijŒwµÑ߼ƒ|k׆(9j‰hÍÞ7è•õ÷ó´&Änéþóö¥¼«µCU.`¤QZЪtl¯úÀu(õêŒïõDÀ†ÆµrK)QÜm—ŠIÞ5—^Ž›Ú¶fßôäÊoñ´ƒŽuÅA
ñ†Oºÿ¾m)ïj픋³G¬Êº«ºä îŵS/3‘zI'õzn\ÁïÊ„×F›M‰â3ýb±I¾—ý¬ì®ïoÝBO®¼™‡¡Ï|täñ†Kº+o}“?Ú©H³\‘fÕ%yêU—˜²Û)ó%Wœ¤§^åê$lc¶&eñÉ(ÑøW#)1݉(AmT™•¢R¤Éƒ­ŸÐïVÞÄÃÐŽ?~t;äñŸO_Û:ôýï%¥Ë¹fi@«Þ›®ä ªíj

3šzµN²•º2Oo¡ÎZbZO‰Jñ©ëœ"	1I×\0é‘q:xt]TÆxÚñ'Èâ
2{ÿöÉÈuÞÛ•.	Kj/9¨ÒWÜßBê•RÿF¹³ØâÐè0]Q‰»êæS¢º®Ý5'A×\´MÚ…?pt3; •‡¡µ+gÑÁ£[ ^@éþtùi	 7¥ªK"+G5(Kš'Úô†—‘ºœ@ª$->ÉæÖºlcJÆLUwÏ¿€VÝ“)DÕ“(õOD‰»æ\Ð5×ßF’m±cûh|t/C;þ´ê{Y+_ˆ7 ÒmXðÞy9@\¯5\ï5Pr¥Þ4¥	y	ƒ§M½Ã'ŸêÚëuíèkëE¥½
X‰‰‡])Å%êšS2ýé×CYÏ‹Êå%Æ©³«•ÎŒîåahÇó«¾›•ò…xƾ¿~R¹a~Jº‚n¾J.ê„*®÷r…dŸh³šz¥Tœ7ØÕók#IQ#KË`JT'@y·\¯kž®Ú»ÔŒHlëèj¥3‹>åahGݪÿ¦ƒG7C¼ÀŸl©YÉ7Ìo²æªyù¯¢¾k¨Þ+=ÀÒ¦f{©7õÿü~}hÌÔrW_»ŸO}€,ÆXJTŸˆÒßWñÚêÔC¥²ÕHSé±³+FgEò
h;^XýßôÉá¿C¼À_l¼ï=¾ç¹¹hI9‚ÀX‰A·Þ«S‚ÐK­†S/©ï¬/ŒôdÕáÒÈ@a¯ÀhJLwÒI¶oÚ®¹F=T &Ƹ°nJŒ¨³+Fgnà·]Uôv¼ºîhýþ¿B¼Àlš÷.ßÿ×-¡ªK‹%'ÛÒÕ{UF¤)9(ÍtR¯xh§è B:óšQ³½x>õA&®}«©Ç´*¡ñ®¹¶ÀÈÀ¶Þ4™øy鯹ën=»êœ´ƒÖïâ™—îW·ô&Sƒò%Y‘|¥0(‡˜i•äRU/¥^­¡eŸ¹iË÷p¥á1¥g(êÕ\÷òYù6õʱ®Â®9“§BùØW­“P\8û—HV)!¾µiî·Nªº0í 
ûÿñ‚̰yî?øÁW·ô
Ô¨|I~LYš`ÂÕƒÓ]Õ¦®×jÕŽ¦Þ1S+¨bò`O_Ó;'ÿˆ%.¨°’vuj£z]seÂd‚ÛíGŠ.üÛ›æ,ÿϱ—A;håŽÇB{l[>“Ì9‡]¢«µ“6Þùoþp_â°œ⌈+~&b‰íÉw”'îÙ_ö3“ì'þYy?žzžä¾ÊÇJíK’}å£~ÜÒÅ4ý‘ËX¦^ãï/ý/?Þ&¹ÂK^ÿTo㪳ýª.¶Æýr”]nÕýRJ»+j§‰ÿKŸgì)×Òâí›YÚ1uÌ}þ(³öFâõ¡t¾õ7ÞòÁ>á
©ä«ZPR™|5†Šél#1Ó+9h§`íÔ[:¢?]ýÓϲL¾Î_þ8‹ô)TÕ¬…)‘‰†X)“¢âvIªÓ­‡2ÁÉ)›²bŒhã—éKÃGò0´£~Ó½¡;Î!^ŸIwý-ãm{?¨&ä+¿¨A˜™öÏ\½6› äÐ+(ÉÏZÏ/yœÒÅtõO/õ´®«-ß'X$YvÐ=³¯è’“@PÒ®¹\bZõP.ì¾§XzY¥žoÓ—éºá£yÚñNÈäñúHºnþkRº$›´Ü¨|¥“«“°2­rñÅ‚z¯h”ƒ–´å5,ùh‰ÒáÅtÕÏü!Ý]ödR¾ÚiWTÿ”]Nˉ‘qA=T1V)0Åp+ÍÔ¨)+õè‚MÓô£yÚñÎæSgW+j¼Àº[;iýMåí›UõÒžeu\ýš¯ªÞ*ûY^{%ÆduXíúor?Åï {~Q]8ùó€ÅtåϧøJºRî~ë&ïjSÕ6™ò½ þ)í>«»Óòz¨‘}H F¦øIJ"Õ"*í7†Þ;ÄXÚñ…³~OùyQÔxuÚ76Ò†›^åñMÂäÚ[†³ž|å?«G:HoÓ¾2M9‘Ž´ÄÀåÃɸ|ìçé—UøZºDD÷_ö-×I»‚n¹¢Û-êN+E¤'+y÷]=ä͸¬”É”SSÛº¤Œó0´ãµµÿI]1$^`]ºo|•wí”%F"õÈ"Ñ3ÉW’JÏÃuF+È’­îmŠ‘ÉÛF\1œ.¬>Ÿå=¹ÅÝ|ol»*ª%pB•õïcäÌ¿ZLÖdEš'°JúAËC;®>ó™Œ'_$ÞJwóá'Z;Kêȯ:ë©¡’õäÛ›6·‘¨N+NQ½W|›úDÛé—KºDDw_x?-®k$O‹ên7iÖCéQã,?ë‰CÖdÅtdEÄéHÛzº¸'ù»K>þz`“/oˆosçdÔ÷è¡ÿÃ÷¶nŽuÍ1;a`¼¬RV"É™“iÈŠ)¦,È+¢µ±ÓXÚqå™ÏRI¿qJ¼o¤»e櫼ëhGO^Pž@ë)—*KŠ“f¦ä«qLYJl“=—¿r8M°tS<¿î—üƒOßN{"JïgJ»?iwçÓÈŠi
L=%#©ÊDùIù†¡WŒÿSFäñ€–··Ó®{ÞIJW"4‹òÕ’¨¸v+¾ºM„‚:“ éJGKœw×d6üŠ¡yÏêÖ=Ê?Üû¶)Éæ’é×P%'ªÌÉJ=@™¥É± /JkcƒYÚqùøçh€ÇòE×ç4-Þ8}Ç­Kxwë1ùDäÒi{j¸\8Í£păš¯ÞÕmªZ­Æ•m²9¤÷—Ô~Ï™t‰ˆªÆßÆÎ<•Hãì¿h+éÉŠs%x$+ƸjÕˆã]-4!º‡‡¡o­«¢#mëñ¹‚x=àÈâÓ÷ÜS¿¸÷Ä”üR܄ܸâä•R¾\uÒÌ®|e³	äËäk&
†œõÞç¼»&÷­™tS|eüíìâòk?!åÉ5åÿ™Æv²6$KWVL,+ÕhÕxdõyÇ»c4®pŸyÖ-·½KÖL£mÿŒ“kîÆé{~´l±p¨˜ < ,=ˆJ²pš“ã+;‡éœlS×{óƒÏô-¿rDG6¼Ÿ?^z57[çí9)§ºC}Rʰ¬t®c‚:¨úd©$FD4yäCw?óñã„ 4|ÐWPãÍFš_ÚXµçžeÏKzî²Ñ	éêºÂÛÈWQ£5%_QýW£ÞÛç¤|:ó»çô6mD,›Þ×{—NãL1[WŽá“P&d¥9u¢XVò…'¹ª*Þ®þwò¨‡ï~fíoA;¨¢ì+o6qè—+ùÁ_½/L¶âô+(i_8‘z<©Peû[–¯úMù2¢¼“òé¢G.gýGÈÊ÷÷'o]a)ùZ••æ¶Âš©(ŠOJ1¥°’·7²fö³ÿfAÚAeUo6°÷‡oóæ—6Èd)N»J²Ç_qfK¾iËD¹Etá/²Wº)~þÎu¼£;&¹Ì€t…ceÍËJt9-鎃wÉ{þeò¹ˆˆFz½¶­ž…¡*îƒxÃ̾$¥+(èɵ·t .-è×}õä««H¾¢¯Ö0³¼¢|ºàÑ+X4Ë¥›âþ¿_Ë;ºZ%2:Ñ+bÕ×ê!Xº²­KÆ5—ÍIWU%FE:Tvו—UÑ[»?`ahÇ9#ñ†Sºoñ–TÒ•¼ººu\Òƒ^Ý7݉µÞ’„IùªfëÝ?¯¨€&?z9‹Ž*Á›-áÁ¿_“¯É’CJ:9¦æ:­_f´ªÝ%W¦Di‚Vv=-ÛõC;Î9ýQˆ7LìÿÁ[¼eÑuŠÕ8I¦*=ˆê¶ªº¯RÐÆNº™‘¯òÒâÔþE£KèÌ{.„t5xèŸç²ä«-'3²bºËípˆi¬c¦‘V:” Hü;¬ìzªßõ>C;Î>ý—oÐ9ë ýw¿Å¾µ•do1ë}‰Í¤_3¥¯ä{Ò¨:ï×W²>'åã
×áé•7òƒG7÷Œp0*]Õð¬4ÇNjÔ›×€™H‡Òèú÷Ô’«é½½YÚ1iÄ/©O^ˆ7¨ÒÝóµ—xÇúCŠt+YðÆJúMWzHsÒMyi¯ùž4ª”ÎýÍ•,Ò5Díû3ù¡£›UÉ׊¬XÚ«½ŒÕAÓ¥Ãq)Ò!“GbDí7žV7¶±0´ãÂq¡>¹ý!Þ I÷ÓñŽõ‡„r•¾å"Y
Ó®*ýj—Ò×}µW6*ߓƔÐ9¿™éšä÷ï3!_¯)Yïªß%7—Å)Q*³háxZÝt”…¡Œ{Õ–|!^¥»÷†yÇúò¥ÅéÖZúÕ:ñ&œG&äô#ŒÈ·ß˜:û7W±¼"H×
Ï|ð
~èè&ÒM3ôJg¼kºOfÒ¡¸FÚ{ßháxZÓÔÊÂÐŽÏŒû«eùB¼^J÷«/ö”HšdErÕ°áôk¢ô 5]¤æX_|O¾f4¬>ҵɛçñõû_M/]ƒã]Í áZg¤º]Þ
—vÇ¥éR-3¢þ…ãiÍ‘C;Î<ý·-<âõ#ëÑ¡»Þàë÷¾½ï@Úô+{Û
¤_Í*Õ}ÓOx.’ïÉ׌¢1s.fЦ3,Ý4—oØÿ™tYºY¿T«ìêÕA©ÑÑt¨N‰¬wYÊÏÒ–¶þ,í8oìß(ZxÄë7éî»þÏüD¬CœbM8}úU_>,º¿*ÕŠê¾Êm¤=1ú kFÑè¹—@ºóö¦9|ãþW¬­âkb8–3éP[PRQIk¨y¹QÚÚeahÇùc_£"ò…x]–îþª룑R¬"ù’æ~ÚéW™XÓ¥_ýÒƒVÝWTÏ%FTöÅÑ4
Òuå[àk?}&ÍÂ\5Ç­Ö(ÕØ4'žŒ¤C•˜D)Q2W¨RZÛÚ‹XÚqÞØ×
ËâuQºª^à'b²T+­¦€•H8“~Í–D—K]víh9Òu›M^™òΦ/#ÅÌfzóXé’ë¥C;Ýq­‘RimŸÄÂÐŽ‰£êh@ôb×Ä‹‰Ðõ¤ÛpVÕñ±c=oJïŠ
’ÕT)9A8çêý““tÒsÅ$ç=ÒÔ¤þ”|.žÞIÓ¹lu
ÕÄçÊýH>ÑùÈû.¹Òõ†1'_[?eÌ‚«s”Â5 ]ù~Š®ºjÒðÞt¨¼€AWö¤^[Ž	×U%Õî-4¬àS>팟<ôv|¸ií;üŒkŸ$^
âo|RÐxç’còš®ü%ã’²‚Ñl®ü N¿ZÃÎä)V‘„5ÖQ1ÿÒ©¯]%zËæ‹§¿»ùG‹IçòZQ—\kL«°[άuÇõ’¡²[N’”ª,®þxÝ[›æ\‚vЩ¿Rƒ´ýyÝ­Mw.yTÞi!¡€õ꺲aû™-?ˆ¤ª¼¯ÞȆÔcT,˜éf˜gÿu.?ÞÕBd°ÆkäÄ“ºËm´>ª}©­º[.íÞË?õri=Q÷ö¦Ùׇ tІ|!^¥{äûKåŠWÈy¯ÿ¦K¿zc~Õcy•/¸ôêÒéc^‡ú2Ïsÿ:›ïnvÉUÛôÒ!#Õ¼µê%ÒÅuOe:´+*éýDznÙæ_‚våñ:&Ý×%ÑÛà€€­”̦_ÍÒc”ST@§ýðBH×g<ÿï‰üxW‹ÆP,圷zéP<;—Þ¼ê¨ûê‰JúÿS~“Ví[ÂÂÐŽ1ß„x¤ý…uwùþë÷KGdJÀN§_ND¹Ñ:ý÷_d‘3Ât>äÏÿ>‹wvµèvɧCåXVArÔ¨:)*ÉǘNø
Z³ïu†vŒ©øÄë­/籇—Ë_¦#©e¨xKíX£þkää›^ú͉ö¥€týÎëk®âÍmë4»äòt(H…FÓ¡c¢žn–ˆJONø
Z»ï5†vŒ®x
âµCó÷_ãí/|,xÙŵXU
¶+`ú¯‘òƒrî^QúÍíß—†ÿþZÖw,¤ÞXs%onkžx§CŰ«4Ýq­9j튊É6Hë°ò£çäߤuûþÊÂÐŽÑOA¼–¤[ý¿ð±lˆ–_l¦üÐSÓPŦCºã͵Wð–¶u”›þ¤“~w\47­S¢Òê¶+ïÓ¯píŒífahÇÙ•A¼æ¤û7W&]#V\If_ÀâåÒ	X÷ä#ê;v úóË Ý€òÖÚËzä+J‡éºãú'œiÑ1QqÒ;ŠR?'仓½ÿï¼nˆ×(-Iér—#½„µëÀVl®þ«~ûŽ-£¡¼ŽåF`°óá'·ó]‡ŸŸtbê4¨·ø£f·Ü°¨ôëžLûlˆB2\"߉´«ur;.:ïěޱc«þ?¶d³FGŠ€µÊiFBˆœnr½òCò¡óÇ¢aÏ^Çr ÝPðÑÖÛø®CÏ	WgЖnýÓ9QéuÃõ„Û›0ÉwWl;j;.:âÕÿ}cǨiÆŸøñ†­·&a?	8\
}öKnÈXµõV¾ûПÝqõTŠ™•¦¤dDùÒ7¿‚öµ7± ¶ãÂs­y0+ě«GºL-XfOÀ¢2„ò1¸ô«ÞŠ€uNÀŒ+£Óþ4Ò
)
;Ì·ïÿ­ný3¨Ä³v)“ÙºgúT¨q„ÈÈËíO‡:O° µÃªxC?;™Zº’:™ô…í™I\y©¦r‡ÞÙÀw”ìß;£˜²~¤œy¬çC ™aL:«qÉï)™ÍL:Zô?ÆBº!§²ü§lâˆ_ýR4ãV	&Û!ÉÕ`ÂY¹Äsá&ûüÚ“ÖôüQÎЧ8¦ÉæÛ•î«<¦qêîn¦²üÌv˜'/üÒý£BºL+‡&þ'ýëéò(SpjGi
–~£¦öçÔ3鑬TiâíLu­RÏŸºZ‡§‹'‹¥pRМ1ŠþÇ8*»ÿ
Lë˜)»á6F¼`íöÿþÓZy¤3mi'Cñ™ýtÝp'Ò-×ìjww7Si~1?Òyœ¥V	mâíj8@M3žQHWž\ÕÅ«)˜„)XöÍ(™›—)“·Å\4c•=éf§•}í¿Îñ›'¤©0G9¹ŽN2d¢Ñ‚ýåŸ_ÁüÓÊdi ݪu1ïDw3•ä÷áçŽþãUAmGÖÖxSÒåÉ	Ì5WûãÀ5wckÁFëÀâ˃E5à~_®¤^	éf)¼zNöoÐÕÝb"ÊO4éÏY új¤B®sñ´‚Ñ»}DEmýÚmß™êçv|æ\ˆ7)Ýý
é2M7+aý·ÎÈh3î÷åJ*}p¤èó®îf©%¢b¤y›^7\zOû~ÎÈV$ß·}{ª_Û1Ù¢xCUjPKW¯´ ]rÐÛ®,h—"Ô'ãW—!’ßb½Ëñ¤)A”>8í6H¤¸ô콬Oní“k²¥s´NH)»òŠÏº¤΄]pùç_KRF»çÒ}·ï˜5åÌ-b;²"ñ&¤û…t­¥ZoSpúE2SŸ’‡§ÝÖïËã	Ý%ï~tŠ$ùê½Òë†Ë‡¨	d†S!sPDÆÖЦ]w3¿µ#«oǒѦ¿Ôt¤Zn{»¬Øß³›±L‚B~ω8Ép4HèqñÙûYQáY‚„+F¥LvâTH©é¤B«É6»vWÓÐ_ã~lGVŠ7^·úÞæëZÒå6KÎIX¯!½Q¿‘pÉCWÝ
é‚tœ[¹’õ;Kc$€ÎÏ)I1í.x&d+ÛŸ56-¤¡e_ç~jGVŠ7^·úÞXõËóµÇÔ§}ÙŠ¶Ëºs¹„¦àÜh>
xøê»¿2þháìqﳓ
Ï"RÕ@¤BãõN£’b6e«¼ãáÆ…4¤ì<í°SZÑ$Ó5Þxݪ{cկ̷Þ4–íÚõ`¥¶s¢Tòâ
¬Oå Ø˜fÕúsx{ûõ'Y?›Ï\’
³pÇ¥3ißá?°L·ãülªñ&¤›JºVJv“-·ø8õ`E
NH÷«.°Ì¤q²A¿©™
vÁ­¥óÓ‰©IDAT$B»©ÖÈýRqáY<Óí°Jà.>úP=o{虊¾³xšï2+÷ãiöO¿oÏÿxï¶œþ}iÀ‹_e}*O†=€-FU<Í?Ô¸Pð©ô6ÙZIµévo¯¦þ…y¬}5ó{;-ÞXõb¯[eâåsBÄÌâötû2U7E#4àÅ ]à#UòÕ®uúARf}Ö_MQ‰|ý,Û@–bÕ/ñxÝGKN•œ+1¤Û–Wy2•,‚tóœ^ñ4;uÐíº]p'ºßÒò™‚Ýî}<)ßL·#tâMHw•
ÉZªÑ¡gfä¬Þ–W9ˆJ}åAºÀ%ʇְµõFdæ¾•Z­Lãþñøj*È+æ^·#´â•']£'¾ÌˆÖŽˆí§Þ„t¿ÎX´/ì\¥¬tæÔÓ“òµ“:ͦA'E«Gww3äs?¶#0âå±cÔ|ã³Ié:™h±ÕýyRº'SÉ¢o@ºÀ3–Μj4ùêv½} Z-ùæ+’o&ÚHñ&&0ÿïX²Þ`š5’zݱÙ4Ì%Ò=Ò“ï¨Ó_›[ìH̤hEs"™|½lGàś«a¯		Z©óº!jcåŠHÕHd”ÅÓ_?{â–’¯™4hUPÌ!¹yœTÙaDEí27Û
ñöJwŸÑ:±S"ÖÞ©šHÑšk!]àΞx„åå›Jƒ^¦Y;²îîn¦;gMQÞ+ßLµÃ·âMH÷	EÒÕ»,Ù;)éDÒÖ\‹¹t¯˜4¡7ùÚ‘]A9•ˆ•·+)_¯Úñvï>’”î>ƒb´Z絺}I'’îtHøV¾ý"-Í2æä°0§R±òñvíœ5ex¹ºìà´ìÍüÎÖªC“ät5쥦Or‹;ðk:5õ2³qõöHÕ$ŠÖ\éß³aÃ$Þ_íœ(º¿SS6è:pðæÔóŸ}NoBºOpk·PVà6ö3›^­§âhÍu³!]ÆŽ]Å
%É7Si–‘;iôÐÁGh`éLîU;|'Þ^éÆ-ŠÓ®–1H÷K³#U“àpA“o$21£’u£kŸús¤q!•)äëuÉ!#âMH÷qIÒµ"D7j½vO¾õÞé‚ Ë·´t¦£‚t+Ŧ{|Ñs4%åk·o犭IéÆm¦X·ÊöeœîÙ.4å嵬´tfÆOž¹%ð¦Æ…4 x:ÏD;<o¼îƒ{üÇcIת`í¦dçöaÑŠÖÌ€tA¨ä[¢H¾^¤XFî'd"¢–æ—©_d"÷⹤x6o¼îý{cÕuóÓ7‡xKÌÜÇÌþÌò>,Ú—JÝÂò*OÅÑ
B'ß¼Üb~èà#Ž>®×gœµžïX|5õ‹LämñÕžýJž$Þ^é¦K¢éR¯›É×zúMH÷[.-§
©aÃÊÅ3›yU°“’Ó=_<)_¯Ê®‹7!Ýç瓪Yú©Á‰E#Hº +()9UK¾^”˜ËÏ“’¯_®^@Ñþä?vµÎye¨÷æò}X²¼I&ÝÁ8*AÖÐÔ¸pÙxU
ðšÜÜbêên6ôëL<Ç㶦o¬ú9¯{ßÅ——yx_õþy•ƒ©ÿ#_tAVÒÒüòU»wÎz­»»9pb5ò;åæÓq
ùJ7Nð“xµ¥›‰ï?çÓo^å`*YômÆ¢ «Y·f—Ê×/ruâ÷0’|'øå’á„tW’µg2µ“ýqdñ1´÷Í«<Ò Éø	GX^n±gÌ0ƒœ »»™òr‹¹ípT¼½ÒuB¨Nˆ³{RNºð`*YôH	•‚i%ý,T?È×1ñÆëVÞ¯û·IÚ:æVúå:åH-ùŠæwð«PÍÈÿDw3õÉ-æNOei	i·«áSj¼üîíKäÝcDªÎ£¢yÓ!]Ò°eÃ$~L0­d&$ê4}#)®¸Èâ¬LÖx[ç¼Ä+8]^0_Ç•¯vEk¾
é`€QcW±¾g6sºáv‚>_M'Ÿ:Ç‘Ùo¼îß÷v®øÄEa:%nóÏ©:Ÿ¢5_Å\º8 _Fþ‘¨UþÂW®µ=üú|ï„ê¸!]ìÉ·D2³YX¤îîf`p"u=lM’Ó±dm´{w“C¥/ª;Æž'R5™¢57@ºØà´òZFDüHãBßýnvîÖæ—3[jèxcm‹ýê‡ú¯tÕˆfCº8'ß:ÓJ•¤Óì¦Þ!‚…3=K¼Ç^_ë°03û­ùÚìHÕdÌ¥€ÃòÍÍ-æO+™Ib-¯L±#pËâíjØC‰	̓ÒQài¤ûuH—8eH
ËÉíÏ훊öØ-7X.5t®Ø²+sÍæŽþ)˜v&Aº¸Ë Sç²~E—â…°#Þ±ö¡NÐÙ?Æ)š75]< bT½écùôϰ‹¯ò\¼]
Ÿúü-6&èüGRîÐRx„tR ã•r,¾ú5ÏÅ«¿`epþäUÁ‘€‡ô-œ˜õ¯AN¶¿¸àyê·.¬¾äþ0÷éjØOr¼c‡©ák`9ñ&ºèÁ/5t®ØœÁaqd¡x;w˜y>ýcgbËâ͉FBy¬Úž\Æq8à>{¶]šcíÀžjËçþ,‹7ÿÂÑÃÒw‚ñ§ýÉ·QrÀeZ.sbžƒ,/5Mž˜r{î÷¥ÎcmÔ4ã!ùàžt÷íœ5Å­n¿×ôLÌÜ´}¯š@~¿8¨Äò}òÀ%éºù^×wí^gO¼_¾À£/o$ÎcíÔ4ãA¯[q/ìsxß\î¶t3AÓÁGl¹Ï–xó/#¹êË/	×~Ù!VýôüxÝrÈìß9‹7†dR)…Ì7aûŠ~ß¿fv&–åq[Ò/ö¤Û’œ=hõÛtÄ[ßa_ú'Ruá‚üGSÖR3ú¼/ö¤ë~w¡C³«9´¼ûnjšñ·v!‚†õñ4_.Q´æ&Ì`€ÇÒõ);äæÓ‰îf™ÎÈäòîy•C©h^ÕìÌP°š€Ót-ê–S¬ú)\d€{¶Lá±Æ…›eÌhâ4¤¦ž9ø˜¶oŠÖ9Ïóö'—zšF½É1;7LâñÕ!<êô/I±Æ…ªcL&oŠ¢y׳HÕE'RÿJ¾˜Û÷¤K䯓oZÒõMâM«~ŠÇë–‡ôcÆ)¯r•,úcÑBu «Ù%.÷õÑë¬t}‘xSDknbEó¾ÀKÀŒ%ð®†]Ô4ãÿ|¤+Hº~"f&I÷/I­™ípm"ôÂ[.­¹iv°ÄjÈd3[×°U^ðûØÝƒî V‡Ëžˆ—ˆ(RuÑoåëm½8%ß®†]8AÖ°mÍλ›]e&Só)åµõÍ6/	Ψx•¯?OÄu5줦?‡|AÖH÷Dw³)Qfªl`UºwΚêv;\9¹&¢sÅFj¾ñW:]ó`—äY´JýåUÃÑ	²JºîYÞÙ)éš¹ÿ(?\‘áT²èn¦=‡¯_kíwKÌl†äÂÉvIyÁ«Ôê©ç²"]_—¤øg–;¥Š”|ãuïa~
Z.Ûú“%]¯Dé…”sr‹éäòÚúC’ò‚WÂ÷¤Ô Å›^§hùóEknž©ºx]dét`.Ý̉úÒ%ÅÜf×÷¥Qòu¦ê—¥‡äĪ7?^÷.’/¬t)–êq2¹zQ>Ð{N³Òuº9™zcÍÉ7“#¬?'ä‚,]7Å“‰º®tYvÖÝÌ29n8#¥ÙãÄÚ%caýtŽÓ9"US´æfL®|Ï‘}sù›«Fp™f’®‘ç¤RƒÌüÑÂdòšɺ¿ˆ&§xÝ?(Vý$¦•¾æÐÎY¼yß<Û	Ô$ëÄcöɯ0U^põ¤žÞðÔØüÏðH°^Ì,'^÷.ä|-Ý£‚	ÌÝ*-8Y:0òØ‘‰t¢sóK;rüòƳh!
xñ‡,Rõÿ|œbí=OJ¾˜ßø‰ÃÒu3º™&•Û72‘ºâ«™WÏoôw´¦î^x‹UÿŽÇëÞs ã¤h{œ¼Êr*Yt¦•¾•.÷ÁÑâÄcD&Òq…t|îÓƒZã­¹Y‘|3=\Ì©ÇJ˜ßágH¾ £ìß2E3éÚIƒN&I;É´ ™týÐŽ@ˆW.ßLsÿ± _Iöm˜Ä;Zß1,¿ˆØ¨Œ#E—ªÊ~jGŽŸ?Ñš›Y´æf‡§•t{yyã$äûSÞÕ°&žJ·S2—®™ØÛ£¢¥3©³õæE;B)^"¢HÕÅìÉ×…ÝÇë½?ä2)]'DäÆÉ6«•ΤvŪ~(-N¼æåë¶h¹¡¸%Öù×Ù¿a?_mX,™ì’[yŒ”týÔŽ@‹W_¾AmúÇ€|›ìY3@•tÍH%ÓµÑtQT:“â–êA×¢|K—ÎWÌéëNÈÛêc$îÃcmÔ4c×ýó;ÇøÔÀæf…âT×*²E)ÝÑ#]¯Û‘â%JM®ãÄX§’²=Ù*ïÇcí«~|>䜔®Õt륄­Ü¿¬¼¶¾Mc}4/ÛzñZ—¯»csÍßWȸ•t½’°Û".+¯­?’œÀÜoí¥xË×ÉÚ¯²å¦öU?ùKì5¸T›v"EjÝ?%Ý ´Ã±2…›—›¡{÷aj¾ñ—¦•ôòÂIíý#U—P´æÛ˜V¤¥­qá²#:«FpO?¹îYÒÍd;*Âtɰr‡¤’E÷¸´š…Û©ØØþ‰i%ÃÌf@—öÆ…ËšÓ,Õc$µyQµÚ•X^[ßlp}4?×xŸx{~ŸX;5Íø™…áXN•!ÜØŸ+’ïg‘|¦tEI—»öitïÈÝ/'·˜rÒÌ¥›‰vdmâíù‰&“o¹ÉÔ»t+ßW™|ÿN±êÇ0¿0$]³	—ÚÏn‚TÞ/'·˜r“Kõ©Y‘x¥É·åŽ'xÇ’}lÍÞÇØ¾‰i%g3íëd9­ûæòVÉR=Ü¡O#÷É¡•týÒŽ¬O¼Òä[üô,Ru1enœ®Õ4lì1»vPÓŒùœÇÚ`ž,¦yç,™t¤9§S¡›#ôÊ~i‡UrÂú¡ŒÖ|‹Eª.ñP¶Dî”Äû@¾n\gÕ£vªûn¥¯÷{HËAhÄkK¾Î]fÿ9Òï×Õ°šfÜÇ»vÀDY*]'®Ó#ìÖv")W‘tƒÔWÓ²_k¼"Ž>ôo{è%ÁYMÅnìoþ<4‹ö£’E?ay•°RÈiÙ9‹·ë$]îø§ËÛ# ?2‘x|5J;ÊQãÕæ¤;¿Ä¢5ßší\)Á»‘FöIL®ƒävš¶LáñÆ…º)ÌÉìõ8Ù”tƒÞˆWB¤ê’	ùº7¿‚µý­W.ߣÔ4cäR7Lâ­ïî®fê$›Ù²‚HºAjÄkX¾ÿeaBõL	×hç‘K’ï<¯{ó;„Lº]«FØ“Ó'§¬¤ÇüÈD¢ä¢”AmÄkP¾Ú“ëx5šÁî~Úe‡Xõ¯çC¾á“®W%§¡‘}û•Î$’$Ý ¶Ã,YqrMDb­³É«À¼˜æÃ©R¿ñÛ£5ß©ºtôLš’KõXù$øõäWH÷xãBäv³xr-kÅÛ+ßù&/ÁõÏh#·Í›¹»ð–Ï#(%§uL÷Îs?QnŠ«0)Ý ·c(F5˜§÷ÒÛBƒo‡õ^'N®ißÖ:§vh¬úטÙ,ÀÒ%‹%¯»åF÷ë§nÛRƒkÉׯ	×\NˆTM¡hÍw1³™Ï9œ”.wä]÷_r”J7èíP^KŒY;¤rðQO$ß²•Jf6ssDƒ“£Œß¯«§Xõ¯| ]#	,Þ–‰ä˜Úw@ym½4é¸4 ¼ÖÖ{Ä+mS¬=y!‚™9}½ž'É^N(˜v>õä{˜ÙÌg4ê¬ìçôkt¿åµõGuVP;¨PRb@âu€Äœ¾?19§¯“enóöô÷ëX²’šfÌÁä:>áXãÂe‡?b=ë£1“É,Ó©ÑÈ~ÊkëÛÒ¬vȤ‹Äëiòu~~]·S®h{^åp*Yt’oéh\¸¬UcsîÑ'Áí䘒nÚ!”®ÕÄñê«~ŒÇëþîSáZ—n
È7³Ò=š”.·üzû‰2ûé..¯­oß9kjÚ¡™t!^×äû[‰|½®–¹sîÐATüôX^åpØ0ÒÍDÂu{T@Nn1å)¦uj;JG×SŸÈDmB¼™”¯?‡¥¿-±-1­ä|È×âûæòø¾yŽ¥ÜL§Få~9¹ÅÔ§»™…¡é¤ñfL¾N—Ü--èm‡|ݧmç,Þ!™K×+9y%.–”nÚaDº¯G´?ùÚ®Ö9ášÿè'Fu,€|=nÐä›nQy!¨í(1(];âÅp2Þrõ°hÍ·MN+éÄ>Þ$`k£ÆË«y¼nf6sXºÉ	Ì&«—“…û¹]oŸEÒ
r;ÌHׯI"U—.ˆÖ|g¶7)×;éÊË*Î×½
ù:(]=©8)'#b²"%­Çè™Ø#Ý ·£lüvO¤‹Rƒ
âuïÜ«þí|ç…ëVGÌŒŒÛ¢5·ÍŽT}ÓJZäè–)ü¸bÕ§K™¬‰ö‰L$&X5"ˆí0ºžrr‹Í5^ïéXò~´åŽß¶ðØQ£¯š‹·;+ÝEónÚ]xË1­¤IZ7LâÝɹt3-Y7†dõ‰L¤œ¤tƒÞ«Ò…x3HWÃjš1/Í%¸þÑNÄ‘ªÏQ´ævÌlfAº~I¸N~åK¥ôvØ‘®ñ¢Æk“¼Ê
*Y4Gçê/'J™“n¢¬ò6ŪoZ#å…
“ø	ÁªVjœf“’ÝšhºÛ™†tƒÚ»ÒµÄëš|ÝàÜ+é¦HÈ÷È7t»%룹)ßLŒˆ”Τ\E)ƒÔŽÒ±«2&]”\(;´ÜñkƒK¬ûg™™mÓ>Cý¹ó;(ˆ	V0óêzÝ-7û鋔ΤŠU#‚ÚŽ¨Í¹t(5@¼“Xb}®Ž|3;1Žéö&üT²ègo’VU#ÂPÛI7¨ípRºvÄ‹RƒÓ]ˆh?*Y4—åUV„Dº¢d¿•šfüsúJ¤ëEy¾ÍÈí‘ҙIJ0´ÃiéÚâõD¾v¯Pˤt¹†|·e½|[
.JéiY¹oߤtÃÐ?Iâõ@¾ùŽ3 T«£ÒÝfEðÆÝÕ°/¿w5l˺÷÷èšœ4–êqSNvVã5#µhym=”ØßIâõ@¾^œÇ"US(/@¼§«a;5Íø	O¿š…Û‡Û’Ÿ2¿Ë·cËÞÝúNàºÞF¥•™HyñÕ,툎®'–Ái!ÞÐÉw¶ÆüÞ/ûãTÚ•R0íê_s'cÑ“|õÚSL`î׳úV¥•›”nÚáéB¼¡—o@¥+I»Òmy•§SÉ‹÷ûF¾Ç«Fx‘ä¼’–RºAn‡Ÿ¤kG¼¸€ÂgäU§Ò¥³¼ÊáÊVö5.]"¢®õ[©éËwsã‹„ºX^ph©+éÆé‹	D—Њ¤ÔvøMº¶„ÄëO—àÞË»¶g({9€µ†å³Ô—Ì*ùóK¾)éú5ÝÚj•™H}tjºAj‡_¥‹Ä2ÓJ.$ßL(Á=é&Ê*[©uîcùïÜ9«'éú5ÝÚ¹„¶ t&õI&Ý ·#LIâ
¬|3u›ã™žˆˆâ/¼Ií¿{i‹—¯kwóËWukËDÉÁê}´nË/IL1—nPÛѯ¼6tÒE©!@e‡–;åKþe±Ó毃ò¾¬ÿITúÆoYî“=y=™X˜Ò.´›'’nPÛÑχ˜£ÔeÉ·øé±HÕç<:¥#Ä\pûS/óŽ%+I»W^D…7]Ǽ2æ„€Oæ½5+¬ÜâéÔwÄbÏë×¼»™º>BN¶£OÙí.ļ+A¥cKþyWÇÿ¼¿sÅZâ±VÃi7ÿ‚	TpÅŸL»h”ßn:º›_¾ª»å•×N´¾C¼s‡!i±ÜbÊ)º”rû_[Ÿ§37„Çí î–WÈb;(·x:ÆåB¼ ãòîÔ½çuþsð;ää»s‡žü€ß“­¥¶7.\vB¹v[~…o$›ö˜íÜA¼cñÎtB!áÔ9¨Ýz ^Üæÿq!ꈠéÏIEND®B`‚pygments.rb-1.2.0/vendor/pygments-main/doc/_templates/000077500000000000000000000000001315616372200227575ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/doc/_templates/docssidebar.html000066400000000000000000000002031315616372200261220ustar00rootroot00000000000000{% if pagename != 'docs/index' %}
« Back to docs index
{% endif %}
pygments.rb-1.2.0/vendor/pygments-main/doc/_templates/indexsidebar.html000066400000000000000000000017531315616372200263140ustar00rootroot00000000000000

Download

{% if version.endswith('(hg)') %}

This documentation is for version {{ version }}, which is not released yet.

You can use it from the Mercurial repo or look for released versions in the Python Package Index.

{% else %}

Current version: {{ version }}

Get Pygments from the Python Package Index, or install it with:

pip install Pygments
{% endif %}

Questions? Suggestions?

Clone at Bitbucket or come to the #pocoo channel on FreeNode.

You can also open an issue at the tracker.

pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/000077500000000000000000000000001315616372200222465ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/000077500000000000000000000000001315616372200242615ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/layout.html000066400000000000000000000063361315616372200264740ustar00rootroot00000000000000{# sphinxdoc/layout.html ~~~~~~~~~~~~~~~~~~~~~ Sphinx layout template for the sphinxdoc theme. :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} {# put the sidebar before the body #} {% block sidebar1 %}{{ sidebar() }}{% endblock %} {% block sidebar2 %}{% endblock %} {% block relbar1 %}{% endblock %} {% block relbar2 %}{% endblock %} {% block extrahead %} {{ super() }} {%- if not embedded %} {%- endif %} {% endblock %} {% block header %}
{% endblock %} {% block footer %}
{# closes "outerwrapper" div #} {% endblock %} {% block sidebarrel %} {% endblock %} {% block sidebarsourcelink %} {% endblock %} pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/static/000077500000000000000000000000001315616372200255505ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png000066400000000000000000001452771315616372200275440ustar00rootroot00000000000000‰PNG  IHDR)‰+ù pHYsHHFÉk> vpAg²gÜŠ€IDATxÚMÝ;–›É•-`¬Æ$èÁ Ž‚ÖÊ1È Cc€Ñ–Fƒü4ÒÃ$(ƒRUA*éJjz¸Øû;Aª{u‹"3ÿqâ<öcóûË_þüÛí~ÿ}÷ûû¯ûûý·Ãýþï·ßw¿œïÇßwßÿço¿=~9ÿ¾ûÏëýþ—?ÿzùíðÏᅵÿú‡ß{üþò×?ü~ýËŸÿöøÏëßÿôËö·Ûï×|˧ývøuÿÌOßï{üëË/Û߯ÿÓ¯—ç'_»ýýO¿_ÿý1ÿùÛá·Ã¾Þ¿î½üåÏÿø”OýÛãù©ïùö¿üù÷ë?¿çSóÿïÿòç_¶;=¿ãÓóJ¿œó{üºÿë~Ùæ{ßýíô—?ÿûãó÷wýïû|{~ç>Ÿóüeûë%¿û¯¹ç5Ÿ¾ÿO~&Wðü}÷Ûío§ßnù¼_ιú~ÎOçŽÿõá—íóÎÿÓ¿¾Ü¿~ßýýOÿøô¼¶]îîŸßïÇ\ï—ïÿ“'ðü¿Ãó;ŽÏ¿=ýíôü”G®á~ÿ¿?ænþú‡ûý?¯ùÞßw¿^þùùùyϧõ÷?ýûãó\rýÿyýåœoþ}÷O¿lóÌžwôöëþù–Ï¿}éÝžï÷ÿ÷¿Ï§÷¼æßwù¶üͯ—ÿ|ýuÿ|+»ßwÿïóFŸÿí”gЫ¾æS~½äïÿñ-ïì/¾ÿý¶ùíöï·¾ŠÛ_ÿð|ˆ‡\Î_ÿðŸ¯ùÿ¹ä}ùûŸüon0þ·ÇsYœþú‡\Ü¿>ä‘ç_ÿù=¯á÷Ýýø|ñÏ‹Ìëx¾äCnùùÉŸò•¹Á|ûõò÷?å±üû-1øÿýoþ%íÿþø·Çóv¶Y>ÏÇtÉßþþ’ozÞü5 ä~Ͼ”ós©<¯â÷—<°çÒ8ÿçõ¹l·ÏO¹ÿçk>õ—óóú¾d)g1ÿûc–Ïóï÷¿¿<Ü#KêŸòÓùŸ|oþ6îo§çbÎKxÉ"üýšoËkÏky¾î{®æùç÷<öçÿn³0»e±?÷‘{ºÿù9¯!OæßòÚó¿ÿïó©Ï%rþççüK6EžFþ6¯"‹öù§{>%Ï- 8KÿyÅÏír¿çÞ~9çe9déeñ>bû\H÷lœ<Óç:fƒ}ÿŸçÿßåiféåóþþ§ÿ¼>¯sŸžíœŸûÛc“ ÿÏ×þèóþùù¹Û¯÷ã_þœuß5÷Œ¿î»¿ÿþh%>wÞ·¼¦¬ñ|Ë%fÿþþ\k÷ìßÜÌßNY,yØÏÏ»ÿ~Í.ûûŸþòç¿þáù8oY‰ù¶ßÏ‹8ý²ý¿?þvÈ féåõçå?W¯©ûòÔÕ~MôyþÜsçUä…þv{î™çîÎÿ=÷ù98;*Wžù¯ùÏ,äJ²üŸ{æ˜+¼ßs}ÙOÿ“]ûŒJ§çUó0óz²ÌóÿóÕ=þ²Už¿³ÿ÷Çlœ|câZžZ^|>/¿õï·<³üíóŸKë”È•í“×—h‘ˆð|¦Ÿ²•žï£¿‘œe‘¨÷Ÿ×,‰|ã?¿çUçä}dùþrþ×—Üuî8$‘.Ë,¿ÛHþþë¥ïåùüòFÿþ§M^In0_ÒUùž™Õùû{R^Ëóå]s™Ïð9a)_úü×Íûñ¹®yŒ¹ýÜföL¾2k3¯ÛRùíð¼È{nño'û<ßüû{>ÿ·[w–Y–À÷ÿÉ…eg<_ã.¯îo<ØüÝsq}ìžx>ö„ú¬úçm½ä‘ä{Ö³ã~9çSžâ¹¼ŸÆÅHÊúÏ5玞/ð’ݘË6ÈŽÊî~Fš[‚yv¾áÕNN¼Ê Íoå¹d§vÿ^óiy. ùù×D†DÑ,†gT¸'^<#Ò5wû|:ïyîY¶‰¢k =_Ò6‡Ás©œó~9ç Íßf!=Ÿò1‘ú¹Ny "ažýó¹¿dä»ó»YÝñyÏcî__™žÑø˜˜h»?Ÿýs³oòȳž»ñ–]ó æŸ…|_žKÏÉ™õ˜WôÌÚÌJ€ÊKùíöü×k^Z‚¯×ó¼¼—„è¼²}³C³†s;Ïз~Éd÷åu'¼åAd…ËKòpr¶fe' þ¾Ò²àþù=ßžúÏïÏÏßç{òâóšóØòÐrNçç.s.æÑfåEþíáÈÊÂÉ1Ö½üÜoy™YV²Œž¬ï½ßçËÍ'w<Œ¼ø¼€ìéç ÛæÞò›ùÉdP¹Î|G£Æ6ç¹£á~ÌÍB{žâ_ò»Ù¿ÿ~ËçI?ãË#Ë18‡hr†,Ñ|F"Üs'_¹²|òý¿^òyYpù³h&Ê3ó$Ér¿Yü6Ûó}Ü6ÿyuJ²ò± ÃùµÜô3ü_z‘×¼¨<¤„g|H^qÐ?>åç•gf-öL¾J|žñà”tÅm=ãÁ£¹À>Ë&·ŸÀ›þ×—\X>)éQö]^w{–iRþ5K/k77+•)üû-ß…™Ãë¯x¾îKöJv­»v^ö÷3¸7 =ó»(YA®/‹$‡C›lˆ¼”,Ìç2Û5õz4idËòɱ”´±yÇ>{0‡]6Iwþ5Q%ÿš×“ÅšM•C¤÷sKìÌ^ÍÕ'‘Kñ<Ù¿÷¾æÄλÈ3Ï6Èf'çàÈÏeqÍûzÉ’ÊÌ«ÍbÎrÌw5þœe›øòOÙ¬¹ƒÜüýO^YÖe{n;£W›\4ë'Iú–ÏŸ²Ïòº³/³+òò²—s‘yÅråœmÍißžrAÉþ³+ó½ù·,º<ˆŸ)¢ã&a8ÿšïÈcè øœoËžùÇ·Ä­<ÚÆ¦Ay= o§çÕ?܉£­j¦Ä(!҉إrëÝ5øf—e©äE%¼æ~J»€¹ƒ~ÏÏß&ÂeYªÖŸ÷öÖJä‘-”ðžWû|ºû,ZòðÔI_óœó½Úš*‹¤µy¾©ž´óÏ(pì!qMüS™%‘ôæ>Tpùä<ßdyñ¹®üFÓÆæ‰ÏøÚúç¹6Ù¿¹éçŸbRª„×¼”dÍù•ÜFJ²ìÙìÚ×{ cηîýág‚ñ9;>¡/«=äð¾ee&väwS&nd©5òj“@år¹Ï×ø17Üüþk.<Ëê__ԿݲÆeî ðyy ð¹ÒœµÉä#Éêa’éçÎrxÈàó(|ó =WÙ ÒžF® /êœß-îÇd×=²®=NÉC’PåÞ²¤z(’¸:iŸËûµ[à¹ë³ó’g<ë€ï½âDÖ÷„÷öœçÏ}J¡’+HÎE£:éS8§äÎ’I–‘ƒ&O0Y}þ6›)ËÇvÎQ™¸“O±%’«ô0¿dKæén’Ó?ƒå÷||NŬöì¢T¤9mZŽ|r£Éò°²S/äet©ì³óÝñÏÕ™“)ÇŠ‡£Ó”D%Ÿ‚¨¯â˜ô-'\‚oœÓ*¯07‹!·œà›p˜+Í.sþ%Ïnï!gè=Ë& _Vuî#ý EëtNY¬ÍŽ  ¢îéSA^@L‡ïÿ“À›Oî­þóRmðý²<óWÖÒ ã˜W’CNI˜§ŠêçíV$?È“—“嘜?Ëãš¿eÇf'§`sT=»mJ¶Dåæ6»dù½¼™,ê\]–^ÌkrŸÖÛÔ8yy2ݰû¡/yÏùwIê&§PY¾È Íž–ç!jd$΃ûí–Ûï«K!Ö˜ê³yï-ûRc(g™ ¾—{kªyή4ýëC‹¥“]ýž˜ÓÌ|ŸVÉ,ŸÏйßnyØ©,Ÿ„Í,[9ðß–TA´„ýì2û¤éѹEí.;q ©{û˜å˜»Î''·H ÑÎÊ÷=‹Ì¯Âgòûè«S7¯¤wtãrìLâõ–Nec9æ8IJ—c1ùF6VRÄDÚÜe3™}zþ5O7-¤”³yY\IÉÓ±ÉFKi´8¶ÑÓÊÆ˜ŸÎïäÐÌÖÍ•ú”dsù»,fÛ%Ÿ˜'´IøÏi¡Í’µÝ¨›—|²Í‹CwãÃNJIf©$Ü$Ì*nçðù(’=ä sÖ&–$À?â%/"§iK–«ßí¥ï†Û#{†Wé`þ”Ý”‡˜ ßóïòüÓ-û'/O™8§ø!á-jšºëù{ÎLÞ®Û—…”ßNiÔ*ú˜:•Èsé­ÆLº ¿jìܧ›?i‰?Y*YR©òºؽZ¥'F®¦Ý·S¶PžùóÉ4JåIç ÈÏ? Ô¯2ùgñšŸì+?—û´¸²’ç.uSò¯Y® ‡xŠyìʇÚ$J Û§»Oɲþý}“s&i¿MȽ$£õPÒ¬‘b¨³Xr²g'ç´ïWÞ²Ö$ù­àäÙyHÙý õÙÛÉ7²¤²[’+kí&@9“uó‚’{gÇg®Q”Ýÿ³ušÖFöbŽ¢<Þ¼¬ì¨,Bõtò޵0ó·É†LS¨±ó|r»~·<Îdæùÿ¹ ý\cÃÜñý˜]¦‡‘R+{*»VµŸg•oo:øÚEqKÃ*÷Ÿ”§‘ç"AsdL²®mîéGû{þS±Ü…Õvo{8lNW’ƒ¥í¢m>¥qæ’Ô/‹¿Ÿ÷9F6q"uþîYfýæìžÞû{SVh_ÏYêçA¤á’W’ÕÛTè”0™Ã!?ŸÌú’ ·z?çÅ;ÓUäãÙoyèyPY>I˜òsþçµè_5úÖ ß6nÛ~¤8KL"×þÀA®’×–ý¹OÚ#ÊC´ŸünŠÚ,†ý´m^\{_÷>./Y÷#ù‹hÐ.É!Ë&޶mîÙ‰zMŠ_Z³·óî`KŽž¨Í“sZŸÝ˜ŸDXþ\òó|³»³às¿Ù9³³Õ”ªédß&FHVsÌf %*%ndq'õ³@ó’õ ô_t*“@f1¦ÖȆûûŸ6]‡||.,ž›¬Ä„ 5gXn*áUk7'7œàDÌ…§¢7¢HÞ™Ÿ¶Cv.4 œ<º,/mÒì±_}ÇžÄ[YsÒË•TæRëæfL ðg>/¯,ËÂ#iYy\²‘.šcr•î“Çž×!i˲Î3ÈÞIo®uÏÅ PL) ó:²ò¹‰9Z6ÔDK£C‘%¯ßFmšg“i­ç’Å-ýÍòÌõåJm±Œ»²%-ÚgÍkMÜÈæT„¦i—ûΑší˜wé˜íaøjÉ$§QPj&é9üß“‰lòâìË6ywJ»Ü`Û<œD9»g÷-+/\Îß&Fd¥æ”4ÚH»(+X kÿ&Hgáå’6³:[ùœ¦9º£I²dëɤ g²º¶I€ò›"’? ú^cQ«íYÀY@º-â¾wI_[;?Z[Ÿ }rÏù“ëïc_Êë:bä:‰…ÉA ÈÒ°ÊkÌ·äœÎ÷Ú¡ mµ-vM^Òãk›ölž_²‡–Þu>£‰Ü6ßšE˜+j_ð½ýš]òƒÜuk’¶Ÿš¥•Ýr3ÏÞÉŸb¤•ÞÃt_¿n$YÙÉ1ûCׄkU¢~“ê,Ó«Êe™—½Ô“3=ƒ†‹@›b©ü[ ×$Îá”i-ú®ö`öQG3ûŸ™¼–ä¬ÙM­a?æaK*óB³øRc'0›ö¥šHEÐÓí ¥¬žÈCÌ>“ÖJDz,ÛgÊySm?ÏéËŒY_ì6‡W_ã!ÙR;ô¿I”³:ÚÊpzÙ$¹ÒŒ˜r¯ õRÝ´½dëùÝVù—\A^^®&|î!{>2Ì”ªYÉ(DÛ~ïmjµwsS“‹¼Í|r7S;¸y¶ù×4ûó²™Ä²Ô`›4*V{'%x´ò¸•xÙG­ãÏyy­Ô/š™­b)¦òñé‚u´qIj• o­þ’×G#!/-!-«3Ÿ@¦ÞîØ8g÷%祘äïr}é$(»[Ð%‘ó&=ºzìæiY„m ]œ}¦ָýkÖ–ˆÔ¡Ù—ž—Vï}è)(5­óœóÙ ÿ{)&ZžiGÎ÷ăì÷l±¤’-׊HP7ÆšSþ%EJÉÔ$Í}¶iˆëäZd?bD"_z›ŒÝ[þ›H£²Zs[¹ÁÕ4é¤í®…§oHxÉ ÛŒò‡£Ý‘ÆŒœÚzÎãK@6MË'w"uÔá+šåK÷Æ($/¥ê4¸‚ Èùãš\k{i—|bÂ5„KZ4m•sÉþÁ)RéH4Ò\ÅWÒGò€ÔQÈú©×¤µz9¼ŒÉó)ÙÙ-<y Y¶=ªîééÿ˜¸Ÿ³?3N*ÈåÒìVs*‘µ5Á.‹!¿™E ¹—œ ¬¦p“ÎsÍÝ·3Rƒ«ò¶fŽØ_ŸÕ1¿m°žë6¡Ì›èqÒÙmú9÷ã&-ÿ˜Ç$°§êíÙºp¹£jZ6¬åhM*âÚÖØ¥šmåpH…›L!+Š&7Þéá~õu¥ I;$”æØ±l‚k™î`@S‡<ÆÎ+:©K 5KÈ÷*=³²;UØefèJᑚµÿrO¤IÐטN–¡y›W‘WÖnÅE»µùøÕ«PÆ&IÍd›¤G¡7a„“²ÔÎËsh{¬ß¬ˆË·%óÈNÒiÆ1sÈ£DŸ¼ –¢Ù¡"Cî]reAYÌNq3Ûj5¶D=Fá>]Çl@z‚†ay«÷û&!ÜÌøY$µµ¢”%`”’½Ÿ•ÖÑK˦{rôâV9³SrA Òwóxùn ¬#T`.7A·éLÒNŠØQʶAÿ˜Wn’Pœuš ÏŠý9‰ë’ :æ«¿KO¡‡×ivóó쓾Òf-íL¼+œ~VÛÌÜ•}žoMØO’•göa_ê;æ|N†âU$g(˜ë‘'©fOšgTÖœá˜(÷›—­X†¤ ÍìîØºã‘´ét;³2¬DÜ[*µÖñ¯^Ñš%$3qƒNÔû—=$bæêT9jòw›„ÿ7ÚW–ƒ·/Õé`ÒÁü¥õ¬›¬ÏŸP–8é]^r¦KÎÐ!L±e‘?÷,œ3{?¶gõ»Áeq<7ò4p´‚Jœ¶ç‹ù}‚/ZÁ2;ŵýz9ЀQ‡dR8GRÛôÚ¾í¤|%5„Ñâ±ÐÊ¥Y‡"øÌ%o€'‰RôTÚh9åümè¾%˜çlý1mÜö;ؼ´Œl:XxëÃSkI{7úœÂi¹» ® õð©v ¹fãtoŸuDY[ 6êœÄ¡l¡…‹Ì3U"oºÙ¡YÙÆ!ù5ÀÏümOÉ „ ˜UE^|^£¢¦Qà‘¬AnVlÏÝS^£Ó~%wöLG€LžµêÈÈ«…PY'Í›fÈ—éB¦Ö9ØQ¶Ówÿš@Û¶{Á„2ɬ#)™¾é¿4(£“¸›¨’{kßâ¥GÜ#/@ï¡ ¶‰EÁ§â©?åTï å»NB° ¢¶jÏþ‘¸a)Û@x‰ZWYfÀp)â²—“µˆ¦‰ÏJêÄÓD­¶Ú¿AU¥W:ó”6±ò†´øcÒ]úÑéÝ´ÿ½̲N@ŒVr×˼·±ÐŽP¡žÛÀ öÀ9k' ܧÁyÊOÂÇ&jï?£†* ÔYÊ’Ê9˜Ð—x3«PÌï$§î 8š½·\ú”[Õ0MŠcÖ8&ÖiËÏæ¥tþvƒ;ÌŸ‹$ ÚðêˆI°ÍƒMÆšëËYœ˜ósŒ%%uÖæ)$Iµ“"jj?ÓÚ»Ú%÷QÆuõKÒmÏ@:?Uœ`³u¯QU‚ÁWêŠç’À²wOg¿¾8™Šÿ»66õëëËoxÀŒm”¾O푪\#²-•“öIöùB ¡)äw[Üä÷IvŒ8óX´ls€ìû/ ‹ÓÅÚW•ð*gHÞRDãV&cÄ•aøœZC‡ eéNG]ÍÙ̼=Á«Žf3ýOrŒ朲ïÓä=dtT*KÝÒè†ÿfÙûÙÁ9²rGU€"@­ ÿæú¶K{ŒÀÍ„T~¦ç—^³ÑÖ]Éh$ï¹PÒŽaÛåó”à4×øŸ¯§,oöB^xƒ$,+Ñ£ƒÄÏ ,d³hâ¤j ^Yu\›!%c4©¼j ·žNHÝ™•·©óqºû;)"<\ÎÜÖ ™fE«\Ú¡€ÞOYZèÓ5-9ÕÞ³Pó8=öº”Kz©&¦ãÿ%wÑcâCQŽ|}Õ5ÈëÉþ¬´5 ò !òwÚYÈðÏ3ƒLí2„ü\禘Ù5v:›œkÕ©b²LÒ®é]Þ‹¿úÒxp–IÌ ® .¸èÞ™aA{Ë'ÏÙ¦™ÅQ§ÒÓmŠX(îÀòž‡×´S•êü…$[Õ>Ä“\ÜðÞÉ”ͪƒGÈGæ2WÈM_Þ (àÔåuóR kxף립¯’ÑN{Ú"TokiôHΰÀæsUÉð_P5zt}`52ZG-«ÒÉß+â:KÈ ù”¬h¾Ç´Y>š$ûÇ È«5ÅŠ‚œM êsǽó««Ê‚ÉJM’}›B¶Mr0°Cކ¼³‰òv¹Ä9fÛY,¥c}®QWÖÑwÓyŽŒd‹Ì¢»šçš,(qt“°‰O·o ‡W“½¾¦«&%Œ@g†g‘ì·„òìßüI •£!Û0Gî ÞÝÆåH"+¦ "G fŽB'ÿ†ÄÕögG¦IfÚéw3ÙÓBsr‹,Óc˜Ü‡Ž¿‚¨s¿[9I­5 "»;áåñýœ°¥dmSIË´½\°Xv£®_–ŠŽH#ÍŠ:µU³šb°Ò™hY·Ë·¹ó;_s—Rv^Áò“Ó@&9¨´|rˆ ¿¤|Åý˸žK‰=wà–Âë缾\lÅ&¯?µkrL=úÂ3O ¥Ÿòšò·YùSÂfI]ÏEAË5eÒ¡ZmÈìãrßÁ>Ó!˜Ùb€Ÿ[ù餈¸ È ŽœïšSfY‰~æyŽü–OÍ)i„“ÛêLnZH0‰yñ¹ÇN8_ šs—¹¾ì´§ÚÍÈ £Ìßµd|d±âK4ùlÄÒ8÷¢´¦Ú\¾i?•6²IC*M£6!DëfÚ63z¤çNÔBÙ¡ZpÙµ¥®¶ .¶¢Q, ASZ=…,‚ÄÝüçPÚvY¤ÅEvÈ.ÊÖ€ Nĸeã¿&¤dïgÿ¤¤ð‘¹US<èü$i‰&¡ûÑ\ªž½’± Ý{A_tò;,n.á0/Iˆ,Hì"e²¢-1"KG6…×ø(¯B= š5ål~Ÿ]›{k#ì Ø†¤§ãª nh¬à-Xõ¼xJ@b ö¼0¶"ÊmtÍÿãÛÆ!·UR”ÿ6+§Qàž›î¿žµmÚ1{×ÒÉ«ðâSè”Ò¹Oi”u›‡Û c‡î´Ëêr3œ£¿ì«^¦ÐrôÐÊÁ ¢ º¨YÈ1qç¶!< U\…#v’ælÂfþ{ö°Æô*ɰesL``  ùä¡” °hëJ].È+Jž#ÅM̱˜ÓÞQ°™P‚uÛ‰¶àtoE.íµ•ï0²D +»Ù«YFf,0ÉMH}DÂBi>*c×d`˜“ÿ<{ x¢²ÏÛä2eª‘©z Qø¨=›ž˜š4gr?¿½Y|`b &ì¹é?f¬f°º÷a!°ìÖOY2†¢ÐàÚJ­í€ò) Üù™ANìì´|›o 9‰[òœà ‡VÅ¢×××]Pµ&o;î/-œÒ7‹šAÇ:9±§ÿ>­C9Л$12{*ßVNÐA¿3ß]~Àá\…Q…ƒË`€†£(æä9|—¦ð„I034Ù¸qîÛûÁ,"’u°t×mL´ê,â½Ü‚žû`y©óDöG7c›<ÑŠIÉ.4WƒÊ+ÓÒ…"ĘkîŠ `œ”PÚdãXXrËÇ E³|JD¹€-èÆg'4}{ÞµXÁFSÿ6Û¸&g˜ ÿ¦‡˜eal 9oåçö¥j¥´a•ñp×-ÈO !¥ &˜˜W¯*ãÁ½ét‚±ïRnq[TâµÅÙWˆÊFQ˜ ×ȽWúQ–1é¡Qâ½™JJòhò;BY¹ª¼¥d(-÷hõ‰3zªbbg e7§«+åÔ­(k+À}3²ŠlZa?Úoû&)X[•;½>`†Ü¾qI)€à6¨_d¥·šx3*)¡É¦#Æ09Í‹)(¿µ®Îëù š+IêYîÿvš­Ÿ Nµ¤…ÅýwWÒcº—ÒÒ0mˆ¾W»ã®Ž&'‘;êJh#j[\ÄKq — ½áj¨‘…HL\C.[#‹É8¸à’:&Nu¥¶Nv,¬¥ö‘/giÑzìt%&ò‰°Ù$É–0'J<;åóš|ޣؙù]Q% dÞJ—/[«ÍôDèàn›$Ù•Ý¿Wâ)žk~Ĺ]HY°äžÿ»dáyÁ9me¯y¸ég=Ë-.JÉêä1})hX”E ZIT^VLê 7šÐ{4.ÏHI*QÁR`%@æ1M¡h­tM#¥PÌ]Nñ,ï<Èf-[ ¼¤QNÝro.É®ÛbÝÒéÚ™ÇÙôÀ2{°'îµý›ü S{»Êi ¥òt±t³àoçM“T‚s`&f[æˆ^ão½U=Pœ`Œë¼‘,$ØÇ, 2Y@ù9ùC0{=#b,ÉÊW/¯ aºX÷[oµ@tž 5Òo‡iÑÍ9“‡€í,ÃÆG¬.Æh¬Pdë® Á#º²:=A,ëÈktUN°ÜRBgY'H[ñhZ™E]„Òµà‘£“44W…Ö’¬ &¯<;r‘Æ0;_—½ñ¢žqÊ5º€–¤AL´k¡ Eyµ­D¸ÍMÍXti-Tway‰À¶N*ª,Û|…ÌƒÖ akDzMQò>Sa_«÷ÛVÿ¨›¢¤-÷²Ñ_ƒIÍ«U7"båÅ.jhÉY™ìUèÅ…—ûRÂÖE£1—YT] Ž„æ<„öM`!iÔ.ðþ¯v’ *sHRü}¹-XÉɲ²ó¸SȲ¸dÜ¥{g^qIz4­’Æ£ˆ  éÈ¢ÁZÜÜUÑ›j~ç@I¢Ù!Wø߆r¥ƒÑ»&6i©Ucú‰˜•µ©UQy Äךž–>a–iqÛ6‡U(]¼GÓEìTိ‡’må°)Ø­Y ~,!)ñ_ÿ°Y€Ngcçjm²dLYÐ÷­ ­—»°&Në#¿¼Ã:‹M{ξ¼éÝðŠæDTò&3¹(‰íèn‰™%€ŒèšB\®o3mÉ mM$ç:óý-)mªJÓÜ’E©”He´yÕ 5ù+IeîÞˆÒãxІ×,‹’ÇNù ‘ÈQÞO¯*Ü&—Õ¬ù=»$çGö…Þ0t/ÕtòçžAÛ%€"ÜÀ¿÷zÿJÛyD¢ÚT_À’Îøæ5J¨ÊºØ{EÅî›ì|sÆçAÇtôQ^ ¾wËœS^9½¯\½ú#˦SŠ"käÞ”3ÚQ¿]äroKÊ­@¹6‚²5a¸ó§t[ïìø!×¾ë…k¯ M‘ï$b–/yiùzÁÝÍb èUÖôÎFZÚ©Ó¾ãüÜq>Y•䯛nGdJ‘Y¶qÙÓ̦ªÍN‰ãˆéæ—°LibmóåãÍ6? (‰EEìé ¨‡™ºÕ$ø{´ç|ÉMç²IˆÝ[º5Ð#`÷ì¾éä¶SE—u»_ðÑ0@Rºå…Y¢þ¦ ³˜˜EÂlöÿ‚)O¹@e¡åƒs ?¢7‡.õ"²ÿ³D«úw$×Eý¦Ñċ߾‹kÔÅÄ…• r]€üÙ ˆÍ‰­MÑš¨—ÿƒÎ/£W°pyQ¥‚ퟤŸý…òQ–q‹E4©عåf7,¹BÛ÷m5½®–YjK€à_âÔ÷ÿÙ$G÷ÚsûjĬ©]Ñžxæ@¯ð{ä¬R«œïÙ=òƒ–P!wœi†H‰2ŒÐ•jµ}£³“Wë\íc:w®ö‰.bÅCø¸*’Û*¬’{Xú ª)‘cA©‹QúªN§È—e“»4öÒyWãæv–ðfŽXñ ¼å\5JóØ‘c#—%/nåX¸IÃ5ö^E.vHÙÈ–ª{ r}Gªy•¨ü2Ë©ÜÃI%ŸÊ¹èÎe\om‰äRZM=ø »>õ½—´ú‹ŸûÛi#Ç4NmñÓVÑ•?ãôƒuuȆ²ÌßVþ·¦’i@œ£¬0dªì³L ôШúȱès20 õM/Ï7É^yï(³´íÍuJ‚F ‚½cäÒ$pjgô5ºœNUŒá•)$!£!šš—å€.ªSºŸ2eáœv§¹ò¹×tÆ"Vâ«®Á3aýòóY¬J_z_2rE5⊈SHøVW²Š†•è(þ`±$æä³I„Ó%\}ÇóŠQôÞŠ½LÌiÅ’L'C¾ê4'Xªî¬¿éÃíTšùBù©yYG’¯÷²“Á!‚Ê*L\êd¶X†Ïq4OÅ2—× Õ–)Tl^G…V/«°ƒÅ_Œ‚F®“Øf•e§i×?4­Tã£'H¨q$£8D©}³HòKUó9Ï%{ÛÜOTI¦/2Ðákw¿‡aîÓSsÜ™T–”s…O )®jš·yö6¢¸;ýÎâ_¹Ç!±¾a"%#3‰Iò‚‚kb‘cìTZýmÓÚƒ)¹´q•dzx¹}la©ÕçMPÍß”ütðÆ¨§à㱊Bðl1µÿ´Z®dÅþl Yñ·¤@¸ðkXìu¾ÿPÉgO—”u4‚-”ë«E˜x% M.¿B©¶!ˆ4€ÃÛ{x´îÙ‚´õY8]Ê{ˆß¼Xlhb6íÜVG®Ol§!4š"滋ÜÛÂéÔ¥Ô´¬p²5 Á "4SIJÆ´HlKv“7“ÚI5Wôµ¼…åyõYRÐ#@û ÖÑâ÷f^¡Êúå¼É ’SÄÍÅZõ8(°û;g§Ñ3rg4o×0@TEßÙú‰N!a©N…W]óåæVÉÀLtó© É(ÛTù¢èK‘)”R (êà˜.]Gº÷Ùƒ=íåãP„°If#h±õ¿ø Ú"9rÇ:‹Õyk?!s·¤ŠÇ„f-:úêoäºLa€’-ÚBÓFÃp*œí¢%UØLÄõ–hæy’ƒæKÍþ ™ÖP÷Ç…)JDKÜÐûWoåÎs-šÊP¢ûd±fƒée$ùÜd]„ '’‚Ó«PòV½Ú}^ø… ¼UÇ>§i>Åiß|ý¨{IŸKÉÚ<â¢ç–sÚ!ÒÑÉ=ꇇ Õ”ÚÞô°’QÌbøí½9ÇX1gZ iøDŽ'iMìtYÛBzhÃÀ2哊&8cÄæ (úøDüRbÈÕ1Ý ¹T;©w3¾.ĺ$®ùSžuUn€mĦžG€(ú f•Qi3Âk4XŠÄeú…å?ýìŽAˆÇ—ñÙ΂â'Ô˜¬Ô¢3‚J¥gÞ…ñ0·Ç- 6¯«I”ú—^FE*8ÀÙH³h7f!ÈJ¢…ºv~#y„Ì\µä_שå9w™–ý–ѱ|WŸèØÅu.³xøQ©”$oÕ^lñšë3EÌË«jèC M‹Å‚p{¡íL\+ù©õL%5:. ٵŪ‰ úÖ–ñc1• Ç_ÂÚ}oà´¹ËTk;i+¦ªTý U';0ßÇ “™RDÞÁÀráùºM˜¿PÇ 6H‹®MÓ7r¨„œÓƒ= EDÝK­HüïDhÚ¥;ÓÙ!•; œ¥Dq;Ë6Ũ+ÈÓä¢b4=üý@Uö*®ð%­uùE¾‰ë±ì 9ÿ×iéEnò¡Óê«,â7'†ü\Eú‹B*sòkÓ廦Þq(mô‡2†vôæ>0+Sö™0$[@WÉ5н/ÐÊ )«’­²ðK2fÝ»³ol Á!ƒÆt`À“….Seg,‘&‡ŽLí·LîÑgŠYÙ@)-çNzêÙGÙ䨼 4‰ Ó8Ð9ÖX5{ב35qËR®Ê×5‡A[>W([ËcôÿnvE÷•îbÒÐöêB:QèLÀ²Ï7æªúSW€µeAè…Y1*ÄLãº>„)—‚ws•+òXž ÜÄ-yM"Àò¶Â®¶FRb}Ñ1(¦…Š^ˆC(ïÓdÃÏñùë~¡…Yć‘«RMÉ—Û¤š?ˆÝˆ<*{¾ÅÝ;á‹F&Àƒ*¥ÑžQ!çG‡Ê¯&ßżŸÉ+ôfŽ#¼²λ›g/x—ž~vah¤Ž*4ˆÃöLï°õ ¬=Ý!Òky8· —æˆê « úE\Kš‡ÐÅ c {R"wôU[1•£ÖÓ>ÛŠ*«öl6D¶KÁ_7bÑAJ¨˜yãWº¥d­‰í ç3Ñi*üøÚšp?@ŒÌC±œ«ÓË@UOÙtb|:̃pšfëLL±#ŽÈ¶¡é̃Á&b'ÊœŒtó8—ÀCW•~4mà5KÀÉ 7yëc=—<ѱRz×s ÍJ©©Å/°yØ. 2ãÑ3º¦­Õ¤É €†§d’{3ÓKxRó*òPµÁiïéL£dÐ=ÍÃöÔ¨÷·ÇØj‚2²†U—2™öxK\{ ^ :,Y¥W¿§d¸¬!(€ˆM½ËædyGâUjû‡6ÚÏYýD½Üdä¿$¢Ý&û ÆßM#g-®`‹‹Q1O&JÒ›9¡yPÆý9`LŠàÂ*a!\–ü¡ÁHÎ(ž8¹pRê9Õ¼Rìa=E|[>DÒÆ§ñÞ"êäZÄÄy,ì¼MÊ±Š—}&—T‘‹UBVá2†ø y7AÂìc £fñ"+ÖrN¢ËyŸ×]Þ[kñî¤$•|€r†Ǧ­iGaé‚bêäçl´hÉ)b™’aX‘a©m•Ù{’¡à÷©sØ,#°sl@ãÓ¼äê ìõ ÐT‹i).Ï¥Œ‚»Ã°¯û˜ É há"uN¸ABy)ôg‰k¥|[¥ .ôÈL7»@¾A]ñ "™¸»ú*í°É<͆uÙ<Âh¸o ß>ÏRÅ´Ë ‰Ê‹özÍ(‹Û¬®xÑè÷ªT5-’5ç¦Z¯v_”ò¬)ÂïÒ]ñI]½/ ³GËO(ì\.ñ9ÐêX€Pglr…Ë5=Ô™0×s$´%´Õ[O6ßÉ^ÛÇ›P1/+àÔ çkn`*ÈÔ!»ö~<´->D§•õò³ûëÌÜí‘«`î.OÈ<4]{M'mfø¯8)"ôÎ¥Ò¦ñ¢{×莸‚@ž‡É^GºW‚˜í@\q®‰9íg–öEb¢ÚQs»²Âh)øY#»È®Îa—-àfaÆF"&xÛõ7]NÔnÃÄÆÑq¦(e¬Î¼Æö´š¬å"+–±¢î™jÚ•ÆESK2/o8ó_ WÍ&Ö°SÓ)IÛLXÊ´²r»€^ ŽD35#‹:†Õ4¹ ÑýÐóà~ á,áJ]‡”[a5ž­V˜"ŽŽŽ™4•nQ\ì¼1ÿíÝ.ÏSk®%“7ç4¸Ç3G 6 ÈÞ2·$u É;d\Õ¾ £±Ši=QGF3ŸÌ!AeFºIU9‘o@uÚØX"Óµo0zä\U&,£æÕ6YitCNôDáþ&Y.Ôœ0¼2n` ZÞˆÕÆ­Ä™@.’ú.ðL%µ¼‘c»á2àA6[ rÀÈʨ{Ü‘>-?¾¶cnä°¨#@êHÐrN[f"ÄÉM“+ˆ£œGƒðœñC¬ùâõd™9RSúr0¤‡æ]¢IëöÇmÞÇÊ<Òki{çlÄè…ðŽ3¥ãÉ­:ê߆hu¢ÜEèÉ{3­^6©\Á·Ð†CY›mi ¦Ýlø¼$Õœ¡$Ôa€ G³TF|Gz¸ŠAŽ«.ËȾ³Ì‚ÃðYDç“ѲéwÖð–tU.à˜ðª·™ÏîÃ9@ê¨Éa€èhÁêòׂÁºÀ)b‹ÐÌ´ØÐUñûFí@5‘Ïf·›ã¤#œA©<'Úåú£•­<¼!pÀ2ÿ¥m¸WQ™\”MyÖNÊ6 £/8V#×?X"c«‹B½!×L—$‡Ö&_»Ðê,Π]T¤¥V|_})ÂqxåNFV¥'´*7€û×г©CZ%ð4y¨ @ÓKü¨¯ò]OáÙ/š.÷mú¼™öµvnMܹþÖ5§Œj´ÉfOÖ'®+ŠºF''D,-V×·`oàLêº!¶è*úY˜»Y ÊÄò÷w$]m=~ª(`&v8çú:—”}¥‡BÒ%ÝKŒ TyUúšäS¢_Ãë‘¢8£ä«Ú!¨ äFïn¸ª‚ûâÂSª.…༹æÃívöß©XgÕ±€ž/ŸÁȲJ—hãh,ÎÖT0á­þ~Û¬} ,ú¢ìäÝXpÙ$ûÔüYM_ÅãûÂóœ˜ö~"œ³hè0ùLŒ Åzd&{f•Ë}dNÃÙÀ·J£=”åü õÇÈÅ1[Ž7¸oä@’Ê]†8õlú^ñŽ©œö-wA`å¹s³HZê3UX~ˆ¦üÙÍ!¸"npÉ(Üë‹ç¬•éÙÊ6³ Ã(û͸Åo8”­= ÅZæÐˆZ›v†'"Á2N×ÑÌ<¡VÈ(–E«Éýû x¨‘-ˆ* :ÕnBÓ _@Õ”²(Æ mФ åj­j÷à¼F¿‚4Aº’D¹™0sro¼Ôò-©ò™e%êi¼ ÿykôÛyüÍ6©Ïa´@ކGÕP;°Ê@„Á‘Æ!¿lS’¯žÁO»+ç~‡Hmϧÿç Ê›ar¡Rrç¿Ý6~-)Ȳ†(DúÁþiÎÆ ™Ó˜+Ó.åç8vÐÿ+–øÅ¼NŽÎå&ó(=²¬Itï’?¿‘3É«]gTòHdãÑZ[}%Í©ÄKÿËc¬6i%+9H3`ò”Zñ@)/Æa k b|¹AÇKéx˜b푌„ôMÞáÎ%‹Lêò¢…Üâ#Á@2hMdWÓÊ3ÓhhHØ(Ú"¤#Ø=“†Ë$„sÊ’*”«¸Cð[¼"NH€»•´:™¬÷÷èà‡¶'(?“†— gkÒfyhÒ¤–ô5ˆGK›Z÷V/ª‚Xɳ¤"ó•.Ý^­£ØGþØüóààz²w€;$WÎkGAjŽ’°ÁŒeOOX~#jéZ•zƦmÃü5™syÌUÌ#f¹?ÑçGM©Í›¶q‡æR@Ï'£²C:Aò$avÖ&ET¦1Èâç aQS÷ïH¨©ZÞ‡ßHBªã_ÏÓ&ÃXصhCëEEͶδ Ĥ¦Hí‚Us@h$ço7Ë&…øK³ÿbzÊÖyPÑ‚VÁ'aŸÚ;`Ó ˜íZí}Qñë(óÀ ãÚõûÖÝ]M½ëd¾†H ‘fIvÒvÜA O™Èë™ûm%#›(h MÙ‰+ï,,Lö"ò⦭š•«+Öè—jØH¾=Àard¤>7_ 5®»¯Ñ”Ñ–~;ñøeå0®$ÕXg àaàMÔØö‹^^²cõc±»[”1/܈9!«*†œEOèzõTfƒój” ÓM ê—óŠEs`IÒøXøkÒð )…IÃæ™/ðsyã䳯†FÝ™­˜³׉ˆ±´,ޤÛèB¥»àN%DŠ™P\“Ä{qß(oÛeˆ”¼÷È#;7ÍüEîC ádqMì¨`´pý©ÙÊËH®ÞLñPÔë¡´ëÏ`zÆ7“¡ö›WËÛ„`©,’œ0ECéx@O˜¬‚_a¤ÓÚŸYCžYYiæ…vÈ}‚ïuÎù YO#YQ¸À楇ËY jKdT»Rµ&~µk’ Wõ¾ú÷5yP³íÌ«Æp#6{Iç©C;?Õc:ºÝàÒ|ì’³„jP{aŒ¨së1#[•^ ,Z½´5éʧwør^X?}NÕyiÊ*áuò盥ŒjJ‘Ä‹žͨ¼€ad(Ul,Få°”¶3P¦Y%mÃE(#ú@¡dAðVYÊÍc5‰X»ã¿£ Äÿœ¤¤â;Œ r a˜qcÜÑ-Gñ5ï`ä2‹â±¾¡ÀÙo‹ú!1¬|˃Àpø·¥‰5õåˆ6óÇX'ÝF¶õùnÑ¢eSÏë@¢®@ëBQÓ¬é²à/@Â&7ÉÖiYV µ-7à®{d]‹!81iÈÈã'D5„»dŒ_°^éYÜP%ÐMÉ0¤N¾(1iµ\5ÑÇ€| ¹j9ÂvEþ|Ô æ"Œý€¤Ryø7¥7½fW'N×…†iŽbÑU<þØi@ÃÍù{ S%±ÞP±è|fÉÕê®jH¥b•H ƒMŸàõjsÏÕçJjuž?¯›|Kh5VwFÓ4ØÛ— á5´mé»çL°L¼©¯äs 1¿²¦ƒ#ʱ蹩FC¦o|!G “Pú¸Ò’,†BöïÚèÿ5aÙ#;,#xÀO„n³ªvσ7û¤"0JÒÚÈ¿gBÙÔ3l|‡ßŒo ,× 6NzwÀm ü²\B)˜À8…$†+³-x½Élf†²ë?^h”Õåd»dÖš¡Ü5d`y‹áçëéó>[ Ž`˼êŸh›ú^æØøÝe_9®ŒSb…®Ð@õUl’s¯æÙž­D"=ä2ý_° º½±ä.ðó4Bo‡E2¦6Е^^éP÷™ö¾bo±ý~Ýè¸å4Ð÷ö¢¢xS!PžÄK©"».S½ÒMqÄS¨™å“‰èl虜Ïn µÁî´ÕIJfQH³$e<ök-Ø2¥m¶ Pí¬6¤GïkK%é$‘†É ”þ ö*ˆÞ —Õ„lO)‡³Cë?X¤¸QQÚ/=Úž©ÓGúùs9l’çˆtÐV5Ž@¹ ˆ‹?¨cpZÕ‰>È¥²“a…`¶±8“ðÁ e¸«ÑM½Á ×;Jø‡D”DÓÊÚh>ŽY癆¤j\+¢^t_ ¥ÕÕêdÅ"R’“ÈOç'¦5Hc†Î“ ¡&Ú¨—ÆÐK”¢ÉØW)%iÞÄÔ{š~¢)ÀËOJç,ãÆåŒ2žO»È4\ˆÎë¦þglL;?ÉØXJÎŽVdæ³àr[ÃÛ;m;ªA½Žq{¥À¹Ë<ƒ,ΩË̓I÷ës³Ì,d&±žZëýúˆTlûÁº‚îàòPVSö6~ÃÕú ,»`âdvaµô¥©²6-Q¶¾’»Öçßéÿ®“©kæ¥üÔ³s+ž/ABƒáR“^ô¬ôxë0<Ê*Ææ~@¢È÷â#R[rqþÄ?Œ&Qv^†ÅÓ=|G¡ª‰üVh„„©8Ä›üäܘX”Ï4¼ü€<Ç| ´„0¥½oÛ·,󴈾ÒîÅ©YŒ=¹j»›É2Á¤·H/È@ia%“Òot¿ÅiUJ XׯØK2Ô‡$|FR8… »´TÚd*f€ @TK¯GÑ¡•Wz × è•a'J¥”‰àZ…a^kÝ|³û‚ÚX”ÎNÿsÉçܪc]µv—s=‚KÊ©ÆfÚÐÖ.cRG»7nÞ NkÃòIâv98ƽ±J2é”P­3Àw"¢È]P„f¿8À5W¡7ñK/°¬£+Œå´,=–jq}Ó.§L@7KEašÙ'á‹´aÍH ÔüÄ{%yø™Ž>fv¼×á'×$"ý² ¬ëƒºŸoû@DªÄ‹LÆxï·Ã†Ko•ºö+×9pEüñÛ.¼p MÆ´I3T¡iƒ˜¤eñC'«îaoË¿›ŽVgŽŽì“òuO:g5«)7(I¥›æð£¤Ô]v ½w/'•ƒÜALq&\/ E¾¤Ö ñxÈ”#íc%¡ˆ¨e¾ —åc\]Ý”ËÂ"Šˆz–^i‹ê‹Óưv˜7ZÞI%M'ºô:âÑëÓ˜—5ƒMó ÑÍÀ²ÐD¢z(ûqF{¡‰¾º­îÞW OÞcÓÕt/æ®Zxê¸õýËeGÇkµU»t‰©(ÜK›ù9ub¥€'C¢*ûh†˜Láêΰ8»‹ü’^.wLÀÓ/&HfµíF^U,YW° $twíîu½Ý·ù¼¥…ÔáË0þ`U6GŒ´±†ìWK«vä4?Kª'öZ áwv¶“´{ö³[ *jÌ"$š%»ÍW! ˜‡Öø*déŠÅÈõ/°¯ƒR{“ñGkíÊrd?êø_°† .x3!¤îÉ¥ã§Ù#)Ο”ꌃpI:ë)Œ`ÄgFލùhLö Ï|[Òf†¬cycë¬YɃgHÊ­§oƘÈÃ×-ÕìöïNÛylñhœTvÒÖy™£¨^ÝoÃ¥ùmè£J˜€\Rðu5‘½Ü Ðí ÎÜÉÙkšMÈ7€dm6بe­; ¨7ê"* _î¨Kêò5y•”Ã2âß>2%¨m¦Ex\–ðè3˜IƈWW~J¥MáO›‚Uj„{N‹Ç£›Ð¼°šâ£#óÔ¸”"Lׯàˆ]4AÌ ®éÛy!uôêÒqR¨µ[ëÂgÌæ‡hu[É`j¾ZÞ+Ë`ÏHz û‡ë ‡Ž²'Ö |Ó°*e*;Qá캨ä¦èd!-HZôÛ*Põ«ÓVÚx¦‡†WAfÛÚ°ÆlùŒHMãDšN|[( ›íä…‹ILè¦ëˆ}Ó ¨3¾Ñ î€âÀy"`ѳ1ù„R¹6ó=,}éä×—\zGµcaÌ“yêeqs=0Úí¾ãàT/ñ L ­=™y^V;r7E¤JvÁ¦1)ŸŸ©GÛÜuýàL‘$¾ª•½Jus—­ ®mѰ`ë@ÆçQ&…€SÐOä][BwI§I§—Lð«’‘±m!æmœw <èŠWϰ‹•Ý‹ûø¼(ÿÌkGNⓊE>¤aÏð7o‰¿:䡬’B#Îúaêx"£š³ù“ˆf&!’qÛËYÍâpŒ+Ãú6®&#µôÚäîZžá‰ÀkÓÁ»“]ò›†Pþs~IåÖ^NiÜÇydásÒ lë ˜¥V'|å9Ò²XóÀãpªVŒCî rŠí²žaÌ%ÓªRë'%2¡-tÜ’Y.†ÀÜ krµ_]#ØyÏ!2®Ä¯Ï@iJ±B²Åd¯ö1{p0hܪmÝ–Lû˜ÊÊ%ÙºÊ@›ruj>ø9â3…YÕ¼¹á:S€Á¾YpØCý@Á¬À#£dõÇø œ”ŠF°¯~˜ ²ž.[ö•ÔCö¾=–\ž¤}R!`‰Ö$;S@–µ|ÚwܯP_®ÂiÜx¾,σ‚ëÏ‚¤Ü¨“3Á’6¶Ïð…%YksNŽ]_þ›©oáX4Ú"NgfØ Ã™³ƒJ ,'Ò0ÂkØßÿÄ Í°ýZïàröFmù%@МO8-çh²l*XþnÈ ï<õú¯í[“yú¢cwpÐÔqœôT="R*’’´XçU(º2ï&ß1êe]y} ›Å\›¥¶Ú ÷Î}¨bm#¼lH]¤ñ·AÇî~Š`åŒ'g#GþÂn\~ÛâŒa§V¦-¢UÃY K­=‘=Žº=0¸ˆXRLòèªACÊP–ˆçâ$ýPïk¿ªüõ÷#³¡[QMÅ*\I“ͺ…β¯Í(Ø’^“½eÒ«¤)›µ­($ÀY†¨èüSf•%ÈÈ ÛÐ8³S¡c—ßE/'ä-¼P„Ä4ˆ«Ž5“CüN°¶q gTååÀ|Cé¨äÍD±œ¤Ö)Z8„ŸfNÁ›C?/ÔûäTn4;’’ƪ­ÐÛ”Zpxz Ä(ksÔpÆ6NVQ‰í3×óe”AϨí¶7ür/¦Õ&ÀŸþ\g©Í]E½/‚$?Pæë’¢B6Ûõû:æ_ÍZ\õFþòç XC ²jBÉh´»ÀψöÝhÁ¢Ñ‚X ™‚—î Ê„´Iî¾±.à) äj¬V=ó;0w^ü‚ûÞQáy¸-Ž™y$èózS`©£µIsð™’dÏ7é6B;uMÐhî‹ÒÛ2‰ÐÌ*Æÿ¤¹R=Ðq'ÔwÇ_€­q-Ž']¿"®\ÍrHòþNI¶"ºn ¼òÒa6#ЈJ.@É‘Òb Ä4]€6¡«E­•DÞWÿ”`lÁcï†U(y~ÿ†3` ˜;¾i¬Þ1<©`Ÿ¬„-c•‚’Fzܨ$7S ˜ÃÌ­nìO”a€^}¢…⨣bgX¥_°¨KaÇ ¦ø<ÒN-ùc TŒþFîÖL³éú djÍøCó{”GÙÏUM-”õŽ¿Ÿ—jò)¹leÅ«JàW³¦rß)¤øší…õú¬ã Wš¹j’†á(Ž%çÐdJÜ{ ½§y6ÇáQåÀP²JÅ{hj!ÉÇ;¸öš:/ÚMäŽfÐxæÎy€=$G~6ÂzÚ—oûþÅLS^%oOÆ äÙ#ækáØçå‡KvqŒå·¸FeC¢¸x©`Í®©/ƒ;Ëç‘H›Ù+É’„Ñ*õ´âpyðB½U E‚“‚ÁJZ’ÙiŒÛ?RÖ<ËýêÿQaVMDV “D/1ÁœQå:»Òéæ `‰ÍÁ‘æ)yM ¨º”ŠÁ(¾˜;:û®.µå¸q;|&’Ö1eÎû¼žþí Ï•:¾a_:S« cn…Þ©HþZJ?­±+V®>7€ÒE/¦U \ð $¤j¡šÆ}L¯F Íà/¸ÅÄè%YCúÚ!¦+~Ú ¹t:w“#cѽ]>“‹ÚÑÒ ˆÛ‘” …/D°µ‹ÿN|aJÁ3À¶z¹Hæû‹§dÃ4}»{X'ÒM»‡ íX®ƒå ¾ÒU«Å´<­0ySúú¢@¨•—‰æc}â6 É¥sUô‹ŽtÍQ4Höe˜U®  ˜åzÉ£r+eó&\ÃïhzÝ$NôËÆ3ç0ð³²èHËôÁ$[F”¥œEštÕ¨iPp"jå¬Ù{:wzi`«MÆš®â/˜øÓj] ÕÀR¾ ùò{J Õï¼p1ÔÑçRŽŽbÃû‡P#.#!©ñ'®â ¿-‰‰„u2»Æ´T,ttyC[ V5í|2}U–¦Y5„¦£f~]f·Ä¶¥ÖÍ7ªË^ýƒ8¯.üŠ öO[}½\RÎîÙØ€4À0Ó‹ébë2‡CIÊþ]ýçRžnrj•xÖ©^=ò“QhQ¶ã±F¤ °òˆìø:c[ÍçÊÐ\uMõ;ú-Ò8‡H»ûqD½:§¥b|ÉŒuÔ±„ð†™«ìCQɱ“ïõ»º„r˺*¥×²˜^µ^LûRD~Ë4ˆ\Ÿßb­‚Ïx¢·åÝfÙ9†oóû³e«œk,:áD“hù³Ë–– ”ä}p–·Q Cq¨3îW` í˜r}nôd¨‰SÆ­3U{_Bðá‚m•m\t±Ím x1¾ C@ôA© 4ôÍÃÐó’æéLhѤ!Ô<¾v±xôˆéi`›ž“¸äÍ{ïÒ&Ϊ_ö‹z|§+‚ )™ÐOÇ.¢DÚJF=[ùæÄ—æCG‡CÇD_nXccqb  ¦'˜£îg'»RŽ?õúOèÍ,PŒà,.î šÐ¨ì}ª¶€ÍñØÀ³:9³°Vy›ÓÅ1ÈHÒaœÛÊëdEZYiút WŽ«ÞpÛÍ€'KNï+»ºz¥W­XòëLh b²ßœÞÏ´UêAï 3ê1‘XÂËY4t>9!9b:›¸æñ®NDð’6ñ:ýôù)šàã·ÊÕƒ¢gׂ]€À ú\°ÒÁ`ïÆY]›*/6[Ô&Ê ÷êbôJ(Û/«hˆÆôò^’úQÊÉÞR4¿cE¥5‰fjÙúãT±h5iƬK…–¸x;{’.Нúænù^'@uŽ7[Ž€}ˆŸ¥.–N¹3¯³÷#ÊG%SnP±Ô8Ç·Ïè÷»³/ßfàÅ«økäQ™ç¡cšk­&o™¼uvk^&FwÉþ¬4€ Èp Y@„÷ÄNvñ9uM“¤ò`¡Pâp€JdY.džʔ‘“ŒšÎ6‘ËγR A÷®  ©ÿй7ÚÌÕ¼‹ ¶‰Ói°'=6sØh\–—ÿ\#;™•\ƒê¬ÁºåîUù2†²`ï£÷ñB,µ-Ÿ‡nZ¹}†0ƒ\H{žE„Ö¨µgF»7b Ÿ°ÖcgÉ%qÒHë”:&á)-ƒÒäRîøPÐdªÎû™04)7µp®NNlE¡j×ë…b.—ܩݨlá%^Ð÷·afXrYY8ô{jm#¼Bê]>t©…~uü„Ò›ö e¼æü¯ºzJ­“{!6¿l§hAß›Î,ïbïu د ¨,µÚIàJœRÚ÷­¡TªB2p}RIº)¹r:y™Z:4‰ò¬Ã¡Y£2zïB]në%˜ Ëïp‚³ V––'¸AêpötÝ¿Bõ!pö”%ôSsO°¯@ÚMq¡$ÄUõ¥ ¥¶íð“ˆ[5¶†:A/::¦€Åõ“q˜Ñ:å&Df ‰[Jã[¢´=uOÓ„ÞÓØ¯záYÃT¢Ɖ\–+EÈt:3ŸŠ£0ÔÐúé‰HÁŸiŸh˜Ã-e§c"Éåå9£\Zß²4Ê:;«¹ü·1ReáÄÚ¹ˆ™°¥ .y?¢„ⵕoG§¸±X™á_rP•z^8ØGwÿ bWá[æ’ð‰ê_”íÖÝãÆSíÀP³Rô`ðT;ÿ½€NR)Ê\ré1‘L†4ÈTµW%ÓT§ÇÊ ºoòð(LcKÌÝ^Š[ìeº«yr* ²OÜ“©cSF©Âéwe'÷S*L°¹÷ŽâÏyZ-i¯ž•*“šw’¶W Ïq ^ÚÇä-‰eåxÊsßMÊiÀ nJ­&SM¼™-M\j?*¡Ò1dF”5Ù>ÚΟxU`õPúîdþ”N®¨íb*ø|fùÀ¦ª!w«Š5ð³B·¬Zh8{.’¿’;î­ùßíзFèܾ¸›î#fk:‹d‰£×5”B -áí̉‹H[³@ œ’5¿+UGÃï E£pk­qÞÔ˜q-Š$îÄ f]U!û:Î [¢<̰ŒuVñß'e¹PWÉ-Pøj߈™ê^R.MŸX¤ñÊ‚¼V,!«,²‹Zè|MÚxwì(Ly},uàNf:,œ¨“¯í¢9¸sª¦¼<è+Ç™2‚¡u†±¥©ÆMIë; 忚ú/ULÖ^Í /(ç'6ÈJZ¬P¬LÝÒ¼e´ŽÐÍ+ 4­Éѵ?0sâN-c€*NØÌHF¥åá‰Ú®ÁH…ÞÞFœ¢Ø£Q}Z(ê›Äp, w,³TÛ•ˆ.4ºŒ‚£:eYÑS:£ã%Àw68?¾Ýaü· ÉR±¸’Jj LTð«,È„ƒ0~bb=OY]¿9»¿.ÀFõE·d+| hÓ ”Ùàß:wÙufx#q­[»ð“ÌeúL;í õÕVØgI²Ûš¡kÒO†IS–±»sº*#oA Kˮݗ§ì­ÀºP%ØCÙêQÔ–í+ì[ÉW2§F80J‚pªr’ã"|]HA\¢4bï³ôȼ$ 3[îôÿ3„ÍX[”¹t{òYÙesVÂ]Òi3ñLv‘Ç®/ªƒLá8ˆRmò+âØ%еŽ×tʵ䅎cù;FµAÏy"ÜõçÖ„´÷RO¯LN-su’øo@›t 8ßèëäŒ×M<‚±_¨áq¬Ñ:Ê‹yvêæãaßàPXL n4û¿%lq*92}*/á[Oº†æc®@ßJ·þ©Z!P÷Ùý)jÀ*òj—o¸)|ÏÚi3ç{Gùÿ‹QSŽ»bN+¼¶RÿJÊ¡˜ã½V20Šèƒ'Uß‹åP&59§WõQÊahk•šùh¼“2 ©ž˜ *§WV6àWŠEZãb]Hõ<Ò ,Hí Ùõ@pW«KQˆc¶$0PGÿóºÅüž$jqœ~ŒW;…¦&å §‹.\Ú;J7«"ÞcªØ7# €ÒpŽåË“+ákÌ·)ç–îþòþfó–oîl¢’3¤– ª\z"tåÕ.[„Iß=pí|"ê%Ž"}Â6[?ªç¥`mß4¶˜Þ—úŒï9ôäõÈÈfÑý%|ËÆ2íh\dý©04þ‚†²ìÁÄSm°Dâ´ÇˆWxèpyÏ1Ú@4k;ÿ0oÃÊ\ŽíwÕWŒ’s̨Sò¶7uüHï d‘r¡Õ½Úå)à¤öarÌ-Ö –ˆ¥WQrôÝkÖ`Ç&jbu榎f”ä!)’B-N+ôE•Kš•G8Y‡\]¾oA#]êçs…³cŠaLŽ(uU ¦JXb‹ƒ»9€"­]ÜiIQìÊ#æ5 èU¥“‹Š>/Š[x{ª7z‚×mzù“±Ä …‹«œ±7@û7s3ÅÈgÐcYµL£Y{@J>¹¦Ô5l‰±‰¶ö¯W&çô"=S­­ð£Åp[á¬:¯‚¦§ªŽ:]qGCQ±{%¥ÂÉC”=$æø^™«.UåO\ŽÛ^*ÄÃWÁ¢EaAh^ &¨bÖ°8~ÛCá€ËOÂ!…,i¹FF^çW,D6[õW{%1>W2z•º;… ¿ü¥_·^ó\l*„îE_zK¦¯K¸Ë1Rqû½6šã™Q±ÊÄàà ZCœ†ŒV$%Ú-R<ƒn@ §®õ_UÛÛ2=䨔±še‘nÚ,Õ¡ê3&Ï/#Už¿äò‡iœ~"Az7Ø+œþ˜IBqpþé;zy2¨Œre(Þ(hÐôÅ!ƒWîèŠr´‘\)!ØÁÛBHV2¢/¯¬AdŒä5DdÑ7ŒuÚÊf?ÕØ™'óä•f¡k\™ õôž—üÓH×”¸.…•NoüÊ¡–b7ÁânuW¹˜£È2rÕਖò¦²cG_¹ZÀƪcª»ú|ã—3Ü+£CX!0N5ÄØ1ÜÇÀõBÎiÆ0¥=УfÕàûaäÓ¶Ò‡}.P‡*paÊÏ‹êâ`H2:þWáPÙ•åX-?ÈBË5›0™JÕ,"Ëæ ¨V‚%›9"qÈ¡ƒtHQR‹Y<•°7e4TÖg€L‚o"©Ñ"ó}d0ïiù¨cR *‘AnÊÉü°´Â¼<£Ä¼F^.ùœ‹^Õ]“œ£~¬ºðšƒ…™¶‘ï®Ç>üÕÓòÖ†˜ŽÉ3$3'»dç-½R¶OÄ&òÛY¹ã/*ÓW¯G¬Uú5¯P2I ZªË|Ç‘ÄÝ"°#=gŸL³æ¾QÎXÚYÌá–”´ p„%tË\ Uôq ù {œN[îšqDB:eP>Ë…YoSŸ› Å§íU6t©¹}±¢½‚;¥$Ko˜Êmz·-|0E‚-ë÷‚ä´O% Â`ÓjÓéæž8Mq×gœ$(Æ ±Â÷€<9óp0È¡þ–Pcn.»o™‘/[rOœ9 l;Oÿ<( „ÂG¿b¼æÑûÛÜ"ß§ÕÄðL¤ºÍ½vtµ®ê¾ËâVYeI´žû.hDÆ:ÒÇìÁ朘K¾Þ‘ñÃ+%aZ·‘(¤Ð‚¸åSò\òýš5¹òë(eL,`ü±¨  ¦AKó›Ò@ú/8Õ®*ªö‚ô('žBEÎd€ÈÔ§^Ï`o?,ìÚ±Y„<ÁOm¬íŒö³óÉ¿œ7€C&ÐJ˜–‚í¿3Œ×}Ë Cߤ,nÀÃñ£gv@ OÈx…hS‰€2×€§-•xÊŽç«ò‰.<Œ6rGVš€%#ËÑ×;SÞ¤ÏÅì*U AùvòÝ[„ê!zJ ¿(<;/DwxEà<¦e{dxIÑñI`ÕOQÅt²2Á<í6$6V"›H#ËжÎR^¶Ð3‘}°œc4“( Ÿ˜«B˜O£§Ïw•Y°««-\`^‹B9Tâäfµc0È *P)«s BÛÔRõ›KœÒ£ˆ> ×Z¶µ+yS¹"R.ÏúSÝ3Y3Œ•Â@ôð#¥ —ЗLjÓEó&c’Ìc |™B’§…â!¤ÉîYÚ¨fWm×…¯p±JdœD$šýÀª â–kiŒ¸kÂkƒ‘”½ÜZÉô?Ù K™Ö6/¤,Å0°yÆÙ¦:‘"0÷±¸­¯wO/³ÔÄ‘â˜;_ É&²V—}¯?Sfç•‘ ¶%•Mz+ËqƒFÜ¥¤««[héuèÕAžW‘ Ë£Ôé/|Ãs :}É@\ÚY˼E>¡tƒHŒ´qWÏm©aë.€YQ jxeïð‘r}Qãg¤ }o¶ò£t2ª5°¨Á]5"%p ëF= {TõÚf®ÒȺ§Q NË'Q…¾79YDމÊòZ¬žÃàxy éµs(ÝŸ’{l@)'¶cdŸ'³ÑÖ)¡{ ÑcÚâÈ0†/Éž²3j<©Ïýo/|vѳ™7¯Ð¬¦î)å36‡ ö\.ekâYL-I{9záÚ}¥:•¦–Ë_CþÂD åú+-£,Xg‘/ &¼98yV‘ Àéôɬ0ˆŒá™‰™¦&Ÿ¹®«žßñåÄï±ÃØý’’ÑcÄ F»©~É>Ÿ§×GU™B|¶1žc"¦”\<3iè (Û(Év§™«b+kZ°Ü0vL2ùCQ®aãݹŸì_¤*ë™í AÖD|Ι„,"é«}Ò¦NDz€“Õ²8pì‹ê³ïÀ+¢+¸ùîugù#U¯ SˆÇׂº{[:ß¶fAî8ý/w²³“š¶üRl¼ÉOKÅ—¹5Ál•ÊR®ÃÇx‘ä°Á¥ÎB*­¾†Ø4gožGóñ¦«m÷žaÚ>æZW!ÀÚJõmAsp«j'uC _³ÅÄ¡ê ðgÊ™kµ±³udd¦#4ên°ìó°>vY¤¯ÇÝKË)Ž×SÑÎiŠQXhâM@DË cÓöe‰×úK¤!Ý(,Df5 ¥7’Q¬›_õ(š·ÂÀ®IJÇ6µPû5¯øQ•_-&³' $1)cäO&”JFÕK ÅüîbÎq ¯EåÏ_Çs-=¤0c±¾…­Ž|1!?).ˆÁœ)d÷<:½ùÞå{¡ç&Wà±ôsñëlšYny]Qgk¬›ðJP~!è48yÕÓÕ]jkÞztÍM¯sIŒtd±3Q$‘ªqŠñêeP½Ï÷¶iRÉäi|Ük»²¥_¸ØËKÙC£Б–ÞŬãÊ “’U“k<ÂSu,{*EðÒ!IG(¾‰Víí,$&50†¹ÂÚh´=h—ë¿%ÙN,©ÔQWÕ¼ÂHʈ» ‹â|^(†*4]P©©åÀ@LIÉíµ7[:/K ²·u5ØKÁÄ×6$„ùƒ*ºª3ÛZ\ƒF‘µ“6®vGUw¿aª°/Êê,¥ü „A˜FãÎþÈÿVacÃ[Ï­ ¯Û­­Y²È+0o“ñ%›k! ‘G,/ÎC£ª¡«;™â†ž3v.WNÉìÒ;¬CÊ–7 ’ s”g5 äC˜\jü8¢Þr„eçIå%3†1&Wù+|Yè kËHÊ©ñHÞ䉆G¸‹ú(Í0nÆÚÅ1š¯~[Å¥yæ½e9lȉà‰0q„&í(åÂ×’‹šýQ:ƒx²\Ÿ§w‘²æÓÇê…ouδlåÅV" !DËR¬÷ËÙ‹:sÕ‚2^X«Ê({*uñm!.^n°s°-mÐB6+¥*½ô:Æžª¥á)Ž:nXòƒZA>ø„Ðä-âè¾`¡Žªs¹ ›w7†Y‚»MËv¬gªØk<.ª@@dãäMj;T ù-àõñP=êÏÈ}p)°±¹(±@#†ôƒc‚ÕÉ‘wΙm¥¿– =ŒÒ=¯­UUâÏÈ•³|ÀœB]•ï3u».õ~Õ±œÒ(6‚ ÙÑêaiñSòAXuZÈiL[ .¡žŽ·C^9Èê¨âæ— ,h¹œƒ{J„gµ˜ï­ä28Põø‹ û"ÑÓŽ>Òg$l°,ÉtŒ ¹;¹ÑööÊzm÷ãÈä¥ðµwÜăÜaȆ§µv½ß÷Õ~O][§FX;?)åŽãŽëMoFÞùE£XEÕÄV–6ì`ÙÆ{ÓM:åFâ˜Ã ×\»ˆoÈåÙDŠ;¥êú›`&þåû7‹¯ ܼt­Úî ÷<œ §?膚u™yeuÖZ­›&§%j¾­-€dͤ Æ*õÉ‹"‚G_ñçìýávÙO€[•H}@ãï§“Ÿ¸A:ÑbÕ¸nnOžÂp¹éÖÃØv ãïp‡2w‹ºÖÏZ]y؃b¼R;O°W h±_,læ8rÐ D&H{Äè]FعеeY_AÌÐö4 ȼtlüIbÍÅsZ:K[Äž­Q -›ž™–~7\Æl{j R†Vx6ÓºJDÀµ±H"kj|®và‘“ÅOF=¿ŽÅx&Ç÷qñÊJе”i™¨¢Œ„æë„ãE# LýfzCêš'µ9I[CÇ$´ª“l^˜¬ßnP‡Ò2êLU…[vwõh»Ž 7Æ|äAn }=*xlØB òÖb`Gaª°ï­þU^@‚Q ­uæ)¿ rqØt¯áwa…ЪV³$rŠ HZ¸äÙüV¿ µ*z£•]uâx¼•®¸."áw"Ј+Ȭlß’×¢ôSFç—z¹f [TN}:¾¥y™phÛ¿KzƒçU³ ã$ ¸Ãñ„Þz6GÃÿ^J§‰–gŠI1ƱÌ Q " ñ-{Í  #W°ÞB½B™¨|}^'¶T‰T$¾½q¯’‡[·™:; Þn«õjñ4à ä9.åE»jü_­îàÑ|T®Ù¿fëŽÆC4„ôày,™:{°Âó<Ñ[]ɪwâù:†n#º®ƒæQ³i§ zmÖ‘=(¸-:ª™¸6ø|ùBÇ5&ϧ ±±˜õj²]ѹ‘Íß:~¦ÂyŒùœc¶ «=Ž,†¦ì¢_^rŽçd5…›tHœsYul …WèNccúÑì]=m`³Ê¹1ˆî‡Ö它O\AxtTëžtMq„øaÇ]ךTĵ­±¥¦ œ}4REÑäJ;=ܯ#(z!i‡Õ¢¶l‚ešîàg¤/rŠ&ux¸Îøä=ÛêNvt‰s¥ðHÍZ^õJ;¤>iL[üPüá2³¾ÐNw¡ÒzCŸª›•Õ3ól„SBüw¯Ñ7/=äÂHÎè^ÙÓ ®øVyFëuXª¿ºçÕO­?¹² ,æ¼Á µv„4ñ+Kú¬W±£Ó~Xj_Gc³Š|¹Õ1rã°ñ.ì,/ìVü/ôó~ÊÀ6q°ŒM|©Ó†Ô9å»\5 )ŽÕÑó`]Џº—šÌ¹£+Ê X¼’@“8œ=Î"zm4ÉAlU®Ë‰Ëµ‚¦ƒYH:‚D—  ²µÝÆs(Y”ú…atGttLàÃ|R[34¨—U¶N3ð-,JBŠ8Q€ÅÉ(ª®œÆÚxlíp ³SÙ0qQ×דì¢Zµe|߉û ê¯~cEæú(³ca£ôf”t°š' Nÿ’†$0<Ëe5‡ŸwT‹9 “°0„ÿÒë^ c‰aùÉ Qö\n‚ ïoŒ:!£gü)àÂþvNÿ2&RSް0Á;]§ßR#éLýÞsÿ 8GŒÎþëúKt¨©0Î8:†9S笱Ń1MÛ¸;æsR·±º¬l‚JÔö¬èëƒ(ZÁrìîc»{¯º¡Ëu Œ¤lèæsz ‰²ÀW@Ö³ô JZ;˜ˆ[J?€'eùíT꺧ù^Ÿ–ð_ñøöWw¼nL:Qu+lU“>µ–´w£ßÁ)œ` û¬¼—Í¢H²@¹ò‡ v3sOQÈØÝøç'&`%Ç‹„/'ãªa,âjõ~cäÖzºžD›‡ÛräaŽG&Ž}S­žöÕÀáÄ ôTß‘¡ºb߯5Ï@ "@eM§—†ét!®¼»Lö Ši‹¨O¨õ œ˜Pb {Fš*C=×½ø Ï:Ç$"1#*ýQï¡ 6–½ÀŒwlj0/^–Ñ/ëé$†tku„cÈ«%=•­„WrÛ}DÃñ¦7"šòƒÜ¬ÊšÀUβEŸ6PD[Ψ F•dÿfàQ? ›ÓœL„«Úy]É.u´RΤeŒ÷Ã&gíDû48ËZ†MjïÿV®Â+TP5ûïÎX9uB_â̬Bq”2Ï˳šù„´N~^8÷ƒf;/)KSI\…Îßnp‡¤Ç{íêˆ! aUÒû((·ÞZc,))ÒxžB’Tû—ÚyžjÚrj—JÜu³ú%é‚¶·G{w<ÀJèÅ#b•ÊyŽ£46¿ ãˆ6߃Ä"û˜œ) A'9ð«í_€D8·•’À²wOoÉ?,媎L’®½¥ SyÀŒ¸úÓA{”ë{Cøð+Ú²Sí2ŠXCjÈ6$I•Ï6!—Q´‰µïw¼,,Nëð€H ™jþtÕqÏRÁ…"wÁµ[‡ eé¬+Í)lʺ}q>y§¡NUKz_æ +Íé~0õÓè–F{ö¥Œ}ã…œá#«Zíwz9Š€ZÙu"Š‘žás¶& ò3ͨŸRyPòÌ×Y¿â¹v'5Ó7Í'õJ"A˜ÓžppËÈ1’½@”ÑÜ*;tœú·a‰â š˜’˜¸Ç–­¯±Âl¾¹õt#’Yy›:/PŠGSV<¼Ðëy”£¨²´J2–U„²f/Mµ=§q•‚Û+H51ÿ/ü“±ÆUü«®AÍ.ÒŰ Œx:óŒ%E›}Îp ½«Zò063 ¼0Ä!ÐYâjÈGpÝÕ%“'9NHËþfaV,šî_ì:´@ÉüüÕ>_^`¬¿FØšÎá€vªR¿èÔk Ú‡x²ƒ‹Þ;™0õ¤tÃ]K.s…\UâRTÇÉRÑON®Cšo±~Ûø/±:EcI‹3ÀÜmÍçª.K1•2'Ð<ŒC fCF+â¨eU:ù{Ï¥³„3מ1i…Ö‰üÅØ·Q.üÿÒ0M êsǽ󫫢² îLVLt¨©‘¾’×u’ùJ«ÑÀmIûä nüZ1³;ì¸î€úÝi V¦‰8â-6>™%Yô|•£¿IîIDATˆ„M|º…xk8¼šìõ5]5)Ñ `:3<£ˆjî<á…§@c3÷ƒaŽÜ¼»2Ï; ‰4Qaz"ê¯ñA3û—¬zwÀ‘¾@;ýïÌ#YãŒØk Ú3†á«ÊÅœT}³õ 5Ô‘5ÏÑV§έ4‡Ørý–i{¹`±ÚåœV0ŒgØÃ¡`ŒïoËTlŸNy~– V;Øùš»”²óª[ é¹À´ÏàåñÝ4Zþ8Ë |áÑMóÌãÑŒ0c)ã-÷q’Çjëã¿Ú:t·ò§„MÚ£ô¯’6-×”©m܇ċCh1ˆï`Ÿ‰R3[ ðsËâiRÄ\dPGÎwÍ)Ú?‰~æyŽüÆã3}³&¤÷媅“ÈÏ ±Zßq|P¯ˆõ2¨V(Q()ÃwåR‰a U C"–ƹµ|bIt‰â!•¦»O.qw‰÷¤œ£/J„#w¢¢fj–*)W[qûÝ”wr"÷Ty”=¡.î¡;¤yåb“*„ ó¹Ê54û‡äŒ#F—tÒ°³‚“W©M°ˆd$P$ •ƒ@'Ÿ3]úWB¤h%eB¤#ÚGëæáPïÊrTaÿht£‘‘“-]l+8Ûüå,ê °3رXéð-# ƒ×–iÅ ·²ùæ9꺄r¼+úø›+Qoq–œ—ÕD;‡ÌI–'ºz@4cnÉç1ß6Œ ë˜IÜ])ÅÅ_÷›B‹¿€¤½•”àÙ t#}ewóM Óõ+œ£å¡!A¢È¤" ”³c`Ù¢mÓŽÙ»–NÍdyZ\— ĆÉÃÅQD÷¦WŽŸLâŽ?v–!b—U/Sh9z ™…F·g&÷‘­ü2LŸ²ûÍ9ѳ±“4g["oA¸4¦WIAI0§r¨ƒÝ(éPìÏ;Åå• ä²OŠ›˜c1§½£`Óˆë¶* _8Æ[‘K{m%À;¯ZHTß`tXÆØshcTP©õjÜ;9ÕΚ@µ”9Âß« Ëõ¶Dõ–©DV0卯¦/Pôq%áòw&÷ƒðÛ‹4‹f®ñÜdìÁ’Ž…Q-ï.Äj)+È"?­nFÚ`<¸ß9°u/>fNl®~U =/–<Ü<:xBáU±ŒúÙcW‚WÓqa CRÃX§â.íÁëytðõFD^{‡ëép2·è\LêÊØ!œ/‹Ÿñ@ h8Šbï'(Ïb+[\ÿ1[7o…Pdí‹ ññûI.' l4±¨áÿœØÅxùQöHû³XÙ3mº` IÚJ§?‰-ø“eÖ@éHƒ§ò1CÑÊ8žxâ ,#¥¤m?5¾Èô«lþF©.EÇ úoËìB:˜£"Ç_Ï3À·ç虾…œ¿è„»nAÎxZ)5iÄļú%.©K 5K´¡ ÅmQ‰í¶Ë,Æ*Œ‘îüBBÃ׃ôÓ±Þ´ù¨¹T¥ô¶´Oèþú‡Mþvýu[ÛO¿¯Æ.]:;ØéZií"V£åd5ýÇ…g´®×'™ìx¹ã’ RÌ(lP¿0‘HÎ`TR¸S“'LG Œ!UQȽtÇp_mÍ{5û?a-,S–A–ò4[?;2šF¸\6o5¨¯DõM0gÜPMã‚Ts:,ÉIPY§ZœïÀèK ƒ²ÌЛ†/5¢‰‰kȵTͨÙ®©#«-É-‘pYz,µÚý5giÑzìôgº¥Š`élÇÊœøÇ§ÍH¯Ý—‹æj•ãšÄ)œ¬Ý¢l?«p³g­µT²+»¯Ä R5gáÄ]çv!e«™ù•¤3áêNÂf€œ‡›þ8I©zmmÇlkò 34löÂ8ù|’DåU`Å,ûÙ‘‹;ÙÁxO‰ éécÙéô‘½Pø+Šá²(šE+]ÓHáÌw]|$úŠ·œ?—tS:"4}étí¬|ÛÉp|…/< Û߸ɲ0µ·« p‘ÖPŠZŠœž*⼉"¥Ñ<çâº7"”yj¹²É¶÷[m9 +ïvV_RÁÈRA¾ª Ѓ™Ûb,µŸši e$D€ ¹fŠwC:jÓ†#KFÏÞY†'ŒXMÆ(„>//ƒ<ˆŠ¹‰¥‚Ecy®*–öXBgY'š{·âÑ´Rt‰Ù;Û;W…Ö„š”LÍârh>9` ¹ Q¦JªÆA§¥'¢X …í½ðsÀh675cÑE¤µPÝ…!ä%Û:©¨²lóyJ0òœ7,ü ™D(Û䘀II …$€ÂH#вH‰rå {‡öª¾4#¸.j(•aò|È9Xe¿ʃX6«HÞc¤°Ç`Ô«°4jxÿW;IP•Ð IRü}«„˜d <øR©w¨s\¦Ñï#öt©B•B ú¾ÒÝÊKišüÁÐ6‹†Þnîªè5Î5¿ùœµ–ðÝh(W:ÞM1ñ9k©UÉxú‰Ä9"@*ª€4—Û/›à/ À&Åâ2¶¼—šÊå§7J-/Šw£r…ƒ\iU^ïŽ ’¹8”*°Öt:;Wk“%cJæÑJF,a L|lØë(&2ÖYlÚS¨•ðÅ+šñ ¹Ì¨üŸ†/&Ò^5qŒÇšˆå…ÊFt0òýi(KÁ¬F\êE”XÖjÀò=…‚ÇÛ5Ø"m(Z—E¾—Û€ÄD•ÄvŒ2ÄŠÌ@FtM!.×·™¶ä…6‰&’s5ß×+¶ñ–‹H6¹J‰TFûWÝÐ ’wJŸL·ÒF…$ÕRëÆ=@S ßûŠ`Yš:$KRáV±¤g‹ #Nneêµs¦ŽÏß@¡EÿÒVÓü«.½WŸ×nâ¹2¶œÁÄߨØK¨ÊºŒÍ›ƒl…â0–S ­ôìUn[Lyå³Ðw«þ0ñÌç–Bÿ‘:0þÑ$|KPþöSÊ­@¹6‚²5a¸ó'ò¹ewǹö]/4|g-/’4d©ò–¾üÁlÄ¡¥’¡ ‡ÒXà¡f“¤|“@«GKªFVÝôzíŠ"É·˜§ªätäÔÓE™Ý!äãÍ6?#SU|'J,g3uçšà ìÁ$7͸©ª 5Gf0[6ïvÄ]ÎFV´Gj^×è­(òž¥%êoh„òDÂlöÿ2røûe¹°ˆîœbïˆÞÔ‰ò§ºÄó:s$‰cùªÑÄëˆ6N»wLgOÎsRÜÌy&£Ë“sNpép„üðÍ/צª]*Õx–¡<†þBù¨ÂÕñ–‚VÅs—xÚ:éøíÐ쯜ÉiI; ùÆ e“`>ãºÁ æS¤~: R*Ì^á÷ÈY¥VY€ºmÁ\!ÔÅzì|&<ÙjûFg'¯Ö¹º èGx³ø].0N¢-ÂTX%÷°ô+ TS"Ç‚R“ÍZ¨ˆ:þìdÆ^:ï bÜÜÎÞÌ‹ > “嫌Π[8™5’ö;o5}ÿ8p“†ëeÄc’\@ÉÙU‹Nß‘êAÞE3¼/S±ÔPTòYÛ¸< apxú\´§(дN 9Þ üB]Wç§|‹Ÿž°Š®ü§¬;5ÈxmÞRPžT%ì6•Œ¼Ú™ƒP(dªì³zôm%©üïTÇðCÔ= ¸ñ„Û'9&RªcòŸ×)Iw <è#ž>Ëœ¨tÓÁžªÃ+SH BF[Æ ¼Vñ-x`m¬—Ò†ǨÏòî5±ˆ•xÄ*…kÂа~õ"äÐô®âÓGºÉËÛ†aãQ³ËÖ·eºùaøöA=MÉÓ0§’°íˆ!Ù¿š+ŒàG=ø#5!¤+œ\ Aø:2jˆ½ÆÊ_ÇKkGY¿„­¯ruØÚ¼ÊÖz &.u2[,Ãç8šB‘îïH?ïµL¡bó:Æ}h ;XüÅ(hä:‰]`VYŒõùà| %}æXz‚„qKq¬ÍàÚ7‹$¿ÔQ5Ÿ)Œ³ë´€5¢DŽ&íî÷0Ì}.?‚êŸäKÓ/>(¤¸ªZz‘°ÅÝéw>¯j#ß-/õ"’H0ùúŒ}ªéœ–FF‡Ñöß&´—NWI¦‡—ÛGÀ–:7» ªù~ÞõL+¡¨ñÖþ̸2[#ß å~6ˆ]«Æ–lÃ5‡yÁ „Ê-Ù¶P®¯aâ•$4¹üj¡ÎèëQ*ÁØ2!Ûc¼a4/V&¿y±ØÐÄlÚ5¨gYWŸØNCh4EÞU3¹7*Â…àm-¥šä\@ùMBpƒÍTRãÁÚ±µ2uˆLtÃØÜ¯+gë,P‘gà ‚ÁîÖ#ÑH{•œ"n.֪Ǚ–#v?3E©J2š·k˜ ª¢ïlýD §°®ÙÌ$ …ÊÉo»çíȯŸq—@Ì;}8š´ÃØ`þ9%»:Ò½ÏÜ3f¾ä ÷SqÍ Z{®âé3¨£t«òÆu¡ Û­¼} Âe©(mýSnÀ1¾ 8iq)ìÆ´ò‡¹´–Ta3Uc{Q$Ç7D1oä²ÈÞUõà,ý¯—v¯ôˆ ƒ 5–KÕ.ß4`¡YtƒRvVX›ç^S$Î*Kà«-ïIY¹-·aÏ¿Q±ÉëFÖ¬KàÉn%m†Ëc2VÐYÅ+²ã1‚í#8½ %aŸ£¨¹òuUà­:ÎøL9MIÏãÒ’¥rLÁBbîrÿS)UMîQ?÷â§¥r²ãÇ,ý+ Èšœe•÷AtX•6#¼Æå6\¶ÛÁò1ýÂòŸ~vSSâñË)l‘ÕóŸzæ„ ‘´xkÞÒšÅÜ·€Ø¼ìXA~\ÆÔ?ŒÖ4û¹¦æð %]ÓÏÛòMäÉod»ÈÌU;@îYvͬ¥ÃôMòmZ·ÐÆä]\•æZü¨dZ’7mzþ h#/ßR‚øDa³ô´ò*´-y¶RÅPeôwlVe 7Ö6yé Øóf“5œ|Õéà•G_ñòEä ,ž¡Û”±hú„_–%ãâ'iÑ¢©cúÆNž3Žß‘,”ìt?¨›À±ŸÏÈ cig)‘ÊȲM1ê x™æÑÓ1OþþÅÞ1yÍHkü Q䛸¹ˆà1çÿ:-½ ÈM>tZ}•¸ÍîÀlA!•9ùµéò]ÓÉ¿_@åm|q뫇w ÖKRþÌEˆ,únˬÕ8&¯Q’’dÂ/ɘu:tïξ™a<0¦“ØÀøž,tªv$ž²àtä(`jŸ¸er†8«PÌÊJi9wÒS/Žñ¡Í‘Gm™+cU³w9SC·úwD‡'TËÄR¶.—ªØÄÞd@Bj¸Ûéþö¿•—RTÁ¨È^`¡åUö§®kË8‚Ð 4bT”ÃÚ€ºaksY´€ÓÀ¦— }ŒÝ %¯ITv0–›A_$Œ:Šš†*[ž\B¤Ù5°¥;€ìì -Ì >4>(Õ”|YtÍŸNÄnD•Œ‹=¿œ?)oý,Wán¾e~.5Í¿•¸²C€ 8ÆýÏ@UWR8ïþmž½à]zúèpÎk÷ŠçÓ<çŸÏOÖÁΧLæ BÞæIš#¨Ïsª‚èq97ôoŠ3š‹ÚåTK`‰Ñraüú)gvÏ„üÚè¹uÏÑvç"½[t3oüJ·”¬5± 0”´¢ž9G£ÕìЈÅÀ+êt?š{¯ÿÍse6• è0b –P>QNt z`tМJ „`±eNFºyœKà¡‹ëÆšÝ"GRDž"szn_Œ•2ƒÄ˜KhVJM-~ÍÃtD°’žÑ5íh­&M^4<% T"qj—³»];”¡‹Á°Ž«B÷”›/ùkíãÜybed +æZ‚9ó9Æ´H´ÇàLeÆY˜%íô^“U€äÖÛé‹‚qÜ û¬$®O ¼`$Y3EL¯[à6¼cöŒ¿›FÎZ\ÁZzH»V‘5¹;bÀ—õÖó¢`îT½S\X%,„Ë’?4ÉáŇÖ)sË%h‘ƒEV’šiƒ–ÔPÚ¸lG|æ¡ûPÉ‹zH/Üw«S~Z„szà¸x®€ZYùÎo|P;÷{˜”°Jåë» ¨¤TrS!ÝAóƒI„á=vhšÎ„ f;6_¥¸Ý)5¾Âù©²Hx§o˜˜¥ùƒƒŸuʽ:YòBÖß2M]TNNB%[?H¶ó¯-6ånš碗PÒA)+‹½\ZÌ]Œ¾{V1ë£õRG—wð¼Æã@E·¢ì‚N¹š±ž©é¢E¦_W~Þ¾ éÕÒ\©±²éX¬-&t3tyªœð»£[ö’ý[©*öO(–‘?Ô»XnÂÔî †CÛ‹¢X4äq‘¸z­{ØAž1Ý.ß °˜+@‰^¿Õ‘0ÎÃïΛâVȪÒ^cñòÃ,îƒqqvfi^P.íëh¦¾ülª`q·"aýì²B"TðFçH雽¤ Är€Øïf|4ˆÕþ?Ììö)TxŒ`¼³Gr4¤&±’S‡÷šzHluî@7ØÒkå䎱ü_Ý» {E¦Ù-B¡Z×µ·L4$m¨º¡HòNç:¬AÀö‚ÔŒ `YQ‘ä4ŠJæ+Ô¶(à6¶¾üt®˜çm„ 9ºKFžëy1 C uÂdÇobA–(n'%¾n;æjT‹˜¤¡«•„mœGVì©3‚-A•üÎJó ɸƒzO ;-H$E%y¿.îMm3>fqv-VK¨J= —žhHUçD¹/Ë$›LDeÕ¿û×dAåGßÚzèôWlö¤û¦©D l‰Z¶^9ðgrA“×&q’E\í r*ß“”L¤3Ý„ñÇDÊ[>ñ_%ŒÎZäsKR×…XÑ.שM)YjlÔPÀ‰²e;‰+bð;q(r#ùTѹÁÎÀ²0É]û£GÎUåaÂ’1j^m“•‘F7ä¤2,Âß$ËÕ¸†WÆ LA˱ڸ•8ÈE©o÷Ñ3}·T*ûô•ÊnÄeÀ+‚l ·Rµû€P¿Ð9[õV2ðUšX´œÓ¤™õerSÄä â(çÑ ƒIp8Êb‚0€RÖH²$+9H3`ò”Zñ€‰.Æa k b|¹õRKéx˜b푌„ômÁíŠ$ºÕje×Þf§ð#øyÚEÓÙ)¾÷¡!a£h‹ŽX:®¬íKúÛrÊ’ÂçØäaçÔ jÄ š»íA"¤ùãV Þí,|âålMzÀ,0MšÔ’Þ ñhiSëÞê…CC+y–Td—K·Wë(ö‘?6ÿ<8¸žìàŽÉ•3ÆÚQŽ1ÍQ6ÅD_ØÓ–G_[£ZzhsR/ÃØÔ>d1RÈ•Ç\AîÊÉ/ò'Rú¨)¹w Ìü\J<‡æR@Ï'£²C:AòTˆ³Û¤ˆÔÑdåJkò÷•cSÊÈ5Ue`TFÂÚD±–Zϼm³zZ<¨þ‹&ø=‹Ç,[•^ ,Z½´<ÎÄ:Co +X?}NÕy2Ê*á–¯Ê%Ûô$Þ/Ooz^‰º‰9ÉÔ¦¶‚*6£rXJÛ™í£Y%mÃE(#ú@¡dAðVYZóÜÃje1MkäÕ¨¯V:Û…s+=lïõYÜ]³al _ ~“2¬uúiÜÄÛS)éஞ®§ý¡êD“-U›‚&éÉ%ÚÌs¼Ê¾Ÿ‰ÃC·…m}¾[F´¦TÇó:¨[|gk[.€fM—……KÂ&' [§eY%Ô ´Ü¦ljAÈÈUȶ+òç£5aì$•‚ûÞ”Þôš]Á¦ÅÛ»“©®­ Üâºeÿ:É„k(~œŸ ½q»ÙòÓbMd`6‘.2' „½âXNs4©—‰Xj[óx¾dpý€Y¸<êß¼Tn ãepÔË#ª:÷‘ÂðI{ "èÀJ‰_AͪòÊõé;Ò;ú¸ˆÔæµIVAÝBëhC“e;Í/˜F ÃÍþèLå:¨Ô®´æG¢1Á<ªüIêæS{)âñjWTQÝêä“©`?yçhNæ†6N´Š1u³Mn4ÅtyÚ¤Ï)1ëìÆ¥ekï1u ­©A¬7çü†ê)ö"X¶ ¦Òjh7 ¤@¤!Š>pv£t•ˆÞhx°_„J,í$!U:2{thÜÁâª^Æj`VgHžÔZÔ­òwÚàzœ„\€×-ÌÁòàÔ]šÌM¥ó™%W«»ª!•Š]T"1 6|‚׫Í=gQt{H×%¯›Ïw(5g£iìmˆ¿©!Â۹½¥ïž¶Ã2ñ¦¾’Ï)ÄüÊš.W°Ya.ygÂa*\Bn9Y99·tÒÉA÷æAPÑÿkÂ+ô}ÁË-ѤÁ7Ý󣇧Yƒa´ AGœ mddSϰñe~3¾¥ÕI’®(=Yu¸ ¶ËŠ$“B¶lRÁZ¸2Û‚×›Ìff(»vÊsLëuÕi®~è/ö_A0»,)†[kÁŒ`™W}àÍ`³@ßË¿¢ý’¯WæÀ=ƒîB²º3“-‰¦X¶‰ ô+³÷‚ÕÈ%š%wˆb›œôn€ŒÂßxñ€W[Ù ­óß%69í§‚BÚqKóVßÛ‹Bˆâ L$Ÿ!ñRªÈ®+Vé&ˆ8â)ÔÀÌòÉDt¶wRÛg7ÐÚ@ŠÈ-µ-úB@FsE¹dΙ—Z=ß _A ©ÉØV ÚY‡¥z`de~N•Pl̵àFê¨Ðö§ó)¼ZÀì"”ÃÙ¡•Ù-Rܨ(í—mÏÔŠé#ýü¹6ÉsÄ :h«G}B'í»âêXœVu¢r©Ä{X¡\ý†X*‹V0â1e.0i™9zNÙ®p'gë¬@ÍÇ‘"Û›ºåï´"r+4VrE¤$'Q¿Â3U½‡|[ÖΓ ¡FV¨—ÆÐK”¢ÉØW)%iÞÄÔ{š~¢)ÀËOJ—G¬ßÎdx{žviV!:¯›úŸ±1çÃ$cc)ý9;Z‘™Ï‚Ëmþ ‡²ÙQíêA]åJÍYs—Zqä3reO€,¶¢²q\C%¸%¼mõ•¹XQ|D*¶ý`]Aw𙂩~QŒcI·ëi19¨ß ×:]Drl‰²…ô•Üi.Óÿ]'S»^/å§ž[y ô|™1 W²éEÏJ€·ã|6/ð…%J'S\œ?ñÏC£IôÓö¶IÓ; UMä·ú—½ª&“š1mgÒ¶‹ò™†—çU®b²â ¸¦ß ¶oY<æi}¥Ý‹S1²{rÕv7’e‚Io‘^ÒÂJ¦ KKÙý§UQ(-ರOÅ^’¡>Ä2&“ïϵIW÷tÌÅSj1i÷6„¿"‡i!ÕÁêP;†Ž#:d½/õ}³úu°vþÆ= )ç‰q5&ð™+{œs+/Öî²b®GÐcÉC9ÕØLÚÚeLê,ê„RŠÜ€à´6,ŸÜ¥dvpŒ{c'”dÒ)¡>¶ç¶ƒˆÂwjSgÜEhö‹¼Qszs¿ôš0B”Ó²ô@Z²ô”È&ŠtñeFño¼È°˜`ÍHóÝZψqŒ0à d:ú˜‰WI>«Z£´ZœÁ¼U”±ôíD\`r­šžyœleyö¤aJ©Ê<§Q×®‘L.Yö_·a~Û!— Q2¦Mš¡ M›¯Z?t²êÖñ¶ü»éøg÷X¬Ã×=éœÕ¬¦Ü $•nšÃŒ’vPwÙu4ôÞ½œTròKŠ3áÚ«ÀwnNsÖð5 oÔO1Ð  =‘Ƽ"…v·ö1«ºh_mI z ê[G¼èŒgÙŰS(ÑÝQ].&ŠÓà²fTO;ÎZƒºkâ½SWUÞÓïNت+¥8·;²ƒâ¢íŽ{1wõÐÂSÇ­‡ì_.;:^ƒ¨­Ú¥KÌ2ÃJ–66ó=rêl3x¼‰’5lz°h›ù6†ÅÙ]ä—äèôr3&Êb s¯“$Õ4²b®€š¥î»@BÇŠb–ƒºŠÞîÛ|ÞÒBêðå@°*›ƒ#FÚ˜C)ÏÊA@Pª¬¨-~ãb,©žØk5„ßÙmØJL"ÐîÙÏjlª¨Ià;hÈnoœB£•ó]S¤j~[èžœ¿º~0,8Dƒ¾³ŒfdGó¢ÀŠqϼQ ÉŽÊc‚ö´QWÛ•”çOàtãàÅ\’Ϋ9夛IægmÚåðåè TÑb„!ëØCÞØ:$kf”‡gHÊ­§oŒ×ÆDPN¹ƒk(æ)“ÊNÚrR;É4A4Òü6ôQ%­¤ï˜×ÀBI Gèv gîäì5Í&ä@²6lÔ²ÖÔ‹ÆÛý¾é ½hö-ÃåOÓzAeèÛ'Iøò¢`Ôqë3z ‚ˆµÈà£&ð‚W×!R¥MG[äso‚tD‹ÇW:åÕ'|ðæ=@ruÎó&r²ù,ìB )bfpMßÎ ©£/P—Ž“B­­ØZÏ”d±g6?D«ë€ØJî`+ fà«å½² öŒyØ(È4ModüÔ”•“Vß4¬ŠF™ÊNT8».ê¹é=²–$­úm¨z‚dý[QUô‹JZÑô½ò;Ù°v´:#wWìqË9¢úãÙš­ùx®xE<¹°€üÍà(œw =“ßH(±¤™ïaéƒXfä×—\zGµ_8vñƬ"Ðõ±7x7côªå­¬ƒ ¤µ'3ÏËjGî&i„È“]°iLʧÃgê>“@‹YE‘$¾ª•½Jus—­ ®mÑlµ¬ ùðB̵ƒÂGÀ)è'rÈ®M†‚tªHO¾TÄÂJ@Tá qÞ%ð +Îò³Ê{mãŠa$àÕ8ö‚sÛ_ûPÈ×–ˆ¶¶ÉÒ§.6àb1€^q#ÔñEô|ÖœÕIjŽQâå(¶—³šÅáW†õm\y®Ú,„âíE IjÙ?Y¬‹*“]©Ómos«Ýe 3SÁ;Æ< št‹Çˆý®e §WärAä†Môè`N²Õæ'ì5ªqª‰z£ÓÌC¡zæozœ‰\=vpœä\–ŵÆÏø9â3…YU´ªáœM‘dÁa# ô³v‹Ê  ïWŸ“RÑvàÕsAÖÓY¶ÐôØ:öXry’öÉ 0Z“ìLYÖòißq¿B}¹ 'Ĭéú-è½aY†Œ‘Û%Ô\U¹Ã±y9ÿdDê[8¶ˆÓý~Ýd·–-šÏT¼D±«ª½ýì=ñål“†$ÃF=¼1ŒÚòJ .P¤ŠEày˜ –ƒ¿òÂ;O=Ôí[“yú¢cwpÐÔqœôT="R*’’´XçU(º:Úºc&Ö:j®ȼŒ¾†ÍN<¯ÍÒ [­*Á;÷¡Šµð²!u‘Æßê0õãsÆ“³‘£a7ò"Q˜RÖóÐꢓ€G hÕpFrK­=‘=Žº=0¨s=_FôŒÚn{¾)÷ðbXmüéoÀõp–ØÜU6‚BÉšw£ß(…xÂÿ(ñŸÀ¡óå­„«—µ Ö\¬šP2Zí.ð3¢}7;´h(‘.†LÁKweBÚ$wߊ[~ðrõ" `ýÌ¿`ç¾wTx:3LÒÀÑ[çÄ‘K­M øŽG£ÏïH£>º@é?´N÷|V˜Dhfã”’-gêŸâ/€~ºÇ“®_‘NW®f¹$y‡²"ºn ¼òÒa6#ЈÂïîS / »¼·)^µ@–‚ω·ŽykÓN0t©ÒÞ °D‚gÀ0uÄÑh†ç/ìSÓ¸#–±J‚t~ªö†P¤jñxÂìO”a€^}¡¬gê!LR*"qçw˜` ÙPêô‘: WaÌK’kJGL_uCaLú½&¢ÁÂÑèÉ´ð‡æ÷(0²Ÿ«ªƒŸÞ`©ç'R<&a’ËVV¼ªîÑ’ê·@FòßZ‰”fû_aý£~'ëx›ÓÌU“Ü0 Gq,9_6…Jeë^c­X>côIøˆ¤òǦi§eRõêƒ^`e&G0V»£‰ÜÑ /Ƶ¢‡iŠáè°µ/ßö'ü‹)™¦¼JÞžŒȳGLímú°ß…ÅÊF–8¢ël®¼#0g¥e³kªÅËàÎrÄy$ÒfvÇÊFrWþþÂIû 8\ÞÁE¼PEoC‘à¤à­…ìGhIf'ï¡îWôS#úB(9‘u,s|¤è€!Ýià‹ÆZî H7AýŸùH #¸Õ70–G•›m*8pèïX¿¹Hö²’Ö1eí¨?9ܪóÊØbŸ]Ä€Ã/dcÌ­Ð;IÀ_Ké§5ö­ˆ…£Q2G@àÈŸ$‹Yxx†?Ò µPMcâ—Æ@Íà/¸ÅÄè%YCúÚ!¦k]ÕÛäÒéÜM5ž;Z¦Td—ÏäÀ¢v´tâv$%ƒ{¨„/¤¿ÚÅgX1¥ààG[½óýÅSZô]&s¿Àz<1nÚ=lhÇÀfY§4¹»Âµ°r¥›GU£æÃ€¢Ö‹æbù4$—ÎUeÐ/:Ò5GÑ P©M%×0Ëõ’;G )eóž^üŽö§×mAâD¿lζ/ù¬Ö­øÂnYÂË2šoÌé§eË÷š+ùHaS¯¯è ÷ŸÁ<‘«=îWì’T¾¢UajLëL°½P:fôkâ°˜ÎZŠ£î£$öê«Ç}±ßëø]ZV"ùyiwÐ]ÏÂlÚZùf™93¬¤Ä¬óXGåZŒ¤óº ætüy­‚—‘ÅX|gÀü£±˜_£»‰§…N«LÙœ»m:xØP“i²g³®Ô£ì5ôåÇ2íij³]{¦,ß—­lÕ3¤O5tÇí«ceò¯ì!eÙûµülH|Á¶Ó×3»-¤©zv‰>·" c•dQ”8¤•Lä–´…½*A 3Éœyè–¤'¦²–\u–½Ž`›Dkaåéú-sF2Wy&S~õ̘-Ϭڟ_ø4$^±³ m F–ªþƒ_õHV*)t}À´ˆ5í'ж_*<ÿ(÷aÇc1 ÒÚ耠d‡òû$ŵÂÉTxšžË¡Â#‹azæ;Ä$DeN³áZ˜€fN6†¨iAݾnô=“ #z¬a5°e7)MšvE«ôÖQ!0¨åõ ëCüþ(¡Be8™Ã‹j1ó%r5z å,}OÈŸ—.bB.£éz§ñaÞ¿¢ÉHéÆùäbmRX9PMŸªf ¼&¹Q7Ðù\‚œ)Ø–ÄÔ‘GHm–›*;ÇNÓÕÜ¥KœxÆ©½æûj½ÈïqnácÌ»ók)yð`ÎäÓºÇDÏxiWÖc«¯GpR*¯ ð9ã Ì´b….‡t±õH™™ÊÚ…8è{¿í&§V‰§JЫG~2 -ʶs¼Æ«•GdÇÿÐÛêuT†æª³hªßÑï™§"z^Éíöœ–Šñ%3ÇÂRd®²E%ÇN¾w|×wËõ|¬bjkW8ü}ƒüë@cRDªMË4ˆ\ŸßbíÛOô¶¼Ûì"»#çÂÿÜÀÓ;r«Ã:?ؗݫ۲fv ÜË‘ƒÆ>ì9”þšÉíí² ¿9…H½RëcêNçô¾d `ÑÑÑ_bT4·U$àî•Ñe¤‚ÒÐ6†@š§3¡E“†PóøÚÅ"``àÑ#¦?¤ÓCân7ïy¼K˜8«¼‰¼›¢4H'#!ƒ%®eÌöð§1›¨‰“âLÀ¨Gcëg|^ÄzîMA®­$?ȧC ÍŒºŸ8äJ«ŽzÚXuTæ¦/þ¢ênÒ±_Ò¬xC…bŽùa÷¢•¾7`Ö*O`Ü[º8é_ç¶òº™ ½ ªµ;ý¬0 ȉò0KºÚšdX=Ÿ£]^S‡ Ö"W'äG =ÑGî½*õTôjÔ8M$–ðr ONHŽ˜Î&®yÉ„«¼€$¤u?}~Š&ø¸Ä­rõ èÙµY< '(ès=ÂFHƒP7gumª¼Øl5R›('ܨ‹Ñ?(¡lŸç’¬`“63˜ i¤VˆPp JÁ¨ûFÊ4 ˆªU\Ø;tfÝš4í"cÖå¸W|ñŽÂ(I—•3t”r¥VQ¿ÏXo«`Ëeñ³ÔÅÒ)wæuö~Dù¨dÊ *–çøöý~wöåÛ̼xõ<*óâGfÛ4ÊŒŸðWG+ûËÈÒo³|èŒwn÷‡G2ÚÕ>Á´ý!®Â þå'®óyÁBA6[d~aœg£}¼v5ÀrÅÌo: < ÷*—'d¡ð®×VÊ8½¯»¢´<»-$´qý:GxJÒUwÁ⤶{[{@Ò냖J´Y“š¼^>!äs™yæéMÅc£STƒ]IÒ7ˆ²±:ëëMIñq„M.DZ‰4™/ÑÞ\è¬IJÕK„2¯"n @UFþ"¥á.Þ Yf0“=ÔíËØ‡‚ÞÚXƒ¼Äé “0Ã’ËÊÂéü¤Ö`‡ƒ—?V®_$|¤m½Œ6ñþN(½iŸ4)ÃHrìH@YK¨'6¿l§haO›,-Vlbïu د ¨,µÚIàJœRÚ÷­¡T6,!Ò9RIm9ǶnDb6®ÇÒ\^‡Ãs ÒªS`5äÞ¡ÇX -S¹ŠÇFë˜è@’5ŽÔáì麅êCàì (Kè§æž`Oo$§ ½bOWž†) )ÀÚ˜Dܪ¶0ÔzÑÑ1,®ŸŒÃ<LG!2K€HÜšPß.:œt´Mè=ýªžéþJÔÀ8‘Ër¥™Ngæs@q4†úÎ8© Û3í s¸¥ìtL$¹¼/ã—0Epç% ¬G> ì0ÉKß›Õ\a×dFž TÂj ~ ª¼©ô ãv¤Ìi…%ègY”Y&“¦v~2‡\ÛôÏßT"áØ‰´‚ì"\i“¦w&ƒÙÉíóõš±Vª^³#¸Fßb1æô×F¸K@÷­:ÖW8ºZ˜ ¢Ë¼J?ŒZ67¬že¤º8Š••;{¡JÚ¢ý?Ð"0÷™æ®8B÷]4–\! p  l«Î š £%‚9¨Æ-¨;ÀLÖ¬ª,ÙÒuðü˜ŽÄm–äCQ°G–61|Ž;mé.,WS#ÚÂz°È'/œFÀãHÌzp“ï3ä¿ ì´ïL ÕùE/œ|d ¡´q/ ‘Gµ¢à‡½@“ZcÇïFø)YãHf’’¤jëçy’,î»FBùŽ2 >IÑ5d–M-ûÔš7žÜ œ/_¢™"©ì½å‚Dšž¼(dMܹ†Íë9VUàŠÞnúoL>ï¥4sª°¬Ù èiír>vðÆç§|¿O„¸µT4•‡jZ›hël¥>L ø¿ÄÉoO\?8 ‘ÍÔÐÝT-¼#«7r=0ÔΗ³Hž$:|Ží<ñF„PlÙjïœpJ;n½ žõÒ ”Ä‚=\G)»(«ˆ°ÎóO¯žåáèçìý¿.UyOÎ[}.ŽNñ¶®`e*<¾dî*õ"˜¾#­+’tâRÜ2—„OTÿ¢l·î7žjv€’{ÛÂà©]Ä'z#À±ÊÜ,›õˆ‰d2¤©šPiWŒÜàþUö€cå]€7yx¦±%æÀn/Å-ö²÷ÑÌ;SÕ6 á EpEõ£pú]ÙÉý” lcî½£øºÂ¦¤ÝÔt±Íædš·’¾=gîÕøh¢2 ¢Gú¢£vÿN6)I3¸P %ú•C•±._‡%™T¤ú†4Qõ•Tûh;â/„ÕCéŒ(éC]IŠ ¨àó™å›ª†Ü­.¿0+t˪…†°çÒ!ù+¹ãÞšÿÝ­”þ C¹ˆ¨›,Ñ^gÑ‚,qôº†R°¬7ì»7ԙĊ|Næ¾+U³¸’Ï`lâqµÖh<âløÆ×=$DEž÷PzÈ–&QfXøXñ·ÚsÊamf~žÀEÙÛÁ+—¼âcÐ'u½í:ÖÜ–†36ºØÉÐË»;N²øÚ¬cg¾•Ë­0å‰ OZ%Âo†¬eÇm™¦°°C•<Øù=X’* ‡ðcg±:|KÔR©’L{œeXg‡ ¸ô—9lÒÁ‚fñØ2š›eFa¨'|Eõ4’“^Æ&üÏòÂ+@Ç`;wγ!›Î–Doé)yßSKÑGÌ‘ ^È^ªû®½‰‰HÕD]Ž!è“´)£Í7Ò ¿Æ†7¸Íš›Ó‘šxuv¾®ÇI˜œeÁRö/IÆ%H=å3÷£QV<¯’;.Âj9DWA™µ6¡ªó#woêÊM0áˆÖF œýXKÞ@ªYI‹Š•©[š·ŒÖºy…"¦59ºöfNõ·“1@'lf¤K÷¦åá‰N‘Áˆ*fÄ)Š=UÑ7ì‚¡.°IÜ ÇzÇ’±ÅíqÁR Ë(8ªS–=¥3:^2|g¦–ãÇ·û/Œÿ–$Y*WRIœá©€ ~•™pƧÛÈ‘HÒ˜e‹”C®¢2ã’ ]}Ñ-ÙJŸÚte¶ø·Î]v>¯dÂí…¶¸ÒÅ©rý7½*MâeUï¿£@ù$,•¤Y³0ç,«§@™Fd\¬|{&‘´TŽ2Ô=Õ YãÆÌ0EpȾã§ÓF®Æd ;’œ,&!Oìþò Q&öKà:Ie1¸uØM¦_[÷*s§4îlâ@\Ò´¸Ýws’|¯oŠ= ¤ˆ_JßÛÑòÙ’ŠTÄ•(ûCb›Äë˜ÙÉFc ¢zŒK¨ü­â++89š…òßdÞ'êU{lŒ¤Ûc|3Hnk|¿ašjíötÞ7wœsѲ…ÆÅx­ÄÍð4k7»"»6Ÿ SOÎJºRgúWM„Ð5é'ä)ËØÝ9]•‘7Œ .¸Ë®Ž1eh&Ð…*ÁþÈV¢J&_Q;T1̲Œp`”áD=’ã"|]HAWpÄÞgé‘yI@ghßéÿgÒ—cmuR檱’æ‘àË^< .ŸèíÜÐðõRu©#P@é^~%‹+®rþšN¹–t\DZü£ KtC9WÉ£Ú®/Å7 ˆ*îl—œ&ï.d¥T½øî MºÎ„ œoôu8µøD"뼌s¹ÖQ^<ȳS7/ö-ÿ­Èþ‚øZÏxR¥ß_,‡2©É9½ªRC[¨ŒÐÌGãlS¤zb6­·vŸFÞã¢Ý^#íÖ¼ &ðF,ºcÜÁéCñ#×إ&‘Æ1ùÄfᣘ§nEÖgôno–ëçáPÏ‹J{Gé&¡‚ˆ÷˜ê#öÍH`ã‡4Ü/yyrŸc ”‡HòZ‹Æ|Í[Mq¿!Šn²%±PU.å…xôjµS-AUBRRpí|"ê%Ž"}B\Kõ¼ Ê4¶˜Þ—>ÓÆ?ÀË4Ûéþ¾ecYï†r‘õ#¤Âæ°ø ʲOµÁ‰Ó#^±$?&è®ø‚Ð`yYÖ@ª«q‡¦ã)ªš…uØÝoÐûJE¿Ü}ZÝ«]žNÚa¼Zú¢ }¤£²ã½Š°óÝÖàͺUþ ʇM|@Í(ÉCR$u…`.üŠZ.õ˜ÈR©š”éÊ ,ßG–Yl⯊¢é'f³°ÓÆÔé8”ÙdvU ¾ƒäÌh¨¼pi#\½ZRÐ 漆½ªôcr±[rý£Ú^›ÞŠXšÒËŸŒ%H.®¶)co€öG¶L{C¥}g@Ž(ižÑ/èîÁa«µ±#w6ÈŠ±‰¶ö¯W&çô"=S­­ð£Åp[ᜈ^MOUuºâކ¢b÷JJ…“‡({HÌñ½2W]ª ËŸ8 ú~ ëj †oe7¼QkË{LPÅSqü.¶†Â—Ÿ„C6Nµ@î sŒ¼Î¯Xˆl¶ê¯öJb|®dô*uw A~/0ÿÁ<-<ÏŦª®ÁmÑÇ—Þ’éëîrŒäoú°·lÞ¬!{5™á¤ù5~-,{ÖasÌ®öñ:R¤À87A„-Æâ*Åú³Éí,ª¢Ó_Ûå°°áÿ«^à¯A®Æx™ãžÒ('<0Pzƒå«Ï#£L¿P#…Ð¥AnŠ3^Ü(åziõP½q  5D½;qÃ88ËÂCdmŸ¨S™«Ê8¶Š [nbŽdVÿ JI5 ‚£dì(anaÌ ÇP«¬ë¨r½±™#‡ 1’ZÌâ©€½)£æ¼>d|I™ï#ƒyOËG“Ô^‰ rSN懥æ}üvÛ0`LíÌ=3?ÒÙûf,§”pX^ùWìxEEÿ\„¦7ÒÅÖÿòÖ†˜Žsƒ„#ò¢À¬–“íRÐ+eûDl"¿Í¹ ]1Àš×# Öb} ŒšW¨™¤­Õe¾ãHânØá²O¦Ys_(gl¿÷ÆœnII GX‚˘k¡Š>$_a q:½IëQås°\˜q›‰>p´ø´½Ê†® uvrö¹éIõ î”’,½a*·éݶðÁ%ïvðdYxqæ¶ÚF¸t¿íùð*$Öä;qÂTz¥)£%úE!o‹S@åZŽ>þ=³íì>²m•Lù®á’þ=g(ÛÎÓFÇŸƒ¨"nÌè4Cn‘o‚Ó‹â‚F¤ºÍ½vtÕ¸ë¾ËâVYeI´žû.•„Œu¤Ùƒ2áŸGᔄiÝFn B â–OÉs©)÷}àø×lµ6†d6¸ š‘Îð®0ÅZšß”ŠèÞ¢•jz郠ú-ÅãÄS¨H“ÚÆèý-p¢Ie'g¯æ×Z°; Eû"1Ñâ¢h%LKÁößP£Æë¾eò¾I=XÜ€‡kñùÂì€.žñJy;Ÿ˜J”¹<€,¾3FÌ‹‚Ðýa~ý(ªøÊÅ(‘‹ó1KF–£¯w¦¼IŸ‹ÙUª‚ò?ìä»·ÕCô”~Qxv::^ˆ îð`/§e{dxIÑñI\V”ÍG>ÿº‚9wG¦¹@+EQ€¤ofsV…ìFÿ ÙË9F3ÿ÷Çÿ×GB¥V%êÌ%tEXtdate:create2014-01-18T09:53:19-08:00R¥‹%tEXtdate:modify2014-01-18T09:53:19-08:00#ø31IEND®B`‚pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png000066400000000000000000001675601315616372200273530ustar00rootroot00000000000000‰PNG  IHDRÈÈrªåŠ pHYsHHFÉk> vpAgÈÈëJ|–€IDATxÚìýp^éuž÷½¿HJÚDs›´GŠÉŒwÐ .X-wœh¬U2T¶@¥DYݪn%m·>ÖŽ‹=16J! ©ž ?É™^9b—Z¶Ùk•mN„”¼h`‰JV?Q´nd=&Vl²ƒPr"K$~|÷¾ïþqÎ{ïs¾ó]F5;Uq?Xà‡ûÝï}ßóžóœç<ÇÃûKÿ¦Óy²óžÎ׉ˆˆÂjX -?íg|;.ÄùxŽàÇÍ»·'i,»uÚt;ü;MÄq¦ w“vâl¸§äø-·íîòç~ѵýž?ÌÅV#ù ÙPv<»'âX.wËÛå·ä¯º5¾ŸÏGãH<É•kñýð=o¸›´Ãçäk¹ ·évÂlh…)>Fže!ÎÇs|¶ìDv:»ÄçÇgÉwò;ùÙr¯¼W>g+WÃrÙâ«óÓñydLà®øw{]¹Ï†>'Ž>Þ'^ÅŽ’<×\l…)|kütò®á=ÊØÂ»Ãqà·ƒ÷)wBDDƒ¿0¸8ôQþ}ÿ}í}ß;Ÿ-›öç²6ž‡¯è—|Û¯Ãũ↌ó–Ûvwe¶Ü¶»+wËã cˆoŸG¸é»8ž|oò6÷Ê{åó8WùHõF¦ýŒo«¹ ÷Ïc(Ï;[aŠÇÇ_˜ù«Z °"øYxdx¾ÙyÎãÉãÆwÅ÷#÷ +¨q¦Áùñ®p¬ÔÝÂìÂÑÀ¹Í¿ãÌ—· oVž¬‡þuè]C§Ý\ÑìâwÕùWÃJháV„s[f œ7¾7™“|ÿüt`zpcÆÕìs¯~x¾ñµxÄx9àYÑy¶s¾sKîvÞ-¸eù69yËlÄyÂ'|1‘Kþªƒ‹®,™{Ó~Æ·ñºh7øw|:´-2ÇxñŠÆMw6ÝÛœ¡ûG~äè;:Ov¦;_s‡×~k¼ïs}«}ï<|¡ó‰Ãûq6´ÂTñ(ïrY½TÖݦÛá)ž¿šßÉÏâ²AŸ} |èØ©ƒ¯Ï`w ¾ßß ^…˜Á`ﳇ 3Óºé~”‰Äe;.ë½ò'<æÙ`v<» /{.´Â~¢u}Wü^ø}5A¦Æë6›šj[nÛÝí[ÿO |‹”\ñ|öLöb¹[Þ*®°ÙÚÿGûs{¿bŸçR“e=>¹ ÞæB+LùEßökê»fNâŒUO ž¾|§vL¬÷ký,ô1­m=gYäpŸ²Aî—÷ÊçÓ»pÕ»°o7`¾¼–5Äöíôðë€WDogÞ3Ÿ¹éH6Uå£Å©ÎËåjX ­´h•VˆâÝŒ;8™øsž …µ¸oÇ“Ž¹4È‘#;ÜèNó}f[¥ ÑmQ»šÐ»ñvXmÄ«aÊM¹šMƱ ^§Ûð7]ò(ùvÈy×bÓÏKÅ<s9YŽ•ÏçÓùLÞvƒî¸“;«ñb<ÉãiÇ¿ ‚ŠèÉbb°L¸Q7â–å½¬Ò ‘,þélÆ·ã`ÜŒ²ÃÓ,]¤+|ÎênWÜÎл†~öÈùγÅ:¿çGýˆ¿_y²gˆ8TÙ_=xl¯501848Üyáð‡÷eÙŒf ÙrÇ#Ñ*Ý®6-Þl §Â”ßÈnúlÑÏdkåhIåyYöDó‘Ä S¤¸†ÏB 4žž=l¹•p×Ïû¿¬<šUºMäܸ»[Ì•§Š)~ 4M3i&Ф#Úñžü0MÓ ïcÂ;å;”«åJÙŠûq%ÓªoÓšu›n™ˆ¶ÓáEëF݈;ÉÏB£DtRÎIžœ„м ñ›u«nÅí¸IO.ùÈÒ©´ d4–èjÎà{_+Qf]6Íd*¤[q;ž£yZ e™l¶æ²›~'LG )8%·é–‹G‹{Å ·ëFœÌF ìÈýLÄù8çi$¦Ø‹Ç–NÐi:‹á<¯zž“lª¿uøåƒ·Ò*µü¼[ðËîൿöó˵ÿÛƒƒ_â‰Uî–·‹+‘A¿ ƒ¾¦½íz“·æŒMû†õ ,Z„Oaû]4g*¶7A%î´øDkC„ /?þ«ò¹`k2ChŽ›FÍþ÷5nücB{1U/tþÁá} å–|Û¯±‡Îã™ÈÎä—ØÏâßûŸîûXÿÑýŸÙÿ±½ÜoÅ7„Y„½î8ž=~Ø|O‹½â|ëá/=_\ü Ÿ…·ëÂúæ³`§žÈø k†Íýô×c’™À^9¬VµÊÀ‡Ra¯ ÉñžÕñfÎÛ±R8×$Åá¡Kƒ¿vd¡øáâXñÙzu—²N]çɽµs¼Ü+ïÉUÛÉïäg³Ù™ü9ŽÑl©am0aEµ.·ì9ënÓíX_^]Òæe4Aõr'浡‰fË.` ]Ñ<©ßÐÙ Ñ:ä*d0æÛ®Mv‚ñÂ\lh°¬ÙUa;Ž lNßJ[ÃÕr'‹îª_+-OunàÈË™ÏgÏd/†ëåµò©ï ~éðµÃ/¼ïÊköm6Á·M0<Ï.~ j!o`»õÚÅoç.`‹óÚ™†s¬Çh®bŸ7¾[ÜZÔªyè™›ÒhvýÚto ¸©`œ?Q8ÿkÌ1º â·ÂJGàߎ{ëÅS÷t¾ÆÛ^Æ›Ä^y¯x¾6åt7çi·GûÛ­H‘hŠcÈþ}ë.ŸÍ[ñLñlñÎ-Üüºßô2 Œ12%áÆbÞΩ¤J‘"¡—É7çZÕÂf b²Îáw_ Eš¡D˜˜÷ ~Ù-ºm·Æñ³¹H3´&y±Áx¼rkWi%yy9唟ïc¶¼XN¹ Õ픳åH™ U¢«‘*Hu¬R Ô ;q7^Œ'…i‚Ty4Œ_€»VØ ÛaMp=>~•Æ+HuˆvÊÝr¥¼’SNù¥r½¼XNÅi?ÛùV¾Ÿe¼MXŒo‹Ú•¯7êF’»>øÛƒ¿;´rðæƒ½ýÇÕ®›ÌЊ»7b;Lyòäו×ʧh6=c~)ÎÅ‹aŠ&h,™ÑÎRñÎï Òào}tï+{¿ñà:¾kÙ6–|+¬Y¿^¶Ì-¿íïÆù8“6!™äÛ¾-Xêj\‰-4»“ws¯¸á'³1ߦUº˜&7_Ý/úy¿&Á kÃßt;ˆXaM¡˜'>žƒ+`»Âé%¼ªoÌì¿)®ÒXle'²íüfý–Ûök´GâI7K×êq¨C­lÃËv8{È.¥â&ñÙöÂJheKy;?Û¡¢Ý¡‰Á;ƒŸ9üæÁÂÁ›˜ÜÀcΩtäþ`ð([Îl  ¼<5Ã<‹ˆæcÊj-R›”·+^çbO¦œ¸xC”Q&s¬˜Œ§Ša?—µ|âʺãî$ ÕI7F=ØX‚HŽf Ù2¾#OÙM/Á@éLhïRf›¼Øo¹i7ãTZ@¼Â‰8žèÊì4ð*+WË{e‹Í¦¼,Vë)#?E¯R›Öćâ•;(¤ía•Æ5ÎÅ$!†™G/ûôî±WåGÝ‚?éÉd(n‡„ÊmÄMJÔB¸ 7æ×&f”°ÐQI#Ú‚¦§Ú‘ûG~äè;˜­Î¥*l˜ÔÈó³§¢œ[ÅÜ+œ!r¤É!¢icZ)Vó¡Éc£ÉA¢2(€Í©*EÞtaÌ1ÿ¥’ëHs1¼y›eN Ÿîª¹¢á»ã̑ϱ£4? *Œ°¬ÚÑ«Òp;²šË†åJ2` Ç­†ðÞÔSÀóØ*jññªNs:›ñm¡€¾å`ÿqž'ü®3˜™õ³”- åœWo¾ÿóÿzÁ²j]2Clqjâ‰úßÞÿîï–»å­âòá O>°»ÚoÅÑÀÒG‹>Øòf‹Oaž‘òSŒï£îÁìi¸ƒ¡YQå†ïÓco늫oŠl,¥Ö–Ú4•@7åŽeTáF¦ŠÙê8ÄÙÒnœÊEÏÖ¾€-Ú`LÌ– ™¢hJ[Zu6Á¶ÞwðØÞ‡-»H¯B®nzdÂ]`E©÷?ðÕ¡ÏÁLž]¢¸i¥€½w+1lÚœ†ù€‹Üz»<æøfñÞð!ÜäkËjÒ/ sâ–ŒY6»Í(õ˜¸á=+ÕHil+Ž¥dTÏÒJuu‡œpC^MC }ðèùƒ÷í?¶÷a67ü/Uaxò¤wIÖf%´¨2²½P-¡¸³Zºgè˜ b(;ž_`Ã$ÊPlãÝÕ´Ë!o‚ÏNd§³ç8Ð@ÈÖêUÙJ+ë`Û0 Á0ÁêO)nNÃÙ´Q«CEœÚB…pÙ#þÁ² 9m €L=jî`2ÙPá§‘âoµ”ßaŒ ÿ¶5”Ï.0¯ ƒ8 ÷¬ê™,-ægñôe¿¬A…BUð™3ð¦¸÷Õ¿þàºÅ(íøà¬ÀñìÁÂçe:1'ø DÐã &tBDU À›²Æß¾ÕW@sÙ#Meaü‰Ê×Cq»…bleŸ…ìï«ÿÂàâÐGÙ«R[/'ëØÅYtWýZeg¤€üq$%žã/×xAÙÂS>¿ç™ “µåt@1­Ý{:é€.È·ž¿šßÉß+e±63%,¸ëþ¤ŠÏø¿¤Š¦Jî_2•±¢zªÑ^ Ë¥hEÉ™uÀu&¿$Ç §’V„=Rüe€Û1ädó‡UÄË ¡(ŸÉ“òç©¿yðŃ71úÖ£°«L˜“vW¶øeTeÖI‰´ºêü)¬«ËÔ0bh’fo}ѵýZú½yUj#i¨X%I0Hñ¤­L«RG€oɃQÃ;GbvZ­ÝÒR0°pÿÈ}bUò. qWÁñ8L@3Æ…2ÊH:Xóqñ3š*<¨.NunpiÞºvìOÉ…ì(ÔÔ|œz’YO÷¥?ƒTÿÿTûß>ðîïò" ÅN~'?+äOÖ®®GF–¨¿â=ðçj²9®Ãa¼ NPü’(:LûsYÛjiöx"ФEuPƶ°”ºI3KQ@t ä½Ûñ&}ƒ‡öPÅ2ÞÕî©Ök>­º^gEÓêè^ݺœ»©Ð½IÅGž£(!|‚yR›ûYðW!7°ÓÃÐø\¸9¡c”äeø‡ƒŽ-7ܦÛAƒ…Ö±?k.^LXƒ:n.;‘ŸÉž+w‹[åe¬ITL&‡S ƒ¯&g¸‡Ø›™²ø‚Q„Äʶ٠/ŽÆ‘øˆ,éùéì9<Ý I M“Ls±Ú´•»Åíò²ÛrÛîuü«}ŠTqZá >ž}ôªpãÁPN }h†0l´e7¨«‚eF(àœ(QÍæ¬¬`„®· ç´Vƒ}þ„é5ûWö~no¡Õi°´dûW%s @Úð[/F+¦ö–ʱï˸¡ÏØ$‰Oa7N9Ïnq»¼œ½?{&û\—FUõÔ2ç³ãÙÔÛP‚„튎ر‚Êœ“Ö òe1,kÛj«Ü‹ÎÅ‹•X°‘IQÞNlþ„õ¶ÐÛR» ÿpÞá¥òZù$.Ôt'ÙŒoã2æ ä}Û¿b%œd¢Ú$® ÀçB3ªr¸1[É4÷Ô Ã t„ħ³Èˆ"4ÀÇ…„¦ …Zöà ݦ«•f ;š”'ÕâD¾;,ð•”_™•²Üñdb+L‰ºéûÛûp“>»]¨vë²#¦é¯Ý0¶5˜,Â{à$¿/%ŧ¤Ë•žÊ`>šîÓ’ixMñ]Y1S‹Xñ™äG~üè8×C%Ìš¬t.·23­Ç|€ ’ 팲-ÊÐ0ôk¶€{ɘ0´šÖ؉Ùz{ÿ»¾Ë2]?zп?mw\~v·±~ ð‰e(É¡’ÓÆW”é ‹MI‰5˜èr†ùéì9ž²|_§)òPÉ·'ø<–á‚>züùÑÍ£ß9öC¸ûaÀÕ4¹mhfuÄ0H´r}Š÷hØaZ<¨{°¾ì´Š™ÕЬ¡*¤?“_â±ÅØzÊ Ø,å©ßŸ=“}±!|ƒv ±98¼YÜ&1øµÆ‹ïgšH ÛÃH>‚÷l£“´ ºyyx¤Ôd¶z­›¢«jUN2Ð[S–µidÙ;Û ›ñ9µUϺ7EÓ`¥’-6ŽÓçpÉÖÈ2 Õ->—™Qh¶X\¨Øé¼§óµ¸/†Ë©,P@9¦0Y;.Æ«q8W@ûj\)eÛCüK~_¢v³\Žãofír6Ü.ŸÊ…E:Ç+ß w9Þ7©2RâIè7éÆã]6I´ÊÓ×ÏdíŒ2’ÁÚ)Fã©ò©„jÅ›©”ñp²3~8œ¿š·òçܧÜuw¦³Û‡ýT?Zž*_æåmSÅÙD6ž¥>1“åX2L¸A6D ø/‰ÛµW¢Zö¬(Ä×å $…ÐûnÌ £‡%Sa6¬„)GnÓ‘Òê¬ätÖgiéuÚ¤VI×Í/ D©>Ï+a²\ ‡ÅЭ¡_Z<òÑý·<¶÷xÜ ·£(ŽÇ 7wXYL<_rä¦Ð/ÕpÖ X–ýp˜Né”E\ qÇïâJ¥’mdçª …}OŠ7y¢¶'6vlnüºßôSa:PPÁ©´«špãîy7ä7 f»Z<Œ…©¸ÛQi!ðïÎÃûCƒ_b.`9ÛVÜŽ µ™ˆÛN|«¸·ãóž2ªymuQzº“:$—s¾JwH¶@~;²ANÑ0$[Ÿ«ê pÕíÐl¡)ñ¤(»éS…#ÑXL9ÑUQ7yDQR Ì|´D^a57¾â:ƒú5 #Œlõƒ×¾¼ÿÖ8,Îø…l;{ÑQÒÿ([µFéWËÖØÈÚÑt]âx?”mæËånq­¸â—üE¿fõ0å7|Û¯±ñò£~į †ÅfH†˜2è[ÿ 7…dËFÒÕ°©WÅaÅD]vËÉQ¾öqx@›gÿ Rå)Åx6\µª•MbÊÐÕP@/¥VÄ”¿f´Ï»± ¾˜­†l©º7¸ç&¸*‚@˜Ç¾>6ic) b[Ä?WÊñæMY4V1˜ ªLàÍ ÔU~ÝÆg _‘Ï ¢YØd"ªHÅÚÄmëî¢ ÛâïvÇêœõȧ3ówqÖI-¡ÍÈp¦ý)9—逊z’ŒÇ „Fq.+Çfëð[‡_>xꪀùO=¤ÊÚêïÛlÿøkaÚQ!D‘lëJ¬XÄÚF6.âõÁŸ‡§½ñÌ=ZŠ5(÷³iS½ (hRñ¯øh¬™Üxìþ›¿ÿïdF‚ƒik¶,–ŠfÈÛal2RVä¡ û9ÎK·¶Ô4‚6×l#©‚À¦m  Zw7¹/gWì&ÉR[øžÙ´ —3†p~¤{$Èó—‘”ÀŸ6¹„: ÉæEÀ  Ò‡œ¬ÙÌWó0ŽÆ¦Šû$ö=Ýÿ±þ#è²ò cé )qŸØøu¥Tµèëeþõlå;h\;&?=—šËÖªhŒØœ þõRy­|©ŒbòX7„i‚fÕÅùÞØT1¨ÌEè— qñ³9åræ©ËNeoÌ¥Bì8Ú©a”?WIơȥlz 9Ï GÕµ¥²}Úbl\ÆæÒ¨Ú÷à:AðË5‰œ”Àec7ƒ2,P(ÆŸ°iÃ7sFBB™c`ª$c½`V;/)õ. Fzꀵ´Ro[Ü./£!Æ·€5¼ÖT¡êâÝhJê·“_B“Ä&LòÂ`=¬¤b—˜Ì:\1Gû(®”-–îc +,ÄñJ¡aÉ{r‹îf•¤:Ü£´ïmº·çî%E- !'hŒ(ì†ÛÅ”õÝXÿ;î¹í0Å0ÿþîþµ½™O üæà—èYú]*—èj±–¯û™|‡é¸î÷§RøüàW?Ã5€Žˆtà£fô†»I;Ålq±˜Ê¶²ílX”ȩƌýaÜŠ»È…ùÐ ËD´¬ÍœìÛþ¦Ûa$ ¼'O¾í–\%·MKtŽ‹?.v‹ÛEò}xrϹí0OäˆZ,¼'aãd+E•œ!|ìü¨j0™vˉn¹¾Æ+’ÄV¹]>OCtœˆÍÖÐÓC¿tä< ½ÿ÷ý5ÆçâXœRì$r7"¯ð½ѽªv‚9RØ¿÷õp1Nyòm¯Ú¦ ôÉ"…{²o²DWãpÜ·SPf×\Ù*_çÙ‰V>UŽVþÔóù«9åI×ô¥x->‰9D[XãŸÍÚ©ê€Å?š#ñd<OÇaÔ›£qSGTce‹ÙÕü’$XF‹‘Î Å}¿N×HPò|:¿ÓwV¤)n%ê͆Ò/ù¿–cGBñ¤®‡V˜âKúi¿µ2wÖÈ#Åž¿µç¶+V+‰ä(!\âþÏ„s ¡Y‘¯ÂGvŠùι¾Oå¿Ù÷ü®»íÏì¿oÿÔÞ‡…ˆ`xXÙböL¦Â®Háb|Õ) H•=ÎÇ*O¼àI0FÂgÖDsrÂWpû†¿êDÖYv]„T¹ñä\‹S¢MúR‰OJÃîÇŽ|ðÈy«½1ÍEj:ÎÄ67ÎP^ JÜMFªFÙO“a¬¶ÇK ©˜•ú}É8/„q- S|N%ìC‘B ê'ܸSa´H˜ ­rªB¾æËçY~WSá*²UÛtË´DmZÃì¡ìÿà-òï­îýƃÖ }õ=˜{ð÷§ü‚Ÿ÷çгKšž ã|2Þ Ã4IcU'ÊÈ·q›AJ¤–åžãX»E+\Î({&Kþû¼¬kº·+úlW2ó9ã¼àç½ 6Çq.¶âÙ„ÛΆݜÛvSHÝà–´ùz~'ß¡yZ ÷úÉlÌ}|èƒGÏï_ÙÛð¸{Í‘F«ÝVíïÈú] í²å·²íÄœ*fËS0b‰…Ï`ÚÍd;âmÑv2vâ¸Ì–­â wÏTßâk ­ 3kǸ¦z0ݰ߮ªÂ…ä+Ùt]•ußC/ÄBG«îÌ'úâ/~âð~ç©Î{:_“|™?­ÜTþªXW–KõpH\ú†)®ÎðTQSTž½fİ£.°ºé(gÁf¹+i7•qX®|®ŽPc•¼láHS0þXÔLõþC¨ž=&ÓÒݪYØÏm?JËÝãÒ%Ì$â=#=GN¿k„ºå ó«ò§ªãŤ"ª¤ŠC+<.è+ÁFòHá§³=™¬š¿ks¯—XRc¬x±õ0–]¥*d —S‰;¢þ‘HypTÉôyðwP´TÝ Ü4Vªö™ %(\jƒ ÷=iZÞ.®ˆK ê¦ýO÷¬ÿhJ·WfKå7áIÆ/Xî³.9~]Ð%6""˜çÛþû¹-v‹ÛåeV³@p'b:-$C^H0ÕxšòBâûâ“¢¶Â9z^Øï=9E™S0…¤yN·8W eQf¤¡«ŠבðäRìâ'~.„¥ÈØBUÛâT©ªaß#æÃwÎ~+û°=¨Â’Ý«úÓ¼×´ox%Íÿütöœ¼YÎJ×ÈÚ#8p:{ ÓëâI1–1dˆ!âyPòÓS8Çpîñý º¬ðËg“ÒVqE•+ƒäK½%"}#…ʰ–UrNÌ÷1ߊRvqÝŽžÄa^ò}©±øéÔXœÿåí<[œ?¼…TzUŽˆõ> ýÀgãÛêbÄVìyŽÀ>+AœØc¨ÑçRêüÕìNßÙÄ=aÍ&ÈܾfFš UùHÇð„PÌV%£,gë©ÂTK{l%‚ü@ªzJ™û‘ôªz´\åLè^-Ü,¹¼†âX Tã²T’ÊÓþ—¾')GùÝ4Ê•²,ò0›íTd»[7©M"•Ažt£–šÃ²dLˆð¶3…Áh¸ùy´¹¸· ÔNPËx.´ÂpäÖ6`ŠÆ–—á¼Å¹”Î×Ѽâv‹à=êvH]DÝ™I<}h(÷2ŠK¹°Òå“ÝòVrp ò¿”WêF§Åô’Yì`þš8îÒ9ìRDS(¯'è£%—:ŸÉ/ñ¿ªéª_±âI0/†©Šy\QOÑZK0ˆgyy¹E0ˆÖºWL&+Ü*/s)ußLß…þÃ$¶×½ç ˆíü‚ëÖ ª§GpTï̯§~vܧº6g˜?Bc”Rì]t×{Tÿ‹ èô"b«íä½@¾O)4Øæé& ÇÒñhØÏ‚Öh(Ñ{J¸UÝHBÀf¤˜<¼1:–Ë€¬ v“L €%WiTVù8*’w ægQm OÈv;.Æ)^Ìœ‡E¾ˆ;¾,ãV‡cbÔp.I ¶tŒ(£‹èÜZYG\‹ÑD9ll›R{sû‡ÇÖßPp¾êÞ\)»JŠìzy­|Š]U€5IãÉɨ SµŠQHùhQYZƒrb ÂÃO¤«˜H÷à+ß;~ë»"PkxU2¬XÜhª½°\VbZCµzlàxh¶*ôE[ .Îä\¼¦¸&ñð›‡_2LƱ0œ-f팸-;ß[q¥ø¹âÆÐ¥#<² ¥Ô)~N0S¤XQ7³ßæB+ËÓ¬#¢ç”Ö–IsGEnõºáÆâç—•Ñ\¹^·ªóœCðRq­x„¥‰©b¯Š¶Ü¶SÕyÙìB •-#¨ O9O…+¨1Kë²TòÙ©^äÁÌ¡qÌ)»Ów69F‘âIZ¥[Ú-h©†å²å•Ò#¢ñCbkwE‰x!j­&Y…gÉõ¬.¬ÈžbV‘/L¾kiþì•°(³*¦ ­ð„ìf ¢]½Œÿä*—+sö¡bu‡ ‘fE×Ý­ƒŒ0>?{OåÙ¶ÇfbH×D¾ŒteWVNu‚ÀM©é³I‚N9Ä¡Â=ÞOÂë¿¢Âß ?©%Uêĺõ·Ë+J©}2ŽÅa†ä9W«)@UŒ’q%ñ{×fØÂ#TUWJóäI÷Ù•¢‘¿b+y>’M•”"!Ó xu % ˆ—  P“WÞn)½¾i<ùÅlÈ$a šªºwzŠád{cµ,Ò“òÇM·ƒòSò–÷Ï}ÿúï¯Ô“µRĸqç,èÎÖšC¼)O”¨&h]™ á'^ÝN%Ç P=f'•Là£å©Î&²ÂÃÕ¬p‡´5†8z„0á0(Àïr¦æÁÑpÿ,;›:upØ`Ç–øØŠH+Ÿ‚RÔ¬¼Šjß 7S(âŒá†$XÊ£ ËñnäR%0@¶ÿvÙ«²,œæÆnØ~ÕÜ¡ÕwEyœz†ë‘TåPœ 1u ³³e1è5Ña³\{xq˜­7ä;䬺ÕÚÇ¢:tÄÕ€û—ÊXÑÊJÀšÅÌ m ¤8ƒÈw‡«§U\óT×"Â/Ð;¤±-K?—Ëb{Ø)8ã@Z{oq0&›}«¸"ûÏžÉ^¬È¥•º©ÍßÙP[Zì–·ŠËù‰ìLžÊƒ@­‰We¥fq± ^úôЂêXÓЙ{«N‹¦2 –"‹"½¤«m£ës[‰†^–ÑÚ Ö7”3<´%Ö 0±eY¡áÆ&# ¥Ýø¼ªPÜ;ìÒÅ'’7ø¾ýÇö?ŒVœ ±8,³¥}fGÆÊ"ãÙÜF]d&Y¿‰ gü$Ž-oØÇ7uÛtK‰A¡lAºç ÕBÇZµª¸A±Ñ> bÕ´~ñ•ÀaË*.ô(DœßrBÅ¿Õ!Ä3ôUE¼ u‘º³àcãuñÎóOõ]ï;#µxÜ6 ”8¶÷K®ªü²ª9úyðDž°¢}°Ø¤hVô0ÿÑþÜÞ¯àâ´JäMÍ,®^ï]•BƒQ o"¢gÑ(¶Û,˜jxaÕ6 mì[cI¡Ö¬¤§èî `ý)ëÙ=\ÓÕãÌ’³­Òš2h¤ð®šæ^Ý2³pãÄF³M¥æVºÚ*¬¨Š5}ø»±•JZí € Sª¶p|3Çïû €s#gØ»ü½uûKèÎ5jH‚u´§Æ“»W§ åģɓó7˜6«o; #·^†ïD~&{Žäγó[R½[Þ*.ãNÕ£ºúð9;þ®]ÌöÌX®¬Ê€M{«Ú•Vz¸7w· ¡À‘Á'íÑN ¦Wõ^*®SS&ŸÂæ"åuz_µÅ0™Í–5ÄV£ýDk:9Ãx[hÔìâÇPšÇ’)kzš¼Kž!üŒùNM¸±âEðî±ê C—íÈÂþÏìÿØÞ î¦ök8ìF}yËhªÐÃbŠô<Ô"2…¡ŸR5 ±HâaŠ=ö¶±SÙ ïò_…Áò2ÖÍ«ö™:–ÿËúPøxÊŠ›rŒœ­TÅcEjvÝ1èC÷½­0[á vÎU⡈ﱟüêà?>üÖá—ÞÖ¸áOS0òp€~“2T*)>ôgMàîqn¾Oââ´…A–@Ð÷#¨®Ø Gÿb¡žÙý`²M z0æMßÅu¾¼bÏ¡OÔPÖ†é +¤Ç›"›3DÁx6¾á챿ñ›<“qMÉïët31q)µ»´áu…c6¯§œ’†–è² õÀâª&n{uĦbÎ •ð±1Fíá(šê?U öÒ*¾ËëS…œb‚ÀCª œ^|}¼âÐÀϯŸ§ÂÁ[@ñÇTö)¯Ê„x'85±z‹•˜Å#àÛ¦¶š–#tÝÄ Gx¸G1ð”•`4¹Æ[á½&éDåGïF½)só„Ïn9\V[ eílðØ” °ÚR8Ú¶bÔ&%¬©å7Î{,#ÌÓ”í½$æÉ ¥6ÛÈÀg´Q¦Ç&»ñ£‡eÛ‘¨¬>e Lï%tYÐ¨áŠÆc,àƒ†Uiê±– =(+(ÛŒÐ;Oýëåf<É< qgÃJÙ’¿ÎÒµ._ rˆ~Òä|sT^+Ÿò[Ù3Ù‹î:mº:OÏt©±c? CɃ8YŽWˆâf2|ù:ÝÉÚ‘âÅôÚ亳Žó2ÝÉýÕƒå½÷¿µÿñ'úí?ÕCÒÞèI­Çs•ígô¥Ð O2ØééŒfÇd”ŸN5÷¬¦ Ë/ -æÚdóÙñLAæÙ`FiÁpm=Ëé6ÑY…¹ÃSy6TµJ“sÔmvu]d¡h¿çãBT=Z yJE3˜µd?íUvU ýtvø7÷¿‘ÍúvöJ9WÜ.‰)ÍR¸_)WÃrùNþ”«¡•~—Mb7´èrÅ«úâþ›âÅǹ ¯UÞ¼¶Aÿ~<Ç]ºUçLãf•‹ß¢¶»KqS{Rùzv§ï,ÓDå;'èL‚Y¸cƒ%" ¹q'ºéJa"®¤˜Œ--"r‹nƯ%j:µ=•«¡U1 (P˜b.nâÅ·âÉÍÁåét!È­âŠÏþÑlh…)& °Q³áù¨hºrbEÀ7QËÎä—”³Ê¦wcÈTZWMwPÈ”ÁÈ–êlÚÏøvßÓ}¿Ôu4.ò޼- Š\ÿ›ö÷—Ý@_I_,º¶_ÃLÂ4CÅD$H³Ã¢+¤æõø]T†Hj¨ ­ƒP=‡H³4É{~j¾[Ô]C’;ˆg¥NÝõSK÷À¦íN~6I'2™À·ý¾)É!òè2¥²c{l×nE¢D¯Gƒ¿ÅïÈ Ú`]¤POñ)£É*•ì+¾ÿ?îÍîý÷G7þѱ¨áäâ z5íÏeŸdï°Ti`MÛЃ–ûj>Y#@õÄ,¦ËTe%ôC'A(ÕŒÕ+Âä¸âdlËSª=€EJ…ŽDHG)m%Ø †Ñ>>(| äk‘‹E³jyˆŽNØÅŠp‘s­‡X‚#¨ÔO @€Þ3ù%¹pP•¹ä¢hÚ°³È$ÅáΓ÷t¾Î™Äo ~IyÌb¯Ñij„ÙÌüÖ«ê~µÉ€Àq]?u:»$ /Œýºv eñsI&ÃU…  N¦&˜¸h0ð”0YÌPw¢@Îo —4Vå €q”§Sý«cuõš!Š´E힟HÞf] îŠ• 8†Ü¨Ü,«b*~œS‹2×âÑi[ržòm¿ÆxÏ4yò{-áý{U8˜í%5€¦ÌXÍRÛ¸»‚&£«Ò\çñäšQ7u]˜JĨU äa%À Ú!ökS‚T ¢­ày.{>/Ц• öÊZ7È¿ó'¼ø]ƒƒž‘ ø.Õçš·Å0ÐDñ1$mÐlÊ øQ6PÉÙƒ² Åáwùsi¹“ßÉßË  ¥Xpƒe7œÒ™]Þ©°_4£¨:F¤M€jeÆš Ž #ífµðK†móÎÚËRM÷£&¨†KºŒfÜÔ²DYDðDðœr l*ê)ØôÀ1 b§J>H „òF»Û£%¤¬ÖMÇD >—ÒÝDz'+B è "h3ïØ±—áâTñ2{UR¼µ^ëš1V…’2VÅ×C^˜*t T3®5À¿ÔÚ±@»a¢É ÁV‚·45O¥hÚÔ&9M‰êÀ8æ–j… ·'àPÌi›1QÈæ¨UU`CsólÔŸËÚÜ“ \8ç8öCûïÛû¹½¿î§ý'|›æ‘HÜ2^ãOdÛþÒ«ìX;‰#²f¼¢8þ·ßòmߎ»n3*P™Q-ñs§‰ˆâDÜæ’žD®—¹ø«å½2•€PÝD³)(>Ú:ÍøÆ€²E?“­q©³:ãA,^¼Úá>‘x4KÙŒ_ãû‘„Àd Ã)xì.qÓ~ÛµsÊ)?ãfT=>öû³Ì{n‰(’èÁCçJ1”ÓDD Kð8™ùT3ÀO Y]–öäÛ5«Þmºÿªkûµ°ä[AR=8qî&íV…ÿÀSSÔå·íκÙÚŒ¢('Êñr8;Ÿ?“ߥ¥8/`q;wgœø•/y†¨¤‚Š q”y¥°t“Lz7h>¬œˆ­óê¹ow±i‘¹ŽgàKŽ1¼0å<›œ£< xprò~ÂÒ"L7å3ó®xäþ‘ÿìè;˜W…KΖ³ rƒfWÕ‰m[_†Iz鵫›VcF$µ¬ÄE|d‹‚|_“ 3út¶ÓŸ½[Û` ?·›:ý5UMâh+](vÁæòH\@  U„¦A¼-2>´ Cßw„:xßþcûÇè]CVÄ©©'cò§ù®êódªG¬ì¥ٕأ"WœYƒH™jr›$sÀ’° Cý°[®z:*9meÛ­ÎØûVÒÉ]‹_ô€€T‹ªr†+ÈpLoËcƒ¢önž&›*6[üJ@er š*1:¦EUzözÒKþ‘ý)p­±DXl;2¡5ªÅY?”m¯a©P‚«ë"Õ˜ÃhHõH2€$NjnV‹âÔïÑAOÌP¨P¹*W) ¢'À3„?ª"Ü„ó,€gê+>«Qt(©ÑÖ[žø®C„ðç+RŒ¡7Âílª¥âš½+ûãÁ¼ÚVa&}6©­¦ >•£©ÏV"ZcZ ]„„fÖ™z”Éׄ#*V°zÅß´+NV:iÔ:Vë)Žüñ¹[§*ÙÊ…³œiüi¢ŒÚV©–+o%Åt‡U¯mÞi[oZŸQUšMË]FsÉÒ",×/ùІ}Ø6³P‹ÖI±Þ‡•"±Uþ=H¡@)@$ßúM–`‰Þ•”CÑ8ÛpÁ¾q¼[ôÑèX/OCZluñŠ™ xÿèËà=àø4uëk*Ù±BŒ¶ØÈÎKÓEÃw$?òãGÇãh|G<) ë]²sÕ†œXy×£xH¤X¦ƒür[¾cYÊ£½ÉJ¨¬Ÿ-„ Ã[$šª€‰£©ix¹R¶ê Gn»êVÜó~Ý·ý2Y~~ܯ1sªØ-n—³‰l<;'’r”‘o3]“[¥¡?"Aå”)N9·P)TÌz‘§nt*@èŸìgýE¯8Ù”IMfc>™ÚÅì™l­x©¸VíÒmz™GÌš*s‘?žõ}jFOþj¦*;Ÿ9éw)mâh¼âÙ©–ô~Æ·ù¹G!cUÝέÎe¦ ~{hðÈÂÁÖþØÞ‡UŒ²¤äYÆ*ú4fÏ×›_œ3¡jOcq¸\(ÇËs唟­æy+­5ÞÔy¥ 1²@*¬¹^n&¼Øùãþ‚í+žmdçÒŒÀŽÍ$JĶJ·ˆ„@>j¾ÅÊË ý³˜N[ao£eñ*V+f°n»¡ ³GD Ô-Á?‚œ<–hXÏÅü°£Î¸ÊCs^*¯…'_;üòÁÛz>ñº†'…G*XŒ~nu»š<,UTd<4ë¶C²˜fcÃ9‘±EBVpF–=벚:*â’Ö˻ưšÚ©ÛfîM?ªBÀÈòرµÅäŠÙp¬ A¶r1¸Ž†X†ËÂÀëá3cïe….!rd«)HŽ­Hµ Jô TðñÔW"¨Q±Î„2—°~‘J…ˆ9^¥I%Mµù’_Úp ì—˜DgrirI¶ Ÿm¨f!#Þjî ¿ƒç±@¥:(DàáP…1´wXÕ6VxœLŽ:Ÿ8¼/†x.¶Â—HË•@K4Ö!bº©$hQ?~À[y;b«(4LòUÃÑ+Lj÷”ˆ‹¯£:>æþÀ7y𤽂÷€Ÿ(]PØ>Å›3d;ñáÈóâböthSK™BÉ&秳簉/dK_Áü¬¤k^èüƒÃûr+¤Ã-·Òb3’¾30”ª/ºdX*‹õ;¬T“®†„ˆ )à æ)ÍÃî`¶){+ÇCøl¥±ql©áG¹ig›¶©Æë¨² ¿£“<颻êר—Gõ«&ž£mƒ†ì'ô‰,Q­Su5)ô÷¨Ù0 *\71–Ú„ed|¸/a£âu²ÓÕÂë¥(àºqülÐaåŒ-ª…..V±YyV¹“"°íìËà)Å»Ÿ=§2”kŸCQæâÉÎ{:_ÇþÀrŒ!(¢AA.%‚âÒ²Hn jÉÃgÉ«ê x6œä)&MC§†p‹Ÿì3â,1·4ahˆ•¹§–c2ÒªÙþPz¿SĪlw9Q%ÈRCq6ò¦È3¶—¢GzÊP=pÝa£Ù&uü&ŠvrD£c¿kÓbø.0ºRŒ3X¡öíä–³k[™sã¬b´)¤?3¶DgÅ%"j§å&Ij–TÞ+© êk‹šâ ·àæÝó4DÇéB—˜r«ô Óí°ÀšHš‹D‰À¶”µ3eæh•Vª+ÓÙé¬M[´MIhí;ý_­r1«´‡9a¬”KWãJ™Xõ³Ÿî¢;)ÇŸ÷g²ar~ëhàÛCƒï'Âé0åNøÓnJî'ˆ"Ñ*]L#œœ^?ßÅ Ÿ,Ç*+ëf ”¦ñ/¢1‘¹™º ZØXy ªÊ$ 47Òk=¦õp1N±ÆVØ+)ìEé&g`Ó³ôÁAÙB<IîÉò,hPäI§i&eýP²Fü²—ˆèI¥"ËÛÃKq$òç²¼ÕýO×o[º¥þÌ´évüªoûWй¢UÐÑïýÙcçÙ ”ï ·Ê+ù‘T¯ÊêoÒêe·n#ÊéüŒ²3ù%‘œ›y6Q>3#­åWÊ_/ﲜ÷©Ì§ósùSs˜`Ñå%Q/e}QUc0Š7C/æ:üîVý²Á‰$vãÅxRD'ܸk•£áv)²EÑô^•lÊ(mÓ]LpI–Ä­¬]¢iGÔfÒ•”‹I8–¢Ê Q- žM˜ÊÍÖ\mt5QâCzá™ÍJjæbT*ò6§£2zp‡¨Ù jÁaà¿â¥¸¼À=apávÜ+žTÕ±Q®•ú²É/qc‚¾§û?ÖTίÜà²Îi ¾ÓÕ\ë ÛñPvÉgA0`º£OÁž‚E‚ì†d<»ôD ˆ`ýD1š`ìd1KZ ÎK"²“°HÐùb}ýG«êX½-…ìÛþUfÔ àŠ3ÄfîzhÐ]Âp ¯ØD‚ Ž"0²^ŒþAz/Ðñ˜ËïùHkz´<Õ¹›·ÚÈÝU¿ÆH+CéyýŒ×¹BŒ-#.ä–4^˦xÎv®âï"÷½NL%/OŠŸL[@B±áS‘6Èm×¾›Ü­¼<–”õ#~J$ÐĈñ*X}@™çãqá¨,-Š)ÛÈ6“Q ëa3ˆT›[t§Ýšò•øÕ²œ¦s¤ho˜OD'™‰¦¼cð‘hªÄô\—Ʀ¤\\_¥‡=ZŽ”OqA)MÒ‘ô.ž+[©w®< ëLœÏžÉ/•¯7˾§ûîô¿× »SÅ™b¢ø@g˜É“Ü1˜é¦6 Æ]‚qiÉ_·²g2BaÏ%P ðrv"˺„ˆKÇeùéL•Ãå­òå|'¿šTÃQy5?‘Íç)[´KD—-'áÞM±"kALõ”%Öø~\‰Ã,S—Mû‹™-Ë9JD'5dNcÉ_ãâj>Cœ¥±ø—Ä mu7ÞNm¯ò‰¬§ÒÜÉr%¼Gã©„p%O1¬Š8n Ø15Y`snÛM±tŒl³±Õ³¹ƒ©Ì­0ß¶ÖNÈFã9Ýè!#:ã×ʹ²U\ T¶Âí…7—û峺޷¿½'ÄìÊ\Žy)V/jjèr\+Qá˜ã§.X}.I‡vŒ¨hˆŽkÀDl¹M·LKu$$³tƒZaǯûMÒOû;Ò­ê†ÄméÌ÷œ"3IÚm>´BÝž¥µ½B—(`êµ/ Y¹=<©s¸3  Æ}LŒÒÕTÞªÖä¶äêTU7J­)íZãgjx÷ã»Â’”=CO k¸0/ƒ÷£Äm >«’ Ã|]É$2 Ÿkñ þ%ÚÞÜO…CÝ@âGOBÌ› ­ð²«¤e9›Ù{kV=æÑTg=É×mêü,â<Ü4a5,—Ø~?Gc'b/¬·Éõ•ìÕò,àµø ²ÜÎw«øè Û‚Ä ¾.Wð¼QeC½ÇSú„óh(SÅÕ¬LME¹ÚkÈ/Uý¥oUïàG¼{¤^sXÒû=“_BŒgÎÁûöÛû0oÆêlü^˜¾‘Jª4 ÎX]¨ø\àÇَШ‡%>DZ–Ž.n͉ìtv ‹º¤®¯YK ¸ R:•ò?,]Íææl_¼Ü(úB”-±\dØ7| › IüCû¬áý[S¢èðz¬Á²SǃDnïÊ-0,Ç{ö4QÑ„á瘉³µ~•Sµ&KOW‡{ÿèZ¶œÇÎ.”©>CÀÆB]MõÖvË[Åe<sp69€ùJñ°À Ú|e>}¦q©íé c¢PBìˆk¡©CSsÛݯG‹³²šR@<»X2P‚qXÑB,À²óxE ý 4ëÑá¼B\qMy|eaŒÝ°Í›’r^„ÇP?Ð0ž0¶ïQÕmŒ”¢6ð•m:Ó´èÈ BËÍGò+Áo¥>€‡_§ùAºC’ .n——‘W»ñ'ÑH‰qÙ4BÛ¿¢ ‰6ji7ij¤‡#›'¥DZ{^ êv]Èju*37AcqGaþÄŒcqÏ/å;¨Núâ¼ïà±½ÛJ4Ô–\Úbµü„¾€ENìa6ïpRTkfzŽqîï©Î{:_ã¥5s2ž†å„ëQEÐù½¤^dúÖ’…¸’´€Ý©9åMeÉV,°‰‰áæÑð®l[P›¡ûA…âÈ#õÔr¸0«h…qÔÙ ATÌ4vWn`ÏÛú;¾®`UÀ«jI9Ó´ }xó`ÛºØ aö(6õ¿XvÆ,ùŃ߹ „} V¨OñÀ5±ý‘#©ÂIäaÁ½a“ZëàÌ8Y÷ÿ«ïþÝß{§½,Ø.¾|:ëþ5i$4Õ‘[µ¬& +Þ ~‚@÷šrJ„Ì‘bІղáÅ¡ê‰À­‘Ź‚Ï‹z[L7UÒzŒÑÀ*Àny«¸Ì~,3À’x¡Ê‹‡¾Ö¸,ñ¯¶S±x¾N"{ ‘<ÑDõ¼ŸÄeGV8`…Ú|Ä\ÄÚÑãçå;Qrzp‡ÇÎäé8ül µâµX²‘I*ò~‘ ý›PN¸¢j¯€3gõ^ÞŒI-Ûzç?–RW«m^eëÀáP¦¤¼P½e½+B©±*VA YéÔóíŠ-G†4¼HõwPl<;²ô@ˆlWa蔣 ƒàHT•Æ‚ K%hev0(UXÚU†Š8âe(Á!=HVÃr)ÙR [†‹SÅh¦šíåSíKUÞLÌ9ÂGTI N$:l†Ú°õñ€ìÔ¬ô»hbР —*cfåÌÔv‰sv`ªð~¤­_ucÉý‰iÿM†~âKžÈÎäÏ¡ ö›‘0³±ü,ˆ¸Á˜ðU0÷gê:§Žý£ÿä ßfT¨šÝ‚K˜±5徘ÑÃ- æ±–jq††‰Ñ˜u¶‡Ýªy#äDhB¦¾Yè ¨>XˆF˜ÈvüæûAÛb}á¾à@`Ö^Ãò2¨£ ÁØÚJ <Å!¿`m¶µÁVAí+º£JD¥A’5°™Dפ—(; ûÝ›µÄ½MŒuæ›ÔJm°lÃCÔB}Eô¶øn±Æz M¹?üÜ Ôà1ðÖÞ‹©} $mÕžÍEÚ¼[šâuÏj± æ>ÑÃ3wv„Ñw³~e¥*ð^¯ˆˆ0´êæÖ/°›ºõt¬6¹ÒS UC­ï†×²½lVóü9'£8“hu;lÍ/ºMåh6ëÚØ1[¸toÊ‚­‚D@F|@®%Dce4Š0†?æ!.Gc›JØZ?tV±nk—ø÷#›G¿sì83Pšù­°²ê $~D·h²Æ—e`\ß&YUn¦©5UjTaWá‰ÅüïÎ ‡Ÿ8|Єjaé²°äÑ4”ÂX$‹Akk8l°‰æÃšÈ´hë ƒ>4h’Ða¨‹‹ Óx–…3íukÂC,Œ3€èUÙò{\6ÄSE¿Ø8’T(Ï‚ŸÛðÇJY_fe)]S9¨ªAñýz4 ˜å·á®,e„mÔ…†)‡v6=èP—»B?åõð°1$x1hJ,P®R×ðv-L¨\MóØ,Ú/å©°¼­rî~V–Ìb J»ëÑN©1¾øW í£÷dµ®zxanHçžG‹SÅËœŸjÒÒbcÁæ* –ãBµZQMF—="J–'e½34£È,Z„uu*ôI4‘hàpÏÇä@Óµ¬ŽoÞ]&¦MàzƒvÈŸ´ç=Ñl¡ñjì¤mxüèd &IÕ ;ƒkǪÂ)4™Aw+tk;ý¢Od¥à,`¦ 6QjÔ TÝ96ì$¢fGýipÔä á.×cÆ=œÛ&A2zèÍxZßТh¶˜ÃÅ2Ö ÇQµa¦öíw-À¯îܘ üÄ æ© f 4jÖ¡QK£×íÙc¬Y´P=šc>Þ¶,µaYaxS—Hú“ŸêûÀ»¾»÷Õ¿þàº.Nê D= ëš(â6”FËІ7‰õÔØÝö•CÁE[Ä£.Œê6Zc°¢á«ì* 7ÇÓôèæÑ?:v\¨zŸ#‘_#L9%þŽÜtÈdâ_ñ Šq‹F§Á«^R½>‰>zahÚø lh, n=4|H&°0¹"‚þpq¬óÙŒgø%ƒe¹ÖÙF| ü«Æ`þ؈;{ìo¿ñ›lª,ÁΫ­@ ±Ù†˜ÆÕ!FVzS cl/ çWaTCë5ëjNšÚ²ð8°ÙÂRjŒ~dôÉ’û1¸ªÅ¯Uoó†6+|æâÑâTq#U·Ë+¹ÕÕVÜ+C–·À›XGÖÜ/VRÛ(?ïgür˜ +aÊ‘ÛtÒ,Sõª›÷ ^Ü]6UlãÝ–ß®ú—͹íУµ^²Ëq3™ ñ–êòcµ·°¥¿^7Úv;YÛŸMMÃ8µh‚ÆéyVá±qãD¤¨äÐÄ]í¨°-¤¶¢ùΖò¶V²'rD"¶ÃšD¬á%%¦óa!,³¶ŠÉqëʃÕýÇöŸøüà?CºSî.ãÙbÖVüò'Ü’Ûv¯W b)ûd¹ÆÊ°¶T~"ÛN‹¿^ÆÙçx©gëµAiRz@ü ±r¶)RBàk„+²s‚7ÝôE–‚@ª¥J‹.®u>›ŸÈÏô}(ŽÆÍxÒª|-1Uœ {Ÿ#ú0qJAÁP[J TVM""¥Š¿Ê$mj5tV¡²Ì;1¬ûÆX¸ÊfÃH˜ÊNdÛù¥0[¶Ê§ü–ßöÃáz9Rž¤Y¢ä层›´È…€”[¥Ò¼#êÕó†I!¨$"ªÅh¼BcOø;þR¤z´¥”ú顟=r~anïœ'Ož¤î$Åa6(~.k%)§$[䯦òø8gâɸO%#•-ºÓÙZ¹^^,§ü‰lÛ_b¼1”ce+îºÍ¸“SN©L\+ñ†Wš…¦½´POÐxY³QwËÛåqíë–áj[iòS%±>B§ ±ÁÝ8àƒˆé±½7xwÚ-oW”Ð0»Ó•s#H‹š¿uËKÿ‰·ëOÉï€_¦‚>H“vR+ÃN~'?‹irþ„1>.¿èºÿcýG4…rhìU#& ð#Yêu¯”ISZ¨uÁ2j® èøsUÍ”h„ùZ˜ °‘ö‰ü¯¤xóC†:Ÿáóï÷}ˆ}4En€@•3˘¶Wf0ÿ oߦdñ0SŸà[H]ë¾S8çñmZÅ]A‹`s¨Ô–ðå®8õ;ä Ûs!‹Ýø€w [}"Ž%57dÉÛõ«$'CXÇ^ƒRjÎÖcó°µî¨`[ë´évø ¢ßT-­*ß„.™m¢™nº;ƒf;Ç`/ì4ƒ #å긤§£B*ÓÿC>GŽȪ¦’æåÙ ÁQÕ?Ñ’÷…+bºZM,0a–:hYZ8¹mm~ M;/t>qxßBÝè§ @¢%ö%ëOØ4 ÿÒTÛˆ•€Èϲ5†HJHºŒVÒt=¸fZ¡¬ûºøö± ¾GÐ ›S7(cÕM5°sûO[ ˆ‰µŒ,Ûr÷¦F'Ÿ»:ë}ÃÉÛÝö>½Z„¶Û0/~Œ?Á”°!ÄæF«n´½eBàÒ‡A5w”—U9®ÞæJíݶ»‹5(ý¡¸ø /#O yÕ!®Ú9QÏÞ`ߣ÷6Åek4F•œN¥j$SŠ™”GfÐ:TXu ¹ÊÇðíû\ßú~’[Ø>‰ĉa_‰ºYcÊÏjÝmºñtlÅ>S*$)‚¤áYÓÄ„ahYÓ”";ÊΠ©’<ò§9è62&Jï‰ß‹‘Ê“íÁò?•) öå9!–4û³Z KÒ݆ Ñm¡šÖ‘“°  1Šß#d[-ÇÊ–u›î¤\òUp )lWÂü†SUW»7®=‚°î…çýª_I„½#ß92xT‹ý ~³Kz™É26Cž¨íÏýHü´ßöS6q‹^÷¿ñÓžü”›vÇ]¯–e¦ØÂ~Wîv=.D%¤SN–· é•"Ü™l³â:º·Â|ãÝhÜt'Ë…b¾¸A®EWø»mÈÙ–òv~–ˆž¡+8ö^ZZÂíš(ÇË· N.}4¾ïÄ÷vv;·§h”FˆÜy¿í_IÀ¼#+\é„û>¤ÀŸqw‹.F:Ÿ¥%Gµl´&ûœàbë¥2ìâzq­óY7çZ~ˆ–‰ØoòÓÝ„ ëfËVq™®‡‘ø¤u­ÄÏBO®Ó­4Õ/fí”ûãc†Þ5ô#•¸w6ZrçüÏì(Úü 4^-o6IKÔ¦5¤k–»%WüßUOq·$7á¶Ý]š§’Nj äùCPs{ùxòmÚ MJ@ÇœkU€÷l @Ù†ßÌÚÜÿ&[ÊÎUógɵ]·bg›Htî1´T/ø8Çb›ÕÙ“ JDâ¢`¯›UM *Óïåx97ÜXL>ΆÛt;û{û+{Ï~~è«CŸ9 Úçv'7ܪ[q;Ü)!|ñ§(#?¥À{Þ27èfÜÉÖ³Íì$ÍÓ],}´8UÜÈ(£ì‚„„Šf¹†‰£ZQÁåmóTt§¥°†³ZFÊÖñ¡ù°=ÚTiÓîM°Â  Ä}@„ó›J@1k,b#hUSïI¦ ›uU$:X„ª.Ή\6~ñX²ƒA¢Îv8oJ)Ÿæ›8YV@mÒ;S\s³"ì›[w7Ý)î€ßåF Çþ›7üí7~“·@\`¸… yBÿ]Ñ•Ñ71sÒªzX£‰ ÓØëÀÖZ`Y âe|E÷4 „>ðZhtšt#zÈ¢”)!jŠl¨Ëó–}ùGüÁýo\`ZÕaàV]¨´R ÃÀ÷S—>ð‘ÿ£û nØýe÷3þ/;‰¢Ã? ?üÕøÓñ]ñGýã¾áÿ¦{Ýý[÷½x?þûøÏéÏÓ[éxxc¸¶ù¯Ù‘ýdöxÃÀKƒ·8ôÏõÿ4ürœ %ü“🇟óìý;üoúßò_‘eÿ]§Ïø{þ£þÇâïÅÿ™ûMÿw_qwé‚ûžw“î¯Ñ3ñ÷i<¼1 „o_l;ü‹ð·ü_÷¿è_ MÚ ß’y(‹ø ~ÏFŸ¥·Ñ¯ú>Ôÿd8Þ~—Ï/nð#ñyz?‘_¿Ä¿âþ3÷97Á÷Ægæ«»w?áþÏôwÜÇéã>w‹þ'³¯e¿“ý¹ð¯Â×ýŸ>@vÿo÷÷ûÊíÿ­ìY©ú ýMw>Êgˆ¿ÞÏãyønãgé…ø«<2t’þô÷¯éiwÏOÏÑstI¾ûr¶–õñçñ/ÆwÅå“åÊO÷r¶–õÉtüóô«á¿ ”ŸÍ?ÿ¿ì~ÂÓýk÷-÷lüÙ¸ß?_Éý—î'ü7ù_ú¸û8ÿ•ÎÅß?K/Ðq¿â~Â3ž‹ïo?K-¾‹è9ÚçßÝëtÁ}Ÿïß¿Ù?âÿEüø/ã;ü/úf×ù÷ºû·îûñ/Ò?‹?Ê÷æÿ®?ê¿ ýew™ßð¥c—ÞøÕÎÿëð¿8<ÂsOð™×Ý¿ußóè¿íßÊï”çÏ¢øAúkñ]<xnÄOÓóñWü²û ÿ þkø—åÿ)ü-õ.øœ¢§éÃ+ំ_â·É÷ ‹™×Ågâ¯Æ§ùÌþ˜ÿsþ/‰Ãï‚g#¿5>’ƒî—³µ¬/ü£ø+á|üÇáx|ÚýŒûËî©øÓôÏâÊVúÿ¤_ä·Ï3Ÿ¯È÷I4@ƒâãÿjxcMÏǤÅp;!ß9ÿõ™øû4.Oijn€hïªó÷‹ÿËáÏþï‡þ§¡ÿ]ñÏ‹Ñb#á—â×ÙbˆÇ_÷¿è_‘ù›î}Ôýÿ[î/—GŠ_.ÿ±û89÷wx¸ËBžÞJ?äQJùëØúI8Ês5#Il?ôAaWaut5Q@F 0b0àR ¦‘ “²!.Á±õßX–ivìF ¨†KÂAð’ÍÍPÍÝ·Ž7²oª2‹.¹”Q*‹¶0•™/àŠ#sÚîÿ¶ ŠØð_ÑWíÑtöÙÎùÎ-†äóÏõ}¡ï'e5N]lkCúß..³÷çÂÅ:±À}ƒ+1!‘Ê™ÁÛ’ ›©\rm¿ÆÚê,GÕqQÝûèÙÒ}ˤSç 4fE=OÙö:ÏØLø–B„Aø. Jׄ^à<ò»¶™ò¿P×@}ô%±k:Ž€\•ïL ˆÏY@ ˆ­sÐb ¯]ùPÐÜ’„ª‡M¢ôºc ’åã‚›nTÿ¾-NmòÍÉÒ5š*¤ÉÎÈ_Í„“Iɾ©· îÅÍ–®su‡8tƒñe«ÀªnáýX½D ?å©Ù_ÄJr‹¶±¥içê*{ËÛrR&Óùþ§}Òö¼tDþ—=b.îé{ºïcýGŒð‹ýLû™ÔÞ*;‘N òx€|)=‰z =…;O¤6´áZù¤°` « àÍâ3¢GTÔÂØJ¶û òv X§šF!ߢfxfD ªq]üq"h#г µÄÜÀ³ l¼sœÏˆ”ÙÑùÄÇ Ö‚zRÞŸê¼§ó5N’XÝ= #ôtl\’ˆ£Ó4S½ŒÝòZ¸œÉD¤˜MÈ™¸?ð#ƒ_B¶:Sïdyχ…°\N†±²&ÊÚLäã‚O¤G‹‘âd¹®¦ø™©nq7ÞÖ¸R¶èg²µ0ÆÃ0–€Êþ9ïgür\¢«q¸*õ$ÔiÈ÷¶Ç$º˜êé(k—«tµLØÙjh•­l1kgÃLûÄ _ÂÙbÖÎTÞ¿ëÉ·}›¦‘Â\l{´0Ç”u›n9P @R;ÇÂ0~ca¶ÕÃæç*wË•JÄvšf´ø5O߃كý}ÑŸôOù÷ø£‡/nîÑvòƒDO Ò·ý+q+¶£2FRb½¶«]”ó€ëÙ¹ü¹b®ï¼ìOdÛ¹:Ï^ƒ¸þ5ñ4Çt+“r«Üö_=Ý·Iýˆ¹™tcÔòä7}›‰—4‰¦R¢] ÂÏeÉ»!GNŒ]˜ •/°ND;‚ m„›e‹?Qs 5 n‹ñ“–˽r%DÙºæB«Lr'2¢Ô?‰MÌ]£a$(ý’&=/&*‹ùX¢s´FDí„4Ñ,]$1:åh¸]öHÉug©Eírµ\)[ÙVFÉ·uCîNÕçyÔ¸e¡¶b ˆ:Ü:üòÁÝþß8X=üÖáØÁÛ*ìõžV”„¨"⦵VÜ./ç Bù¼_Ê®úµ|ÝÏä;‘"ÅÏ TID°ø‰üÕüNþ^lUŒe¥òzȑӔ³‰¸­ ŸÅjq±HDŠÙ@aJŒEŠÄCÃæ©ÊˆµÓ¾ŠžB6Íd2ùœª¥+$YeêÏE¢)šˆ÷h˜ViœÈ ùMwm•¹È?Êç²?„é0¦X©BMŠÒH§@o><á$Ðu›nYjMÄù8Ìll7í·][U“ñÒÝpcQô*d^Ê7ó³4DÇ©&jŒU¥N'Üiw—ï¶bÝ£áb´8Uœt“~̵˜»ÜÿjÿGú¥Ñƒ×¿tðDÜã0ÍR+›¥>ºäƪ➥øLsa$<á6¨ǰ™ÛÔfy^hªd.­Ò Q¶‘Ë.°ŠF¶”µ³56Rià1ú¿hdî1ð œõê6Ú•ÒoxÌó^+ñF¾”ŸËÏÃÅJq#®Òr¬S@+åVÑ›ºÌÌùÐÂ:‡j{ HÝK¼pVéoz”ˆ”ÚGÜ-/FÕc·L¹./xÞ‰¶›S@ùNNy’`fŽþ*ÝÖï)ZÄê ¢¡2MçHé¯3ç^Ö¾øP¬œÆã¹âÙÎùN{ðmW‡^aß9[Ï6³ ¼‰Ê¿üãÀ6GîŠÌ}I¶­öJØçê{ºÿcýG° ,X«%n-;êK5Wûµ¡ÜØÐÙO@‰:vû!µ)[춦2"8›W(ÌÚ$ÉãÛå‹si`¬et hŠJÜÙÐ;TšvÄÂ’T!ôÀÖá¸óyljŸ±­ìÕüN~vàmý|KþºT…0JdÐGSe;Ü`-!·,åyU@é¸*>ÇöY‹U™ôÝmA  Àz: (Ò ’uåyýU§½N؃gmsvh¼ÀiQ3D©”2øìª žÃ|žiR¬ÃïA³áªJ™>4¸NEªÀPŽð*8Op® ¤kœÿ¨ìÂ×$"¡ï'õ²¬³‡2Îß»ñïÿøw/a I$ÂcJ)  ‚åd‹6›x¶ÐÃ|ýhÝmæVc¶‹"î½MtMû]¼œ:˜êV,v£#†Ç(ª§IQ÷ßGU“P·-l«ñÆök0nMx"Ÿ™!y~ïÿÁá}¦#5aÑ_õk?¸ 2’E°g²“`¥|äF‘HX<=èĦÀÅRI~R‚ý«m¥bn‰Äì`i±=RˆTg)œÄ·ÙcÙ;4C‘a»vÊæmÚd༕3 *RÙÉïäg™(50 Ôqal1#ï—ÿð¿;zñ€¥’’ÿ…òÉr û‰ü§³¿ÏiÅÁ¯üüÐ N*3YÓ™’RýWáëaA’¼˜¿çúêïùïù¸ôWÃãy\rBõøëþý Ø~Ãÿlv’Ï/ ìŸq_qOqršïö呲(?£Ì=ð&mÐoñXñ‘œ2—q~‰®ÓgâïÄ¿ÿ‰Ð;~Ñ/».ˆÆßt装þ'úÄ“B‰à·Æ™Äß©)Çý³7|ŸE9eŽ”üÈ~$ÿ<Ç乎ù?çÿ’ÌÀGâóô~_B#xcßào1Aß#ÏU„´%åÿçé­tœß;•œóý·ý[™”ÃÉ~Ùÿ™ÖóÛñ§èEþßþËä ™½ÇdJÓd~Ðs´ÏW”™üËñAü+ü»Üá§éùø+üÖ„RÃ÷ƒä‡x.¾7¾CŒ `þËVÇÇ3…â³ô6úUþ«Œ¯å¿ã>Nçó‹ÁçìóGýO–ÿ¡üÃòò¯~zµ2¯’\xÕ®BQL&i,sö°ÿ­ý¼&%÷Å¿=8ûß8üуþƒiÅúim¹˜pE`Xퟸÿ0}‡ï’´¼›¦sZE$ËSÊ_à7!F€^R\¼$ûŒ˜ª·ûšWûŒx¤}FÜ3qü›Îi=\fêsä£Á[P€´Ieð~ÈÛžtBúGûs{¿bÁiëi¢‰DlTùŒ’ñüY è{) ©ÁȘ/ƒÒ¨€t()2#¥‚å”¶]bçÀK¥ói¡è—!Êc!zm¸àýXB&ت¤MüUQÝxÇ@´:£^ƒìÌüÂ`ÿAmÆæ0‹‡7gŶMCħÀÎq SðxKŽí!Îß’b×ßüÝ¡•°VÊXOJmç« P·òÀþ³П²ç²°ýŸÙÿ±½¦/ȤÞª¢Ÿa_sëø×¦~Ñ€¨ÏÁ²ZÜ÷¥Ém°'µ3C@ªò  )ÐÔ”ð_µË5 /=²W0ÐØM„u>±¬T~‡ÊŠ)*H’•BaS‘‘7"ü'EO’VG÷³å&V|.…E¡¦†îù‘£ïè<Ù™î|-{5¿Ó÷Þ|'¿Ów7«±µû6GÖCõi¤òÀëÁ›G[-'ØÕ±xg—nËVVªUÆZ=~ã#`À¥f,iÙye¬J‰‰/«¦å†í$ÅOoeõì Ä_L!@C6¤;-FD®¯ˆïT5D8ñ|-QŽÿæáÞä^{ðøk?ÏŠÑC }ðèù½£þàþ7ð%Ù†ÑÖ¸ô96œcìSÖÔãÏ õ5±T¬¸=vKä»ÅnÀíÁy±ª ¨]a|IµÈMX§ÓºÍæNpܵ’¸hˆíÛéÁå1K¯hƒwÛ,“ÏÜt$›ªòÑâTçå2ùÎ7ÝNßçúVûÞyøBç‡÷YA{Ò%£ÀE3 0Íܰ¡D>”aQYa¿¦ž|Wj< cM-Qz˜0³ 7Š\ZdØ Ñ Àãm­®\#Vܼ—ÆCÝV¾Éâ4pÓÚT‰Ü¡o)Ë+Èl”Å6íÏeí½Õ½_¿}è]C¿vdáàÍÜ.1¬„V6š-dËq4OE’êå=N…)¿‘Ýô;¬¦PŽ–T^qD.ÑäˆæcêA‘brËWi…¤e¶LÄ-·îrA©òhVé6·+æÊS…èãˆÎOëIG´ã'<ùaš¦IY7áÆò¸î<îÇ•8L«¾Mkª™Í“ÖF݈;ÉÏ‚%©Ž<¹)l7[PAU³£IO)p GéTÒ¨–ÑX¢«º…¼ÔÕ¸[)øÍ*¢€¼ø­¸ÏqS)71[sÙM¿¦#¥ÒYGnÓ-÷Šn׸“~Ëoû»6ËV¹úóq8ÎÓHL¾ ÔÒ :Mg» ÎçC‹«óÙT~ëðËo¥U"jùy·à—ÃBç:Ô¹ÙùZÿÓ}ÔÿÎ⇋cÅ…8Ç\‹„@n_n*Þ-+ HÓó-¿íïZR•yÃØâóèqƒ)Üüøs‘è¥@aMôBÈ‘KÛk9˜íq1¾O.Ý·ÑmQ»ZÆ»ñv…èmÄ«aŠgš<×d WÚð7«æï€4¥„UYGæ¹DÜ|²+ŸÏ§ó™¼íÝq—ˆ«ñb”bÇŸg5z²ºZ‡C6ngk\IÆÍ˜BæYºH‚ÌVw»âv¤ÿÀ³Å:¿çGýˆ—†¸îÁW¾wüÖw¥C2tæèºïcýG9`Äý»¼¢°êÚàtWžýàPÜx°å–L€v“?z¸“àâoj·ÑÔOw{L6”³Z_ )!-ÆÑ@³MÍÖšh¶aG(¸g[[‡cnÇJåL'i,]üµ# ÅÇŠÏÖ“µL^!*ÜCÿ·Yáãð‡÷ËÝò¶îƒ¸å(5ùæ61b½NkÎ,IÕ¦kpùÙ%¾Ø§°ÝÔíwUö›³› Òr÷ìú²ˆ0츮|.“²fÍqÓ£9ÿ⠴\-Úc«”ªÀ›‘ßV˜r{—¿÷¯n©©;çz°ï˜€’´uWÒ#¸3,'TtV ÉXwÅÀ6S¹G^†7ù ÅâÅa…Þ|Vs½Ç”2W±Ï‚/ÛpÛ\ÏÃÏlsˆ=²W(Á‚Á®$øtM[…ÕØæ;<²yô;ÇŽ¾å`ÿqic5ïü²ÛrÛt7ŽÆÊE¡Ú=° ã\h¶l~Êš°&-v»åêPØÑƒ ¯Ž „Ý8M‹¹b¬¸! µ—ü­‰D/ïy‰ËnÒ·œš”, h}¿åÛþ® Y7«iÁª˜‹îtDO;"ÂðÇÅ~q¯xµ[p+în °ZüŒ,»(>éDÃ~#›ñ;Œßɱ½‚xŸdeWÞ–FãJ8)^Õ·?pð{4Gb+Ûʶ9ϧò¥¼¯Åé8CÊÕr¥$·înú¸å¼Èt–¬)M1æÕ¢ïcýÏå³y+ž)ž->ú$JÈ¿î7}âš³$Ü w:yRùbÞÎ{ð¶DŽÎÔµ‰àÿ0f:ÙMÖáï"J‹4C‰E8ïü²[tÛn߸¹H3´&y±Áx¼ ÃWi%yy9å”ÈŸåly±œrþªÛ)gË‘2¥€ˆ®ÆšS>Öœ Ô ;q7^Loª1Ä£aâ\Ma+l‡5Áõ’˜ßx•Z'¢–*Ì)§üR¹^^,§â´‰í|+ßÎÏ2Þ‡&¬Æ·EíÊ×u#i• ^úô‘…ƒ÷í?¶÷aå5'·iÅݱ¦ø†Ï0YvãH¼¢dÖ‰Kp6édFå"qËuõYÛ ¹ãn'L„±È”‚j~ëðËkùb~'¥o·ïVÿ‘°VJ aø-Ë”3/eW½hüc ˆßrx”(Ûu·] '݉÷$3„=)4ܼ ¯†V”­‚dÿ·GÏÇõ¸U H‰Øè|úJ˜âw]éÁoWì|6^œä­h®l•S~Փ׉,ž±“n¬+chà›’,¶•¸™öÛ®ê1Úí¯)6[QPc™Q£a$œ¬|yJ‚æì›ÓÍÓ9^)|66U «‡7‡ká)¿”=“½èØð]/¯•òIØ-oWXw_4Š…ò¿áÎe;ŒÆóÌ7‰ˆ‹röÂJheKy;?Û¡¢Ý¡AüÍ¡¼ù`ÿ$“h‘ÚÔâTºj Á#*¸³c,Én?{OÜ`‚—ú"µIíbÅk­wñ†(£LÌb1OÃ~.k%ÕNè²’ýgÒQ6–Dø£ÙB¶¬^?e7½w¥3¡¼K6©È‡–©9ífœ‚9Å+œˆãu1svÕ¯¹Af6—÷ÊOq¥ d°Où)z•Ú´&¾Ã4Íñ8Ëö°Jãçâ@Rt!Ìïý¼_“`¿µáoºD¬pƒkAV.Ï Ã ¦ÜçÌÀw†¿´ÿæýý½Ç¹Dv"ÛÎ/Eh>æ·Ü¶_£¥8OºYº¢ÞcaÊ+çªÿ­^O•Oá,F+L $ÿÁÁ/aƒiK?ÃÝÆö8Ãrté-Š!Fõ‰íª(½©Ê– J7º¯=œ|8Þz:Ò½cLóSÈïÀÆgÁœÍË(Ü$¼ñók|O›ÁDoÑ·ýc lªØ‡bøœ]táX͆‡Ke‹áv ðç0eå÷ -ÊÚ ØË9Ûšˆcq˜¯Ë²¹ýoíÿ©×€Wåñ8òL!ToS@MyaÛ¯0rÃê¯JÕ!@ù® 3…$á6ÝŽ ÃPPÿÓ2s{=“úèA;@çë ¥ÜÙ˜ë5++£ Øm ïyù)]«Dÿ.à7+%˜ê‰°ôíL~É¡rÿùì™LÔY¨«i0y<ÛF`º‘?a×nè]Cc}¥ñþÐP¦5X£™v{C³• ›€ä ” ¦¶²hú•–Ì D‡Ñò;ºyôŽg¶ºÈ%œÈÎä—ÔÈó³§¢œ[ÅÜ+œ!ЇUÝ(_ìVqEQïÁpH—4E*Ï‚«~Øó²ì4"½ #ºé‘65‹LL©"ܲ‡pw²Nñ/84³Õê`šÑ±,-eXJsµPhoÕ©À\âÝZAÛêÊžM‰“ Ya¸8U¼ŒúSÕ™Çã°øV …3Tnš’6–¥UFÕÈs!·sÑ(ˆòúßÞÿîïrÛúÃ:Ÿ8|€›–Ü¡n„Y× x¥ÄŽal{àS˜g$¢PcÎ.uÆGÍŠš™†ŸØÃ6kÊÙ4i ¨¢g†óØ£(Çp-£ 76U\˜…〠“•TVzª,ú„ê]BÕ"­]z7â°ÕÄ?)Ú”#—|U³Ž |„°gDT”&L‚ä÷® Ãé•jûÔÔsM³ž„|%Þƒtu† ï gc¸aÃ=›xƽK_\+W”ÀÐ, 4jx'˜ßDS=jB"™²Kx¼d+b0+%uùJ•æDñ|ÅÓ‘7ž_àßQ'“?g“ÄÞ8ѨT«Šç%œä60¶ð_žînÑ·ý+}ŸÊ¯÷Ÿi"ʪ¨bó—Õ\’”TeÈ_á‚ÀY«t×rà 鑆¼­Ÿ’7<ëË'Ïàl1‡hcjp«ë1ë '‹‘ †½HoFè]Ö2c É«ÚKÞ:þË6G"6ÐzSTa~wlÚV"+ïkL*²ÿ­â ™²Æ’SÚÐ=,^ É‹¬é ˜¶ÇI)F›P®‡&VŠƒÕ·A16È–O¨°uKt…1a‡8vªðœjeìp5É ]¹n?UPbO!nÈ“Œ Ý™ÿ" —X⮠Ó'Åx“K:JUÁMª%˜ûMÀzô*Éïˆi&÷\¼˜BQdÉs£'ƶxãT¢½jáKiõšéžD«k‘Åeƒ‚K—ºiØ !©¹û¶_Ãû‘Уuû2»IÛ‡æR¾‹„ó¸ñ7¹ò@YÁöDbB4¨ë€t!Æ‘x’í½+ûãÁ¼+$@\/¯•OUâ·Š$…ý:B0‹{päÏÝ:¥XQØq„§/Û¹†ªn+‹gàNŽ>øƒûß°1?–Ejp¯èÁ‚¡çq‚߸Ü=¾`B'­ Œ^Øg¬1Âr«¯`{©Weü‰ÊA±hSç|ÍÖE·¿ ¬Îb¯uó_üf“±è®ú5 ÓÈtW "ÚU«§Vúîp¥ÛÅçÊŽçØ0‰$$Û¢»ZéúÏ‹ÏNd§³ç¸,![õMÙ–•´n’ñS­Ø À´­+쪱gÓF­mpj ³Âe Œ`&×oP‡œ¸ÀÛ£FجG~9 ÁKCŸZ`M4¼'gHÖ/H¢¸ «”@wK˜¸]8‘@ƒ¿*âå†PþÎä©’{"ŽÅaÛØEìQ¨‰ì[æ$¸–šU  ß ‚|iz¹êü)¬«Ë>p¶Ä94L"Ò&¿×ýªÔF`ÝZ×w×´ß l*”:|KîŒÞ9“×-Õ"ûù`v<»À°:bUò.GCC@ÛÃ…2ÊÈчâ3ÔèC OB¸Ø ão‰ùŠi GÐI¼ ›Zn%e±63%,¸KÿY Ÿñ­c lª°÷»ðÐØBîs5,—-”öîˆÎä—äV7Å´{XìfãŰò¬v?±- °…„q}~à«CŸÁRê&Í,•RmÐ-ÉaK.›ô! ¾ÐC«A Ù¶-°}z-SßJî«ÅÓpPfË”§6Žö`ÿÃÝJ­Ö³Å:¿'„O0Ojsb? þ*ä6"ÊÏ…›ໟ(kÃũΠ.C£‰¡(ûSb(ü>™ ¡ùƒõ’¶žBZ´–ªÎÌ<Ä ;%B¡`qs&žÏžÉ^,ARYLèã=`ùa÷e¸‡%K(JÏà˜¡Š6ßDY¹å]¡ h9Z+a›52#; kÃè4XšŸý+N< íG¸•™õb´bjo©œôz“UOåšîÓ&§Ë—Êkå“|WÖÇD Â"V|f®úäL 0Ë×XÔEÊ­ ™Àþ`Éï&…¾e`Y }1Y~;›‹+±`#3’ÞZy;±uøÖÛBo GX†ó¤/•×Ê'q¡¦;Éf|—1¿èÛþ‹(ᦈŠóRàø\hF€÷ f V„Õ ³³gÈÃ}:‹ä*B˜EÜøÑT¡scg5æh7ôå…™B4«”«@wìr¡ÚRà­X[;­bfñSôA8Rå×,vžF€&Ÿ…÷gÏdŸClH²K¯æwò÷ÚWbspvúÚà×/¾¾ŠŒ˜H ÛÃH>‚÷lwû4Y»y.x¤¨c¶ºˆu€·RM¦Êˆ`&Í“õžlp‡Çc°FÕÔL+¤/X³…¼øw`‚ S t±³õöþw|—e~ô ÚzǸü¬wlý¨÷®<&„â¬CïI¶[þ±ªzð-ã6al¤øœux݇JT>Á籌<ô¡0âáϹ¿$zë¶áž5[J²:bªÙ PFm/O^R)ÓÚ·³l3»PR ’°Evv“ý)¦®å×Ü(‘#·év¸>oÔem!.Æv\+v;·;_/¨C¯ÉüîÑñ½ý›v¸@š €ù%TPñ²_ô+>¹¸T²HŦ;)ÆHêã‰è9®)“¨x2¿š­…Åp1LqÑ& ¶­Y±¦J è‰|,kÓ"È òþ¶A7ãsjêϺ7EÓ`¥’)Çés¸§¾xÙU¯¤oÅç:‘ŸÎžã@#%ÄÝßüÝ¡•b§óžÎ×âj¼Z,¤²x@uä›,dí¸¯ÆáH4^í«q¥”i„ø—ü¾Dí8fÃJÙòäofír6Ü.ŸŠ[q;…–ˆ‚ÉØNúq¿–md ÉHɽ‘§¬æÂÅŠTAŽH²Õ~´»h#Ì*[~Ñ_M`ÿáêáÊA«Ÿúß=ð¡8§¾V,•3EæŸbšf´—Áɼìý¨ñº@ýýÙ|¶¦xð¼‘LzªŠ-7Ow¹š5Œ†‘ðŠ’ñÁ oÕm;ñ©Ë¹pª|ÂÏy©®µÌA1L¯Ò&íd“uÀXΕ­RÌnF9eÃñýq<ólc´WÒöÌÞ"-ÑsâëMøq¿^ ­ÐcvñÜãöñ‡¯~â@ôªÜhÜt'i"Þ£a^×¢‹ZÊÎUfhZZ •%¡ä“ÔÈc™ˆvK S4G-;ÜN™Ä\ÙrŠ7y¢¶'þ²4Z÷›~*L ÊÙ“¾onÜ=ï†ü¦»`»¡¡¾OÜŠí¨´ø÷áÃ;oâ ‘ 8±äl[q;&Ôf"n;ñ­âVÜŽÏ{ʨæ‰ÔEž¸¯ªs¾JwH¦/™p“D4ŒÉÖçª4¶¯ºš#4%že7}ªp$‹ 'º*j¨hʼÁGKÉ`VGâ+®3¨_8ÂÈV?xíàËûoÃñÇâŒ_ȶ³¥zú²Uk‘æ”s¨¸Z®°ÆFÖŽ¦‹ Àû¡l3_.w‹kÅ¿ä/úµ0®…)¿áÛ~—õ#~Mü²É8^ùV蕳Ÿ»H•‘ÂOB¿I7ï²I¢Už¾~&kg”‘¼Çb4ž*ŸJ¨V¼™J¯';ã‡Ãù«y+Î}Ê]wg:+±}Ø/@õ£å©òe^Þ–Ú’MdãYê3YŽ%Äs²·bhÀIܮոÕ²g4¾.oxR½ïÆÜ0zX²u͆•0åÈm:R½ °÷8ç ×g4šuÚ¤VI×Í/ D©>Ï+a²\ ‡ÅЭ¡_Z<òÑý·<¶÷xÜ ·£tHˆn,î°²˜x¾äȩޑÐå€uM¤  Ó)²ˆëq!îØà=P\ b²ì\vABBÄn,H†½ÌlöAM}@všXà*"Ç’Ç>µ)UtY-⃟+åx~[tC1˜ Ø9ç—Gê*¿n㋸_‘Ï ¢X𠤀bŽýBxÅm¸„¬Ø·Ë8Vç¬G>™¿‹<âe²ÔÙ‡‚õ¿pn($ XB¯„€ÚZ a'Ï(&sðý°ÃcÛ$ýg) Þ99fÃU«²Û$¦Ü£¥qƒR+â•Ê_xJšPÈM4µèiPÂÆÎ±h>ðXJþµ4ñá™Üxìþ›¿ÿïd1‚ƒ0§5[›@3dm±7)+‡¡ý\-!C_´Ô4‚6wcw`L*ãB#Â…/KÈ£¡›Üç®Ë—“d©-|ÏlÚ„ËŽC8?Ò8m_1µ'²Óù%¼{·l’PÿÖ‚ñhÔÐÚná(Çfëð[‡_>xꪀùO} ˆµÕ‘ªÌ ôpVÆÅiЪض)ª;·üi¢éxy6=†œ‰ý–åÈ¡ºVK¦£-vÁF@|y£݃ëÎ$×$2ȇCf·‡ ^ð'lÚ$ÿ²³Ù3b¤ìÑâTñ2š*6í®Âj°G¥b Þ%Á˜®VzÛX›&õkÅíò2b| XgMªn t¦M.{6’Æçˆ]ª^&L/€+bA;$%ð'’¢A Ú X¦X@ƒˆJr²Æ<_ÎÃwŦŠû$ö=Ýÿ±þ#bóÈcé )åÙœ*Øøu¥Tµèëe™K «`{(ßAã’Ø|ùéì¹Ô\¶V}P}’ߟ=“}Nð¯—Êkå“H½“Ǻé@xNs¸^ø/ß›*N‚I7æ¡îâ!\ï謰•N l1$2ˆâËçÒv!vm´6VÕ‹Ïœ÷`I°ß-nÉ÷áÉ=çZ´Ã`<‘#j±|—„“a¬Ur†ð±“šªibKÉ@ÝjX.[q!ŒW$‰­r»|ž†è8‘×<=ôKGÎ3‚Ñ+ÙOÞ_cLq.ŽÅ)ÅN"wÓ©d0ßÝ«¸Èäȑ†J_ã”'ßöª ‘„¾*}“%º‡ãn¼²BbŒæÊVù:'"ÑJ§ÊÑÊŸz>5§<éš¾¯Å'1‡h kü³Y;U°à™øG³q$žŒ'âé8Œúq4nj…}–l1»š_’Ëh1Ò¹¡¸ï×é ê”OçwúΊHÅí DrÙPú%¿â×âm'-P\)[,ÝÇÀ²³PÌwÎõ}*ÿ;¿àwÝmfÿ}û§ö>,oÍð°²Åì™L…]‘ÂÅø ªéþ@) ö88g¨¿<[ðF“7­Ñ0v8³&¹~¼‚Û7üU'²Î%` ˆåÎű8%Ú¤/Å‘ø$Ï[áU½onïÃUuä˜æNJ€?gb›g¨( %9'#U#lÍÉ0VÛ㥆TÜ ú}É8/„ñ.sfº?¼ªÎF¡ª÷Bõì1™–î¶:Ü~nû»Y. ‡B˜IÄ{FºþŽ~ýu'W¹›ùUùSÕñè[¤OrF€‰` €¾î«°×½bKmø~xJqaMµßvßµ¹× &,©±Fä–_nÙUŠqn¸QLzÄ!ÌÏFDÈ U¡Uò•lÇÌ.ʺϓáîca¶U£ççe™@æ¬užê¼§ó5É—™t Ø›ÊõëÊr©ž¢aKVgø¤€PSTž½fð‰²ÃꦦMŽÉ]™\SÙ™åÊ÷èêÅ|VÉ˺yÛUEë˜@r)vñ“}ÜÙ-o¥…'÷ÀFdÑ]õk” êF§Åô’Yì`þš8î܉Wòz°åu”w<¦[Åþ—ÏÙy¶8x K°|ZÕ'‚öƒÜù:ÝÔiZ#‘NQ-I8V¢%ÿ̓/¼‰K©óW³;}gñ½«Ìè‘áliJÉ·@:†ß¾xîb¶*å×qŽ©l8»xnC Hoæ~˜Ê+H™`Ó¤VV1Ë(q.¯¡˜ß&ÖäsÓ*ÍJ9Êï¦Q®°(M3ó°¬Ê•­0’hsºà5øAMÅ€ÑvÐÃß=ŠÒ/ùаÊgདÁBÕ>s.´ÂX”ƒLq¥—d*ø›ŠKÅ„µF4ôÈñáOÐ86q°õØ?<¶þ†›¹#© è4Ò ÎwØXg‡bA ž¯éh8ÐlYA[¹:{ ¬gÄBCö¼p¾ð‰0åï²áÏ-K^<ò ¬¤øñP×&ê–§:7ø*\J^*¯…'Ù¤ª7à·%©àö© qø‚#K‹±eÕÖ4¨>›PmªØ|@Â-“M• ?Ë®tÉÉ9KÇ›TðœøW| âYe7Ë S‚ÑŒaáp ±6µ‹¿^6ã>©8\Hz0ò¯¶}<¾_‹šY\Œ=/” ´5zÉfcKËš ŒÃ§Ê_w@²_“$Œ’ªSýò~€Z-vÔ?Â%†ë­Ð ÂÕÒ{`òðw™•Lp Õ‹Vª!¹ñ/4R–W…ײeÌ*ÄC¶—¡‰>ÜÀáˆÉ¸sŒW”àw.^ S\“È]^+„Þnio²Â5¶È™ÌJá›ê)©Æ VØh™¬À8m^o œhÐ<5$®Gdi))*¬+ÜãòïÞ7MÒ ü¾rE_œ§Zæ^uœž÷Kî\òh<ù‘ªƆk»©'"Ú†ê|fŽ\ ->^)OAsSlÿ-‹ÚwmÙ»Â|8ÇG†É8†³Å¬·eç{+¾RüFAC—Ž|úÈ‚”RS¤ø9UÀL‘bEÝÌf|› ,Op&=§j÷±Lš;*r«× 7w8_£=æÊ•ðºUçÌ ‚—ŠkÅ#ô(µHLs…hËm;U'Á×.´$Ø2µ°ŒË¹x*\AÍFZ—  ’£Mücc3‡K=§ìNßÙdh"Å“´JÊëH ´ÎT¡ v)¶ãI7á¶Ý]š¦ÓUßÕ] Ä-Èå) 3(>Ô’`47ÝN$ºXí“4‡Ëëåµâ g%Ôö”µÃDX)[4J#Ú‹¤óDD\ñªè¦Éë¼MÄyÕ½ÝýåW80÷»þvöÚáì!LÑ=¡yóC |šˆˆ +²ùí–ׂJÉ_Ädš<¤béìé6ÝsôóG¿sì3• %D|¢¯ "»Ñ0´H'¸Hï*-Ç5©%œ÷ ~Ùp§Ý]¦ 0G#Å“òÔ{q»L0üz\ˆ©Z€¥f·œå—¢œ¹ºÍ­œS&œ‰s™è¦DŠIב|TŒ®¦òU·–bìú¯~²/Ãv×’*m8&íÂQ©}2ŽÅavwPTÀ$PU%æg\I¼ÅÞ\g[x„ªêJi@ÓtŸ]§ü[Éó‘lª¤ œÅæBv¸ûÛ™D•¬`òÊÛ-¥w.'¿˜ ™„“E£©ª{'ŸHò¿¬–Åî}ª¤¿évT˜itkUk8À¶q“‘/^:HQ²F ãðÈw_ÚX`V‘/L 4|×–%1†È¢Ìªø.´Ââ}ƒê?Οÿ´) TVÀÔ–ºC³êåÞT¸Zw´Q2Âøü5u~„‚öuVq&Ôs²¼"pmnгÓÅjizÕed²fº«Af (1¬DZ¡“Þ"6JPª= Ëm&U ×¼[pË (r%èý‚sy<]Œ¸­°iP&“mO!ð9*‘J§¶ÚƒÃnŒ)pXq»«Æ¬~;I !aR™D7¹U¡?쀹?Ë€š¼ì%ûÆcË…/ª¼£¦Gp%ŸC_%4¦ÀBˆm,0 ÅÜœrŽüW¾"{—¶]…hŸ®×#ìE#x^]•yc¼j¡ H,-0¾=08ø%I›Ô|÷'T³Þÿ¤) žù ØíV¶ ,<¼Iið*l·nƒ½ˆ°—Šc ŠSÃ=Wê¬u9 ­™íáÝÿ¯¾ûwïhíš:»Y¸¹8 Vh¸Q´¿¡T¡>Uxi¥{Ûn1üòØ%Æé'h,ç'²3ùsMì3[Îje‘ñln£.Ú¬ßD·Ç–É ØÇSø¶é–­¿ŠüAÈÂÏBô+ñã œŸ(ΤJø‰Øô ±°¬.üÜÞía§DàLÀÛc©ÃÊù1`LûùCž·"—Vê¦6g;¶”½Ø-o—eÂfi™_È«êÏÃ\•6œ€âŸ†ÎŒØÛ\uZ4•‰˜bRdQ¤w$_m‡]ŸÛÊYôïpuØ–.Jš™G›`¶¡£ÕbGà™m­%…Z³‚Vß–£i³P®‘h[1•›¦fo€Þ••ÜM¯§¾ºefáDÄF³M¥ævÙ[Åä‚«š>üݨTªCõÒ¦²~p|3Çïu»ÁX(‡ßÜCÂix›@À*þ­nª K^E¼ uܺ³ ™ÆëâçŸê»ÞwFjñ¸ÍÌ öÈü’«*Um ÈŠ2Úy…b{è…Á •",WFg¢iµ¢Y±\K«¶‚«©‡ ‚É9ZgïD9=’{½»(ZƒL#ójý¦´“Ô7”OÖýZìƒYºƒâ°©>ëm¡Q³‹Ÿw lü5ôØ‘¦ÞvŠ4y—¼ò3æ;ùü½È©‰¥øë¶Ú~èÒà¯YØÿ™ýÛ›±é^ÛÎ_ž]0hôÑèa&ÐÃ:‘I &ÛŸÙAD¦B¡TgMF¯©Y\“†äÃIhˆeÎ…‹Ðrâ­ÇÔdÚ¬f|Ó»@ÿ— L=í<Û9ß¹%%лå­â2zÖ=ÚIàŠ€ÏÙØñwíb¶gÆre%[`ˆJ=´v­®o$în¢Š#ƒOÚ£A´V‹¢é)äx–—±D{K °íBñ¤øI“ îÀö̶èÁ?4=Ò¿À¦ïâñµ„·ÒÊ'j(ë±;>¯`;Ý•ha6¶Âo8{ìãoü&k«ËˆÉ —€ Ô£Òê Ol^O-ò†B4Øi‹«šdmíÕ{0ÂŒ¹Ä±Â+Ú©l…wù¯ÂÃy–âØöàj Í1þØrÔYµÒ†ýox÷ÀwKâ·Ì}G ·Å3„ÁE•ÀÖ[H8€|âÀç¿:ø¿uø¥ƒ·5njU6€'–….‹åUÉœ‡ RIñ¡?k:Kwsó}ÚPp:‹aáUŽ¥1O˜vµ «-…²v6x´š>–å$wšV–hg‰|ÖÔrmúþ•½ŸÛ›· 0OS¶—‰˜'ƒ>Øl#'Å9ˆAÕBƒbzXMtM¹ð;ØèØp’-š4jèá16€²DS4È̲ÔVÄÔz¶¦úO•CøYÅw10UèÁ)æem4Ði&ÔÇ+=°äx»â¹qðP(3•}Ê«2pÞ n¥H e`autljŒö¸‚¬÷d×o6bà)[ú+?ö…Tlucgd[a£±M•<Øtvå·²g²ÝuÚt;tžžéRUc bL?ÏÉr¬¸B7“áË×éNÖŽ/¦mF®;ë˜awÑÜ_=XÞûpÿ[ûx¢ÿÑþSý7„¦ƒžÔzøêƒ?¸s……s³ùìx¦ ól0£džX „å¿›è¬Â4”µ*Am¥!<ê6»º.²°´_óq!^PÔÓš§T䇙wÈã£E²Ê®¹B…6²¿ÃtJeùAKÙMU€˜`¼%?Fk´HmRrÀbM‰®FÊÖ³Í삨SoÅíª»ì–oû»¢o 6Õ­º—\Üiš!ÁÅh•n×½£ÝJÅ‚Y¤ZSí‰V˱ØÊOäwòK,w#þà wÚÝåÈàíïüÒý±ûîûÿ.›õíì•r®¸]S%0¤p1¾R®†åò# ¦–«¡•~—Aß -º\ñª¾¸ÿ¦8GcñqÕç&ª¼y+lƒþýxŽ»t«Î™ÆÍ*·µEmw—6â¦ö¤òõìNßY¦‰ÊwNЙ¶°:¢N2¹Áܸ5·[þ:W’ÃÍh1‘[t3~-Q=©í©\ ­*sGÂëpq»?íOgíb®luêöXfú+m¹g’ÆÆÎ ÓnGˆ Kþ¢_“Ö'¨íט€ZN*‡ÑdÈ„9UÈÍã°áù Lw¬yd³e«|ŠF‰ˆ"x‹ÒNeõÝo'a4ÞŽO¹ 7–ˆ52ÚÏÝÎ/u^8üÄáSO ¥gÝ:gã“ÍÎ×yÄÜ’Ÿ©¸ò\QHþj&ÔÈò¥b³Üñ³¾í•ßÁ?œï>|áðôÁýl4;ž]àdûòªaõ7«ô›6‰:ðôë4ãS{ˆõòb™ÚŽÍ¢)4+a"Œ‡^]&âxfÙ(ÖzC"«øk“q, ÇÕx1žd•1Cè`ßæ¯æÛùYÕå[{§–ŸMRdL&ðm¿¦¸KœCä )Õåî±]»]½|ø[ì1YA±Üàªc¤Œ&«T"°ü™ {_}ðë®Ý<úGÇ~\÷W#èô?—}’wKÀ&¤RõpG’ûaÀ}ý– 4`Ô²l?cX VÅTü&8§e®ÅXÓkv÷ú¶_crÛÈà—m4'dyˆŽA¨ØE ‘Ÿ†‘áà”Eê,´¾¨•¹ê&BWð|uÿ';ïé|3‰L7U3Yì5ú‰x–TbðlÄéõV” ×õž§³K¼½)ÙösDJ&ÃU…e  N¶RCÀÆ Lf,ž&‹êNÈù­d e«’‹`ð%%p®¬pL‚Ø+¶÷2h“uïn7„z4¦ê!¡7t“¯¡*Ð/ädŠ)ïi"ö2\œ*^f¯JŠ!Ök ƪPR&˜,’$t>:šƒJª.c“ÿаP{톉–& !†²ãÙY`ijÞ JÑ´©Mrmâ%qTÞeC» þDî¤Á‹AÏÈ|—J}ÍÛâÑš(š] B4›2(¾±\|5æ{0߀ċßåÏ¥¹éN~'¯¨A@b n°ìE`ÄÅ~ÑP<§:è˜z4ª•k½ƒ¾;näü-6‚Z‘Â6®£"I¸Aê é~Ô ]„Î 2øø\±'–²¿Æ¥›°MƱ .+òbÅŸšöÛ®SNùÙ87£Êèñٰߟe²r»ÐHD‘D:Á‰¡œ&"b\‚ÇÉlÌ'îh ;˜%aYUO¾]³êݦÛñ¯º¶_ K¾JìÁ1Ùp7içÁêƒ?¸ßbÞÖÞÒƒ_p R@þdŒ¾IDO1>ÂŽìùDävÐ?²ÊÀù²­Œh-/;µ­R«P9(øW lj0÷±Êžš¢î¸mwÖÍÖ¦Û…—åx9œÏŸÉïÒR‰°¸Î»3îEô8ˆè QIЦÄöã‘<#çk–H«ÐhÜŒ‰ò:G­J1î6õç²6·ïå‚|ÎJ^av.£r5Œ•­@a3¤C© gu‡â[ÍÒµ.­…Ô`Ó-ûü™ì,Æv\+'Ë[Å•ì|öLE•`Ã"H;ùü,tý'Î Ó§è]¦î¥f¨»a9‘Bnýô±b_F`Þ‰$7ãËþD¶í/!­ºZ•í$ŽÈšñŠ’mêUü–oûvÜu›Q%ÁÕ’w=-³q›;Hzyqž'«å½2)ÐSÝô·)(>Ú:Íø´rýL¶Æ¥Îê<Œ_³Øújh‡süDJ^á.Û °‡V$M®…½Þ°î\édC± êX!q%5ì™mƒx[d|ºG°¥8*4ðçVFvè]C£ª:4sÀÖZ ¹mõg‹t~Oò¡ qƒmfOdIˈüÚhÉJ'©¦°R)V™mòŠ+i®¸Þ1z³˜(riÄHÍC2FìãdcÉÍKTÌúÖS7º@•àHûYÑ+@N0–.[€²ƒÉļ[_ÌžÉÖŠ—ŠkÑ.ݦ—¹mGÖTáãñÎÀWÂù«™b+v>9rÒ?NÚ.-ÐxÅ[Q-éýŒoór¯7ƪ:»[Ëñ-ñ‹ajðÛCŸ>²p°µ?¶÷aµç/Õ;6£H:afð|=™ât˜ Uûx‹ÃåB9^žË(§ülе’ïV™€–Wa£ |TaÍõr3á/~È÷lŸÞl#;—&4J6“(Ð*Ý"Bæ¨ùßÃP6’䕞¨Eíl'oç®—TžŸ—½’£!0ÙÌŠb,ýM“´YÉ/¹s~q–rAòeótƒÎÑYЙm†&ݵŒt3ªæ’¿óÄo!Î ÄÈʸWu½¬ó±²Å-°ø“ï ~‰kKŸüØÐÝΓtºs©œ,dž+çÅ0%­½fã cMŒ ôˆ®¦^œLº¶¦ «ª¥Åny-\æÕW<ó~ͺ—D“森p䱫nÅ=ï×}Ûï !waÂû5fz»Åíâr6‘gçD“2òm¦—s«4ŒŸ$¦œ²a)ͱJê*â’Ö˻ưšÚ©ÛfîM?Šqkd.n'Ç›âLÛ^ÜŠZ ²•‹ÁE;Ä"0\f^ŸyðÒЧ,°·¥Ð%DŽl5¥ɱ^VAA‰¨ × l<¬¦ëöÈšÖúDön­(þ`™±õ×,&…Û›U±èžEè 3¡¨3ÑP@Þ„Fê¶ )‚t¥<–”YÏÅü0Ššý|o$²–üák‡_>x[Â'^×ð¤Ô[À45üÜ®©&K™È ͺíèŽ]𜈠Û"!+8#f‘‹Ÿfk’·Z ¶Èt7>À‰h,Å&G¬Sõ<°„¬2‘m4ûp_‰€óm§2—Ð kRSö¡*ixÿ2oò×á¥ÎæÏ¢¢ª\»mÚцÏÛê7ÈãÈS˜6+h¤Ä ½½ÿÝßåtPL@CUj6¡à¼ïs}«}ïd/Lÿ¨ÃiôãšV5Mbœ¶õ¯mî‹«Q3‹YÛíSq `¬šÇb}.¯z¹+T›ÆÜØõGPV³ø‰Ò…é(ÖÔvâS¶üD~:{_‰ØÓ¡Mý-e %;“ŸÎžÃ¦˜}xóØZwQ»8±ÙΑ÷F|öJ†¥ÂkdºC¿9ž "/'ãU¡ð´Ð P*š5Ú¡o£ú–¡T²Â•7${kB‡[Œ,{%`"rÔ=ù,qW•ï°‰Áb¨“èL.MyÉö[â³ ÕUȆ·aèïày,ˆnéÐ §ø­©Â)ÈÚ;¬j+<Žû9¾ÐùÄá}1Äs±¦¸ÔI žX^‰{ö=ZžêÜ`l‹é¦òÆQ?^ÍÊ[y;‚XÍJÄüO|—ô “@y%þºðÃhóáÁVè±!u£`žÒþÙí6eCäxpG­Ô¬²Ö ?¨QeÛ+aËR•í2âvø; ›È“.º«~÷FT¿jâ Ù6hÈ~BŸÈòzl77åÓa6Ö´rR¦ß€ªpÝø,jb5Ë4uD¦’’Óýü,9Ò<—퉩Ø^üÉÃѨ‡¶ªSÉ`¢áÛ·ÀcÅ$œW2nF%U™<*òFÈç±:Vè $c]3¤ÐàZ¶J¡=Ôî@¦Ù²ºš¢1¸âfÛ- cÃU…©Á*{ »õl0¥§W­!…öØ#pXÑ„áƒ)sc…è2Õ"܈ê=œÁS ±*ÛÀ]NÔb·ÔPŸ‰8‡9„]í°Á‡‚{ Õ}Ÿ‚Ä&uü&ŠvrD£c¿kaf|è­(Æ,Tûv,íÀªnâ é¥(ຠTmÐaåŒ-ª…!9V±Y)g¹“"PÁoÃSóÈÞº=§5ñ(…Ø$–‰¢ÌÅ“÷t¾ŽÍ,äC¨Fƒ¢V«!‚¢+`‘MÜМYÃgÉ«ê ÆbXý^4ÁèÊÒRœìÄ&Biꂃ2`x ’ÜsåYРÈô¦™”¡@ɱ£/Ñ“J•‘‡û¥8ùsYÞh¡¥|—¸Ð2•W}Û¿RÌ­‚Ž~çèÏ;ÏSª|_¸U^ÉȤú/VS’Ö »uQNçg”É/‰„Ûhܬ’ñ0)ÙTq8Pþ£r®¼Ëb Ü÷-ŸÎÏå;œêf‚E——D½”õE¥ˆUÀ(Þ ½˜ëð»[õËNdgÞãIMœpã®UŽ†Û¥È€TDÓ{U²E(£´Mw1À%Yb·²vv‰¦Q›I –›£öv\`;ùül1ZŒ7DZ¢³âµÓò‚0J*ï•Ô•šh‹úë ·àæÝó4DÇéB—˜r«Ú$6üM·Ããƒ&’æ"Q"Ü.eíL™9Z¥•dj³éìtÖæñá3 þöÀ¯ ­ìÿÌþþÞL\¥å8Ì¥\ºWÊĪŸ ütÝI9þ¼?“½è “ëð[‡t@ß|o<N‡)wŸvS t?A‰Vébá¤ûù.ùd9VéX™:–lêa:ÿ"™›©« Ms©h Ö5“0ÐHIoPŽðÖÃÅ8Å[a?¬Ta/âüˆì¤ØtsX¯šÙ±lŒ^‚–BömÿŠ¢í7("¢E·™»Z t·Ã+6‘ Dߣ 6˲ιêxÌå¬|$‹Ÿ€H¶ljÁÐÔìÀv÷ëÑâ|Šjë ©røÀeÕŒƒ!Ä\HíÂ+Jè¡Y7Ȉÿ­l^ ¿e‰—¶¹VÈmÇP™!¹-[Í^׿æl_¼Ü(úÂqàðSmȰoø–4m{lèƒGÏó&ôð¾v4l{ eÊaÔÌ4[&Ž!‰ìyq [‚={š¨ÔhÂðsdØZ?v/°5Yzº:Üû¤ÚdË©Sv؉JHlz0@k·QK»!ž%=ÑØ<)%ÒÚóJP·ëB¦P«S™¹ ‹‰üƱ+Àü‰wÇâ0ž_ÊwP^ƒôÅÁæ©(±†ºÑfÂi¤ú²`Ñïù˜Mã{ÜÕ°¤Ê.ýƒ£þàþ7P£)ˆz Ö5Q.{ÍæÕ†7‰|jü–íGi5$”~¦1©ª&,±Ã¨A( lØÉ¦ªXøA²5yCè•“ùQ>;ãMŠôЛñ´¾¡Õh¶˜ÃÅ24ÀQµaR‘ìw-À¯îܸ8ø‰ø” Q%€; uÈÎ@ÈŽYSÌ)¶‘\W8[á !€An‚ÏiM•Ô©â}év¬–ë™ü’ ÐÌJ–®,ÿ©2ËæèÇý“7ÜC2m6Jf¢«¢ Z1—gò;”@Ùý_'žk0 c×<¿ò ­™€J@ùÕ¸´&jU6¤ D°«0;^G7þѱãB-†w…GŠaÊ¿ñwä²E×iø+ž}jet̲ ‘¡¦š°.âÜf—"éßÉžË I̬»Õw+S…0¹?zÇú ¯ Ï¿#¬.œ¯ Ä>À÷Ô ûll…)Þ×Ñ© ÷fc+L嘿ïC¨Xˆ–ÒÚQþÚxD©<$ VVØy’Åí­*eÃ=j¡ÉëƒXÌ(”«yd€pÛ°«<ßPVÒ™#²6ðùÁ¯}[`Øfe¶€m¬Ô¤Ž»¥ Ö”ö´ éÑ¢ €íj;9]²ÒwVŽÑ^·Çø4¨k)3Íž8t`§óÂá'ï[Õ-|ãÈl²@n'¸•Z‰>+¨I !Àñ±Û˜êhÌ=þXÚ ²ùœL7-žíœïÜÂñkD“1T„÷òzƒ&ê ·-¬Ð9˜âÖ¨?ƒ©ùw°…fF;ØE $¥¨µ÷ØÀñ_-wCÒœµ {‚½*ÞýÐèà®…Ó'ŠM´‹ÂS¸æ(wkÅjZÁ5ýŒõÀÒR\ð¥ºTHyvL©…)ˆc­nAÓ„s¼äÛ~KC˜%ŸÊ;`L@zE‰ù²a°»Ó’-S¾¦‘PN»¬âÄã{TÂ&ˆñõé>Ã@d ½†¯ž îúN?…mG÷ÌŽg d¾ «0!˜&Ê4òXmÀ–À£Š5§\ØÄ¸¤a„a7úJ"¸Õõ 8ï¢Ç$Ž”ÊÉ6ÃL+Ô;5H™a·+¶½ØÄò0¹"‚þpq¬óÙŒÉ Ÿ£d°,ךŠÃm4%DæåØÙcûßdSe)vë!­oˆ‚6lĬŠZ<0éÿ#*îÉØ^ί¨†ÖøÓÄánjs€éj,¥Fo"íT5’%÷cp ‹©^Á m øÌţũâFþª>z^¥É÷¡†ÕH”a;At —“Âìâ|<‡‚Åòt¦¸ÝóHb°x¨%¬<¼Ù½-˜oê냄 ËîÑ¿Œ¬íÙc++š:atÂf‹³ðx Ûõ’êÿ“ès¡†¦ÏÀŽQ@ÝDZhøø<¹œz¶)Àö‡uĘˆ Ù9Á›îŠaÚ"KA ¥‘$D¯â‡‹kÏæ'ò3}Š£q3ž´Ž_KLçÂÞçˆ>ÜXýoRÅ%*«&‘RÅ_5u6µ:ë@Z&‹‹õ°vˆ¨­‰a6Œ„©ìD¶_ ³e«|Êoùm?®—#åIš%J^7•–“r«TšwD½zÞ0)„•DDuñîWèÆ Ç_ŠT6‡ÌGÞ~äÝGÇ÷öæœóäÉ“´¥œ¤±8ÌÅÏe­$’d@üÕTnçãL<÷ã©d¤²Ew:[+×Ë‹å”?‘mûK‘"ÅJ¾¦+[q×mÆœrJZ`q5®ÄJ&Ûr¯LqMˆÅz§ûÅJjåçýŒ_³a%L9r›NšûªÞšó~ÁËø±©âQr[~»ê·8çZ´CKtŽÖzÉ.ÇÍdn$Ä[ªË•/̳îz¨›†ídm65 ãÔ¢ §çÃ|h…eÛÁ;NDŠJ¾Qà…ÑØŽ ÛBj+šïl)ok%{"G$b;ž<ù6«ÔJIü|XËÜDÅ/¹ÕîÁêþcûÏ|~𠃟¡GÝ)w—äl1k«z˜'Ü’Ûv¯W b)ûd¹ÆÊ ›òÙvrVj·#û»&Ùzí5)= þ%«U(ÑÜñµ014"íSì"çþ6hÓí䯓 ê|†?Ì¿ß÷!¶¬ŠÜŽgj0m¯:Í`>P!±¾ìãp3eð‰8ùŒGH׳º NˆzX+I­ñ0–úåTªUµòQÂkº JÔï7llÏ…,vãJø€lõ‰8‡Y• Yò¶‹œ2Höƒ°Ž½$ ʤÔ|·¼]^‘9 ~b­;*ØÖ:mº>ƒÒ8Ô ß¯n  ]%¡è`ÝÈ2òmë_1U¿=ø»C+¨Ø¡3øŒÝ) 3Á‘ù&¶ABA~Ož…ÃÊ9ƒi¦Å Í_‡ºe‹e>X{èJ~ü2ôñªIZo]é#™;ùü,ÒzøÆø¸\¬ÿéþõ•$”Cco-1a€j‰kR‹H™4%Ç¢b±—ʨ¹ €âϱZˆ£H5°žbiÍ2¦PIÓõànhÅŸºF©±e)ÃêÖ‰…—Ý7äéz”þþ©„T™XËH-mj€ð¹«³H7lNÛ£ÛÞ'r©pAb¾ CHÛDSß¼S 3±÷*Žaƒ[¹:.iãé¨Êô+’Ï‘c ±ª ®Ùl,ˆóPõO´dcLàÀqΫL˜¥:[–VÓ<ÄYÍãÉyêÎ OÞ·©9Œ«Ðž¢½Ä¾dý »2o5Õ6bå²hºã‰ õ^ ·¤áYÓä¶ yYÖt¥È޲3hªxDuQÆDé=ñ~b¤òdz!Xþ§R彑æ¤ÙŸÕJX’¾è6dˆ‰¹¬=Éî™Ä6blvÒVö)Pñ20%lÈäê<±êé¡Üã/<¯pa£š»ƒmCå"Ym‚=kiÀá¶Ý]¨A©"ÅÅyœKˆQ€ÒnUM‰µ!¡ 5(ñ£1ªät*6Ùª¡˜Iyd­C…Uš«| »}ŸëûBßO²$´í“Aœ&ñ•8 ›…0ö¡ü,ñ§ÖÝ¦Û‘È *”óŠ”°LÄVÐOw' %¬›ýÿµwý±yV×ùÜû¾ŽíüÚFç¦ ë‚(ªiI2Ò²ç$cÂÐÀd•™ªb5ì‹´$²y4a6jóUY]‰aY¬Š Œº{|‚Ñ4D8ˆUKø!‘„Ôe¥MBìÏß{ïþ8ç}¿çæ|oÔ¿§ù(ú~¼ßûÞ{î¹çžó<ÏI •í´Ï-ö÷šSHñYȺ¦}t<IÕ÷FÅ´öÇŸi\ÖøÅL¬ƒ;…ô™.;d‰Š6èµëxy÷P[¶¼Ù%õQ‘†®™œI¨²Ã¶ó]UóSÜ}Ä´›QsжRà,L`Rl¸ä˜}ÜËÇ’-Ò•(=8l2…,á½Ñ‘£hÄ–¢"÷¿‰ú¢® +ßgŠæbÅÎ"Ÿíƒ”j_uÁûßê‹Q‡¥¬DÐHDݾWr¥ #NŽ’ôÿíI[ÒìGL«OcœS2c&.ô7ükãÏŸž¤IšàöÍ 0cÜ)SøOQDve¼g¡WýX4•¢y´•z¨Û šS¨ï×T.¯Œ(¢¬½DFœó2-¦dD‰ßƒ/¹ÑLhˆò5îò¬«]i #7áÆ]¿´)Àxú'Óf¼QÞS~|r¾±E{Xo„²Èy+M4¶À@Qƒ’ÝÉjÛaGíJ 4Á¨ŠûߨKv¥é0M¦VË2EÓß•»ö=>ÒI–'Ç+ÒÛI°~#Q)³·³Øp=n«“Ï›_2ó’žÊÖÊA1ÚÁ¯èmC®ÖãUD´–žÉÊGãi( Ø®ö¤-YÐÐÑÐÛ¸Áó'ýíSg¦Ž—WR -&2wÙQûJš˜7Ö %>ÇœÈÎZsªòG•ÅS{©ÏPU6Ú®ž•¼ØpD) »²¯²{j¯ ÝÙ‡IΓ¢¥‰X*ž*Èó§pÕÍa¼XqU ‡¦¡±Fá}k>ᘦ›žJ¤+} ÷¤) ZÒ$P•D²+@ä“9 tŽy¸0M’ñºuRUH%LcE’_Á™>8î*n˜ šÝŸHôqÛ7h‡Ý˜4n#µó«Ü¥nžŠO¡ M]ñøÐ}èž’AiÕžÇ-È™*«Ðüy”u¬:q¤`äÑž'a”GÒ6þájB^$\±ll9HÙÁC¢TRÎ_kÐ00¹Ü>·;¹WRò|<ì˰?¯ pa—¡´žê ’—G†ÈëQ¬|^Á8/·%÷©ÄêÐ|kÐSajk0ì”*€†‰Ö åädër‰ˆÆ‚©î«ð"Á¬™J³bWTžíšæÂG9t|5œN¡¯‡S­Q%‘`¯-Ú!Ñì1-j˜$ÆøEæ%'o¥!&Z+dSNŒÎ»þäô¯Q—„?-‰.O;Víps¡ÑÊÚõ³'qõÔ­S‡¹ìƒ¹­<©f.£«’Ä<„;2;|T‡©ôÔ˜.>j_ˆÉ3”‚‘ Wjr°ÝZ;A{ôŠI{‘Ê?›œ¯çmCŠÏèvgZ›–n³†‡q­8–éà¶`Ê@¹ í¤F^Imäš¡õÈð Z^1øV˜x´­kÉo” d®«üz¯Ýi‡P†“KìaâcñɺÛóx‹A$¾ùŇÞZ·Áœ¦nsŽæÑh–ýœk_÷ïø·ü"»Înˆöñ+æ´ùØœó7ÐË~!]A{¨Éþ½a_’$ýv³f½1sóìŸOýgùËåétͧ&É’Ì£/Ð,sÚ|lÎÚì¯ì|šëûi–}Îî·‡ü ~™_hÚÌrs§¿‡îôËh/- ]þ¿ý»þeÿ$õû'ì³ÄåwÝ[ÉŸ¹‡£ÃÑ;Ñeî]÷¦ë‘kþ­¡uî÷¢{0Ú]%|2d§ÍÇæ¬ÚïòkøÊv¦½ÌÞ$1ÎZÿµñë´…¶Ðfù$±/DCQûGÿ„»Ë?åšüs³¹Å¬ö7ÒË~¡˜æÐËþó>­1ãnÔ½îæ_äû¤zª§Ù3w¹Ùþ.1©6Íö†ŒÓæC3ÎßòøÏümb^7øe~¡ŒÆ“ÔïŸÀå!cÈwÎï®õïQ›<Ñ ~™_È×ä»*ï™z¼ü`Ã4þ[ãïW^«´TF|Å=èßt³Ýv7*jß¶ëì™ûM7m0WÙýæ–dzå‘ä)³ŒyÔÆ¦×.5Ûͳƒ® ùôyš¤Iš0W™fs‹¹ÙÞbHé¾ï¾çîð7úe~¡ý†9jï—y9ïí_ãùâ_çw£/GK£¿­ŸUÿ|ÃñÉë&4±Ê>fgØÝ#~“»ÍýÄ}É}ÇþÖ–í"¶%YöÏÓ>zÚŽÛ öj¾sóœýsÈœ¢ns–G‰GÆÍvõî¨dåFÝëîa~^*Ñí—y¹VügþM‡½´€vÙ:;Ã.uMn¶û__Ží<›çý¯ýkrøâücó¬iç{ã+󯛯˜%æ/èQ³¶ñH¢mÓ·è/é>ó_æy/HS쮋’ ÏÐý¦›6ðØÆ‚5RggØ¥~/íñ»xddU¾OkÌ8__ì„¿ûB4Õñëb9¼F8¼à§{!Šêdû¼‚öP“t_uÿ¯Šß‹o¶Ìû¶yß|hðwû1¿Ìÿµ?ín2_5KìÛü/m3Ûˆø]êòoùE~/í¡&;`–Ø·}—¿Ý_ëï¦;ý2š¤-4‘jºWÅdD4K‚7ˆ¶P¯3ÿ}¦h‡X[]€êl,½vAmÕͱž¦ÂjdJ qž ¬ÑØ¢6L¬ÊNh&ùlƒ Õð] Ô>ð†ˆ÷y‘ñê:NcIìBŒ# ¿ÎJRÕ,b¸d§¦’›üæÄõ÷5ln|²±Gö1n ¸ö †‚޾$ŒÂ iŸÄ*~[? §bS‘„¿Îÿç›ïÆ( #Ï>ú¨‹†ˆ¨˜fšh#­'q:I‹;‘ÔH©Êïn¤“Ád )DG"Jc[ÓhNfP³Øh+¦TÉ‘£ò‘òÏ&OeäžÖ‰j q†æú3þD˜WŠzmg4äÚ]›kFʺÄû[m§=àûh§oΨéÖOeLm“íF˜1ƒ~}ʧ£¨˜ ÒÎ$Í ºBRˆz£bÔ̰Ït «Ä&\M2×½Q1 ê†ü]K¶h‹Ôaˆ‚±nÆëÔ´˜R:ïBã_î[]3¿‘˜­õûù¹’3É@&ºÝA¡ø5ÛääÆÉ‰‰•\䱫í­vFyO¹Tc? aRègü_ôAðg”ÅB¦ø—&ÆJ¡[ŠãF_p+ÐU‰»¤¢h$ꊺ™•õEÅhˆ]† w!i‡û ºßîGÓý 1ëÙm3æ:ã¼ý€?÷Å]ñªJse rÐÒ_M©$;˜Á.Ù¶º↳á&H©Ž§¸pf½ËîÔBD{ÞŸIÖû Ç š î`b^D£ù)Õx,¦8•`fŒþ ç)°TÏê ¢IÐA]è¯3æÞ!ô³ó=®ÍwMQùñr±aAý×Rè@4•¢n6Jù—ÿ`âcñÉøv‰×ž¯ì®ð“öÛ¾h§Їmg<æÉ“VJ+äHX+ø»’²]=ukù°¤V_@¼Œß3ZÛ ÌBe°²¾’)6:r+Åé'OìÊÙ=e±b1a¤uD‘lŸ|Í ¥+À d«Þä‰VR»§f¤6"ÓhK¦“AåRþqcÜK<ë:\§[ÉJÁ&Gž\:òéAokzxä RŽ„-¦dHp€šeí~«oföˆé°£¦°_Ù9Ž˜V/zržè‹Kñ*j¤&ª5Z3ªÓs¥9Åw›‘ÉÇ©¹ÒR¹¼2Ï,·­¦À\‹iǦ¬Ÿ;ízˆN~P~cr…?ã×ûfÚHGê£}¦5#÷ôùµ¾Ù¦QuUºÃ r ¹e)Wj*@Å ÈœØ>«7£IŸª!³ äÓéP<(âB9¹×›0Šá‚=RpUÍrâuÖ ³T2ì­”ÃfnÑž8wš!̰èãjRU}häPù)]ÂÇ_A§Œ»«(@g]*%ð†Äµ¹4Î¥jΑçHzYVk|¦(O7‘Œ'ý©l[5*ᘋw`숳€ÜR‰^«zšÁ{nCD?qì 3(i (í#Ä»"ê1”ãj#¨Ø©à; «Ì©äñ‰d‡Îs…‚æ ±ÍÙ1^ƒ ´¬á,ì˜ ;„c/Tƒf+uÕP$ÎmEÇâ“ñªúÓ¾^ÿaj·YÊ%™Á?‰îÖ>vUÁ¢œc°ƒñƒ)ì9¹¢kpÓ5àyŠà¢K³¿ (A¿«±Èº#±<;Ä&ZLV_KòA§¸ò¥…Ñ­ë{¨q‡ªB"t!%ÆIÚB’™§ZbœÙ0óåYçXÄ‹KæXÐ}1þ”‹å\¬e¸—Ÿ¹ÄËQÌvõî(‹ ñ§qßÍ%ULiKÉÿ šOM hˆÖÙ³Ñ>†È5?²¿²ó¹ÈÍÅ~Ùÿ¹Lþïþkô ÿßÜl™Õø/bduL†0LA¬r’¶Ðÿb´$º1zŒ Õü¹Ã'©ß?áßñwøŸH‰šï‹å0¾ËßîÉDò¸1€€ ÆK¢£ÇÄtøó ¡ØK h¿+ãÀËõQ³¶ñõeYò5ëì »4ù4ù(ù€Þ§5f\æ‘Gwõ÷iGxß7¹Ã½–<\[Ã/þ„ P°ë¢¿±ÏóÚÚÛ×]ÁÝïnÈñió±9+%ùï&÷&õÑ’øÆè{|'?n¸azùå?œ#Ö²…¶Ðf€¼ëÞt=Îàg,ÑígkáB;ÿ.—磣öîhžáüy)í/r_r§¸ðÀJ¸ÀÏ–Ýé—IA€gùºÓ/ ƒ ø#ƒo`¾0!@†k0Lg­ÚøÎÄYê\¶ÿ­-ÛED˜i/³7ñud©?fgØí¸=k¯–ò<8z|Û®³{ä`{ÔÞÍãë à†í®ïOïA!Éô¤’<¸{a¶¥q»Á^ÍŸdÛ“q~žöÑÓlùïXgÏFû${¿é¦ rT…»J µ#$|¢FâOéÀºî™—î+WC®¯ï*ò©¹‹*§û®Þyô.ä8rø\zg®G@¦÷j|Þ4´®M©Ñ±­¦ï`C-œeÝë9‰ç[ÏîÜ/9÷¤ã¦<½*þ-Žª&v\øÎ…­ú©q–s¯¢(v)ZÛg Úƒ…ö€.IÅ›xoyÅqÓE8(ÞO-?à„¨<”£ÛÜ­Õ9GU€oçQ÷5M'’£:˯pB€£­Ê½S·NFÈz Å.ü&·žOË©N»*6© Ï¢úåâòÆc”8Ë—ÿñÀáðaë'<æ`n(àa¥µ*¢G¡Àqbd:Ê£XØ uJÅñ)Ê…vUX£á§–̘‘y˜,Ty‡_×èù@£³?ütlÄA#CHG^F s¬ÏBÖ#yϪ(àŠ¹UÅÁUáBÊZ„f¨=,Ì=ÎÑ`ý+T@Ë®t´Ö݉x A6 Á˜—ÔNçs‚>~Em$Açp …š Uºë${G9„e lE'[²2ÅEÙ½ ‡ˆ3Ñ}åU 낳™8;Øx-¨uÂ:BXCjØ6ÁPv[¨¨a%oÅž \{;½«k\ ¢Qä¦;lWTÄħ =*R+3EGì0¼#1Å v¬wtyAV" D!érÐÕ÷R0LÊbï– ¢ÁÄ<› Ê€€óEÓל5܇ƒ‘¶=º? 4ÅÒ‡KAÎZ€_ƒÔ>Æb|Ž»™1Š+Ø]O‹Ôò`’Qd¡ÏpÿÂYC;‘¸¸¢øIIÀÓ]Ôa¨JýA+7[Š ±µ@R»â6 8ªß'NŠÓçèzWº(ZÑÛ6 Cê´½n¬‹ Ö Äı³Rþ¨QFPëKƒoÄ[£[8€NÑ9Hd·Å2"´Íh,¾‡Mn½[H$3”÷O½ßâ¦róz‡àþ,øÿO©þŸK©bH"È|ª!Å‹ñË%™’šÇ œÒ!ÀŠ6n*5ä­áe„sx¬ºëR^7Ƽ>OùjûÇã?®M¼ÿRÝðŒy–©ŸK÷BÉ&@ÀqÓ‰ÝëóÒl]uk¦=4m:7“úò™äDe»eWÅû$•‘R€øiüƒU¤zèN¹èã1F[ v #ôÊØž÷@,ºÇ™)“q0m  µðàÄqÐõO7x€ÉCÃ’\€j¦€‘)zj ®á®÷ð ^ Òr7U¯ƒQ­D©ünÖ®"€˜,§VßÌÕCéÙ7lJf ].יּÃE{/º*˰¶ê!7u`KÀ b¯ù·t^IîJÕ[ù“:âw°.„ðˆ Ë£Éd@ðB÷8q˜YœÇ<)j„øk Ü vÒ¬Aýªwp8Å*9zÈZ"0BljiæI0¹gz*Õm^5c±k¾51íB‡í°”eZˆhæG‚]º%¡d‡i'2©þúX\2«\‡£T)°±M¶` ,ÏøQ2dd‰Ê'!8DÔ»<67¡R Fœ›vÓfR`! YBt"!³ÜÒ„¢!3jÈø¡Ê;£Ÿå íD&Õí"óª!?ìK¾FJ•a¢‚۞㯠yüŒç“õi*†#°ˆqTt‡=i‹ õ¤>ÛJC †”É`Âô骣Ú\Èr‚ƒtÀñ(1Ì/F6š“fŒññ™› ¨èÛÍ•~³Œü ð…`faœ¹]Xyx²496㓟Ìü¼ßLOúž‰oNŒ^¸/@ýðçÉŒf,…aWrc î;â®x,¡d…6C¿ôòQJíÿý½³­‘mŽªDwÓ¯ôm9-®™m«Gpüñnôk4ò«DAAAdñâÅd„ ‡ÒÓÓ]©µbYæææD.—ßqwwOyï½÷6yzz>á›*ʼÚö\ÌfùÄŽßT’Z½lÙ²[µ”ä呬¬,æèÑ£`YöööŸ¦¤¤lÉÍÍ­@TYYY_üöÛoÇ÷íÛwdذa|+æÁ£¼îæñWޤ’<†ÓÀFH:Ýó¢ß‘“ª|9 Ž¡¥ÄDJÁ€¡¥D‡¬¨†¬(¥ÈK+z¡æÌ´¢4°„Ê´¥Ê5(-A•îK?§5ûûÁÒô˜ÛبzÛ’™™ €7â³Ï>Û `k``à?ñññ}t͈”RÀæaÆن††¢OŸ>|OăG˜5k–¸°°ð L&ëG½½ý3fÌX OOÏW¾üÌ«V §s3µÍã·OÊ À2D£%•Zóª!ªÑ^¸§ç´00±6x¡ÏgghWFB4Z@§CN‚Òî WªQŪœ^¡–ÄF¦´ K æ[“&L(û)&UfæÓ”fÏ‚C(”U)2œo%ïM2“8¶å›SE;vŒ\»ví}ccãDýs×®]û.\¸À Š*`nnÞC­V—}W*•ÈÊÊêýº”ÿ• ©¨ΣÉ]p½múÑè“Ê,„á(]BÒìŠR²‚ÖÔGŸjV”jÖnæ{Ìô‰{Qe¾ž|÷Òoï3›Fi ŠÑ1í1eQ~å÷ZŠ!¥ÄÅ %ïŽàdÔ 7¶·<¹€oU:èß¿?]¹r¥ÊÎÎn+¥OgB •J½bccÛtéÒ…UCUËcâb5¤¤õGiM~,ÑhY„B@( ŠcEÉÒË—OE~Ý.øzw¾vjpæÌØÙÙ=pww‡®oŠ˜››¿ÃKˆž¤ž;2¶Ý…ó”öˆûùâ×ųÃP¬¢¬&BKT¬ÖÅ,E™_ŠÑѤ´Ú”¡•AVƒööŽƒWôJ÷wœ^øs$æÅá½ݶ7µñ*b…e‘~¤tÓUyµÆü§.ø 5X¨K5+£EFI9'¯YasÈ.Œxë+i÷]\\ü~8zFF†€oÆe xé£Ð¤oNÁy~g$Ì;³!ñûó#‰H”Fð!(8,p 8 ¢Ùƒ4£Ò$`îj*í4Ћ’ ®þoÂ’%QJC‹ÖïEgß<_¬È6aÑäîÓjP¬F›b¡.ý¬ñM±åR(QPZ"‰ÍØ»ônü²bKãæ«øª (•ÊZåa¤”J¶nÝjÓªU+i›6m CBB0hÐóÉ___lݺÕÁÆÆFÝ¿ÿŒíÛ·c̘š] 7n, ¯?}ú´Utt´ýÖ­[Í7lØàæââ2„Rª¤”ª®^½dmm­*((ˆûôÓO ÜÜܤŒQ£Fչ̇ÂàÁƒ±yófËððpƒÑ£G¶oß>¯2¹mذÁuß¾}Öl``à €‘ËåqëÖ­;¸eËÖÄÄ$ù£>Š€³gÏâý÷߯é]mÛ¶5 ±Þ¼ysc‡¾(uÚ3ñññ‡333ãìííe©Ÿ~úiª¾œž•µaÖ”RƒÅ‹[ÙØØ4|üø1íܹóG"‘ÈŽ"ºpáÂ*SSSµµµu®··wRÇŽë%ïääd899áСC†—.]²hß¾}ɨQ£²×®]‹)S¦àÈ‘#8p `õêÕvM–/_.ûçŸæSJK(¥\TTÔ>¥R™ijjš×¬Y³Ì.]º¤¥&o­E¡:TVæÊ2³…Beeÿß·oj3A^Û¦(¥¢]»v9( Ǥ¤$V;ùžR ¸¹¹±)))çÍ›—­ÍYZW¹¾TûäÜvEÒ7§vI?ú˜r¥œC5Ib9RJL¥ùø8¢Ýj†Ñì5Ç¥Š£mì ]ú7jÞp gbLè4ìóßgÿ;r}ƒ8éÍGYEO$¢CJD»•ú«Jseæ¿R­Kk,%5#†³U¯:yýߢ°ÇÓѾѯ$T’»O cm3NÔ+V¬8””Ô]W›²³³[0gΜŸàÆÞÜ­P(lõïßa—.]‚žÇýµ+00ðDjjj+–e™Fù?~»¶ƒª† È„ è¾}ûšfffÇÅÅY2 cM)•¨T*èG.ŠD"¨Tªl±X\lkk{aÈ!_:;;çÔ—pOœ81ïäÉ“3(¥ÄÔÔ4#))©í€T%%%9r$ݾ}û=§R©l(¥ÆJeù>ŒeYˆD"p'e&¦uëÖÛ‡ ¨ÛaévÔðçŸþòäÉ“aœ(¥FJ¥²Üs€@ ˲Çq™ÖÖÖvvv ÆŒ¬ <+(¥æ¿þúëÇJ¥ò›ÂÂB#¡Ph-—Ë+È[ €a9€, ‹3Ó§OŸ&‹óë:Y\¥R9,^¼øV~~>c`` ´··ï2uêÔpíšhaaa=:G&“u …ö%%%•–…"g&×ÀÀàÚ|°«U«V{jûîoܸá±ÊÄÄÄ—žžÞ$::ÚPÛ6U*ºv횤V«3t8€2 svèС³÷îÝK†^ã€ðСCßݽ{wtII‰˲–J¥º¡î Ã@,C.—gH$’"''§£'NœIQ×…¨^IÅõÙ·ÐO7bדý €Ýİ:D¥“8V—¨8¦tiŽe f̼mò;­íÛP«A½*ø;r¼mÿ×òðÃß/æ'˜ ÷” ´ZSAéjXåCÖµó«„ŒVÆ­§viqhí«ªå¼H’:qâz÷î•+WÒÄÄIJ4I„4kÖì__ßß´¿]¾|ùÖÔÔÔ±eÚ­Dñá‡vèСƒìy<çŽ;†Ü¼yó€vaG¡PˆÅ‹;B*µÛiSÒÙåää¬ÍÈȪT*딈—ã88::þäîî¾fРAéuÉ@)uúæ›o’´A'Ç¡E‹úùù}¾hÑ"33³°„„„Z¯F)ÇqpttTÙØØô?~üÙ_ý"‘þþþ8~üxï[·níÏÎÎ6®ËsÒÒÞšØÙÙÅ(Š^ß~ûm\}ó3fee1;wîìQPPpB*•–Õ—Ú>˲pss[йsçÕ-[¶Ì­í}ׯ_ÿøáÇž,Ë‚ã8êèèHfÏžM¶oß.(..^õE]Ë...{¼½½çvïÞ½Z»ë‘#Gš\ºt)R¡P”1 S¡¾©Õê J)Ú¶mû`ܸqÍ+«_ÀСC±k×®6™™™ÿÆÆÆ A걉‰ ,--§¶oß~Û{ï½WXÓàxI>©¸ÿm.%¨>;¶—ÜNóMàí\¨Ò£ñI= ŒÐGÙž¨Ô0´6üÇû«Žn„ìÜÇ9¯T‡ýaÓ/ánÕúÞ¯éí¬ ìNëúžž”f¯cd4Ú–6,Õ£´ÒÂëkNÝiÿ#\¸×ù­2óõîÝOžÌ<ÝÏkNo#‘ñ–phM~P—‘P™PCLZÿ) ®Ð¬O9äò¸ÎÜöžô¿ç ß6Ô¡C‡Fè7d†aàçç'Õ=fddtY÷»B¡€½½ýF___Rïû=zË—/o+“É,´Œv¹{ŸígΜ©ðtJMM½^XX(Òïœ4¦b‘H$•H$™¢ ²…BaŽ@ PVÖaåççÛ†††ž8wî\OŸÚvºz@‘HÄÄÇÇ_‘ËåæÚri:®<‰D’)¢,--£(¥ r…Ba˲LSJ¥éééÓV®\ùãîÝ»GæååmËåЕ‘P(Ã0Ù"‘(•aíu‰Åâ –esõ;QBÔjµaTTÔ¢#GŽøúøø`ݺuµzÖ!C†ÐM›6%eddôT*•eY•@ 䈉D©b±XʲlQeóð²³³½"""b¿øâ I}ê !üñÇ:™LÖA«ÙPJ!‰ rD"Q ˲ÍÍÍ£<‹ÅY ÃäW&“‚‚“”””ËÆUÝÏÊÊJÆ0 (¥e[U…Ê6!$\?Ð% û÷ï÷:yòä …‚©¬.‹ÅbÈeYV [,C[}¶_²dIZUå+g~‘‹¸¹-(¥F©ï»Ç%å5$ )]fƒT“ –CÊ ¥ÎAÂWJ£”£ „Uª`ÚÚþï¶; º4x/:|µ3`h68J©ÏÎCöæ?Ìè£õMéšø-3ýiÓ*1Ú‰ÁT¹"ñÿnG:@ûG ó‰—Ëbú&“SHH™0a“““3F?üÜÖÖ6ÜÜÜ<üÆðññÁýû÷‘••õwbbâlBmãIIIù€RjD)ª÷»0_j¯«-Cƒ ~PÁ©½iÓ&’ŸŸo’››{QÓYÝÿÇ9;;/V*•×Z·n]ðî»ï–BÒ Eƒ .0VÆÆÆ£ãââ&Êd2]gAANŸ>½oëÖ­-ÍÍÍ Tç:À²ìD©TÊBÀ0 ,--¯PJçzzz¦ 6LFIÕþ6''Çýøñㆉ‰‰ †Ùš––f¡Û‰B‘‘ñmVV–@‡ (bkk{ÑÊÊj…J¥ ›4iR!!Dª£uئ§§;¨Õê}u;­ââb\½zuóž={Î1¢ÆðBJ)³|ùò¿SRRìôC(Ê5j´9''gk“&M2{õêÅI$’DJ©Edd¤Ù™3g ÌÍÍ>zôhlQQQ ]y§¥¥Ù,[¶ì,¥´S}̉‰‰ãt ÛÍÍí‘‘Ñz±Xü`øðáù„2sbvv¶ÓŸþi`mmý~jjêOÙÙÙåž%##C|÷îÝ4«,ÀdìØ±ÿN¿@ff&²³³Ë›ã8êééI„Ba9Q*•Q®®®¨`êó÷÷ÇÂ… gr'Ö7ÚÚÚ>‰D¿ÚÚÚ¦<|ø0ÖÕÕ• WwìØ±Qxx8µ··÷OHHè/—Ëí³B-X¾|yhxxøÀ-Z(_ªOªpÏ}ð†<<Ý*÷çó÷dçâ ”ç§Ýk…¦ã“¢|RGp `ÖÝíd“•}zß›p-7xm:ÚS¿GÆ ‡î||#»ðNkª2"Òš÷ÊÍ©Òæù+K£T:LKV r8ÙŒ‹nᱩÑÛà“Ú¶m[Â;wè.GŒ1¥C‡†Ø‰ñññÎÚßSJáîî¾nÚ´iSžÁÔÇ.X° ³¤¤ÄB{ÌÔÔ...Ž©•9דâããtËÍ0 œƒ¦OŸî”4Ð…näÜï¿ÿ~+##£n‡¢y¦óÓ¦MëVS4ÜÍ›7Û_£”V:(uttüÙßß6¸£&Y¬X±borrrµ#D‘H›~³fÍú§¦ëºyóæå>ô×O&loo:|øð®®®êê®Ø5==ýœB¡(G –––ñcÇŽíìää”TUD¢ÖC)¬[·îè“'OzëŠD"œûN™2¥Úù-k×®¥ÑÑÑ•šØŒŒŒr{õê5¨sçÎÕ&›Ôº`É’%'²³³{éûîZ¶lÙwܸq'ôÿ[Y@ÂÁƒÿ=þ¼Ö<§R©ðÓO?}nbbò§þÿ«‹îûå—_¨Ö¿§­ËÞÞÞËÇŒ3»ºAæ Aƒ(¥ÔhåÊ•SRRÚèiã÷Ï’%Kä/ÕÜg<”Rc©ÿñå—CÊiæ6q`©v>”ÆôG90”[Á'ŕΕ*QÂê}·ƒMVöé5çy z6YBˆjpë¿Ú7´îyH@ gîãÀBUnî«D¡õ[i‰ -k‹gXÄ;ap÷a7j®…Ö´C)%Ë—/¿YA999%uèÐa]eÉemll: …ÂrUjjjÏC‡×·L{öì™'“É,tI‚a˜ ãÆK¯Œ 6oÞ666 uå-—Ë!—Ë÷iuàPKKKxvîÜùBM ‘u͸sçÎíkcc“¦×±“ììì QQQÚ}esDZúÇd2™Ae÷®Š ®_¿>>++«Ü ÉÚÚ:âÓO?½oß¾*ŸeРA4$$„¢Y³fµõòòš. V«Áq,,,âÚ¶m«|i>©Ü™GJ+Õê«–é=6ǨÊiÒ=Í­§;·,ƒ„ÎD^FC`ZTƒo:ö ì34á§‹hü{Ï×Ö¼•S©~¿ÉªnVÝÏ2DAË‚(ˆºÌ÷TF\Ð ªÐ™ü«M«Ä…E7ÚÝŠèø¸U“Ó¯¢L´Ë×ZSIJJ2\µj•˲æ«V­šúÓO?q)))mõ ŠeYN,û…††¢²ä²£GN±¶¶ÖŸ=Ú(--­Y½ý‹.Òí< !°°°ø¹2óOvv¶ALLÌ,}““……ÅŽ±cÇþP×{§¤¤('Mš4ÃÈÈ(BÏ<ƒÄÄăõ6Ç‹ÅQ*•jQ]&Új ¥S§N‹« ptt¼8kÖ¬½u]lïÆ3fÌ÷‰äŠI ?ú裫J$¬ N™&•JMuË$ S† 2 ,,LQWÙL:u ˲qºï;!!ÁøÚµk#jšVÉ`€8;;w›;wn6Ô%!2!„ëӧϧúA ™™™ž{÷î}iƒÓÛ·o[ê·Cƒ? !5Ϋ҆Íoß¾&LXåééÙ¶Y³fÙžžžÏ›7ï³áÇs/Í'e¾r (¥Æí×\ãR m[êƒÒ,EX¶˜ðt¡uª©Ø”hüU (%„CÌ6Zn7¡í쌭w‰í¸V¯µÿÅʸ(t?vëÝ)%òø5ÐNù…uüPšdµúßK7‚¢¢=¯ßq¸Ù¡UJ{B-,º c£6¯Âã²Ξ=»Æé”RºpáB;“†ÙÙÙJ‰D⟟_aùxíèßÕÕuñäÉ“OU±e``ðÃ0´¦#Í|”åþ§³R[û†……A/`"sêÔ©'+ëh7mÚdÏq\9£¾©©©rÞ¼yæÏŸ_gAj´-å¥K—>8zôhŒvÃ0ÈÈȹùúúÆÕqt++«ƒ'N¬sh~pp0ºwï~kÅŠO=t;/CCC899MÔ’G] Õ LMM÷wÒ%ˆØØØ1Tñ,’Ÿþy¶þ bàÀsõ©¼&&&ò#GŽüqúôé­FEÁåË—¿°§.×233{èààp¹>“±£££qîܹ‹fffñ999®:ŒÖß}÷÷_-\¨ñC>©ËÆŒƒµk×âóÏ?¿ À¦L™‚šÚãsѤ —/AÜj™Ñ20žKÎkTêèçžRÕÝ ó™{Ý”…³B$î=ï5;óëxÝ JýÛ^]ë`Ñí—rÚ“6ʯÍéipEyÒbZ•ÖöÆë Ez+c£6È‘|‘ð€ñ5m„ßÂÂÂþ©©©M …w~~~YCÐ'(KKËŸ§L™²`÷îÝÕÖ‡víÚe¦H·QÅÄÄt.((hZ‚:sæ bbbz@ÏÛ®]»ÅUu´ŽŽŽýår¹P¤~%„”<‹@;wîëààPN›bYÖL©Tvxøða]MPèׯßÅú”CÛѺººV˜$­P("¢££žå9½¼¼þÕ/+€Á•ý6997nt‘ÉdVºõÅÉÉéQ§N¶×7ÓåË—1pàÀ666åê_ff¦+¥Ô¤Žë‰^½z©ê“-ÄÓÓŸþ¹"//ï¨îñüü|DDDôYeggGuëÇqpqqùZ;0«-¦L©è®©=>’2žÝŠ 1íT‘éhV‘%!DC>¨°g¨¦Ã¥¬ÆXú+ 3WsT` €As›QîÇFŸŽøl¦wÄ›†‹ƒðn“]ß¹Ø|4MĈÊL{,)oæ+—Û¯Ü1Z–A…ZÝ$òQ×ë9Ò¶–C™ôÆÐ¿é IDATÈJ£¹p 4ð;wî‚€€€G¤ï¾ûn´••Uˆ~ÃÚ°aC­‡÷AAA¤{÷îË埔«ïÆÆyªòMddd Ó#W!äŸç±8£±±ñoº±J¥‚@ ðiÒ¤IäinnŽÆ{–2uîÜùO}••• 6iuªÃ‡~®?8IOO¯RËT«ÕÔjµ±îï !‹´|}ðÞ{ï$ÉiÝãjµÚpÉ’%æu² XY{Ö÷îááÁè‡kggg¿´…Ôúôé³_$•{'ÑÑÑ-NŸ>ÝÞÇÇAA/®¿y&’Ê_pP¼÷n/éçûþ¥2yó²„z¥Ý‚FkÒ„Sk¿sOµ*F³G™OÊH@Œûztw>0jwÆìP¸ùo"þ×¼tÎNÏ kš¹ý¶°¼J]‰&¥É¤®cî+‹öӼȒ’‡â„Ä/o^mjcí‹Ø¸ñ¯µŒ´áÑ»ýüüÌ ¶ÔÅŒ4kÖ¬¥ú R©ôƒ³gÏ:Ô4ú ¯¯/ݼyóâ‚‚‚ò6ràÀ7ß|#Ó÷MhGí*•ª[9»'Ë*FŽ™õ<g,)) —H$úÚKÓº’¾££#€ºùGô±qãÆ4CCCýò%xyy)žñ½çZXXè‡GWgÚ«—ŽGn``õ<ê ««k–n9$‰U“&MšÖEÖ:tÈ{ÖrX[[W°½´… ¬¬¬âu©T*³«W¯ÞرcGóñã_\_óL$eúS?®¹4¬påÅPš_Ì<%¨ŠÛSÓW:Q•r:D¥¦Bs1Œ†6eÐïlæWÿÀvY¼éˆIþ ζãlâúÛ±ÀLÉBEµAºZS™ö¤CXDcƒÒ¾D@.O Ož ½óI{w·-ÿ%QQw\©Ë&‰®ØÛÛ_533[ÖªU«™³fÍj0eÊ”QÎÎÎ…Ÿþy­o @pÏÖÖö n'#—ËmcbbZÕ4VëìMJJš§??«S§N»ª2ÍPJ%™™™åüW†††ùž‡P---å,ËR½u}ˆà™;Nccc莮 ///™¢z×®ÍDOHII±ÕóGÉÜÜÜ2Ÿ‡¼è^[­V#++«N®‡æÍ›?sÚ¶èèè3ÿõ &&&?êûý¤R) _±bÅ©={ö Ö±B<·û>SàDÁÒÓý —ž †’#x:¯æBu>ÐÒß \̉ñWß7é}l–÷ÅÛ€†N_ØO[wïQÿ#……—¨º ÐhL(Ó– ']ýÏa@”ªTa^ÁñÉ)ß7ur\ôð?z45¿ç™`¶.КyLLL¶äää ÑŽÄ9Ž#yyy Ô8gýúõ¾?.G8ÖÖÖÿöèÑãTUÿ¹wïÞpµZ ­³ã84lØð¹=WXXX&€TŽºEF¦ ƒÈÈÈíÏZ‘HÝ0mMYž‹ AŸüªƒ¹¹y7Ýɪ]»v}.=ºT*ÍЦ¥ª¼5iî>k9222¤ÿu_õÅ_lY¹rå— mu&å•J…”””)))=–-[VdmmýÍøñã×üç$%·cpñ®›¡Têt‘Z¢ÒíBµçh…=¡TÍAèiƒ±mGô>W´û>ŒFzãmÃ͈vhéu,16q¶GVöö*eº¥¶-èJ’êJTgÕýójUMOû-<"¢E§æÍÃÿMO_;»Yo\»térjçÎYÐDB™™ÙéêÕ«.ï¾ûn•þÇ3wîÜ¢ßq¶hÑbQu÷Ó%5-!$''o†¼¼òJ¡\.·ˆ]²dÉ3_[¥RA&“U0á½­˜9sf»€€€”””+ÓJRSSRSSW/X° ÀÄÄäÃ0»† rËÃÃã¶ÖÂQW?aG=Y]WB:~û‡òÓQû¸Œ|<£5íÑJ¶ÊL€¥ÇYKq–Á¸¬Ñ¤»¼•íšßÄ£X_¸7XÓ¼ñ¹6O@³„–î€!Ñ (ýL*€PZ‡_ÏÊÚòçÛHPЬY3™‡‡ÇvÝ‘pII >|x¤ªÿ\¸pçÏŸg8Žû@÷8˲÷ŸúÇ8@­co”Æ8˜´-þó ÷¦­¸Zx¹!#+†M5ÜínlØ2§ŒxˆfMÈòDTÑܧÿ‚ ˜0Á/1aÊO˜0å­“«¯¯ïb±X­C6ˆŒŒ´?uêT…t÷ïßG—.]о}ûm¹¹åWh°¶¶>9cÆ Å€µÏxB)…——Ï$oh)òÄbñ­·ñùµÙQ‚‚‚0vìØ5~~~Þ666ÛÍÌÌÚÁA% DZ)))ý¯,_¾ülHHȇϤ”ᥠš;%Ø_›uˆËõ4$uÚ’Z‡¨ÊŸcZdKz6v²>ûE¢Í¿_ò-@[k_dfÁȨ]\³f·Ú™™ö(#!í #uÜ@•ÈÌXû]JòÜ .kß*yÞ¸q„ü¦M›Ñ3ÓØ\ºtÉSßÁëíí J©Í;w>Öõ·p‡>ø`e}S)))|Å~Éà8î¹oÄÒÒ²ç Aƒ²ÞfÙúúú"::5 ÿúë¯ÇÛØØ˜¶nÝú WWW…v`Vh*• ©©©Ý._¾|`ýúõ›§)­ªC­|RÂNÈÿ.deñÞ[3@kJÌUÁ}ó¥RA3ûTƒQm|ä§Ÿp|sªk_Énƒ!‚8äÞ=‡“JejÏ C”ʆ-U\“ =í×ñ¢:%y5¾²àaDs4iñÆËÒÇÇ.\ ·nÝú^$ T*•,P¥ejjºÁ××·±þŠ§Ë—/¨»ÌƒZ­FëÖ­{xx$Ö´R«f¹}XóµúÅA?xÃÀÀ sÑ¢E~%%%Êçu@P" Ïk;ÖºfÓxÓ “ë –5j=€õ{÷îõ‘J¥þ‰‰‰,ËúäççWXÏ‹ã86::ÚwáÂ…Eþþþ5j(Õ’”,ø_Žê€Ü Ûƒd[¯Œ‡Š«¦;Ôý®F¥qhvvÏ6÷®‹áoß¼ª†‘áÓÔF-[¦öŠŠêVXp¥ÖUjçË ¯~õ sãf·}ßYvéÒ…¸÷Ýwß=V(M´&55ÕëÞ½{ [¶l£ýí™3gD×®]›¢Û¨ ¡P(|Ô¸”¸««+nݺUŽà<<<|üÈ×êccch7Ôök………÷MLLâ_ÄýÞv‚Ò‡îÄúáÇßðñÞ½{Å– ÃüëWXX¨¿`) ¦­ZµÊrÚ´icª[¥ZsŸá¨ú-—ŸŒ•®o©²@‰ê¾s€JaûÉ[>m¡¼£æ_míñèQ7Ò¸ñ•ö¦¦]Oé/_WÁ´Wq=Ý(JŠoŠhH)5z›äزeËMºvsŽãpòäÉrö>…Ba›ŸŸßJo}@Amîѹsçh½´EHHHðµøÅA äê½CzìØ1ÊKæ¿ÃðáÃå~~~©ãÇÿláÂ…ÄÅÅe•H$*Ô7¦¦¦Ž<}útƒê®U)IåÍ,«˜õþÒmòáþT.GuzýP¿‹º7:gúëàÆŒ¹ašÙ¯ƒø Txy£q±£ÑÈë|/[û¯Ã´QµõOUFfò’Óã¢ûFQJ%ŲÛo…GŒ±ÜÁÁ¡Ìf®I’ÙrÛ¶me$>>þ¥R©ŸwoÿçŸ^£i:::„«–––åî‘››kRPPàÎ×ä…Bñî(] XRJùh•WÓ§OŸaggçeccS¬÷îØË—/¯3I™®ø˜ä|ø›*:} Ôj”Ì«N›ª$ä\@ÀX°Ü=ñ}ù?á2þuÕnî»–ú qrþÍÇÚzüB5hL5iXy¡Nñ1ƒÏ¶AZòü·BŽVVV õò͙֘ ؤ¤¤±º& ‰Dÿ}µ ˜ÐÚé­¬¬òu«Õjá¶mÛ,ë’ˆ³*h4A~§''§{ºßår9Üxɼ: „Ð3f¤ЯÏ?Ö™¤ ¾Ù=Iq+vT*Tn«L{ª$ÂMìVØF,úŒg÷æ×3ÀÞá[š™¾ήAŠE#",K‹TŸ¨?B€‚Ü¿;f¤þü§½Óâ7^~!!!ÈÍÍÝÄ0L¶ //oìܹ󢢢r&4h°‰’Q—…îlllÊÍÁ¢”Jô­)SM¸pá5j$‹Å¦|k(EDD’’’Ž ¥Þý+ tY¯”FuÖØØ¸,£:Ã0HLLDHªät¸¸äø½ÏžjPúäTÓÜ(M®>!—Í듳ýµæCÏ»YxÙ†6nµÇÈøÝ ,cP· *ú¨²3–û½ ²4hüýýÓLLLžèÚÆ322¼®]»Ö÷áÇmtµ,cccLš4iÂÆImº»qã¹sçκi}(¥(**šG)­wÊ ÀÀ@téÒ„Ùr¹Ü„o ¥hÞ¼9ÜÝÝ !åÒ¤çää4Ù¹sç˜ú,¡mâàú.ûñ*(2úŠºå~ðàýáÇà÷߯W!´–++«raê5eð¨Ðhäß²$"¦}ÍZ“ºjÍŠ¡ui´Üúì¼Àlåh¾5=Gx5»ƒ¤¸ñhèua“©Å°ÑZª¶þ)}¨UR$Å~2ò-1;¨Ú·oÿ•~Å¥K—¶¨Õ꺿511 j·¬º>>>´{÷îé”Òr eÓÓÓ6lØðG}Ë=cÆ ¬_¿~FLLÌt¾”ÇСC¥vvv—uß)Ã0ˆŠŠÚtüøñÆÕe© 4‰ƒ]===_Kͬ   BwðÅ0 îܹS«ðü7bÙ²em‚ƒƒo^¹råîï¿ÿþל9sêUPJ ’’’ [ž*¦mTMRªÈ$–× 1Ueþ+=ÎXæ²^öËeÁ×øô‚àì¶é)? Ûö¿Ä’¦u6õém”+iõ6È-$$}ûö½äîîÎéšRRRì´s¨´Ü%‰6ÕÇÔ£G‚fÍšÝ×]>‚‚èè詇úvîÜY§k®ZµjHLLÌÊ*fõ¿õ˜1cÆ—úIi‹ŠŠD‘‘‘ûÍÌÌlê¢ i—””$X±bŧß~û-;wnÜêÕ«×5 ûöí{­d“““sB?U×ãÇ‡Ôæ¿&L€Z­Þ*“É•J¥eZZڨŋ‡œ={Ö¢.e8x°t!ÖÍ›7OR«ÕDw€èèèXP'’åZÿ©º­Tâ²â<Å•‡EÂŽ|ëy‹ÜJ_"©Ÿ™¤hÉ[‘—J;iW©TöѪ;²£”R fÆŒGêëG3fÌh“t}³Æõë×78pà—O>ù¤ÚQyhhhÙçÕ«WïNJJÚ«Kz<ÊËŠ’Ù´iÓ¥úqrrróS§NÝ;qâÄ€ÚæóôôÄÍ›7{®_¿þRFFÆv¹\µZøøø/BCCû<뢎/³fÍÚ«¿®ZFFF·;v4JSUJ©µîsss? ½uäÈ‘Úã—/_®öC† ÁÉ“'û<~üøçJ¬SëDR‚fÎ1×R“ªbS«]Eíܾ¶pá[Ð BjÜx˜[û"3eÑyñý–Ï~EæÎÛ$?—{b±¸Òå^ !ÄÊÊê™’Bï¾ûîgBa¹hv(•JÑåË—ç¯ZµêaBB‚×Î;­)¥åì±±±æ÷îݳݲeËðE‹åÄÄÄŒP«Õ,_ë+GŸ>}pÿþ}8::þlddôPw`@Aaa¡ý©S§Žlܸñöþýûß[ºt©EFF†‰žödõã?ZìØ±ã 6\ݽ{÷Éââ⎺‹-RJ¡R©Ì_7ùBJlmmoèÊE¥R‰£¢¢.>|xÔ‰'ì~ýõW‹¢¢"ц *üßÀÀ`­~_•JåvöìÙ•Ë–-K>pàÀ´ððð†K–,1¿xñ¢Åõë×-nܸaqèÐ!‹?þøÃ. À{Íš5g?þJ¥*·J¦……8ŽÛReù+Ä1‹‡ødËÏÜ¿ píj~üÊMõT®Fqð¥ùÒ±¸Yl›þ‰,ø Guæ[Ós$(·-H|ÜlNƲ­ r<‹Ä Ýþ¼ؾ52>|xÆâÅ‹Éd2_ýðrù¤I“¶}ñÅõ¾þ7àããstûöí«nÞ¼ù¥@ (×qÆÅÅ5‹ÅQùùù)?üðCêüùó3LLLHQQ‘`ÇŽ2™Ì,##Ã’ã¸2-RJ% Q©TEjµÚˆo Oáíí …!!!Ý}šÑžS©TP«ÕF”Rk…B¡­Çe‚U«ÕprrZâççW\'MJÒ­¹\ÜË{Ké™Úù *l„•Cqöþh©ßê%|˜ <Ø·U«Výlmm39Ž«²s©lôN)¥ÎÎÎW;uê䟂:.±ckk«ÔµšPJallüÌ©šôI^,?³¤@ PëÊ©¶+õNž<™4¨`ðàÁ­›6mºJ,£>Á&”RpSSÓ===MŸ>½!„«)oŸ®Æ\—r×+++Vß¿ijjZëä„¥¿¿OWW×-B¡´’JÈ0 ®_¿^AXcÆŒApp0&NœèííýŽÝýÕŠk •J+++8994iÒ°uëÖ‘š¦ T>™÷‡`ÎòÀ×_ ½]vW®QÕ’Á 5Õã”O2ZÍXjur!ŸÃ¬ž¦¯€KÓÛL\D“jeêfp%ÐYÿ°ÚWPÕ&9gº6¾Ú%-Þ7ïYË×®]»±X¬íhiƒ ²&Ož|ýU•g·nÝÖ/!!¡Üä]33³¬#FœÔÍŠþ,øàƒhrr2>ýôÓ_ýµm§N¾566ÎaF®Ÿ½[¿Ã „”'ôèÑ£ïÌ™3;õë×/¡>$РAƒ{æææ»µ‰uÅb1úöí{ôYŸM¡P ¨¨è–eµd¥øßÿþwéyÈM.—¿+‰ÊÞM›6mŽÕåÿFFFR??¿é?ÿü³½——׉DRL)®Næ„°,Ë1 Slkkû¤_¿~}¾ÿþûŽ'N¼½½±yóæ6ééé­ ó§OŸ~‚RðªÊ”RÊ,]ºôHfff?] ¦sçÎ|ôEßïÞ½írrr¼¥R©•µµu/¹\N affÆp)“Énš™™ÝûüóÏ#! í!S¦L±600¸E)Ë7hiiytþüùkx^áÚµkåç盘››ß™™š2ßë—{×®]=âã㘚šfL:õX]Ë­í{züø±Åþýû{3 cЪU«Ë½{÷~\×õÍÖ­[‡É“'kËÛÄØØ¸SJJ G)¥NNNׯŽUS½¸páºtéHMMuÛ¹s§R©ljaañOµZM5Z%‘ÉdW†‰177;vìBH~]Ÿ¿Ú'Ô<äÍúsGñžËŸ Nê­¬¥@ܧm†ÅÖ™v<õÔ±3Hœ~-/ýŽ:«žÔç ”šd Ûe¹4 sËÏÞRdfíûÖÉ288éééÖ©©©wT*UÙê¼fff ,pÕíÜ^$ªë ª:wàÀváááaùùOÛzmHŠÿª.?+jXª£4àÁ4Ào¬øý3‰åÊwÕmúÝ%Prä_Û¬îß&­ÿÇ>ç£ÅüÛ­)º‘Ò}#yétÔ®%U?#Ó¾7\š„¹BÞJ‚Òš. †rç¤kê±³³Ûीjueçnܸ'Ož(åry¹ãvvv¼ÇŠEP5’”Næ,vø²žöŸ€€«y_5a‘ªÈgÙÖSw,÷Ïçßn5pô:GS¢:_+É?=€!ÕjqN(n¸ÏÑóx/yñ¢·]¶R©t½^Fˆ"‰D²íU.³lmm»””””;^PPpœo-<ÞTÔ:J(ó½¯a}æ—`qÏV£ˆ±¤–ZTÕçÕÑ)vÞS’²ÞmÊð8þmhtß@b¸ÇQyÁ¥5(Tó]ûY(l°Ì­EôpBHžä¢øÞlÚ´éÿÒÒÒÊœÛÇÁÙÙùñرc£^Õ2•®Í˜œœ<[×Á²,%„D%''ó ‡Ç‰zÍ-Xºÿ£¢?ïÇ1•kQÕiXåÁ6´‡Åö¯: :\æ_‡.Q¹\W):T%QZ[ SÀЬ÷v‡F'ÆòR>ìþï¿ÿÞ...6+Ó0…B|÷ÝwmŒŒžëD±°°0ɽ{÷&0zï½÷Ö7nÜ8ûY®÷×_ Û¢GRݺukׯ_¿ÇüÛåñVkRº0ùæ£ýF³}ʺØhòüUš^½ŸJ•H¥£~½T°8x0ȂϿ•/¢$¿t½"µJêšÑø¾Z‘Ð輤êüM¨â8Ó.Ë›ò¨_ÛDGGoÖ%(pww?nddtûy.Å@)]¼x1%<<|eDDÄ/;wî¼~çζu½Ž6ÁmXXX£ÈÈÈ5„²†ÄqlmmñŃ')=äÍÝ “ÙCþ2ž=d01WCJ´†ã²D˜‰â]g‡\{ÏpTWäÍ\÷Ö½‰éû ”:dE÷‹S•Dµ¨iù÷šÎQ ˜ÙÍÜâèuavÊ£npô:÷ÖVòÐÐPPJ™ÀÀÀ³IIIåØša˜ccã™ÀóuþîܹspRR’…vŠL&óøë¯¿®îß¿¿'ðÔ|W|||‘‘Ñ$44ô¶L&3Ò—ˆÅb 2d"ßñàIJf¿Ž ïb¾uV{b zÊU©-U}üéw.3—æµþRΈŸ‡˜­œŒ¬žß¼/@7 “îwKð¼¯(¼F«ò-¡–a$0³™¸ÂÊ9À7+aÊ[MPPTTÔ}éÒ¥ÿ$''wÓϒݸqãU£G~ô¼ïéîîž Ÿ}@­V‹îÝ»wòÇ 444¬qòͶmÛš, ŒÌÎή«ÏÃÃcSÆ o=eéyðxUñLË3®8ãYƒ‘;}½µâÂý8.5ÇLe—¬É«¢“–F$ÛØùÖ'~½T¸l/Œgã_‚,{«C~Ê‚µ"¡ ©TNó•~§€¥ËÚM¦¶S&d%LµËÚ·¦2oÛ¶ C† 1»yóæg‘‘‘LII‰«J¥š”™™I8Ž«¦íàà°å«¯¾zaqø‹/ž’››»¦²ô1„µX,–¹¹¹%K¥Ò gggÊ0 Ô&&&rrrJ¥Rëg°á8YãÆó8þ|þ³LœåÁã&©r£Ä˜T³œQKo«3ÝkON•tÅ”R"ÉÐοš­˜<¯`Ùb2{Ä—"ëAkX7»ƒœ'4T^¿É)3Ì(yú>h]É  „ˆFVã&Z¹nØ–—¾fv³ÞªÊ|ëÖ­æG —J¥åRé§•³ IDATl¡”ÂÉÉéÉûï¿ÿNxxxÖ˜1cž{Yàïï_~ùeqQQѼÊ—jóòBÊòùi?kSU;;»ÈÏ>ûÌÇÒÒ²ˆïÂxð$U äÍ\³•“PrêŽMáÏ»¢Uáñ&²¤ÎݬîgB`äÿQ¨Éì}óæn„Ù¯Þ8áKcFÚ+òޤr\Q•ÄT[mŠ -Ú84 »““8– V¾u•yþüùó Å/ÕVxBàääÔ¿ÿI^^^Ê—Q®ãÇ÷¿råÊ!™L&¬k}x{{ïêÚµë777.885%çäÁãuó<.b¶r@Ò³u¦ÕÙ¥ „][$”šýêIP åPøËŽ>ÒñKw™ý:9}ÿF¬+K_(Hþv "ïï(ÊQ¢7b µø¬ûa͆V£Û;4 »“ú õ[IP`ii™­oÓÕVLMMS\\\>›9s¦ßõë×_ A%''£_¿~Ç-Zdbeeõ‹D"‰‹Åeåª,#º6·V dY6ÉÜÜüÈ€ÚŒ7î“ .px‚âÁkRuÏÃpTW¨2ì¤ÃÙ®ŽKïU‘kCTå‰ÞivÌòàO²ºÎ€õùÀ×^èréòâFÿH¹’:kPTOtŒØãÿµ³tßy+;n<¬Ü¶¼µ•999Y°ÿþÓ‰‰‰]8Žƒ‘‘¬¬¬8@°½qãÆ;üÛ³gÏü—].]g÷îÝ&©©©Ö¦¦¦S {Ëårïôôôršž©©)¬­­ÕJ¥r{ƒ vÞ½{÷Æ?üPHQ×%á)ŠRP‘7Ì]7½ghùñí¢¬ ·– Ë>wêÔ©Ú߾ހ'¨ÿ¸néÖ±Uwyü$eóï*ä|´V/)éç³»¢ª²‰¾ÕhT„@qù¾}Πy‘%§Â hCÈ+/à¼ðF€ü¨ÿù§/ÿPEòA- J ¡Ø-ߪѩVf²Û0zM²™_½zõ¹_³AƒØ»wïÄC‡uvvvæ[ôk‚ýû÷w:tèР—yÏ={ö´üûï¿ÇÕö÷°Üºuëè={ö°Ï³ÇŽk²wïÞ/ùúZ;¼Ðÿ–û€Ô÷wXÍ•çÿœlKèÇD,¨†¨P-Q‘€(oDÚ. Š ”6$„ä¾ê6kñyÞ?ªŠ®ÿ@@¡]­P½§×?§ýÌìcŵd…v… Ùmˆ^d±111dõêÕ¢–-[žP©T&•ü$ìƒ>°³³{¸mÛ6ŒûüÒªTª¶ß~ûíz—k)))¨ùfýê#??ÿrqq1PK—Ù3gн{÷²}} T*o%%%±¶Öæ÷öööÇÂÃÃ;¶jÕê6€H½rîÝ»×kjLaaáׯ_Ù¿ÿh|ûÿJ“ÒÂ"hòlYÀ£MßGÄBTž2©z‚Òݫƙg¶ûårÈêùå+)\J©(ÿž£Wr¿F J•#XM¸]«´† éþ"¯A@Æ éÈ‘#¿}ûv—ÈÈÈFN:›óãÇ'üöÛo‘›6mZÅdÞøÿ¶ñÇ¥”)~ôÞ9uîÁj£AU«Iq€È¬´™ëŸÀÒëÜk—JëGhÖ¬Y”¡¡aXll,(¥†^^^¨Ž¬ô#«!Jé¥N2¨Ž ÃÂÂH]þ÷îÝÊ®QׇTõ¬µAUgU”­Êçã8NUÛ{Ö%àE+¯º Bj*÷Ñ£GñÎ;ï<š3gξV­Z©ëúÿúܳ*4mÚT1þü]mÛ¶9zôh¹s/^$u©µ…¦Î+!ªjêêR¯^§ÈBÁ˾¡õ©eÈ›¹f+§…‡\îTðíÆ+\V.@H5)€„€ËÈAþüµkò¾þ#Éì·éç|4–ûyäô¨$^ç@ Z ŠxïU—„¿§«ÑZìõ5) @b5êiÃàæ n¯µ¯EkV"„q•JÕvåÊ•š7oÞ’a˜Ó•ˆkÖ¬…††öعsç‰ëôôtk`YÖréÒ¥ ¬­­ ?ûì3©n¿i|àÀnÉÉɽ þ¿½+kêØþgr³² „€‚€(‹âëCA´(?|·G[xu_Šb+ÖJŸ¨(®µ­Š"ˆZ\©¢ ds§<7 Ù!†= d¿¿?JlD\ÚJ_}Í÷óñƒŸ¹¹wÎ9w¾sΜ9C¥lmmo&%%¹>`£¨¨<==¡¾¾žK¿pᦲ²2¥•••Z«Õäp8åþþþ2ýCoß¾ yyy³žB(kmmµ§Óé`jj ·nÝ …²õâÅ‹fÏžý1@GGGì;wdff®˜8qbB÷b> Á·nÝúÃÅ‹ý‹‹‹›ÝÝÝ_!£Óé >>¾àÆÏÈM¡Pþµ}ûö¯–.]º!-- BCCJ¥Þ½té’`РAç %99Ñh4^AAAFgg§™LƒW¯^2™VTT”‡ãød„PGb€„„„ÜæææÑVVV@$!77X,VĶmÛâ—/_þ¹¾ÎÞ0jÔ(§sçÎíqssûÞ ÇÉÛ¶m+ Óé………`ii ÅÅÅ R©æcvM$-qppxî<•ÜÜÜ5ÖÖÖG+**ÀÔÔŠ‹‹A&“-¯¬¬<ãø „®ººzUmmíj­ög²¢¢¢Ã0¨¯¯÷€Û8Ž“vîÜy@,Ï …`ee÷îÝƒŽŽŽKKËû8Žÿ !Ô  Õj=¢££oŽ9òP~~þ™L6!ÎÎΦ𡑤zÀôƒ± ,¸ ”QïdjkŸü½eÚškÚÚ'ðâ ðr¢B¸¼YE_7ùþK̹òí©Ö¾ö˜>{Më) ²§âá{¤®ÎI\ÛìýÚ&ü -*`$ëµ,çËëe5Q@ËòðõæŽó÷÷ÇÏ;w%++ËdðàÁÙaAWW×7–––ÿçééù4$X(‚B¡°.,,O ª*¹\® //ï»Ó§O‡988¤¹»»ßàp8—wïÞý´‘HÄa0EëÖ­¦ßšpéÒ%‡«W¯V´¶¶Þ4˜ÀöíÛ³«««Ý\]] ?þøã§Vobbâµµµ1MMMùË–-ã8ppG$ Š‹‹Íx<Þ½U«V=}Njjêû÷ïß‹Å{Ïœ9S$é­M|}}áæÍ›ï§¥¥EñùüÒÈÈȉ¡J€;wž¯®®öOMMÝ+;;;÷Êåò‘»w/{Ø72™Ì‡4íÇîöF"‘ˆÌd2N˜0ÁÎÛÛû©'..®ºººú«ŒŒŒëS¦LÉòññYÒÙÙY˜••µðŸ*222X_~øðጻwïNÞ¿ü¾}ûü½½½µz77†aŸŸoãçç7iüøñOÃÐ7mÚTÐÔÔ²{÷îÀѹsçFÈ I$î|°˜D"Q\]]o|ûí·Kª««g ‚Š¥K—:é¿¿cÇŽí¸uëÖâM›6åÀ0©Tê¨T*áöíÛÿÔh42__ßÍ“'OŽÒ»%õ²ý¥×¤z‚2êPß&à^7 mO`ÓëA«ƒÞ3R௰¨ôE:ÐTTŸlLøW_‘= p§àšú ¸¶eòë®?õFX?Ü&€™ ú‚íV·¾íÁ»oAH$’ÐøøøýñññIñññI6lHŠ‹‹{íÃ`0 6lÀüùó2 myyy,À/¡µcÇŽ…ÆÆF¥RÉ$šÊÊÊi¿Fß“’’Ø2™,ØÌ̬$222øÀ••sæÌ™ÂçóOët:ßÁƒ»õ$·yüøñ™†k~+W®œÔM‚¡úIÛÈ‘#7â8Þ„ã¸æÝwßÝëêêº]¿ÚÑѱŽJ¥Ö.]ºt°ž ²²²`ÆŒK8N¶T*}7--ma½d2ÆLž<9*//àOKPÿu’€§9øgó*¹Rl°~Ü_¹¢§¢ÀñµZè:yy—²àÎÅ…ü>•_ùðÝ\U3Á«=r/#,„H€QßýÜÌõ~¬¬2 ÌÿøÖB𛛇I$’Ù‰d¦D"™ÙÒÒ2³¥¥ÅÁÕÕUþ·#Fˆ»«b±XqÍÍÍ‚óçχ†„„ÀáÇ¡{Æ·ÓÔÔæÌ™3__Öí“ Ãzµþ9NÃÝ»w‰z—ž~ð©©éc …/^€ÒÒR–R©$šššF!„´|ðnhÅ)•Ê­ d2Ùç†n)gggèé~xçwîuuuAUUÕKÛ&""B£ÕjA«Õ‰¡ÔÔÔõ–'‹ÅÊ.//WxxxT‚3àÙÒÒbc0¨ÓàÔFYeÐßÒ<|:\\\étúN÷Ô ;vlŸÏü©B¡$IvCCÃç÷ïßÀqü(BÏÎÎxéÒ¥~‡^÷@B2™ l6ûyï>Â]¿‰ÓÍÍminn.>§ûcÇŽ…7jººº*T*•·á N¡Pz­—J¥öz°¢!òòòÀÉÉ)+!!a¶X,N!“É ¡PxyëÖ­éÓ¦M;aoo/ILL½Û-00pMRRÒt"‘¸&_¾|mÞ¼ÙV©TÚZZZ #""z¾{¯.uSÓgÞý– Á>“0Œ@ ØáÝ V8ŽÔjµ=BHÝmqBrr2š={öä„„„;÷ïß$‰àââ2ËÇÇ'WLð:}ö[åvppøìþýû­$IÞ›ÅVVVö#‰D‚ææf¼§%õ¢:ícww÷5ÕÕÕ0iÒ¤z^+)){{û›‘‘‘PSS£ë9Qàpz7¾ ÂkÉQ\\­R© µµ5`ùòå&†8Çu C´Z-H¥RdX¯ƒƒö6+Ä?“0gã¡mÁ ';Ѷùý¨õÍ‚—T/V”þ¯Nº–ö1}:(+JI€®¿míI¯‘&@2û¿•´þ·(›’€ò–äá{‘%E êgΜùàE¿ |J× •JßKMMå@H$ú^§ÓuÉåòx}$ÞkÙÓ/8›©'ºººT&&&½^ojjÂu:¼««Kóºõ¾ úÙjdddjnn®°¤¤äH]]ÝØ¶¶¶qÉÉÉ_oݺuÒ²eËž®K 0 ,..îlYYÙû8ŽÛ#„øàƒõÇù_#þ””ÊÚ8È.övò—ýÈ^ï^„g”~äqmy}k9PßDä¼Xœ—”0P¬V/§ ¶¬€¿$AL:õ“ɬ€”œœŽN§³är¹kBʾ¨O$}O¡PàÆ½:ãÅb1¦V«Y ÑoºnCØ Aƒš>ýôÓ£QQQcp×jµÚ< üj¾xñâB„P“T*¾{÷î%†ØÞÞlh¾I(•Ê¥4 † ’Ù“ öîÝËBYZ8Ž[^¹rå–‰‰ ¨Õjgg烉Äu×®]‡þ½éììLQ©TPQQAúoêo~~þ!*• Ç·ÿ£ëÞ§‰šÎbø«ÃÖÖö€H$‡s•N§kÂÃÃS{þ†Ãá4ét:àr¹N¿óî&‰MUUU!wïÞØ‹¥•C  ((èÀ›z¿·nÝz`óæÍ_ã8þÌBL]]J¥’k4š§302™,>|xa{{{?‰DO"‘FŽYû&äÑjµÀårGöp=ÝQ*•PWWÇîQŽ©TªU]]]ÏÌÆ¶·´´ŸÏ_¿páBuxxø ssóšÚÚÚ¹>z‹«¯°pᄉČž×îÝ»çlaañ»÷J* ýÚ_'ÀÏ멽è®ð2©Tºé»ï¾3ïᎳܱc‡H§Óý¾I;‹¥Ójµ2„Çqª¡,T*5ÿÑ£Gï=zô¹#HRSSýcbb_½z•j$©>ó«÷î‘ùÄAýþ /ò¥ö.GÆTÔi~û— ûL>’í.5"ØÛ³jôÑÆPé#‡0\äJïöâŸ$“ù yyy€aX ‰DjkjjbÛØØ,Ci{¦mE €¶¶¶ÏãââV …BßR_```ãèÑ£Êår³³gÏ–ÆÇÇGæååE?~|ݺuëꛚšÜ­­­¿usskìmPúĨ"‘HXccã¼øøxåÚµkW8p zýúõkŽ=*“É<âææöŒ rÆŒA,‹,“ÉÀÂÂâ˜OÓù®˜Ì,‰D2,>>>åÚµkãþùÏn¢P(P[[{~ß¾}ß …ÂÏOŸ>ýùúõë‹kjj>7\Ã;pà€¯X,µ°°È_knn¡®Õ«WÛ1 ¸}ûödžk2oEEE€j0Û¥/ŽžIDAT`Àºöövç5kÖ4§¥¥Ååää|ž’’r$--í§ŽŽËß[FK“J¥P__$;;{N „……uº¸¸èè耆††æ„„„ÏŠŠŠ¢÷ìÙ½k×®'b±Ø¾—5 _åuqqQs8œ{:ŽsâÂ… «õ²xxxlÃq/..>¸k×®Ü~ø!êìÙ³Ÿ%&&–””\T*•ÑMMML#Iõ1Ú—m‹ ;V“Ç Û‡H˜ 4Zƒnîa]i4@à²ÁtÖ”p“÷}4ñÙ§²‘…û1ó™çÆxucSßQc¬É¦N—ÊïTþÏV«Í£ÓéÀçóÕB ——Ì™3GD&“[LMMÕ4-S(>—ÊÀÑÑÑ™B¡\#ïܹ`bbRÁd2[Bètº®7V“É@ 8sæ Lœ8q¥ÏªÎÎÎBF³%333öþýû_â8®ìם߿… ~" !00´Z-Ža˜D£ÑœêµÿÉä;, x<ÞKsÊ-Z´èc''§È¶¶¶< …²ñÑ£G±:n½Z­®e³Ù‹çÍ›·¯W!²¨T*DDDì}A»çÀ£Q5FkåñxOÝwYYYÀb±>äñx…]]]³òòòæw¿Ç›áT*õªX,¹téÒ†âââ †Ñ]\\Â-,,~d³Ù-†E³X¬¦Õ«W‡öRg(‰D‚„„‡Wé ”¾@îJÖf(·F£É “ÉjµZééé B¡"""blllÖR(ùO?ý´:++kCiié ‹u…@ |ÒK†5¼ÀZi¤R©Í<O––ÁÁÁ{lmmSÛÛÛG}ÖÞÞÎÔh44 ÔjõI€¤¤$˜={vüˆ#>Õétw»ººþ}öìÙØæææXµZ]4dÈ«žu©Õêl6[Íd2ï¼ mnòx¼NòˆˆˆùýúõËDËÏÏ_ƒã¸ €¿¿ÿÉ   Ùt:=§££ÃûÚµkñ·nÝú·T*ýÇ»èííí,`0÷X,–F¥R•Iê ƒ•øsò_vêWŸ˜†MJÿ÷N\­Ðêt¿üÃU* û»–¶p¦3fáá¶Åúv`î,„Šh·7ˆ@ó Pü’RPÏ›8ÂX@dÏL&[­åQíÓ„åþÿSÖH$‚K—.çr¹´‰'žøµ÷'&&Ú) 3“[¡¡¡¢ÞBŠÏ;'N,·³³ó²±±a"„bþóŸÿBHÌçóD"ñc6›ýI“Éd2---ýû÷wY¼xqBèi¦„ööv055µ“ÉdÓ{>[(°aîóù|š££ã sŸÕÔÔBH3oÞ¼­`¬••“N§3-,, pŠŽŽÞ…RZú3„ºººØlv*NÿI¿ñÒ*•ÊŸD" éM¶~ýúÕYXXcõå0sæÌúÑ£GûXYYÑ5MÀÏy÷æÍ›wÇÚÚzœ “Åb1---Æ ôñÇïçóù#íííH$’ñ\.×!Tk˜@5==xÌÚÚš÷²>W«Õc ÂÐÈ]caaÁwttÜ¢/¯ªªšÅd2-ËËËe¿äƒ\ºtéz'''g.—Ëd±XL‡ÃX¹r¥ggg#Bè™­2™lš‰‰‰Ã \Î6›íäèè¸ 44vîÜ mmmslmmL&s‹Åê())©333£‹D¢H€?ü’““!44tÛàÁƒ=¬­­™ ƒieeÅ4hwhh¨¸Û*{ú­´¶¶þÛÆÆÆ !T!‰ž“E.—0`@˜¡î#„´³fÍšÂçóÙ\.×!¤())sçÎÁèÑ£xzzúÛÚÚ2X,ÓÜÜœiggÇœ1cÆä &”&''CYY`vÏç³׿‰Ä·ÞÚÄ¥ŠË7TšŠjK„¸æ2rÀßOS½/ÿѲ¨Ê'ÙéÂÏ_Cì\ò±®®B@²% Œ–G±ÝµŒxLJüã°}ûöغººè#FŒ™>}úÕ¿z»è“¢nÙ²åpSSÓl6›mC§Ó.\ˆµæ¤ÆÇÇGGG·<³©ïüùóQQQŠØØØÎ¤¤$Ó_{¬‹o¹%eÄÛ‹êêjÚ©S§’ZZZ¬¤R©—¹¹y½@ H§Óå!!!ikaïÞ½‡***˜d2y*†au~øá{{û £Ö<¯¿þzYmmí6­V $é2…B‘Óh4¿ššSƒÑ6nÜ8?ooïÛ}-GRRÒüGmA™Êåò³\.t:‹\.wÆ0L>`À€aaaÉÆ3’”o Ôj5çСC…B¡µ²²:rþüùˆýû÷+ÿˆM v9rDÙÕÕE–Ëå_¸ººî7n\S_lÞ}Ûqüøqðòò"ìÛ·-ö*•ÊNZ­¶ŽÅbí£P( 3fÌê]Ê} ÇѾ}û¬:::æZXXl”J¥Àd2A"‘¬b±X‡ÂÃßüÚÃ:0ˆ?„B¡‘àÂ… ÆFø•8}út¯ºcèR6Â#Œ0Â#Œ0Â#Œ0Â#Œ0Â#Œ0âOÿH€üÒµªIEND®B`‚pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png000066400000000000000000000041521315616372200273770ustar00rootroot00000000000000‰PNG  IHDRJ?G?^bKGDÿÿÿ ½§“ pHYs “ “åA8€tIMEÞçgÑò÷IDATxÚí›{•uÇ?Ë.àe¢,Je1‡ıT˜², }”L3¦r&¼DŒ(bŠ©T“Ø 1˜NÀ—‹c†Z^HMÁD, YãR "—X.ÛçûÆÛ™Ã²œ={vœgfç}Ï{yÞßû}ŸË÷y~¿…²”¥,- ­u`Ñx8¨”´¡%ÇÓ¦ÄóãÓÅ® Ty ØÔ{€{Ê®w`÷{xX Ì>)ieÙ¢öTg€þ’æ —"¢ÍoQѸ  IºÐVõ&°Éà­="ŠˆÏ¿ª<®g€eÀçÓ€c.Àj 8MÒª#Êõ"¢?°h LŽnŽ:zœ³$­z•ñµ#Æ¢"¢ð”ÞÖÛÕÎNôù’žŒˆjàU ;𸤋k "¢ð²^|¸¸Ø ì´0"†S€Àq’6GDðpð`ˆ¤Í‡«ëÍÚ£žÀ·€ÉÀ<àg½¯˜OÍð±z»ÍqlIDß*,*"FÓ€s$½ÔDkš Œf¿½€“5’Nʺgº³ág$½ž:þ]à^ èÓåΡZÔ½ÎFÏGDï&€ô%`¤3Ø×~ì>ÌÎÍqëh ½Ýí"i’uts¹óá–ªxÜäoqDtÍó¹£ýì%m‹$íj$…¤Ù7Iªõîçnj€Eø-Ô`p¿þqé!ZÓÉ@à>Ió}¸ø_x{#Ôä´I“íÊ=‡Z¨G€£p¯2 œ“s•.E:G„"âXþðOáDêÜ)h •hP$ ž®Œˆ[ TÕ!^ÿðoààçn…̾ ‰ˆIf×{ýULOYÊeÀÄ,ËYfZðh U¦:Ë2ΫW€1!Iÿ(¶EmV•&‰ƒ¦~¼àÌ5Õ ÕßðËv6ûžÃRûFÄ• <û.7ñ~}«Zá0QíûŠkQ’öDÄRg¤ À JÒµq‡­ât3æSÇzIÚfG#%íËRýWƒýhDtæ[à,à&ǵz`WФ6$߆Ã"â!IÏÓõÞò¶ ðBâB’Öß·åœm«º.‹-¯—43ÇØ \+Ýšèà^eºÖ±!5††>êÛñ0Â:O-63ÒÛ%ýî×ÜêZí7Yƒßw—›tu²x˜kKúmŠ o•´%»"¢íTNp¢¨‰ˆ3Š^ëEÄà’:å8wðgàaIר&ÜäŽv÷[ý{ð1ß Ì¦¥ø1fî7Ø\­h@]dk™+ihÖ¹YÎlçIz¶ µ5ÀÔd…3j[àïÀOÍ«†96bÆ?Þ g°Ø±`°ÖÀþËívÿ‚Uí”^ãª}^Êš–Ú Ö™ˆˆžŽ3ã·Ýb©´…<‘ô\à[nÙ,wðï\ãW½Ftóê8‹-Lñ¢DnövEK­-v±…. Û9û½›ÓnIÏJh‹{Õuaw%ú¤zÿ%D÷òÆTMi³$ü¤D$_°¯·)0P—µn­^ÒîÖnQivÛ%O ÔØC¸gš[(³“r¦T\àÓyê8ÁÛ1™rŠˆA¦Û€áÍéÞ…êÝTÑD *éѽÚ»H®î—´§T€Úl êÉ´ƒó‘]©ý €/7pm?s¨:—.” P都”E«²J«s¸6ç•B̲¨Õ¶ˆz»FM:¶f•Ãàv׳Z;¥”¤:àõ”5\ž‡šîe%=£vqqH•dÖ-¬“ô\Ie™‘Ú‡:¶3U\'€7@#â(2‹ÊNñ¹)Å"µ…*=Õ-Ï žÌ'Eí^‚x“³bwó­:2+kJ(O#½–*e†åÙRI¬ª>¸ÇXço[Zª Ôþ÷òÔqiVöK¤™ÕuI¶ÛZÊ@=Çþͨr7Ÿ.A¶ Bf‘FŸæRDi jùÿ)ðòtãd³¦­ª&5æ¥ÔÚPõ@uDtˬAìŸÂOË>I«K(·Gf¦,¡-™eÑùÊ]i"›ð'Š,͵|úG©`œ¬HÉW^6­Èª+K(Ó„§ÀjÓ]»È4·Ÿ2—úe±ªjFÝc/št®o¢®d&6z®îÃÅõô>™)öiú{µãÔ^Êr`‰ˆ·"b~KŽ¡ªD°úð“²É”¥,e)KYš$ÿøÝ{Rp«dIEND®B`‚pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t000066400000000000000000000165751315616372200306360ustar00rootroot00000000000000/* * pygments14.css * ~~~~~~~~~~~~~~ * * Sphinx stylesheet -- pygments14 theme. Heavily copied from sphinx13. * * :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: {{ theme_font }}, 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif; font-size: 14px; text-align: center; background-image: url(bodybg.png); background-color: {{ theme_background }}; color: black; padding: 0; /* border-right: 1px solid {{ theme_border }}; border-left: 1px solid {{ theme_border }}; */ margin: 0 auto; min-width: 780px; max-width: 1080px; } .outerwrapper { background-image: url(docbg.png); background-attachment: fixed; } .pageheader { text-align: left; padding: 10px 15px; } .pageheader ul { float: right; color: white; list-style-type: none; padding-left: 0; margin-top: 40px; margin-right: 10px; } .pageheader li { float: left; margin: 0 0 0 10px; } .pageheader li a { border-radius: 3px; padding: 8px 12px; color: {{ theme_darkgray }}; text-shadow: 0 0 5px rgba(0, 0, 0, 0.2); } .pageheader li a:hover { background-color: {{ theme_yellow }}; color: black; text-shadow: none; } div.document { text-align: left; /*border-left: 1em solid {{ theme_lightyellow }};*/ } div.bodywrapper { margin: 0 12px 0 240px; background-color: white; /* border-right: 1px solid {{ theme_border }}; */ } div.body { margin: 0; padding: 0.5em 20px 20px 20px; } div.related { font-size: 1em; color: {{ theme_darkgray }}; } div.related ul { background-image: url(relbg.png); background-repeat: repeat-y; background-color: {{ theme_yellow }}; height: 1.9em; /* border-top: 1px solid {{ theme_border }}; border-bottom: 1px solid {{ theme_border }}; */ } div.related ul li { margin: 0 5px 0 0; padding: 0; float: left; } div.related ul li.right { float: right; margin-right: 5px; } div.related ul li a { margin: 0; padding: 0 5px 0 5px; line-height: 1.75em; color: {{ theme_darkgray }}; /*text-shadow: 0px 0px 1px rgba(0, 0, 0, 0.5);*/ } div.related ul li a:hover { text-decoration: underline; text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5); } div.sphinxsidebarwrapper { position: relative; top: 0px; padding: 0; } div.sphinxsidebar { margin: 0; padding: 0 0px 15px 15px; width: 210px; float: left; font-size: 1em; text-align: left; } div.sphinxsidebar .logo { font-size: 1.8em; color: #666; font-weight: 300; text-align: center; } div.sphinxsidebar .logo img { vertical-align: middle; } div.sphinxsidebar input { border: 1px solid #aaa; font-family: {{ theme_font }}, 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif; font-size: 1em; } div.sphinxsidebar h3 { font-size: 1.5em; /* border-top: 1px solid {{ theme_border }}; */ margin-top: 1em; margin-bottom: 0.5em; padding-top: 0.5em; } div.sphinxsidebar h4 { font-size: 1.2em; margin-bottom: 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { margin-right: -15px; margin-left: -15px; padding-right: 14px; padding-left: 14px; color: #333; font-weight: 300; /*text-shadow: 0px 0px 0.5px rgba(0, 0, 0, 0.4);*/ } div.sphinxsidebarwrapper > h3:first-child { margin-top: 0.5em; border: none; } div.sphinxsidebar h3 a { color: #333; } div.sphinxsidebar ul { color: #444; margin-top: 7px; padding: 0; line-height: 130%; } div.sphinxsidebar ul ul { margin-left: 20px; list-style-image: url(listitem.png); } div.footer { color: {{ theme_darkgray }}; text-shadow: 0 0 .2px rgba(255, 255, 255, 0.8); padding: 2em; text-align: center; clear: both; font-size: 0.8em; } /* -- body styles ----------------------------------------------------------- */ p { margin: 0.8em 0 0.5em 0; } a { color: {{ theme_darkgreen }}; text-decoration: none; } a:hover { color: {{ theme_darkyellow }}; } div.body a { text-decoration: underline; } h1 { margin: 10px 0 0 0; font-size: 2.4em; color: {{ theme_darkgray }}; font-weight: 300; } h2 { margin: 1.em 0 0.2em 0; font-size: 1.5em; font-weight: 300; padding: 0; color: {{ theme_darkgreen }}; } h3 { margin: 1em 0 -0.3em 0; font-size: 1.3em; font-weight: 300; } div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { text-decoration: none; } div.body h1 a tt, div.body h2 a tt, div.body h3 a tt, div.body h4 a tt, div.body h5 a tt, div.body h6 a tt { color: {{ theme_darkgreen }} !important; font-size: inherit !important; } a.headerlink { color: {{ theme_green }} !important; font-size: 12px; margin-left: 6px; padding: 0 4px 0 4px; text-decoration: none !important; float: right; } a.headerlink:hover { background-color: #ccc; color: white!important; } cite, code, tt { font-family: 'Consolas', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; letter-spacing: -0.02em; } tt { background-color: #f2f2f2; border: 1px solid #ddd; border-radius: 2px; color: #333; padding: 1px; } tt.descname, tt.descclassname, tt.xref { border: 0; } hr { border: 1px solid #abc; margin: 2em; } a tt { border: 0; color: {{ theme_darkgreen }}; } a tt:hover { color: {{ theme_darkyellow }}; } pre { font-family: 'Consolas', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; letter-spacing: 0.015em; line-height: 120%; padding: 0.5em; border: 1px solid #ccc; border-radius: 2px; background-color: #f8f8f8; } pre a { color: inherit; text-decoration: underline; } td.linenos pre { padding: 0.5em 0; } div.quotebar { background-color: #f8f8f8; max-width: 250px; float: right; padding: 0px 7px; border: 1px solid #ccc; margin-left: 1em; } div.topic { background-color: #f8f8f8; } table { border-collapse: collapse; margin: 0 -0.5em 0 -0.5em; } table td, table th { padding: 0.2em 0.5em 0.2em 0.5em; } div.admonition, div.warning { font-size: 0.9em; margin: 1em 0 1em 0; border: 1px solid #86989B; border-radius: 2px; background-color: #f7f7f7; padding: 0; } div.admonition p, div.warning p { margin: 0.5em 1em 0.5em 1em; padding: 0; } div.admonition pre, div.warning pre { margin: 0.4em 1em 0.4em 1em; } div.admonition p.admonition-title, div.warning p.admonition-title { margin-top: 1em; padding-top: 0.5em; font-weight: bold; } div.warning { border: 1px solid #940000; /* background-color: #FFCCCF;*/ } div.warning p.admonition-title { } div.admonition ul, div.admonition ol, div.warning ul, div.warning ol { margin: 0.1em 0.5em 0.5em 3em; padding: 0; } .viewcode-back { font-family: {{ theme_font }}, 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } pygments.rb-1.2.0/vendor/pygments-main/doc/_themes/pygments14/theme.conf000066400000000000000000000004011315616372200262250ustar00rootroot00000000000000[theme] inherit = basic stylesheet = pygments14.css pygments_style = friendly [options] green = #66b55e darkgreen = #36852e darkgray = #666666 border = #66b55e yellow = #f4cd00 darkyellow = #d4ad00 lightyellow = #fffbe3 background = #f9f9f9 font = PT Sans pygments.rb-1.2.0/vendor/pygments-main/doc/conf.py000066400000000000000000000170661315616372200221330ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Pygments documentation build configuration file # import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('..')) import pygments # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'pygments.sphinxext'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Pygments' copyright = u'2015, Georg Brandl' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = pygments.__version__ # The full version, including alpha/beta/rc tags. release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. #pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'pygments14' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. html_theme_path = ['_themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = '_static/favicon.ico' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. html_sidebars = {'index': 'indexsidebar.html', 'docs/*': 'docssidebar.html'} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Pygmentsdoc' # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Pygments.tex', u'Pygments Documentation', u'Georg Brandl', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'pygments', u'Pygments Documentation', [u'Georg Brandl'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'Pygments', u'Pygments Documentation', u'Georg Brandl', 'Pygments', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # Example configuration for intersphinx: refer to the Python standard library. #intersphinx_mapping = {'http://docs.python.org/': None} pygments.rb-1.2.0/vendor/pygments-main/doc/docs/000077500000000000000000000000001315616372200215525ustar00rootroot00000000000000pygments.rb-1.2.0/vendor/pygments-main/doc/docs/api.rst000066400000000000000000000272351315616372200230660ustar00rootroot00000000000000.. -*- mode: rst -*- ===================== The full Pygments API ===================== This page describes the Pygments API. High-level API ============== .. module:: pygments Functions from the :mod:`pygments` module: .. function:: lex(code, lexer) Lex `code` with the `lexer` (must be a `Lexer` instance) and return an iterable of tokens. Currently, this only calls `lexer.get_tokens()`. .. function:: format(tokens, formatter, outfile=None) Format a token stream (iterable of tokens) `tokens` with the `formatter` (must be a `Formatter` instance). The result is written to `outfile`, or if that is ``None``, returned as a string. .. function:: highlight(code, lexer, formatter, outfile=None) This is the most high-level highlighting function. It combines `lex` and `format` in one function. .. module:: pygments.lexers Functions from :mod:`pygments.lexers`: .. function:: get_lexer_by_name(alias, **options) Return an instance of a `Lexer` subclass that has `alias` in its aliases list. The lexer is given the `options` at its instantiation. Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is found. .. function:: get_lexer_for_filename(fn, **options) Return a `Lexer` subclass instance that has a filename pattern matching `fn`. The lexer is given the `options` at its instantiation. Will raise :exc:`pygments.util.ClassNotFound` if no lexer for that filename is found. .. function:: get_lexer_for_mimetype(mime, **options) Return a `Lexer` subclass instance that has `mime` in its mimetype list. The lexer is given the `options` at its instantiation. Will raise :exc:`pygments.util.ClassNotFound` if not lexer for that mimetype is found. .. function:: load_lexer_from_file(filename, lexername="CustomLexer", **options) Return a `Lexer` subclass instance loaded from the provided file, relative to the current directory. The file is expected to contain a Lexer class named `lexername` (by default, CustomLexer). Users should be very careful with the input, because this method is equivalent to running eval on the input file. The lexer is given the `options` at its instantiation. :exc:`ClassNotFound` is raised if there are any errors loading the Lexer .. versionadded:: 2.2 .. function:: guess_lexer(text, **options) Return a `Lexer` subclass instance that's guessed from the text in `text`. For that, the :meth:`.analyse_text()` method of every known lexer class is called with the text as argument, and the lexer which returned the highest value will be instantiated and returned. :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can handle the content. .. function:: guess_lexer_for_filename(filename, text, **options) As :func:`guess_lexer()`, but only lexers which have a pattern in `filenames` or `alias_filenames` that matches `filename` are taken into consideration. :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can handle the content. .. function:: get_all_lexers() Return an iterable over all registered lexers, yielding tuples in the format:: (longname, tuple of aliases, tuple of filename patterns, tuple of mimetypes) .. versionadded:: 0.6 .. function:: find_lexer_class_by_name(alias) Return the `Lexer` subclass that has `alias` in its aliases list, without instantiating it. Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is found. .. versionadded:: 2.2 .. function:: find_lexer_class(name) Return the `Lexer` subclass that with the *name* attribute as given by the *name* argument. .. module:: pygments.formatters Functions from :mod:`pygments.formatters`: .. function:: get_formatter_by_name(alias, **options) Return an instance of a :class:`.Formatter` subclass that has `alias` in its aliases list. The formatter is given the `options` at its instantiation. Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that alias is found. .. function:: get_formatter_for_filename(fn, **options) Return a :class:`.Formatter` subclass instance that has a filename pattern matching `fn`. The formatter is given the `options` at its instantiation. Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename is found. .. function:: load_formatter_from_file(filename, formattername="CustomFormatter", **options) Return a `Formatter` subclass instance loaded from the provided file, relative to the current directory. The file is expected to contain a Formatter class named ``formattername`` (by default, CustomFormatter). Users should be very careful with the input, because this method is equivalent to running eval on the input file. The formatter is given the `options` at its instantiation. :exc:`ClassNotFound` is raised if there are any errors loading the Formatter .. versionadded:: 2.2 .. module:: pygments.styles Functions from :mod:`pygments.styles`: .. function:: get_style_by_name(name) Return a style class by its short name. The names of the builtin styles are listed in :data:`pygments.styles.STYLE_MAP`. Will raise :exc:`pygments.util.ClassNotFound` if no style of that name is found. .. function:: get_all_styles() Return an iterable over all registered styles, yielding their names. .. versionadded:: 0.6 .. module:: pygments.lexer Lexers ====== The base lexer class from which all lexers are derived is: .. class:: Lexer(**options) The constructor takes a \*\*keywords dictionary of options. Every subclass must first process its own options and then call the `Lexer` constructor, since it processes the `stripnl`, `stripall` and `tabsize` options. An example looks like this: .. sourcecode:: python def __init__(self, **options): self.compress = options.get('compress', '') Lexer.__init__(self, **options) As these options must all be specifiable as strings (due to the command line usage), there are various utility functions available to help with that, see `Option processing`_. .. method:: get_tokens(text) This method is the basic interface of a lexer. It is called by the `highlight()` function. It must process the text and return an iterable of ``(tokentype, value)`` pairs from `text`. Normally, you don't need to override this method. The default implementation processes the `stripnl`, `stripall` and `tabsize` options and then yields all tokens from `get_tokens_unprocessed()`, with the ``index`` dropped. .. method:: get_tokens_unprocessed(text) This method should process the text and return an iterable of ``(index, tokentype, value)`` tuples where ``index`` is the starting position of the token within the input text. This method must be overridden by subclasses. .. staticmethod:: analyse_text(text) A static method which is called for lexer guessing. It should analyse the text and return a float in the range from ``0.0`` to ``1.0``. If it returns ``0.0``, the lexer will not be selected as the most probable one, if it returns ``1.0``, it will be selected immediately. .. note:: You don't have to add ``@staticmethod`` to the definition of this method, this will be taken care of by the Lexer's metaclass. For a list of known tokens have a look at the :doc:`tokens` page. A lexer also can have the following attributes (in fact, they are mandatory except `alias_filenames`) that are used by the builtin lookup mechanism. .. attribute:: name Full name for the lexer, in human-readable form. .. attribute:: aliases A list of short, unique identifiers that can be used to lookup the lexer from a list, e.g. using `get_lexer_by_name()`. .. attribute:: filenames A list of `fnmatch` patterns that match filenames which contain content for this lexer. The patterns in this list should be unique among all lexers. .. attribute:: alias_filenames A list of `fnmatch` patterns that match filenames which may or may not contain content for this lexer. This list is used by the :func:`.guess_lexer_for_filename()` function, to determine which lexers are then included in guessing the correct one. That means that e.g. every lexer for HTML and a template language should include ``\*.html`` in this list. .. attribute:: mimetypes A list of MIME types for content that can be lexed with this lexer. .. module:: pygments.formatter Formatters ========== A formatter is derived from this class: .. class:: Formatter(**options) As with lexers, this constructor processes options and then must call the base class :meth:`__init__`. The :class:`Formatter` class recognizes the options `style`, `full` and `title`. It is up to the formatter class whether it uses them. .. method:: get_style_defs(arg='') This method must return statements or declarations suitable to define the current style for subsequent highlighted text (e.g. CSS classes in the `HTMLFormatter`). The optional argument `arg` can be used to modify the generation and is formatter dependent (it is standardized because it can be given on the command line). This method is called by the ``-S`` :doc:`command-line option `, the `arg` is then given by the ``-a`` option. .. method:: format(tokensource, outfile) This method must format the tokens from the `tokensource` iterable and write the formatted version to the file object `outfile`. Formatter options can control how exactly the tokens are converted. .. versionadded:: 0.7 A formatter must have the following attributes that are used by the builtin lookup mechanism. .. attribute:: name Full name for the formatter, in human-readable form. .. attribute:: aliases A list of short, unique identifiers that can be used to lookup the formatter from a list, e.g. using :func:`.get_formatter_by_name()`. .. attribute:: filenames A list of :mod:`fnmatch` patterns that match filenames for which this formatter can produce output. The patterns in this list should be unique among all formatters. .. module:: pygments.util Option processing ================= The :mod:`pygments.util` module has some utility functions usable for option processing: .. exception:: OptionError This exception will be raised by all option processing functions if the type or value of the argument is not correct. .. function:: get_bool_opt(options, optname, default=None) Interpret the key `optname` from the dictionary `options` as a boolean and return it. Return `default` if `optname` is not in `options`. The valid string values for ``True`` are ``1``, ``yes``, ``true`` and ``on``, the ones for ``False`` are ``0``, ``no``, ``false`` and ``off`` (matched case-insensitively). .. function:: get_int_opt(options, optname, default=None) As :func:`get_bool_opt`, but interpret the value as an integer. .. function:: get_list_opt(options, optname, default=None) If the key `optname` from the dictionary `options` is a string, split it at whitespace and return it. If it is already a list or a tuple, it is returned as a list. .. function:: get_choice_opt(options, optname, allowed, default=None) If the key `optname` from the dictionary is not in the sequence `allowed`, raise an error, otherwise return it. .. versionadded:: 0.8 pygments.rb-1.2.0/vendor/pygments-main/doc/docs/authors.rst000066400000000000000000000001101315616372200237610ustar00rootroot00000000000000Full contributor list ===================== .. include:: ../../AUTHORS pygments.rb-1.2.0/vendor/pygments-main/doc/docs/changelog.rst000066400000000000000000000000331315616372200242270ustar00rootroot00000000000000.. include:: ../../CHANGES pygments.rb-1.2.0/vendor/pygments-main/doc/docs/cmdline.rst000066400000000000000000000130011315616372200237120ustar00rootroot00000000000000.. -*- mode: rst -*- ====================== Command Line Interface ====================== You can use Pygments from the shell, provided you installed the :program:`pygmentize` script:: $ pygmentize test.py print "Hello World" will print the file test.py to standard output, using the Python lexer (inferred from the file name extension) and the terminal formatter (because you didn't give an explicit formatter name). If you want HTML output:: $ pygmentize -f html -l python -o test.html test.py As you can see, the -l option explicitly selects a lexer. As seen above, if you give an input file name and it has an extension that Pygments recognizes, you can omit this option. The ``-o`` option gives an output file name. If it is not given, output is written to stdout. The ``-f`` option selects a formatter (as with ``-l``, it can also be omitted if an output file name is given and has a supported extension). If no output file name is given and ``-f`` is omitted, the :class:`.TerminalFormatter` is used. The above command could therefore also be given as:: $ pygmentize -o test.html test.py To create a full HTML document, including line numbers and stylesheet (using the "emacs" style), highlighting the Python file ``test.py`` to ``test.html``:: $ pygmentize -O full,style=emacs -o test.html test.py Options and filters ------------------- Lexer and formatter options can be given using the ``-O`` option:: $ pygmentize -f html -O style=colorful,linenos=1 -l python test.py Be sure to enclose the option string in quotes if it contains any special shell characters, such as spaces or expansion wildcards like ``*``. If an option expects a list value, separate the list entries with spaces (you'll have to quote the option value in this case too, so that the shell doesn't split it). Since the ``-O`` option argument is split at commas and expects the split values to be of the form ``name=value``, you can't give an option value that contains commas or equals signs. Therefore, an option ``-P`` is provided (as of Pygments 0.9) that works like ``-O`` but can only pass one option per ``-P``. Its value can then contain all characters:: $ pygmentize -P "heading=Pygments, the Python highlighter" ... Filters are added to the token stream using the ``-F`` option:: $ pygmentize -f html -l pascal -F keywordcase:case=upper main.pas As you see, options for the filter are given after a colon. As for ``-O``, the filter name and options must be one shell word, so there may not be any spaces around the colon. Generating styles ----------------- Formatters normally don't output full style information. For example, the HTML formatter by default only outputs ```` tags with ``class`` attributes. Therefore, there's a special ``-S`` option for generating style definitions. Usage is as follows:: $ pygmentize -f html -S colorful -a .syntax generates a CSS style sheet (because you selected the HTML formatter) for the "colorful" style prepending a ".syntax" selector to all style rules. For an explanation what ``-a`` means for :doc:`a particular formatter `, look for the `arg` argument for the formatter's :meth:`.get_style_defs()` method. Getting lexer names ------------------- .. versionadded:: 1.0 The ``-N`` option guesses a lexer name for a given filename, so that :: $ pygmentize -N setup.py will print out ``python``. It won't highlight anything yet. If no specific lexer is known for that filename, ``text`` is printed. Custom Lexers and Formatters ---------------------------- .. versionadded:: 2.2 The ``-x`` flag enables custom lexers and formatters to be loaded from files relative to the current directory. Create a file with a class named CustomLexer or CustomFormatter, then specify it on the command line:: $ pygmentize -l your_lexer.py -f your_formatter.py -x You can also specify the name of your class with a colon:: $ pygmentize -l your_lexer.py:SomeLexer -x For more information, see :doc:`the Pygments documentation on Lexer development `. Getting help ------------ The ``-L`` option lists lexers, formatters, along with their short names and supported file name extensions, styles and filters. If you want to see only one category, give it as an argument:: $ pygmentize -L filters will list only all installed filters. The ``-H`` option will give you detailed information (the same that can be found in this documentation) about a lexer, formatter or filter. Usage is as follows:: $ pygmentize -H formatter html will print the help for the HTML formatter, while :: $ pygmentize -H lexer python will print the help for the Python lexer, etc. A note on encodings ------------------- .. versionadded:: 0.9 Pygments tries to be smart regarding encodings in the formatting process: * If you give an ``encoding`` option, it will be used as the input and output encoding. * If you give an ``outencoding`` option, it will override ``encoding`` as the output encoding. * If you give an ``inencoding`` option, it will override ``encoding`` as the input encoding. * If you don't give an encoding and have given an output file, the default encoding for lexer and formatter is the terminal encoding or the default locale encoding of the system. As a last resort, ``latin1`` is used (which will pass through all non-ASCII characters). * If you don't give an encoding and haven't given an output file (that means output is written to the console), the default encoding for lexer and formatter is the terminal encoding (``sys.stdout.encoding``). pygments.rb-1.2.0/vendor/pygments-main/doc/docs/filterdevelopment.rst000066400000000000000000000045311315616372200260370ustar00rootroot00000000000000.. -*- mode: rst -*- ===================== Write your own filter ===================== .. versionadded:: 0.7 Writing own filters is very easy. All you have to do is to subclass the `Filter` class and override the `filter` method. Additionally a filter is instantiated with some keyword arguments you can use to adjust the behavior of your filter. Subclassing Filters =================== As an example, we write a filter that converts all `Name.Function` tokens to normal `Name` tokens to make the output less colorful. .. sourcecode:: python from pygments.util import get_bool_opt from pygments.token import Name from pygments.filter import Filter class UncolorFilter(Filter): def __init__(self, **options): Filter.__init__(self, **options) self.class_too = get_bool_opt(options, 'classtoo') def filter(self, lexer, stream): for ttype, value in stream: if ttype is Name.Function or (self.class_too and ttype is Name.Class): ttype = Name yield ttype, value Some notes on the `lexer` argument: that can be quite confusing since it doesn't need to be a lexer instance. If a filter was added by using the `add_filter()` function of lexers, that lexer is registered for the filter. In that case `lexer` will refer to the lexer that has registered the filter. It *can* be used to access options passed to a lexer. Because it could be `None` you always have to check for that case if you access it. Using a decorator ================= You can also use the `simplefilter` decorator from the `pygments.filter` module: .. sourcecode:: python from pygments.util import get_bool_opt from pygments.token import Name from pygments.filter import simplefilter @simplefilter def uncolor(self, lexer, stream, options): class_too = get_bool_opt(options, 'classtoo') for ttype, value in stream: if ttype is Name.Function or (class_too and ttype is Name.Class): ttype = Name yield ttype, value The decorator automatically subclasses an internal filter class and uses the decorated function as a method for filtering. (That's why there is a `self` argument that you probably won't end up using in the method.) pygments.rb-1.2.0/vendor/pygments-main/doc/docs/filters.rst000066400000000000000000000022761315616372200237630ustar00rootroot00000000000000.. -*- mode: rst -*- ======= Filters ======= .. versionadded:: 0.7 You can filter token streams coming from lexers to improve or annotate the output. For example, you can highlight special words in comments, convert keywords to upper or lowercase to enforce a style guide etc. To apply a filter, you can use the `add_filter()` method of a lexer: .. sourcecode:: pycon >>> from pygments.lexers import PythonLexer >>> l = PythonLexer() >>> # add a filter given by a string and options >>> l.add_filter('codetagify', case='lower') >>> l.filters [] >>> from pygments.filters import KeywordCaseFilter >>> # or give an instance >>> l.add_filter(KeywordCaseFilter(case='lower')) The `add_filter()` method takes keyword arguments which are forwarded to the constructor of the filter. To get a list of all registered filters by name, you can use the `get_all_filters()` function from the `pygments.filters` module that returns an iterable for all known filters. If you want to write your own filter, have a look at :doc:`Write your own filter `. Builtin Filters =============== .. pygmentsdoc:: filters pygments.rb-1.2.0/vendor/pygments-main/doc/docs/formatterdevelopment.rst000066400000000000000000000140471315616372200265600ustar00rootroot00000000000000.. -*- mode: rst -*- ======================== Write your own formatter ======================== As well as creating :doc:`your own lexer `, writing a new formatter for Pygments is easy and straightforward. A formatter is a class that is initialized with some keyword arguments (the formatter options) and that must provides a `format()` method. Additionally a formatter should provide a `get_style_defs()` method that returns the style definitions from the style in a form usable for the formatter's output format. Quickstart ========== The most basic formatter shipped with Pygments is the `NullFormatter`. It just sends the value of a token to the output stream: .. sourcecode:: python from pygments.formatter import Formatter class NullFormatter(Formatter): def format(self, tokensource, outfile): for ttype, value in tokensource: outfile.write(value) As you can see, the `format()` method is passed two parameters: `tokensource` and `outfile`. The first is an iterable of ``(token_type, value)`` tuples, the latter a file like object with a `write()` method. Because the formatter is that basic it doesn't overwrite the `get_style_defs()` method. Styles ====== Styles aren't instantiated but their metaclass provides some class functions so that you can access the style definitions easily. Styles are iterable and yield tuples in the form ``(ttype, d)`` where `ttype` is a token and `d` is a dict with the following keys: ``'color'`` Hexadecimal color value (eg: ``'ff0000'`` for red) or `None` if not defined. ``'bold'`` `True` if the value should be bold ``'italic'`` `True` if the value should be italic ``'underline'`` `True` if the value should be underlined ``'bgcolor'`` Hexadecimal color value for the background (eg: ``'eeeeeee'`` for light gray) or `None` if not defined. ``'border'`` Hexadecimal color value for the border (eg: ``'0000aa'`` for a dark blue) or `None` for no border. Additional keys might appear in the future, formatters should ignore all keys they don't support. HTML 3.2 Formatter ================== For an more complex example, let's implement a HTML 3.2 Formatter. We don't use CSS but inline markup (````, ````, etc). Because this isn't good style this formatter isn't in the standard library ;-) .. sourcecode:: python from pygments.formatter import Formatter class OldHtmlFormatter(Formatter): def __init__(self, **options): Formatter.__init__(self, **options) # create a dict of (start, end) tuples that wrap the # value of a token so that we can use it in the format # method later self.styles = {} # we iterate over the `_styles` attribute of a style item # that contains the parsed style values. for token, style in self.style: start = end = '' # a style item is a tuple in the following form: # colors are readily specified in hex: 'RRGGBB' if style['color']: start += '' % style['color'] end = '' + end if style['bold']: start += '' end = '' + end if style['italic']: start += '' end = '' + end if style['underline']: start += '' end = '' + end self.styles[token] = (start, end) def format(self, tokensource, outfile): # lastval is a string we use for caching # because it's possible that an lexer yields a number # of consecutive tokens with the same token type. # to minimize the size of the generated html markup we # try to join the values of same-type tokens here lastval = '' lasttype = None # wrap the whole output with
            outfile.write('
')

            for ttype, value in tokensource:
                # if the token type doesn't exist in the stylemap
                # we try it with the parent of the token type
                # eg: parent of Token.Literal.String.Double is
                # Token.Literal.String
                while ttype not in self.styles:
                    ttype = ttype.parent
                if ttype == lasttype:
                    # the current token type is the same of the last
                    # iteration. cache it
                    lastval += value
                else:
                    # not the same token as last iteration, but we
                    # have some data in the buffer. wrap it with the
                    # defined style and write it to the output file
                    if lastval:
                        stylebegin, styleend = self.styles[lasttype]
                        outfile.write(stylebegin + lastval + styleend)
                    # set lastval/lasttype to current values
                    lastval = value
                    lasttype = ttype

            # if something is left in the buffer, write it to the
            # output file, then close the opened 
 tag
            if lastval:
                stylebegin, styleend = self.styles[lasttype]
                outfile.write(stylebegin + lastval + styleend)
            outfile.write('
\n') The comments should explain it. Again, this formatter doesn't override the `get_style_defs()` method. If we would have used CSS classes instead of inline HTML markup, we would need to generate the CSS first. For that purpose the `get_style_defs()` method exists: Generating Style Definitions ============================ Some formatters like the `LatexFormatter` and the `HtmlFormatter` don't output inline markup but reference either macros or css classes. Because the definitions of those are not part of the output, the `get_style_defs()` method exists. It is passed one parameter (if it's used and how it's used is up to the formatter) and has to return a string or ``None``. pygments.rb-1.2.0/vendor/pygments-main/doc/docs/formatters.rst000066400000000000000000000031201315616372200244660ustar00rootroot00000000000000.. -*- mode: rst -*- ==================== Available formatters ==================== This page lists all builtin formatters. Common options ============== All formatters support these options: `encoding` If given, must be an encoding name (such as ``"utf-8"``). This will be used to convert the token strings (which are Unicode strings) to byte strings in the output (default: ``None``). It will also be written in an encoding declaration suitable for the document format if the `full` option is given (e.g. a ``meta content-type`` directive in HTML or an invocation of the `inputenc` package in LaTeX). If this is ``""`` or ``None``, Unicode strings will be written to the output file, which most file-like objects do not support. For example, `pygments.highlight()` will return a Unicode string if called with no `outfile` argument and a formatter that has `encoding` set to ``None`` because it uses a `StringIO.StringIO` object that supports Unicode arguments to `write()`. Using a regular file object wouldn't work. .. versionadded:: 0.6 `outencoding` When using Pygments from the command line, any `encoding` option given is passed to the lexer and the formatter. This is sometimes not desirable, for example if you want to set the input encoding to ``"guess"``. Therefore, `outencoding` has been introduced which overrides `encoding` for the formatter if given. .. versionadded:: 0.7 Formatter classes ================= All these classes are importable from :mod:`pygments.formatters`. .. pygmentsdoc:: formatters pygments.rb-1.2.0/vendor/pygments-main/doc/docs/index.rst000066400000000000000000000015741315616372200234220ustar00rootroot00000000000000Pygments documentation ====================== **Starting with Pygments** .. toctree:: :maxdepth: 1 ../download quickstart cmdline **Builtin components** .. toctree:: :maxdepth: 1 lexers filters formatters styles **Reference** .. toctree:: :maxdepth: 1 unicode tokens api **Hacking for Pygments** .. toctree:: :maxdepth: 1 lexerdevelopment formatterdevelopment filterdevelopment plugins **Hints and tricks** .. toctree:: :maxdepth: 1 rstdirective moinmoin java integrate **About Pygments** .. toctree:: :maxdepth: 1 changelog authors If you find bugs or have suggestions for the documentation, please look :ref:`here ` for info on how to contact the team. .. XXX You can download an offline version of this documentation from the :doc:`download page `. pygments.rb-1.2.0/vendor/pygments-main/doc/docs/integrate.rst000066400000000000000000000023201315616372200242630ustar00rootroot00000000000000.. -*- mode: rst -*- =================================== Using Pygments in various scenarios =================================== Markdown -------- Since Pygments 0.9, the distribution ships Markdown_ preprocessor sample code that uses Pygments to render source code in :file:`external/markdown-processor.py`. You can copy and adapt it to your liking. .. _Markdown: http://www.freewisdom.org/projects/python-markdown/ TextMate -------- Antonio Cangiano has created a Pygments bundle for TextMate that allows to colorize code via a simple menu option. It can be found here_. .. _here: http://antoniocangiano.com/2008/10/28/pygments-textmate-bundle/ Bash completion --------------- The source distribution contains a file ``external/pygments.bashcomp`` that sets up completion for the ``pygmentize`` command in bash. Wrappers for other languages ---------------------------- These libraries provide Pygments highlighting for users of other languages than Python: * `pygments.rb `_, a pygments wrapper for Ruby * `Clygments `_, a pygments wrapper for Clojure * `PHPygments `_, a pygments wrapper for PHP pygments.rb-1.2.0/vendor/pygments-main/doc/docs/java.rst000066400000000000000000000044311315616372200232270ustar00rootroot00000000000000===================== Use Pygments in Java ===================== Thanks to `Jython `_ it is possible to use Pygments in Java. This page is a simple tutorial to get an idea of how this works. You can then look at the `Jython documentation `_ for more advanced uses. Since version 1.5, Pygments is deployed on `Maven Central `_ as a JAR, as is Jython which makes it a lot easier to create a Java project. Here is an example of a `Maven `_ ``pom.xml`` file for a project running Pygments: .. sourcecode:: xml 4.0.0 example example 1.0-SNAPSHOT org.python jython-standalone 2.5.3 org.pygments pygments 1.5 runtime The following Java example: .. sourcecode:: java PythonInterpreter interpreter = new PythonInterpreter(); // Set a variable with the content you want to work with interpreter.set("code", code); // Simple use Pygments as you would in Python interpreter.exec("from pygments import highlight\n" + "from pygments.lexers import PythonLexer\n" + "from pygments.formatters import HtmlFormatter\n" + "\nresult = highlight(code, PythonLexer(), HtmlFormatter())"); // Get the result that has been set in a variable System.out.println(interpreter.get("result", String.class)); will print something like: .. sourcecode:: html
print "Hello World"
pygments.rb-1.2.0/vendor/pygments-main/doc/docs/lexerdevelopment.rst000066400000000000000000000661061315616372200256770ustar00rootroot00000000000000.. -*- mode: rst -*- .. highlight:: python ==================== Write your own lexer ==================== If a lexer for your favorite language is missing in the Pygments package, you can easily write your own and extend Pygments. All you need can be found inside the :mod:`pygments.lexer` module. As you can read in the :doc:`API documentation `, a lexer is a class that is initialized with some keyword arguments (the lexer options) and that provides a :meth:`.get_tokens_unprocessed()` method which is given a string or unicode object with the data to lex. The :meth:`.get_tokens_unprocessed()` method must return an iterator or iterable containing tuples in the form ``(index, token, value)``. Normally you don't need to do this since there are base lexers that do most of the work and that you can subclass. RegexLexer ========== The lexer base class used by almost all of Pygments' lexers is the :class:`RegexLexer`. This class allows you to define lexing rules in terms of *regular expressions* for different *states*. States are groups of regular expressions that are matched against the input string at the *current position*. If one of these expressions matches, a corresponding action is performed (such as yielding a token with a specific type, or changing state), the current position is set to where the last match ended and the matching process continues with the first regex of the current state. Lexer states are kept on a stack: each time a new state is entered, the new state is pushed onto the stack. The most basic lexers (like the `DiffLexer`) just need one state. Each state is defined as a list of tuples in the form (`regex`, `action`, `new_state`) where the last item is optional. In the most basic form, `action` is a token type (like `Name.Builtin`). That means: When `regex` matches, emit a token with the match text and type `tokentype` and push `new_state` on the state stack. If the new state is ``'#pop'``, the topmost state is popped from the stack instead. To pop more than one state, use ``'#pop:2'`` and so on. ``'#push'`` is a synonym for pushing the current state on the stack. The following example shows the `DiffLexer` from the builtin lexers. Note that it contains some additional attributes `name`, `aliases` and `filenames` which aren't required for a lexer. They are used by the builtin lexer lookup functions. :: from pygments.lexer import RegexLexer from pygments.token import * class DiffLexer(RegexLexer): name = 'Diff' aliases = ['diff'] filenames = ['*.diff'] tokens = { 'root': [ (r' .*\n', Text), (r'\+.*\n', Generic.Inserted), (r'-.*\n', Generic.Deleted), (r'@.*\n', Generic.Subheading), (r'Index.*\n', Generic.Heading), (r'=.*\n', Generic.Heading), (r'.*\n', Text), ] } As you can see this lexer only uses one state. When the lexer starts scanning the text, it first checks if the current character is a space. If this is true it scans everything until newline and returns the data as a `Text` token (which is the "no special highlighting" token). If this rule doesn't match, it checks if the current char is a plus sign. And so on. If no rule matches at the current position, the current char is emitted as an `Error` token that indicates a lexing error, and the position is increased by one. Adding and testing a new lexer ============================== The easiest way to use a new lexer is to use Pygments' support for loading the lexer from a file relative to your current directory. First, change the name of your lexer class to CustomLexer: .. code-block:: python from pygments.lexer import RegexLexer from pygments.token import * class CustomLexer(RegexLexer): """All your lexer code goes here!""" Then you can load the lexer from the command line with the additional flag ``-x``: .. code-block:: console $ pygmentize -l your_lexer_file.py -x To specify a class name other than CustomLexer, append it with a colon: .. code-block:: console $ pygmentize -l your_lexer.py:SomeLexer -x Or, using the Python API: .. code-block:: python # For a lexer named CustomLexer your_lexer = load_lexer_from_file(filename, **options) # For a lexer named MyNewLexer your_named_lexer = load_lexer_from_file(filename, "MyNewLexer", **options) When loading custom lexers and formatters, be extremely careful to use only trusted files; Pygments will perform the equivalent of ``eval`` on them. If you only want to use your lexer with the Pygments API, you can import and instantiate the lexer yourself, then pass it to :func:`pygments.highlight`. To prepare your new lexer for inclusion in the Pygments distribution, so that it will be found when passing filenames or lexer aliases from the command line, you have to perform the following steps. First, change to the current directory containing the Pygments source code. You will need to have either an unpacked source tarball, or (preferably) a copy cloned from BitBucket. .. code-block:: console $ cd .../pygments-main Select a matching module under ``pygments/lexers``, or create a new module for your lexer class. Next, make sure the lexer is known from outside of the module. All modules in the ``pygments.lexers`` package specify ``__all__``. For example, ``esoteric.py`` sets:: __all__ = ['BrainfuckLexer', 'BefungeLexer', ...] Add the name of your lexer class to this list (or create the list if your lexer is the only class in the module). Finally the lexer can be made publicly known by rebuilding the lexer mapping: .. code-block:: console $ make mapfiles To test the new lexer, store an example file with the proper extension in ``tests/examplefiles``. For example, to test your ``DiffLexer``, add a ``tests/examplefiles/example.diff`` containing a sample diff output. Now you can use pygmentize to render your example to HTML: .. code-block:: console $ ./pygmentize -O full -f html -o /tmp/example.html tests/examplefiles/example.diff Note that this explicitly calls the ``pygmentize`` in the current directory by preceding it with ``./``. This ensures your modifications are used. Otherwise a possibly already installed, unmodified version without your new lexer would have been called from the system search path (``$PATH``). To view the result, open ``/tmp/example.html`` in your browser. Once the example renders as expected, you should run the complete test suite: .. code-block:: console $ make test It also tests that your lexer fulfills the lexer API and certain invariants, such as that the concatenation of all token text is the same as the input text. Regex Flags =========== You can either define regex flags locally in the regex (``r'(?x)foo bar'``) or globally by adding a `flags` attribute to your lexer class. If no attribute is defined, it defaults to `re.MULTILINE`. For more information about regular expression flags see the page about `regular expressions`_ in the Python documentation. .. _regular expressions: http://docs.python.org/library/re.html#regular-expression-syntax Scanning multiple tokens at once ================================ So far, the `action` element in the rule tuple of regex, action and state has been a single token type. Now we look at the first of several other possible values. Here is a more complex lexer that highlights INI files. INI files consist of sections, comments and ``key = value`` pairs:: from pygments.lexer import RegexLexer, bygroups from pygments.token import * class IniLexer(RegexLexer): name = 'INI' aliases = ['ini', 'cfg'] filenames = ['*.ini', '*.cfg'] tokens = { 'root': [ (r'\s+', Text), (r';.*?$', Comment), (r'\[.*?\]$', Keyword), (r'(.*?)(\s*)(=)(\s*)(.*?)$', bygroups(Name.Attribute, Text, Operator, Text, String)) ] } The lexer first looks for whitespace, comments and section names. Later it looks for a line that looks like a key, value pair, separated by an ``'='`` sign, and optional whitespace. The `bygroups` helper yields each capturing group in the regex with a different token type. First the `Name.Attribute` token, then a `Text` token for the optional whitespace, after that a `Operator` token for the equals sign. Then a `Text` token for the whitespace again. The rest of the line is returned as `String`. Note that for this to work, every part of the match must be inside a capturing group (a ``(...)``), and there must not be any nested capturing groups. If you nevertheless need a group, use a non-capturing group defined using this syntax: ``(?:some|words|here)`` (note the ``?:`` after the beginning parenthesis). If you find yourself needing a capturing group inside the regex which shouldn't be part of the output but is used in the regular expressions for backreferencing (eg: ``r'(<(foo|bar)>)(.*?)()'``), you can pass `None` to the bygroups function and that group will be skipped in the output. Changing states =============== Many lexers need multiple states to work as expected. For example, some languages allow multiline comments to be nested. Since this is a recursive pattern it's impossible to lex just using regular expressions. Here is a lexer that recognizes C++ style comments (multi-line with ``/* */`` and single-line with ``//`` until end of line):: from pygments.lexer import RegexLexer from pygments.token import * class CppCommentLexer(RegexLexer): name = 'Example Lexer with states' tokens = { 'root': [ (r'[^/]+', Text), (r'/\*', Comment.Multiline, 'comment'), (r'//.*?$', Comment.Singleline), (r'/', Text) ], 'comment': [ (r'[^*/]', Comment.Multiline), (r'/\*', Comment.Multiline, '#push'), (r'\*/', Comment.Multiline, '#pop'), (r'[*/]', Comment.Multiline) ] } This lexer starts lexing in the ``'root'`` state. It tries to match as much as possible until it finds a slash (``'/'``). If the next character after the slash is an asterisk (``'*'``) the `RegexLexer` sends those two characters to the output stream marked as `Comment.Multiline` and continues lexing with the rules defined in the ``'comment'`` state. If there wasn't an asterisk after the slash, the `RegexLexer` checks if it's a Singleline comment (i.e. followed by a second slash). If this also wasn't the case it must be a single slash, which is not a comment starter (the separate regex for a single slash must also be given, else the slash would be marked as an error token). Inside the ``'comment'`` state, we do the same thing again. Scan until the lexer finds a star or slash. If it's the opening of a multiline comment, push the ``'comment'`` state on the stack and continue scanning, again in the ``'comment'`` state. Else, check if it's the end of the multiline comment. If yes, pop one state from the stack. Note: If you pop from an empty stack you'll get an `IndexError`. (There is an easy way to prevent this from happening: don't ``'#pop'`` in the root state). If the `RegexLexer` encounters a newline that is flagged as an error token, the stack is emptied and the lexer continues scanning in the ``'root'`` state. This can help producing error-tolerant highlighting for erroneous input, e.g. when a single-line string is not closed. Advanced state tricks ===================== There are a few more things you can do with states: - You can push multiple states onto the stack if you give a tuple instead of a simple string as the third item in a rule tuple. For example, if you want to match a comment containing a directive, something like: .. code-block:: text /* rest of comment */ you can use this rule:: tokens = { 'root': [ (r'/\* <', Comment, ('comment', 'directive')), ... ], 'directive': [ (r'[^>]*', Comment.Directive), (r'>', Comment, '#pop'), ], 'comment': [ (r'[^*]+', Comment), (r'\*/', Comment, '#pop'), (r'\*', Comment), ] } When this encounters the above sample, first ``'comment'`` and ``'directive'`` are pushed onto the stack, then the lexer continues in the directive state until it finds the closing ``>``, then it continues in the comment state until the closing ``*/``. Then, both states are popped from the stack again and lexing continues in the root state. .. versionadded:: 0.9 The tuple can contain the special ``'#push'`` and ``'#pop'`` (but not ``'#pop:n'``) directives. - You can include the rules of a state in the definition of another. This is done by using `include` from `pygments.lexer`:: from pygments.lexer import RegexLexer, bygroups, include from pygments.token import * class ExampleLexer(RegexLexer): tokens = { 'comments': [ (r'/\*.*?\*/', Comment), (r'//.*?\n', Comment), ], 'root': [ include('comments'), (r'(function )(\w+)( {)', bygroups(Keyword, Name, Keyword), 'function'), (r'.', Text), ], 'function': [ (r'[^}/]+', Text), include('comments'), (r'/', Text), (r'\}', Keyword, '#pop'), ] } This is a hypothetical lexer for a language that consist of functions and comments. Because comments can occur at toplevel and in functions, we need rules for comments in both states. As you can see, the `include` helper saves repeating rules that occur more than once (in this example, the state ``'comment'`` will never be entered by the lexer, as it's only there to be included in ``'root'`` and ``'function'``). - Sometimes, you may want to "combine" a state from existing ones. This is possible with the `combined` helper from `pygments.lexer`. If you, instead of a new state, write ``combined('state1', 'state2')`` as the third item of a rule tuple, a new anonymous state will be formed from state1 and state2 and if the rule matches, the lexer will enter this state. This is not used very often, but can be helpful in some cases, such as the `PythonLexer`'s string literal processing. - If you want your lexer to start lexing in a different state you can modify the stack by overriding the `get_tokens_unprocessed()` method:: from pygments.lexer import RegexLexer class ExampleLexer(RegexLexer): tokens = {...} def get_tokens_unprocessed(self, text, stack=('root', 'otherstate')): for item in RegexLexer.get_tokens_unprocessed(self, text, stack): yield item Some lexers like the `PhpLexer` use this to make the leading ``', Name.Tag), ], 'script-content': [ (r'(.+?)(<\s*/\s*script\s*>)', bygroups(using(JavascriptLexer), Name.Tag), '#pop'), ] } Here the content of a ```` end tag is processed by the `JavascriptLexer`, while the end tag is yielded as a normal token with the `Name.Tag` type. Also note the ``(r'<\s*script\s*', Name.Tag, ('script-content', 'tag'))`` rule. Here, two states are pushed onto the state stack, ``'script-content'`` and ``'tag'``. That means that first ``'tag'`` is processed, which will lex attributes and the closing ``>``, then the ``'tag'`` state is popped and the next state on top of the stack will be ``'script-content'``. Since you cannot refer to the class currently being defined, use `this` (imported from `pygments.lexer`) to refer to the current lexer class, i.e. ``using(this)``. This construct may seem unnecessary, but this is often the most obvious way of lexing arbitrary syntax between fixed delimiters without introducing deeply nested states. The `using()` helper has a special keyword argument, `state`, which works as follows: if given, the lexer to use initially is not in the ``"root"`` state, but in the state given by this argument. This does not work with advanced `RegexLexer` subclasses such as `ExtendedRegexLexer` (see below). Any other keywords arguments passed to `using()` are added to the keyword arguments used to create the lexer. Delegating Lexer ================ Another approach for nested lexers is the `DelegatingLexer` which is for example used for the template engine lexers. It takes two lexers as arguments on initialisation: a `root_lexer` and a `language_lexer`. The input is processed as follows: First, the whole text is lexed with the `language_lexer`. All tokens yielded with the special type of ``Other`` are then concatenated and given to the `root_lexer`. The language tokens of the `language_lexer` are then inserted into the `root_lexer`'s token stream at the appropriate positions. :: from pygments.lexer import DelegatingLexer from pygments.lexers.web import HtmlLexer, PhpLexer class HtmlPhpLexer(DelegatingLexer): def __init__(self, **options): super(HtmlPhpLexer, self).__init__(HtmlLexer, PhpLexer, **options) This procedure ensures that e.g. HTML with template tags in it is highlighted correctly even if the template tags are put into HTML tags or attributes. If you want to change the needle token ``Other`` to something else, you can give the lexer another token type as the third parameter:: DelegatingLexer.__init__(MyLexer, OtherLexer, Text, **options) Callbacks ========= Sometimes the grammar of a language is so complex that a lexer would be unable to process it just by using regular expressions and stacks. For this, the `RegexLexer` allows callbacks to be given in rule tuples, instead of token types (`bygroups` and `using` are nothing else but preimplemented callbacks). The callback must be a function taking two arguments: * the lexer itself * the match object for the last matched rule The callback must then return an iterable of (or simply yield) ``(index, tokentype, value)`` tuples, which are then just passed through by `get_tokens_unprocessed()`. The ``index`` here is the position of the token in the input string, ``tokentype`` is the normal token type (like `Name.Builtin`), and ``value`` the associated part of the input string. You can see an example here:: from pygments.lexer import RegexLexer from pygments.token import Generic class HypotheticLexer(RegexLexer): def headline_callback(lexer, match): equal_signs = match.group(1) text = match.group(2) yield match.start(), Generic.Headline, equal_signs + text + equal_signs tokens = { 'root': [ (r'(=+)(.*?)(\1)', headline_callback) ] } If the regex for the `headline_callback` matches, the function is called with the match object. Note that after the callback is done, processing continues normally, that is, after the end of the previous match. The callback has no possibility to influence the position. There are not really any simple examples for lexer callbacks, but you can see them in action e.g. in the `SMLLexer` class in `ml.py`_. .. _ml.py: http://bitbucket.org/birkenfeld/pygments-main/src/tip/pygments/lexers/ml.py The ExtendedRegexLexer class ============================ The `RegexLexer`, even with callbacks, unfortunately isn't powerful enough for the funky syntax rules of languages such as Ruby. But fear not; even then you don't have to abandon the regular expression approach: Pygments has a subclass of `RegexLexer`, the `ExtendedRegexLexer`. All features known from RegexLexers are available here too, and the tokens are specified in exactly the same way, *except* for one detail: The `get_tokens_unprocessed()` method holds its internal state data not as local variables, but in an instance of the `pygments.lexer.LexerContext` class, and that instance is passed to callbacks as a third argument. This means that you can modify the lexer state in callbacks. The `LexerContext` class has the following members: * `text` -- the input text * `pos` -- the current starting position that is used for matching regexes * `stack` -- a list containing the state stack * `end` -- the maximum position to which regexes are matched, this defaults to the length of `text` Additionally, the `get_tokens_unprocessed()` method can be given a `LexerContext` instead of a string and will then process this context instead of creating a new one for the string argument. Note that because you can set the current position to anything in the callback, it won't be automatically be set by the caller after the callback is finished. For example, this is how the hypothetical lexer above would be written with the `ExtendedRegexLexer`:: from pygments.lexer import ExtendedRegexLexer from pygments.token import Generic class ExHypotheticLexer(ExtendedRegexLexer): def headline_callback(lexer, match, ctx): equal_signs = match.group(1) text = match.group(2) yield match.start(), Generic.Headline, equal_signs + text + equal_signs ctx.pos = match.end() tokens = { 'root': [ (r'(=+)(.*?)(\1)', headline_callback) ] } This might sound confusing (and it can really be). But it is needed, and for an example look at the Ruby lexer in `ruby.py`_. .. _ruby.py: https://bitbucket.org/birkenfeld/pygments-main/src/tip/pygments/lexers/ruby.py Handling Lists of Keywords ========================== For a relatively short list (hundreds) you can construct an optimized regular expression directly using ``words()`` (longer lists, see next section). This function handles a few things for you automatically, including escaping metacharacters and Python's first-match rather than longest-match in alternations. Feel free to put the lists themselves in ``pygments/lexers/_$lang_builtins.py`` (see examples there), and generated by code if possible. An example of using ``words()`` is something like:: from pygments.lexer import RegexLexer, words, Name class MyLexer(RegexLexer): tokens = { 'root': [ (words(('else', 'elseif'), suffix=r'\b'), Name.Builtin), (r'\w+', Name), ], } As you can see, you can add ``prefix`` and ``suffix`` parts to the constructed regex. Modifying Token Streams ======================= Some languages ship a lot of builtin functions (for example PHP). The total amount of those functions differs from system to system because not everybody has every extension installed. In the case of PHP there are over 3000 builtin functions. That's an incredibly huge amount of functions, much more than you want to put into a regular expression. But because only `Name` tokens can be function names this is solvable by overriding the ``get_tokens_unprocessed()`` method. The following lexer subclasses the `PythonLexer` so that it highlights some additional names as pseudo keywords:: from pygments.lexers.python import PythonLexer from pygments.token import Name, Keyword class MyPythonLexer(PythonLexer): EXTRA_KEYWORDS = set(('foo', 'bar', 'foobar', 'barfoo', 'spam', 'eggs')) def get_tokens_unprocessed(self, text): for index, token, value in PythonLexer.get_tokens_unprocessed(self, text): if token is Name and value in self.EXTRA_KEYWORDS: yield index, Keyword.Pseudo, value else: yield index, token, value The `PhpLexer` and `LuaLexer` use this method to resolve builtin functions. pygments.rb-1.2.0/vendor/pygments-main/doc/docs/lexers.rst000066400000000000000000000037611315616372200236150ustar00rootroot00000000000000.. -*- mode: rst -*- ================ Available lexers ================ This page lists all available builtin lexers and the options they take. Currently, **all lexers** support these options: `stripnl` Strip leading and trailing newlines from the input (default: ``True``) `stripall` Strip all leading and trailing whitespace from the input (default: ``False``). `ensurenl` Make sure that the input ends with a newline (default: ``True``). This is required for some lexers that consume input linewise. .. versionadded:: 1.3 `tabsize` If given and greater than 0, expand tabs in the input (default: ``0``). `encoding` If given, must be an encoding name (such as ``"utf-8"``). This encoding will be used to convert the input string to Unicode (if it is not already a Unicode string). The default is ``"guess"``. If this option is set to ``"guess"``, a simple UTF-8 vs. Latin-1 detection is used, if it is set to ``"chardet"``, the `chardet library `_ is used to guess the encoding of the input. .. versionadded:: 0.6 The "Short Names" field lists the identifiers that can be used with the `get_lexer_by_name()` function. These lexers are builtin and can be imported from `pygments.lexers`: .. pygmentsdoc:: lexers Iterating over all lexers ------------------------- .. versionadded:: 0.6 To get all lexers (both the builtin and the plugin ones), you can use the `get_all_lexers()` function from the `pygments.lexers` module: .. sourcecode:: pycon >>> from pygments.lexers import get_all_lexers >>> i = get_all_lexers() >>> i.next() ('Diff', ('diff',), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')) >>> i.next() ('Delphi', ('delphi', 'objectpascal', 'pas', 'pascal'), ('*.pas',), ('text/x-pascal',)) >>> i.next() ('XML+Ruby', ('xml+erb', 'xml+ruby'), (), ()) As you can see, the return value is an iterator which yields tuples in the form ``(name, aliases, filetypes, mimetypes)``. pygments.rb-1.2.0/vendor/pygments-main/doc/docs/moinmoin.rst000066400000000000000000000026701315616372200241360ustar00rootroot00000000000000.. -*- mode: rst -*- ============================ Using Pygments with MoinMoin ============================ From Pygments 0.7, the source distribution ships a `Moin`_ parser plugin that can be used to get Pygments highlighting in Moin wiki pages. To use it, copy the file `external/moin-parser.py` from the Pygments distribution to the `data/plugin/parser` subdirectory of your Moin instance. Edit the options at the top of the file (currently ``ATTACHMENTS`` and ``INLINESTYLES``) and rename the file to the name that the parser directive should have. For example, if you name the file ``code.py``, you can get a highlighted Python code sample with this Wiki markup:: {{{ #!code python [...] }}} where ``python`` is the Pygments name of the lexer to use. Additionally, if you set the ``ATTACHMENTS`` option to True, Pygments will also be called for all attachments for whose filenames there is no other parser registered. You are responsible for including CSS rules that will map the Pygments CSS classes to colors. You can output a stylesheet file with `pygmentize`, put it into the `htdocs` directory of your Moin instance and then include it in the `stylesheets` configuration option in the Moin config, e.g.:: stylesheets = [('screen', '/htdocs/pygments.css')] If you do not want to do that and are willing to accept larger HTML output, you can set the ``INLINESTYLES`` option to True. .. _Moin: http://moinmoin.wikiwikiweb.de/ pygments.rb-1.2.0/vendor/pygments-main/doc/docs/plugins.rst000066400000000000000000000050251315616372200237670ustar00rootroot00000000000000================ Register Plugins ================ If you want to extend Pygments without hacking the sources, but want to use the lexer/formatter/style/filter lookup functions (`lexers.get_lexer_by_name` et al.), you can use `setuptools`_ entrypoints to add new lexers, formatters or styles as if they were in the Pygments core. .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools That means you can use your highlighter modules with the `pygmentize` script, which relies on the mentioned functions. Entrypoints =========== Here is a list of setuptools entrypoints that Pygments understands: `pygments.lexers` This entrypoint is used for adding new lexers to the Pygments core. The name of the entrypoint values doesn't really matter, Pygments extracts required metadata from the class definition: .. sourcecode:: ini [pygments.lexers] yourlexer = yourmodule:YourLexer Note that you have to define ``name``, ``aliases`` and ``filename`` attributes so that you can use the highlighter from the command line: .. sourcecode:: python class YourLexer(...): name = 'Name Of Your Lexer' aliases = ['alias'] filenames = ['*.ext'] `pygments.formatters` You can use this entrypoint to add new formatters to Pygments. The name of an entrypoint item is the name of the formatter. If you prefix the name with a slash it's used as a filename pattern: .. sourcecode:: ini [pygments.formatters] yourformatter = yourmodule:YourFormatter /.ext = yourmodule:YourFormatter `pygments.styles` To add a new style you can use this entrypoint. The name of the entrypoint is the name of the style: .. sourcecode:: ini [pygments.styles] yourstyle = yourmodule:YourStyle `pygments.filters` Use this entrypoint to register a new filter. The name of the entrypoint is the name of the filter: .. sourcecode:: ini [pygments.filters] yourfilter = yourmodule:YourFilter How To Use Entrypoints ====================== This documentation doesn't explain how to use those entrypoints because this is covered in the `setuptools documentation`_. That page should cover everything you need to write a plugin. .. _setuptools documentation: http://peak.telecommunity.com/DevCenter/setuptools Extending The Core ================== If you have written a Pygments plugin that is open source, please inform us about that. There is a high chance that we'll add it to the Pygments distribution. pygments.rb-1.2.0/vendor/pygments-main/doc/docs/quickstart.rst000066400000000000000000000147731315616372200245120ustar00rootroot00000000000000.. -*- mode: rst -*- =========================== Introduction and Quickstart =========================== Welcome to Pygments! This document explains the basic concepts and terms and gives a few examples of how to use the library. Architecture ============ There are four types of components that work together highlighting a piece of code: * A **lexer** splits the source into tokens, fragments of the source that have a token type that determines what the text represents semantically (e.g., keyword, string, or comment). There is a lexer for every language or markup format that Pygments supports. * The token stream can be piped through **filters**, which usually modify the token types or text fragments, e.g. uppercasing all keywords. * A **formatter** then takes the token stream and writes it to an output file, in a format such as HTML, LaTeX or RTF. * While writing the output, a **style** determines how to highlight all the different token types. It maps them to attributes like "red and bold". Example ======= Here is a small example for highlighting Python code: .. sourcecode:: python from pygments import highlight from pygments.lexers import PythonLexer from pygments.formatters import HtmlFormatter code = 'print "Hello World"' print highlight(code, PythonLexer(), HtmlFormatter()) which prints something like this: .. sourcecode:: html
print "Hello World"
As you can see, Pygments uses CSS classes (by default, but you can change that) instead of inline styles in order to avoid outputting redundant style information over and over. A CSS stylesheet that contains all CSS classes possibly used in the output can be produced by: .. sourcecode:: python print HtmlFormatter().get_style_defs('.highlight') The argument to :func:`get_style_defs` is used as an additional CSS selector: the output may look like this: .. sourcecode:: css .highlight .k { color: #AA22FF; font-weight: bold } .highlight .s { color: #BB4444 } ... Options ======= The :func:`highlight()` function supports a fourth argument called *outfile*, it must be a file object if given. The formatted output will then be written to this file instead of being returned as a string. Lexers and formatters both support options. They are given to them as keyword arguments either to the class or to the lookup method: .. sourcecode:: python from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter lexer = get_lexer_by_name("python", stripall=True) formatter = HtmlFormatter(linenos=True, cssclass="source") result = highlight(code, lexer, formatter) This makes the lexer strip all leading and trailing whitespace from the input (`stripall` option), lets the formatter output line numbers (`linenos` option), and sets the wrapping ``
``'s class to ``source`` (instead of ``highlight``). Important options include: `encoding` : for lexers and formatters Since Pygments uses Unicode strings internally, this determines which encoding will be used to convert to or from byte strings. `style` : for formatters The name of the style to use when writing the output. For an overview of builtin lexers and formatters and their options, visit the :doc:`lexer ` and :doc:`formatters ` lists. For a documentation on filters, see :doc:`this page `. Lexer and formatter lookup ========================== If you want to lookup a built-in lexer by its alias or a filename, you can use one of the following methods: .. sourcecode:: pycon >>> from pygments.lexers import (get_lexer_by_name, ... get_lexer_for_filename, get_lexer_for_mimetype) >>> get_lexer_by_name('python') >>> get_lexer_for_filename('spam.rb') >>> get_lexer_for_mimetype('text/x-perl') All these functions accept keyword arguments; they will be passed to the lexer as options. A similar API is available for formatters: use :func:`.get_formatter_by_name()` and :func:`.get_formatter_for_filename()` from the :mod:`pygments.formatters` module for this purpose. Guessing lexers =============== If you don't know the content of the file, or you want to highlight a file whose extension is ambiguous, such as ``.html`` (which could contain plain HTML or some template tags), use these functions: .. sourcecode:: pycon >>> from pygments.lexers import guess_lexer, guess_lexer_for_filename >>> guess_lexer('#!/usr/bin/python\nprint "Hello World!"') >>> guess_lexer_for_filename('test.py', 'print "Hello World!"') :func:`.guess_lexer()` passes the given content to the lexer classes' :meth:`analyse_text()` method and returns the one for which it returns the highest number. All lexers have two different filename pattern lists: the primary and the secondary one. The :func:`.get_lexer_for_filename()` function only uses the primary list, whose entries are supposed to be unique among all lexers. :func:`.guess_lexer_for_filename()`, however, will first loop through all lexers and look at the primary and secondary filename patterns if the filename matches. If only one lexer matches, it is returned, else the guessing mechanism of :func:`.guess_lexer()` is used with the matching lexers. As usual, keyword arguments to these functions are given to the created lexer as options. Command line usage ================== You can use Pygments from the command line, using the :program:`pygmentize` script:: $ pygmentize test.py will highlight the Python file test.py using ANSI escape sequences (a.k.a. terminal colors) and print the result to standard output. To output HTML, use the ``-f`` option:: $ pygmentize -f html -o test.html test.py to write an HTML-highlighted version of test.py to the file test.html. Note that it will only be a snippet of HTML, if you want a full HTML document, use the "full" option:: $ pygmentize -f html -O full -o test.html test.py This will produce a full HTML document with included stylesheet. A style can be selected with ``-O style=``. If you need a stylesheet for an existing HTML file using Pygments CSS classes, it can be created with:: $ pygmentize -S default -f html > style.css where ``default`` is the style name. More options and tricks and be found in the :doc:`command line reference `. pygments.rb-1.2.0/vendor/pygments-main/doc/docs/rstdirective.rst000066400000000000000000000015511315616372200250150ustar00rootroot00000000000000.. -*- mode: rst -*- ================================ Using Pygments in ReST documents ================================ Many Python people use `ReST`_ for documentation their sourcecode, programs, scripts et cetera. This also means that documentation often includes sourcecode samples or snippets. You can easily enable Pygments support for your ReST texts using a custom directive -- this is also how this documentation displays source code. From Pygments 0.9, the directive is shipped in the distribution as `external/rst-directive.py`. You can copy and adapt this code to your liking. .. removed -- too confusing *Loosely related note:* The ReST lexer now recognizes ``.. sourcecode::`` and ``.. code::`` directives and highlights the contents in the specified language if the `handlecodeblocks` option is true. .. _ReST: http://docutils.sf.net/rst.html pygments.rb-1.2.0/vendor/pygments-main/doc/docs/styles.rst000066400000000000000000000142771315616372200236420ustar00rootroot00000000000000.. -*- mode: rst -*- ====== Styles ====== Pygments comes with some builtin styles that work for both the HTML and LaTeX formatter. The builtin styles can be looked up with the `get_style_by_name` function: .. sourcecode:: pycon >>> from pygments.styles import get_style_by_name >>> get_style_by_name('colorful') You can pass a instance of a `Style` class to a formatter as the `style` option in form of a string: .. sourcecode:: pycon >>> from pygments.styles import get_style_by_name >>> from pygments.formatters import HtmlFormatter >>> HtmlFormatter(style='colorful').style Or you can also import your own style (which must be a subclass of `pygments.style.Style`) and pass it to the formatter: .. sourcecode:: pycon >>> from yourapp.yourmodule import YourStyle >>> from pygments.formatters import HtmlFormatter >>> HtmlFormatter(style=YourStyle).style Creating Own Styles =================== So, how to create a style? All you have to do is to subclass `Style` and define some styles: .. sourcecode:: python from pygments.style import Style from pygments.token import Keyword, Name, Comment, String, Error, \ Number, Operator, Generic class YourStyle(Style): default_style = "" styles = { Comment: 'italic #888', Keyword: 'bold #005', Name: '#f00', Name.Function: '#0f0', Name.Class: 'bold #0f0', String: 'bg:#eee #111' } That's it. There are just a few rules. When you define a style for `Name` the style automatically also affects `Name.Function` and so on. If you defined ``'bold'`` and you don't want boldface for a subtoken use ``'nobold'``. (Philosophy: the styles aren't written in CSS syntax since this way they can be used for a variety of formatters.) `default_style` is the style inherited by all token types. To make the style usable for Pygments, you must * either register it as a plugin (see :doc:`the plugin docs `) * or drop it into the `styles` subpackage of your Pygments distribution one style class per style, where the file name is the style name and the class name is `StylenameClass`. For example, if your style should be called ``"mondrian"``, name the class `MondrianStyle`, put it into the file ``mondrian.py`` and this file into the ``pygments.styles`` subpackage directory. Style Rules =========== Here a small overview of all allowed styles: ``bold`` render text as bold ``nobold`` don't render text as bold (to prevent subtokens being highlighted bold) ``italic`` render text italic ``noitalic`` don't render text as italic ``underline`` render text underlined ``nounderline`` don't render text underlined ``bg:`` transparent background ``bg:#000000`` background color (black) ``border:`` no border ``border:#ffffff`` border color (white) ``#ff0000`` text color (red) ``noinherit`` don't inherit styles from supertoken Note that there may not be a space between ``bg:`` and the color value since the style definition string is split at whitespace. Also, using named colors is not allowed since the supported color names vary for different formatters. Furthermore, not all lexers might support every style. Builtin Styles ============== Pygments ships some builtin styles which are maintained by the Pygments team. To get a list of known styles you can use this snippet: .. sourcecode:: pycon >>> from pygments.styles import STYLE_MAP >>> STYLE_MAP.keys() ['default', 'emacs', 'friendly', 'colorful'] Getting a list of available styles ================================== .. versionadded:: 0.6 Because it could be that a plugin registered a style, there is a way to iterate over all styles: .. sourcecode:: pycon >>> from pygments.styles import get_all_styles >>> styles = list(get_all_styles()) .. _AnsiTerminalStyle: Terminal Styles =============== .. versionadded:: 2.2 Custom styles used with the 256-color terminal formatter can also map colors to use the 8 default ANSI colors. To do so, use ``#ansigreen``, ``#ansired`` or any other colors defined in :attr:`pygments.style.ansicolors`. Foreground ANSI colors will be mapped to the corresponding `escape codes 30 to 37 `_ thus respecting any custom color mapping and themes provided by many terminal emulators. Light variants are treated as foreground color with and an added bold flag. ``bg:#ansi`` will also be respected, except the light variant will be the same shade as their dark variant. See the following example where the color of the string ``"hello world"`` is governed by the escape sequence ``\x1b[34;01m`` (Ansi Blue, Bold, 41 being red background) instead of an extended foreground & background color. .. sourcecode:: pycon >>> from pygments import highlight >>> from pygments.style import Style >>> from pygments.token import Token >>> from pygments.lexers import Python3Lexer >>> from pygments.formatters import Terminal256Formatter >>> class MyStyle(Style): styles = { Token.String: '#ansiblue bg:#ansired', } >>> code = 'print("Hello World")' >>> result = highlight(code, Python3Lexer(), Terminal256Formatter(style=MyStyle)) >>> print(result.encode()) b'\x1b[34;41;01m"\x1b[39;49;00m\x1b[34;41;01mHello World\x1b[39;49;00m\x1b[34;41;01m"\x1b[39;49;00m' Colors specified using ``#ansi*`` are converted to a default set of RGB colors when used with formatters other than the terminal-256 formatter. By definition of ANSI, the following colors are considered "light" colors, and will be rendered by most terminals as bold: - "darkgray", "red", "green", "yellow", "blue", "fuchsia", "turquoise", "white" The following are considered "dark" colors and will be rendered as non-bold: - "black", "darkred", "darkgreen", "brown", "darkblue", "purple", "teal", "lightgray" Exact behavior might depends on the terminal emulator you are using, and its settings. pygments.rb-1.2.0/vendor/pygments-main/doc/docs/tokens.rst000066400000000000000000000246531315616372200236210ustar00rootroot00000000000000.. -*- mode: rst -*- ============== Builtin Tokens ============== .. module:: pygments.token In the :mod:`pygments.token` module, there is a special object called `Token` that is used to create token types. You can create a new token type by accessing an attribute of `Token`: .. sourcecode:: pycon >>> from pygments.token import Token >>> Token.String Token.String >>> Token.String is Token.String True Note that tokens are singletons so you can use the ``is`` operator for comparing token types. As of Pygments 0.7 you can also use the ``in`` operator to perform set tests: .. sourcecode:: pycon >>> from pygments.token import Comment >>> Comment.Single in Comment True >>> Comment in Comment.Multi False This can be useful in :doc:`filters ` and if you write lexers on your own without using the base lexers. You can also split a token type into a hierarchy, and get the parent of it: .. sourcecode:: pycon >>> String.split() [Token, Token.Literal, Token.Literal.String] >>> String.parent Token.Literal In principle, you can create an unlimited number of token types but nobody can guarantee that a style would define style rules for a token type. Because of that, Pygments proposes some global token types defined in the `pygments.token.STANDARD_TYPES` dict. For some tokens aliases are already defined: .. sourcecode:: pycon >>> from pygments.token import String >>> String Token.Literal.String Inside the :mod:`pygments.token` module the following aliases are defined: ============= ============================ ==================================== `Text` `Token.Text` for any type of text data `Whitespace` `Token.Text.Whitespace` for specially highlighted whitespace `Error` `Token.Error` represents lexer errors `Other` `Token.Other` special token for data not matched by a parser (e.g. HTML markup in PHP code) `Keyword` `Token.Keyword` any kind of keywords `Name` `Token.Name` variable/function names `Literal` `Token.Literal` Any literals `String` `Token.Literal.String` string literals `Number` `Token.Literal.Number` number literals `Operator` `Token.Operator` operators (``+``, ``not``...) `Punctuation` `Token.Punctuation` punctuation (``[``, ``(``...) `Comment` `Token.Comment` any kind of comments `Generic` `Token.Generic` generic tokens (have a look at the explanation below) ============= ============================ ==================================== The `Whitespace` token type is new in Pygments 0.8. It is used only by the `VisibleWhitespaceFilter` currently. Normally you just create token types using the already defined aliases. For each of those token aliases, a number of subtypes exists (excluding the special tokens `Token.Text`, `Token.Error` and `Token.Other`) The `is_token_subtype()` function in the `pygments.token` module can be used to test if a token type is a subtype of another (such as `Name.Tag` and `Name`). (This is the same as ``Name.Tag in Name``. The overloaded `in` operator was newly introduced in Pygments 0.7, the function still exists for backwards compatibility.) With Pygments 0.7, it's also possible to convert strings to token types (for example if you want to supply a token from the command line): .. sourcecode:: pycon >>> from pygments.token import String, string_to_tokentype >>> string_to_tokentype("String") Token.Literal.String >>> string_to_tokentype("Token.Literal.String") Token.Literal.String >>> string_to_tokentype(String) Token.Literal.String Keyword Tokens ============== `Keyword` For any kind of keyword (especially if it doesn't match any of the subtypes of course). `Keyword.Constant` For keywords that are constants (e.g. ``None`` in future Python versions). `Keyword.Declaration` For keywords used for variable declaration (e.g. ``var`` in some programming languages like JavaScript). `Keyword.Namespace` For keywords used for namespace declarations (e.g. ``import`` in Python and Java and ``package`` in Java). `Keyword.Pseudo` For keywords that aren't really keywords (e.g. ``None`` in old Python versions). `Keyword.Reserved` For reserved keywords. `Keyword.Type` For builtin types that can't be used as identifiers (e.g. ``int``, ``char`` etc. in C). Name Tokens =========== `Name` For any name (variable names, function names, classes). `Name.Attribute` For all attributes (e.g. in HTML tags). `Name.Builtin` Builtin names; names that are available in the global namespace. `Name.Builtin.Pseudo` Builtin names that are implicit (e.g. ``self`` in Ruby, ``this`` in Java). `Name.Class` Class names. Because no lexer can know if a name is a class or a function or something else this token is meant for class declarations. `Name.Constant` Token type for constants. In some languages you can recognise a token by the way it's defined (the value after a ``const`` keyword for example). In other languages constants are uppercase by definition (Ruby). `Name.Decorator` Token type for decorators. Decorators are syntactic elements in the Python language. Similar syntax elements exist in C# and Java. `Name.Entity` Token type for special entities. (e.g. `` `` in HTML). `Name.Exception` Token type for exception names (e.g. ``RuntimeError`` in Python). Some languages define exceptions in the function signature (Java). You can highlight the name of that exception using this token then. `Name.Function` Token type for function names. `Name.Function.Magic` same as `Name.Function` but for special function names that have an implicit use in a language (e.g. ``__init__`` method in Python). `Name.Label` Token type for label names (e.g. in languages that support ``goto``). `Name.Namespace` Token type for namespaces. (e.g. import paths in Java/Python), names following the ``module``/``namespace`` keyword in other languages. `Name.Other` Other names. Normally unused. `Name.Tag` Tag names (in HTML/XML markup or configuration files). `Name.Variable` Token type for variables. Some languages have prefixes for variable names (PHP, Ruby, Perl). You can highlight them using this token. `Name.Variable.Class` same as `Name.Variable` but for class variables (also static variables). `Name.Variable.Global` same as `Name.Variable` but for global variables (used in Ruby, for example). `Name.Variable.Instance` same as `Name.Variable` but for instance variables. `Name.Variable.Magic` same as `Name.Variable` but for special variable names that have an implicit use in a language (e.g. ``__doc__`` in Python). Literals ======== `Literal` For any literal (if not further defined). `Literal.Date` for date literals (e.g. ``42d`` in Boo). `String` For any string literal. `String.Affix` Token type for affixes that further specify the type of the string they're attached to (e.g. the prefixes ``r`` and ``u8`` in ``r"foo"`` and ``u8"foo"``). `String.Backtick` Token type for strings enclosed in backticks. `String.Char` Token type for single characters (e.g. Java, C). `String.Delimiter` Token type for delimiting identifiers in "heredoc", raw and other similar strings (e.g. the word ``END`` in Perl code ``print <<'END';``). `String.Doc` Token type for documentation strings (for example Python). `String.Double` Double quoted strings. `String.Escape` Token type for escape sequences in strings. `String.Heredoc` Token type for "heredoc" strings (e.g. in Ruby or Perl). `String.Interpol` Token type for interpolated parts in strings (e.g. ``#{foo}`` in Ruby). `String.Other` Token type for any other strings (for example ``%q{foo}`` string constructs in Ruby). `String.Regex` Token type for regular expression literals (e.g. ``/foo/`` in JavaScript). `String.Single` Token type for single quoted strings. `String.Symbol` Token type for symbols (e.g. ``:foo`` in LISP or Ruby). `Number` Token type for any number literal. `Number.Bin` Token type for binary literals (e.g. ``0b101010``). `Number.Float` Token type for float literals (e.g. ``42.0``). `Number.Hex` Token type for hexadecimal number literals (e.g. ``0xdeadbeef``). `Number.Integer` Token type for integer literals (e.g. ``42``). `Number.Integer.Long` Token type for long integer literals (e.g. ``42L`` in Python). `Number.Oct` Token type for octal literals. Operators ========= `Operator` For any punctuation operator (e.g. ``+``, ``-``). `Operator.Word` For any operator that is a word (e.g. ``not``). Punctuation =========== .. versionadded:: 0.7 `Punctuation` For any punctuation which is not an operator (e.g. ``[``, ``(``...) Comments ======== `Comment` Token type for any comment. `Comment.Hashbang` Token type for hashbang comments (i.e. first lines of files that start with ``#!``). `Comment.Multiline` Token type for multiline comments. `Comment.Preproc` Token type for preprocessor comments (also ```. .. versionadded:: 0.7 The formatters now also accept an `outencoding` option which will override the `encoding` option if given. This makes it possible to use a single options dict with lexers and formatters, and still have different input and output encodings. .. _chardet: https://chardet.github.io/ pygments.rb-1.2.0/vendor/pygments-main/doc/download.rst000066400000000000000000000026341315616372200231700ustar00rootroot00000000000000Download and installation ========================= The current release is version |version|. Packaged versions ----------------- You can download it `from the Python Package Index `_. For installation of packages from PyPI, we recommend `Pip `_, which works on all major platforms. Under Linux, most distributions include a package for Pygments, usually called ``pygments`` or ``python-pygments``. You can install it with the package manager as usual. Development sources ------------------- We're using the `Mercurial `_ version control system. You can get the development source using this command:: hg clone http://bitbucket.org/birkenfeld/pygments-main pygments Development takes place at `Bitbucket `_, you can browse the source online `here `_. The latest changes in the development source code are listed in the `changelog `_. .. Documentation ------------- .. XXX todo You can download the documentation either as a bunch of rst files from the Mercurial repository, see above, or as a tar.gz containing rendered HTML files:

pygmentsdocs.tar.gz

pygments.rb-1.2.0/vendor/pygments-main/doc/faq.rst000066400000000000000000000137131315616372200221300ustar00rootroot00000000000000:orphan: Pygments FAQ ============= What is Pygments? ----------------- Pygments is a syntax highlighting engine written in Python. That means, it will take source code (or other markup) in a supported language and output a processed version (in different formats) containing syntax highlighting markup. Its features include: * a wide range of common :doc:`languages and markup formats ` is supported * new languages and formats are added easily * a number of output formats is available, including: - HTML - ANSI sequences (console output) - LaTeX - RTF * it is usable as a command-line tool and as a library * parsing and formatting is fast Pygments is licensed under the BSD license. Where does the name Pygments come from? --------------------------------------- *Py* of course stands for Python, while *pigments* are used for coloring paint, and in this case, source code! What are the system requirements? --------------------------------- Pygments only needs a standard Python install, version 2.6 or higher or version 3.3 or higher for Python 3. No additional libraries are needed. How can I use Pygments? ----------------------- Pygments is usable as a command-line tool as well as a library. From the command-line, usage looks like this (assuming the pygmentize script is properly installed):: pygmentize -f html /path/to/file.py This will print a HTML-highlighted version of /path/to/file.py to standard output. For a complete help, please run ``pygmentize -h``. Usage as a library is thoroughly demonstrated in the Documentation section. How do I make a new style? -------------------------- Please see the :doc:`documentation on styles `. How can I report a bug or suggest a feature? -------------------------------------------- Please report bugs and feature wishes in the tracker at Bitbucket. You can also e-mail the author or use IRC, see the contact details. I want this support for this language! -------------------------------------- Instead of waiting for others to include language support, why not write it yourself? All you have to know is :doc:`outlined in the docs `. Can I use Pygments for programming language processing? ------------------------------------------------------- The Pygments lexing machinery is quite powerful can be used to build lexers for basically all languages. However, parsing them is not possible, though some lexers go some steps in this direction in order to e.g. highlight function names differently. Also, error reporting is not the scope of Pygments. It focuses on correctly highlighting syntactically valid documents, not finding and compensating errors. Who uses Pygments? ------------------ This is an (incomplete) list of projects and sites known to use the Pygments highlighter. * `Wikipedia `_ * `BitBucket `_, a Mercurial and Git hosting site * `The Sphinx documentation builder `_, for embedded source examples * `rst2pdf `_, a reStructuredText to PDF converter * `Codecov `_, a code coverage CI service * `Trac `_, the universal project management tool * `AsciiDoc `_, a text-based documentation generator * `ActiveState Code `_, the Python Cookbook successor * `ViewVC `_, a web-based version control repository browser * `BzrFruit `_, a Bazaar branch viewer * `QBzr `_, a cross-platform Qt-based GUI front end for Bazaar * `Review Board `_, a collaborative code reviewing tool * `Diamanda `_, a Django powered wiki system with support for Pygments * `Progopedia `_ (`English `_), an encyclopedia of programming languages * `Bruce `_, a reStructuredText presentation tool * `PIDA `_, a universal IDE written in Python * `BPython `_, a curses-based intelligent Python shell * `PuDB `_, a console Python debugger * `XWiki `_, a wiki-based development framework in Java, using Jython * `roux `_, a script for running R scripts and creating beautiful output including graphs * `hurl `_, a web service for making HTTP requests * `wxHTMLPygmentizer `_ is a GUI utility, used to make code-colorization easier * `Postmarkup `_, a BBCode to XHTML generator * `WpPygments `_, and `WPygments `_, highlighter plugins for WordPress * `Siafoo `_, a tool for sharing and storing useful code and programming experience * `D source `_, a community for the D programming language * `dpaste.com `_, another Django pastebin * `Django snippets `_, a pastebin for Django code * `Fayaa `_, a Chinese pastebin * `Incollo.com `_, a free collaborative debugging tool * `PasteBox `_, a pastebin focused on privacy * `hilite.me `_, a site to highlight code snippets * `patx.me `_, a pastebin * `Fluidic `_, an experiment in integrating shells with a GUI * `pygments.rb `_, a pygments wrapper for Ruby * `Clygments `_, a pygments wrapper for Clojure * `PHPygments `_, a pygments wrapper for PHP If you have a project or web site using Pygments, drop me a line, and I'll add a link here. pygments.rb-1.2.0/vendor/pygments-main/doc/index.rst000066400000000000000000000036401315616372200224660ustar00rootroot00000000000000Welcome! ======== This is the home of Pygments. It is a generic syntax highlighter suitable for use in code hosting, forums, wikis or other applications that need to prettify source code. Highlights are: * a wide range of over 300 languages and other text formats is supported * special attention is paid to details that increase highlighting quality * support for new languages and formats are added easily; most languages use a simple regex-based lexing mechanism * a number of output formats is available, among them HTML, RTF, LaTeX and ANSI sequences * it is usable as a command-line tool and as a library * ... and it highlights even Perl 6! Read more in the :doc:`FAQ list ` or the :doc:`documentation `, or `download the latest release `_. .. _contribute: Contribute ---------- Like every open-source project, we are always looking for volunteers to help us with programming. Python knowledge is required, but don't fear: Python is a very clear and easy to learn language. Development takes place on `Bitbucket `_, where the Mercurial repository, tickets and pull requests can be viewed. Our primary communication instrument is the IRC channel **#pocoo** on the Freenode network. To join it, let your IRC client connect to ``irc.freenode.net`` and do ``/join #pocoo``. If you found a bug, just open a ticket in the Bitbucket tracker. Be sure to log in to be notified when the issue is fixed -- development is not fast-paced as the library is quite stable. You can also send an e-mail to the developers, see below. The authors ----------- Pygments is maintained by **Georg Brandl**, e-mail address *georg*\ *@*\ *python.org*. Many lexers and fixes have been contributed by **Armin Ronacher**, the rest of the `Pocoo `_ team and **Tim Hatch**. .. toctree:: :maxdepth: 1 :hidden: docs/index pygments.rb-1.2.0/vendor/pygments-main/doc/languages.rst000066400000000000000000000053411315616372200233250ustar00rootroot00000000000000:orphan: Supported languages =================== Pygments supports an ever-growing range of languages. Watch this space... Programming languages --------------------- * ActionScript * Ada * ANTLR * AppleScript * Assembly (various) * Asymptote * Awk * Befunge * Boo * BrainFuck * C, C++ * C# * Clojure * CoffeeScript * ColdFusion * Common Lisp * Coq * Cryptol (incl. Literate Cryptol) * `Crystal `_ * `Cython `_ * `D `_ * Dart * Delphi * Dylan * `Elm `_ * Erlang * `Ezhil `_ Ezhil - A Tamil programming language * Factor * Fancy * Fortran * F# * GAP * Gherkin (Cucumber) * GL shaders * Groovy * `Haskell `_ (incl. Literate Haskell) * IDL * Io * Java * JavaScript * Lasso * LLVM * Logtalk * `Lua `_ * Matlab * MiniD * Modelica * Modula-2 * MuPad * Nemerle * Nimrod * Objective-C * Objective-J * Octave * OCaml * PHP * `Perl `_ * PovRay * PostScript * PowerShell * Prolog * `Python `_ 2.x and 3.x (incl. console sessions and tracebacks) * `REBOL `_ * `Red `_ * Redcode * `Ruby `_ (incl. irb sessions) * Rust * S, S-Plus, R * Scala * Scheme * Scilab * Smalltalk * SNOBOL * Tcl * Vala * Verilog * VHDL * Visual Basic.NET * Visual FoxPro * XQuery * Zephir Template languages ------------------ * Cheetah templates * `Django `_ / `Jinja `_ templates * ERB (Ruby templating) * `Genshi `_ (the Trac template language) * JSP (Java Server Pages) * `Myghty `_ (the HTML::Mason based framework) * `Mako `_ (the Myghty successor) * `Smarty `_ templates (PHP templating) * Tea Other markup ------------ * Apache config files * Bash shell scripts * BBCode * CMake * CSS * Debian control files * Diff files * DTD * Gettext catalogs * Gnuplot script * Groff markup * HTML * HTTP sessions * INI-style config files * IRC logs (irssi style) * Lighttpd config files * Makefiles * MoinMoin/Trac Wiki markup * MySQL * Nginx config files * POV-Ray scenes * Ragel * Redcode * ReST * Robot Framework * RPM spec files * SQL, also MySQL, SQLite * Squid configuration * TeX * tcsh * Vim Script * Windows batch files * XML * XSLT * YAML ... that's all? --------------- Well, why not write your own? Contributing to Pygments is easy and fun. Take a look at the :doc:`docs on lexer development ` and :ref:`contact details `. Note: the languages listed here are supported in the development version. The latest release may lack a few of them. pygments.rb-1.2.0/vendor/pygments-main/doc/make.bat000066400000000000000000000117541315616372200222370ustar00rootroot00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Pygments.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Pygments.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end pygments.rb-1.2.0/vendor/pygments-main/doc/pygmentize.1000066400000000000000000000066501315616372200231060ustar00rootroot00000000000000.TH PYGMENTIZE 1 "February 15, 2007" .SH NAME pygmentize \- highlights the input file .SH SYNOPSIS .B \fBpygmentize\fP .RI [-l\ \fI\fP]\ [-F\ \fI\fP[:\fI\fP]]\ [-f\ \fI\fP] .RI [-O\ \fI\fP]\ [-P\ \fI\fP]\ [-o\ \fI\fP]\ [\fI\fP] .br .B \fBpygmentize\fP .RI -S\ \fI

%(title)s

''' DOC_HEADER_EXTERNALCSS = '''\ %(title)s

%(title)s

''' DOC_FOOTER = '''\ ''' class HtmlFormatter(Formatter): r""" Format tokens as HTML 4 ```` tags within a ``
`` tag, wrapped
    in a ``
`` tag. The ``
``'s CSS class can be set by the `cssclass` option. If the `linenos` option is set to ``"table"``, the ``
`` is
    additionally wrapped inside a ```` which has one row and two
    cells: one containing the line numbers and one containing the code.
    Example:

    .. sourcecode:: html

        
1
            2
def foo(bar):
              pass
            
(whitespace added to improve clarity). Wrapping can be disabled using the `nowrap` option. A list of lines can be specified using the `hl_lines` option to make these lines highlighted (as of Pygments 0.11). With the `full` option, a complete HTML 4 document is output, including the style definitions inside a ``