pax_global_header00006660000000000000000000000064126161001770014513gustar00rootroot0000000000000052 comment=89f868c11599c6017ad5de51275a45f064649622 thefuck-3.2/000077500000000000000000000000001261610017700130105ustar00rootroot00000000000000thefuck-3.2/.gitignore000066400000000000000000000013501261610017700147770ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ .env .idea # vim temporary files .*.swp thefuck-3.2/.travis.yml000066400000000000000000000010531261610017700151200ustar00rootroot00000000000000language: python sudo: false python: - "3.5" - "3.4" - "3.3" - "2.7" addons: apt: sources: - fish-shell/release-2 packages: - bash - zsh - fish - tcsh - pandoc - git install: - pip install coveralls - pip install -r requirements.txt - python setup.py develop - rm -rf build script: - export COVERAGE_PYTHON_VERSION=python-${TRAVIS_PYTHON_VERSION:0:1} - coverage run --source=thefuck,tests -m py.test -v --capture=sys --run-without-docker --enable-functional after_success: coveralls thefuck-3.2/CONTRIBUTING.md000066400000000000000000000022611261610017700152420ustar00rootroot00000000000000# Report issues If you have any issue with The Fuck, sorry about that, but we will do what we can to fix that. Actually, maybe we already have, so first thing to do is to update The Fuck and see if the bug is still there. If it is (sorry again), check if the problem has not already been reported and if not, just open an issue on [GitHub](https://github.com/nvbn/thefuck) with the following basic information: - the output of `thefuck --version` (something like `The Fuck 3.1 using Python 3.5.0`); - your shell and its version (`bash`, `zsh`, *Windows PowerShell*, etc.); - your system (Debian 7, ArchLinux, Windows, etc.); - how to reproduce the bug; - the output of The Fuck with `THEFUCK_DEBUG=true` exported (typically execute `export THEFUCK_DEBUG=true` in your shell before The Fuck); - if the bug only appears with a specific application, the output of that application and its version; - anything else you think is relevant. It's only with enough information that we can do something to fix the problem. # Make a pull request We gladly accept pull request on the [official repository](https://github.com/nvbn/thefuck) for new rules, new features, bug fixes, etc. thefuck-3.2/LICENSE.md000066400000000000000000000021221261610017700144110ustar00rootroot00000000000000The MIT License (MIT) ===================== Copyright (c) 2015 Vladimir Iakovlev 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. thefuck-3.2/MANIFEST.in000066400000000000000000000000231261610017700145410ustar00rootroot00000000000000include LICENSE.md thefuck-3.2/README.md000066400000000000000000000315151261610017700142740ustar00rootroot00000000000000# The Fuck [![Build Status](https://travis-ci.org/nvbn/thefuck.svg?branch=master)](https://travis-ci.org/nvbn/thefuck) Magnificent app which corrects your previous console command, inspired by a [@liamosaur](https://twitter.com/liamosaur/) [tweet](https://twitter.com/liamosaur/status/506975850596536320). [![gif with examples](https://raw.githubusercontent.com/nvbn/thefuck/master/example.gif)](https://raw.githubusercontent.com/nvbn/thefuck/master/example.gif) Few more examples: ```bash ➜ apt-get install vim E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied) E: Unable to lock the administration directory (/var/lib/dpkg/), are you root? ➜ fuck sudo apt-get install vim [enter/↑/↓/ctrl+c] [sudo] password for nvbn: Reading package lists... Done ... ``` ```bash ➜ git push fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master ➜ fuck git push --set-upstream origin master [enter/↑/↓/ctrl+c] Counting objects: 9, done. ... ``` ```bash ➜ puthon No command 'puthon' found, did you mean: Command 'python' from package 'python-minimal' (main) Command 'python' from package 'python3' (main) zsh: command not found: puthon ➜ fuck python [enter/↑/↓/ctrl+c] Python 3.4.2 (default, Oct 8 2014, 13:08:17) ... ``` ```bash ➜ git brnch git: 'brnch' is not a git command. See 'git --help'. Did you mean this? branch ➜ fuck git branch [enter/↑/↓/ctrl+c] * master ``` ```bash ➜ lein rpl 'rpl' is not a task. See 'lein help'. Did you mean this? repl ➜ fuck lein repl [enter/↑/↓/ctrl+c] nREPL server started on port 54848 on host 127.0.0.1 - nrepl://127.0.0.1:54848 REPL-y 0.3.1 ... ``` If you are not scared to blindly run the changed command, there is a `require_confirmation` [settings](#settings) option: ```bash ➜ apt-get install vim E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied) E: Unable to lock the administration directory (/var/lib/dpkg/), are you root? ➜ fuck sudo apt-get install vim [sudo] password for nvbn: Reading package lists... Done ... ``` ## Requirements - python (2.7+ or 3.3+) - pip - python-dev ## Installation [*experimental*] On Ubuntu and OS X you can install `The Fuck` with installation script: ```bash wget -O - https://raw.githubusercontent.com/nvbn/thefuck/master/install.sh | sh - && $0 ``` ## Manual installation Install `The Fuck` with `pip`: ```bash sudo pip install thefuck ``` [Or using an OS package manager (OS X, Ubuntu, Arch).](https://github.com/nvbn/thefuck/wiki/Installation) You should place this command in your `.bash_profile`, `.bashrc`, `.zshrc` or other startup script: ```bash eval "$(thefuck --alias)" # You can use whatever you want as an alias, like for Mondays: eval "$(thefuck --alias FUCK)" ``` [Or in your shell config (Bash, Zsh, Fish, Powershell, tcsh).](https://github.com/nvbn/thefuck/wiki/Shell-aliases) Changes will be available only in a new shell session. To make them available immediately, run `source ~/.bashrc` (or your shell config file like `.zshrc`). ## Update ```bash sudo pip install thefuck --upgrade ``` **Aliases changed in 1.34.** ## How it works The Fuck tries to match a rule for the previous command, creates a new command using the matched rule and runs it. Rules enabled by default are as follows: * `cargo` – runs `cargo build` instead of `cargo`; * `cargo_no_command` – fixes wrongs commands like `cargo buid`; * `cd_correction` – spellchecks and correct failed cd commands; * `cd_mkdir` – creates directories before cd'ing into them; * `cd_parent` – changes `cd..` to `cd ..`; * `composer_not_command` – fixes composer command name; * `cp_omitting_directory` – adds `-a` when you `cp` directory; * `cpp11` – adds missing `-std=c++11` to `g++` or `clang++`; * `dirty_untar` – fixes `tar x` command that untarred in the current directory; * `dirty_unzip` – fixes `unzip` command that unzipped in the current directory; * `django_south_ghost` – adds `--delete-ghost-migrations` to failed because ghosts django south migration; * `django_south_merge` – adds `--merge` to inconsistent django south migration; * `docker_not_command` – fixes wrong docker commands like `docker tags`; * `dry` – fixes repetitions like `git git push`; * `fix_alt_space` – replaces Alt+Space with Space character; * `fix_file` – opens a file with an error in your `$EDITOR`; * `git_add` – fixes *"Did you forget to 'git add'?"*; * `git_branch_delete` – changes `git branch -d` to `git branch -D`; * `git_branch_list` – catches `git branch list` in place of `git branch` and removes created branch; * `git_checkout` – fixes branch name or creates new branch; * `git_diff_staged` – adds `--staged` to previous `git diff` with unexpected output; * `git_fix_stash` – fixes `git stash` commands (misspelled subcommand and missing `save`); * `git_not_command` – fixes wrong git commands like `git brnch`; * `git_pull` – sets upstream before executing previous `git pull`; * `git_pull_clone` – clones instead of pulling when the repo does not exist; * `git_push` – adds `--set-upstream origin $branch` to previous failed `git push`; * `git_push_pull` – runs `git pull` when `push` was rejected; * `git_stash` – stashes you local modifications before rebasing or switching branch; * `git_two_dashes` – adds a missing dash to commands like `git commit -amend` or `git rebase -continue`; * `go_run` – appends `.go` extension when compiling/running Go programs * `grep_recursive` – adds `-r` when you trying to `grep` directory; * `gulp_not_task` – fixes misspelled `gulp` tasks; * `has_exists_script` – prepends `./` when script/binary exists; * `heroku_not_command` – fixes wrong `heroku` commands like `heroku log`; * `history` – tries to replace command with most similar command from history; * `java` – removes `.java` extension when running Java programs; * `javac` – appends missing `.java` when compiling Java files; * `lein_not_task` – fixes wrong `lein` tasks like `lein rpl`; * `ls_lah` – adds `-lah` to `ls`; * `man` – changes manual section; * `man_no_space` – fixes man commands without spaces, for example `mandiff`; * `mercurial` – fixes wrong `hg` commands; * `mkdir_p` – adds `-p` when you trying to create directory without parent; * `mvn_no_command` – adds `clean package` to `mvn`; * `mvn_unknown_lifecycle_phase` – fixes misspelled lifecycle phases with `mvn`; * `no_command` – fixes wrong console commands, for example `vom/vim`; * `no_such_file` – creates missing directories with `mv` and `cp` commands; * `open` – prepends `http` to address passed to `open`; * `pip_unknown_command` – fixes wrong `pip` commands, for example `pip instatl/pip install`; * `python_command` – prepends `python` when you trying to run not executable/without `./` python script; * `python_execute` – appends missing `.py` when executing Python files; * `quotation_marks` – fixes uneven usage of `'` and `"` when containing args'; * `rm_dir` – adds `-rf` when you trying to remove directory; * `sed_unterminated_s` – adds missing '/' to `sed`'s `s` commands; * `sl_ls` – changes `sl` to `ls`; * `ssh_known_hosts` – removes host from `known_hosts` on warning; * `sudo` – prepends `sudo` to previous command if it failed because of permissions; * `switch_lang` – switches command from your local layout to en; * `systemctl` – correctly orders parameters of confusing `systemctl`; * `test.py` – runs `py.test` instead of `test.py`; * `touch` – creates missing directories before "touching"; * `tsuru_login` – runs `tsuru login` if not authenticated or session expired; * `tsuru_not_command` – fixes wrong `tsuru` commands like `tsuru shell`; * `tmux` – fixes `tmux` commands; * `unknown_command` – fixes hadoop hdfs-style "unknown command", for example adds missing '-' to the command on `hdfs dfs ls`; * `vagrant_up` – starts up the vagrant instance; * `whois` – fixes `whois` command. Enabled by default only on specific platforms: * `apt_get` – installs app from apt if it not installed (requires `python-commandnotfound` / `python3-commandnotfound`); * `apt_get_search` – changes trying to search using `apt-get` with searching using `apt-cache`; * `brew_install` – fixes formula name for `brew install`; * `brew_unknown_command` – fixes wrong brew commands, for example `brew docto/brew doctor`; * `brew_upgrade` – appends `--all` to `brew upgrade` as per Homebrew's new behaviour; * `pacman` – installs app with `pacman` if it is not installed (uses `yaourt` if available); * `pacman_not_found` – fixes package name with `pacman` or `yaourt`. Bundled, but not enabled by default: * `git_push_force` – adds `--force-with-lease` to a `git push` (may conflict with `git_push_pull`); * `rm_root` – adds `--no-preserve-root` to `rm -rf /` command. ## Creating your own rules For adding your own rule you should create `your-rule-name.py` in `~/.config/thefuck/rules`. The rule should contain two functions: ```python match(command: Command) -> bool get_new_command(command: Command) -> str | list[str] ``` Also the rule can contain an optional function ```python side_effect(old_command: Command, fixed_command: str) -> None ``` and optional `enabled_by_default`, `requires_output` and `priority` variables. `Command` has three attributes: `script`, `stdout` and `stderr`. *Rules api changed in 3.0:* For accessing settings in rule you need to import it with `from thefuck.conf import settings`. `settings` is a special object filled with `~/.config/thefuck/settings.py` and values from env ([see more below](#settings)). Simple example of the rule for running script with `sudo`: ```python def match(command): return ('permission denied' in command.stderr.lower() or 'EACCES' in command.stderr) def get_new_command(command): return 'sudo {}'.format(command.script) # Optional: enabled_by_default = True def side_effect(command, fixed_command): subprocess.call('chmod 777 .', shell=True) priority = 1000 # Lower first, default is 1000 requires_output = True ``` [More examples of rules](https://github.com/nvbn/thefuck/tree/master/thefuck/rules), [utility functions for rules](https://github.com/nvbn/thefuck/tree/master/thefuck/utils.py), [app/os-specific helpers](https://github.com/nvbn/thefuck/tree/master/thefuck/specific/). ## Settings The Fuck has a few settings parameters which can be changed in `$XDG_CONFIG_HOME/thefuck/settings.py` (`$XDG_CONFIG_HOME` defaults to `~/.config`): * `rules` – list of enabled rules, by default `thefuck.conf.DEFAULT_RULES`; * `exclude_rules` – list of disabled rules, by default `[]`; * `require_confirmation` – requires confirmation before running new command, by default `True`; * `wait_command` – max amount of time in seconds for getting previous command output; * `no_colors` – disable colored output; * `priority` – dict with rules priorities, rule with lower `priority` will be matched first; * `debug` – enables debug output, by default `False`. Example of `settings.py`: ```python rules = ['sudo', 'no_command'] exclude_rules = ['git_push'] require_confirmation = True wait_command = 10 no_colors = False priority = {'sudo': 100, 'no_command': 9999} debug = False ``` Or via environment variables: * `THEFUCK_RULES` – list of enabled rules, like `DEFAULT_RULES:rm_root` or `sudo:no_command`; * `THEFUCK_EXCLUDE_RULES` – list of disabled rules, like `git_pull:git_push`; * `THEFUCK_REQUIRE_CONFIRMATION` – require confirmation before running new command, `true/false`; * `THEFUCK_WAIT_COMMAND` – max amount of time in seconds for getting previous command output; * `THEFUCK_NO_COLORS` – disable colored output, `true/false`; * `THEFUCK_PRIORITY` – priority of the rules, like `no_command=9999:apt_get=100`, rule with lower `priority` will be matched first; * `THEFUCK_DEBUG` – enables debug output, `true/false`. For example: ```bash export THEFUCK_RULES='sudo:no_command' export THEFUCK_EXCLUDE_RULES='git_pull:git_push' export THEFUCK_REQUIRE_CONFIRMATION='true' export THEFUCK_WAIT_COMMAND=10 export THEFUCK_NO_COLORS='false' export THEFUCK_PRIORITY='no_command=9999:apt_get=100' ``` ## Developing Install `The Fuck` for development: ```bash pip install -r requirements.txt python setup.py develop ``` Run unit tests: ```bash py.test ``` Run unit and functional tests (requires docker): ```bash py.test --enable-functional ``` For sending package to pypi: ```bash sudo apt-get install pandoc ./release.py ``` ## License MIT Project License can be found [here](LICENSE.md). thefuck-3.2/example.gif000066400000000000000000026006471261610017700151510ustar00rootroot00000000000000GIF89a{1 500 $< $0 +; -7)0 20 ;: 52:32,C $I$K)I&R$\$W'P)f%s$x%m $S*-}!&x')p//e:O6a%HXoG;Md0E0L3G0S2Y1A6(V0e0i1c1q4&i3'y96zL0IS$V3uE2VYcFZjJ\qTWUMhsXjiWpxatloxbaN %$'+(9+6+3+6+ 2')+))%'663B0B-N3f9X4A5r?i:q(QN*bqQmvaWyEpHZV7JLJ S24am;6540egԄNKQWPXϑoԣtgsfMwkMI4-65::645;9D7G:P4YDILZBNpmDVHcVsk{cU=V(iLsMwHkB^E25tyvzbs3mp4צRYXjrupTX][clr4424r{2َ͚ըԭܯˆ֊ܗʔɩ׵ѯט˒ڢڔ!! nvbn@nvbn-desktop: ~/exp/thefuck! NETSCAPE2.0,{Hb~\(ÇGŋ1jȱLj=R82ɓ(S\ٱ$˗0!p&Msϟ@3 JH$EsngHMiBZ*ɧ-W2ʵ+׃]$1*5*Jf;"%)mC.EaYD#.`ƪ`7M{/ǐjd00I2KE`_#Cv&Jڥ JQ !]ÖPɺp T ;:+j*QM>mYvYtJK;}1Q-GgOPI\[(qgr<#L_Aݓυ_!@%O2wDwd@a"V7v!Ђ<A裌Ls(K>3'ԵD5xHjsʤ>݅>( Ʌem|$_" ?,*%aѴ dkvBO]qHo!hݵ#>ilOHſBzO|P,|,$عW':\G泘ƋaNEqY>]?(mPQ5ʴI c8s9"9d=mE=:^P1I)БDӡisp]T 15aVS\ I4 ;^ b|oŌO0aY5zRֲD3k392i[?m]37:hѱoq7`{':Яˎ9#*[:}חWouP ~cw$X~ه؂0g5Z'`?B?҂`籌%Ktsgc@ L`Js`$-tP_m[luELu@HYP D?0A!J a>O*P!'pAuW2xH9iVn0*%nTTYhƌu,{fu|K5*wja xtj&C NÂBZU`p`S$te( ه0xc}L6Q6DQ†XҋXq_+Ih+'},bx\BӑD,'3`";n^J1.\x:Lo1k WC4-I^ `D0 (YI'TCI#?HJ2/ 4oD-znHz BB VPqoj 0՜D&*MK&q@F_Kf1S) qZ`GZ}~q7KCкy#8(KO}v5=B"a 31~D.zٔ]>Ā;hj:{QtfU(us=$DH i=S'l횶[r+$("zW'i@Y-?Wp:|2jr#;%-5oLQÈb]d&VC[`!Pg$m[h1Pzb|'g]Wp zCĐ5H9MC)&q4ܖof H`q)Gsd !vY+.i>lBtyQ)ЊmVy"tҴ`qcujLC+2}8=)3iZ Ե CTB*C`VzL"I_+4sDmH |Hm,$ʼ$`#h t}}wi2PGGI8Dz8*7)@\$5ϢFP%hVJye~Q-STs4QriKΜS.L?&o~,Q}y1u8N*NhO]x;wxϻ<^u įgg'Oy@<5{ϾқOWֻgOڧw?<_ p+l7@Ȯ6tae{ @v|3 n Zʗ;nA^C"g~}gg~x  }Wz7Xx'yvG%@4d7PvG @ gw"Hg Wv%8mp 4yw'P hvzz`v(xXZH`5(w`+Xv/8IXv@ @wW@f7 vp _HyNhw!8 }ow3}yXxgknXvv X#hGv (wGv`wgv/` ?y xh =`c}(yyi7}kЉӗxxviH g' x@0* g@ /n e*hwP p sp _ yc7vP EMKc"K dWL NMP6)?PL(Y1YvЇChoЌXG hvR wٸkuv0~Hx @e3`( -0 v` ِ@` y 8v) IgGFؘcG7)0LЙCH `/)N)iev Lip|ψ9lj\y\vmg+*pW$tI x0@p)@eHgv  5Y}q| cGCM`8) 'hE2i;3Y? P,Iv=h|}0y8Gh>ڕou#؞ eם hv ؋([jԗhw(yL` N`C)PK`@Z)x<?СN0*ImgTivz:z   "" wY`ٖh؜םx)$@*jWicg9vPnwnz/yڙ?`AN`ʙy8( lj=AP:y=vph) `dw0ZzKʞlǬZ#P xd:8v:Hv ʭ/Iء:v`;"[4MVŨ}J6ZNPv`!8j}I kف8d7/XX[;j yFw4ȁ5xdWٚ*IvcW:;n*N08v{ yv`(uQ࢕[h !v.~iI׵c׊ *Ƌ8KkgJw* )w pxLPv:0{76w:vysi} |az7hw 0p4Xwțxq׊j~n@ "xl̊ :׋-jp%7Kv05A){*Сzze7LzL0ggv`}`g8 \fv `GwhnvwЃw!}s xjm7io'ƕSyƎDzv)Cw7 {Exx ɦ|ʨ,z'{x ĺ{0-{Wʵ;ܧ˙ȩzUr˴̽'[Hnw|͖Ԍܼ͢, z\v|ּ,\x=yρw оx- ]ѩ <,{ѽ =,ҕg$=,Lҧ g2p|Zy{6ҫш>=mԨO}9JZHX^հ ցdldgMvqoyt zw΍\|}wlמ7|Q=Ƀw W}؁y؎{&ؘL'}Gٙڢu=֣ڝژڪ ۲]ڶm٦טHMۺ=٧, ]veWUí]{9w zE-|܍}ӍwXݠmq=z߽78 ج݇Qi~ w^؛׸~-~WL =oW݋ߙԨ '[Hd':&6{(~ .>={n!N~4ִ]!C.x;wPAWxSy[~ոܷ' Q.z,wd~濇 )m.NY-ln~>Unvnfhmrhgizkȃ^x鯧~nҕ8Mfڨ,q:|ި;܁}|ߺ.~ޜeԴѮzӞN.v}ԧc 쬮w]8=zw>|wnvWi^{-z}kznr^g=׬~ ?vv]xݞŬ -.ld-.>_:%Op^Nx,M#Ro}P~CzVv2_wMu.~^ynwǷCge>Ƙ',Tny?7L#=Ҕ-_G _]fVI/d~;n?#Nlx-夎,o/ ° Mïoo/ /־?R/z՟ںo/xv@@ $B >!2hQF=~HHE ,RG(WjRL5#ΐ:}T(B Ej1fRM>UT>TQҬ].&We͞Eaˑbz;n7EuJO;ά#hk$pgA3sj"T C4D@C oD<\<9:@AJµ\4o>h|ȹ9~kۚ}_T*7~v 'IG?a C/hlQ@$p_c@-К`C|W }R\kbN,뺒c` T.O><oD?# fD.r!5& !S8*~\]l/YK nvQ|dcHƛ zٳ UF tc4GڵE%W#ؚE-L"dA" 2%2[B &<Ғl'sCO L>Gxx#F/1m(BZrah̤X,!&jI 0yӆ|>M]FcFvd%]PoRәTjr~SJ@]hjTQ) kfտ5^q[%שat͉VϓfѭxM\d (`RQgJ׬OՕ`&BB[ )[#4i<L&l,G5fVYFv QP?clkH q[~7-u+ʾJwuu")ʕ,/PʰW'Տ{=v^:, X·V9Z.$_ǰ1o àuTYd^er˄!rҝl]|ܷ:8fWߙpZ_0SY`&&W?ƿ ^!R4 c ĥGdOR(+Gِm%]+,[YnLl,daL/f԰_"{f/O~+f˩r\gGC&W164M բIϑ4KC29D[J>QFN02a'kyI:=Gv9]|1ənLG=}?`& _jvqL2!֪f :eO˂z:AkF?:ݚMݣ5*Z4Kokറ/so+-eAZp4ɶ)~ˇ+iu/iՇR"E~,7i-_|i$Wjsy~Ǟkt,:Cp^;5CMk4C]z-_!8RR*Ư<p/V.OdFƞ@/sof9?lAB;qOgxi5s74F!ZRTxջshN*|N[mVK-Cٴ2Z}GxqSFK@M/?i۷˧BtxyM}?ְ?7k2\?;<;.3Z9J @@Ř-ã d-@Cc A[1*N Aax,A9hACT_BBZŠK2)^Кz'C[YBVAB*KCn;Cص5a.e=-<$#D bk:C`*Dc$lLY$ E풾HBX7JI5qER#i:fdž:B{myd G;/z>Kɪ.KK< =K9~!4qDY<7KD,zDLKGJʥ<f\Lk,i =9ܿޘ0|ȃe1P̪ \JT-|,PٱƔQB鳼8R@ˬ# $=#iIE薼\ -&Lǔ %(E94ӎh,!F! nvbn@nvbn-desktop: ~/exp/thefuck, H*\ȰÇ#JL! ! nvbn@nvbn-desktop: ~/exp/thefuck, QȶO=`C]8P@V,S}!j:4mσ(lȓH%#PyWZ! ! nvbn@nvbn-desktop: ~/exp/thefuck, _ 8RO: ;P\LqV3 '"3ă3@A W3+!G `xJTM|"TG0 UP#Ȧ a6 !! nvbn@nvbn-desktop: ~/exp/thefuck, MWs?q $ME(9nLQÒbC,1+z2"Ѕ|E ! ! nvbn@nvbn-desktop: ~/exp/thefuck, 8p *DP!AhP@-bemӧ0 4ʷL.n,l4XX 蔉н* 'М;1FK1 /&]RTBT83 8eS}ol<` Iq]xqc@!! nvbn@nvbn-desktop: ~/exp/thefuck,8p *DP!AhP@-beQFiGX 0̋.{"l4؄*ѓ=0 ye#{&:6jHaf 1 `OYL4(@d>}8 +CY)v! ! nvbn@nvbn-desktop: ~/exp/thefuck,8p *DP!AhP]]L(pŻ8)1$E˧XOX7&@c!@ȢvǤP^I`hӷ/\:TPD"! ! nvbn@nvbn-desktop: ~/exp/thefuck,!F8p *DP!AhP@-beQƎ5b9R$E'MBDReCa&Q._Zڼ 1 !! nvbn@nvbn-desktop: ~/exp/thefuck,*8p P!B>۱ %H9 % Dˀ!D>}WDCǴ5Ȝ:S΍SU8MZ H —L."G(o߸(aUJըvHiU !! nvbn@nvbn-desktop: ~/exp/thefuck,3 UH*$p#uի3AZrmO΀$@pYB Tu"g)RM sa/E ʙ1`tOٗ @M: 3 H1 !B䀩a^vpǬG򙄶A@@! ! nvbn@nvbn-desktop: ~/exp/thefuck,E MWs?q $ME(9nLQÒbC,1+z2"Ѕ|E !! nvbn@nvbn-desktop: ~/exp/thefuck,N QȶO=`C]8P@V,S}!j:4mσ(lȓH%#PyWZ!! nvbn@nvbn-desktop: ~/exp/thefuck,Wu 8p *DP!AWӧ бcEPQ`F"UhdʒNz2#aL$D>ճe(AiEdŪCGzu8vɀ! ! nvbn@nvbn-desktop: ~/exp/thefuck,`w8p *DP!AWӧ бcEPQ`F"UhdʒNz2K#aL$D>EBP)r4AidŪC!)֫C!! nvbn@nvbn-desktop: ~/exp/thefuck,iF8p *DP!AhP@-beQƎ5b9R$E'MBDReCa&Q._Zڼ 1 !! nvbn@nvbn-desktop: ~/exp/thefuck,r8p *DP!AhP@-beQFC \%$oYp3 X7E ow\t!1 `«fRޯx` H(p5}6\Tcj$+1Zm1!! nvbn@nvbn-desktop: ~/exp/thefuck,{~8p *DP!Av,BAGNE,2#D&xO_ǔ1G3 TefBTęS`ОDAuO&t@yE$Ր+ʤ'ϚU[-ƀ!! nvbn@nvbn-desktop: ~/exp/thefuck, ]H*$8`mOXB'Q<0Y! lwB akw [%CF芢VJ{Cyސ/cDj§P!! nvbn@nvbn-desktop: ~/exp/thefuck,!! nvbn@nvbn-desktop: ~/exp/thefuck,!!aptget install vim, HG *\ȰB J( Ŋ*ɒaY"q"B'KGr˗ [t)a.PPt@JѩpOAI*ɠCg(B$T3ZևTwJp S2ܒ-%ղ`Tٺ2).ڒcX}z3tz(A8āp 1aHqq<#dcѠ'ʈ1laRpܑ7^LቧdVׁݓQ~g1':bNNIGqQ5`tJc&u( a2&9 h#f'nS^,'ܡ;{X ?Y =7RKc?`5$ቍtRyόH:ywXJI e^mU[J5l1Džu%^ &BDTŏRJ+l⣅x'A[x227Y¸9N:$sOfUJ}攰beyo]'C>jb"$Ai>׶Z(=@&!ӳPU@i/w'3>|-B#dtj1y yvuxn#KwB"0@8j?gI$UIkThHloBD5{ZoySrBdRp5U]JZoWdIfllr D%KSmcM1i5n3::xaGNN$/  .b}L |vOa1BBy31b\2ɗqz)qz:~2K-sUyM5Dne@ލ1< tR6Es%aҸzE2"G=a>Hp Mǂr|C. 4]T gr@lH"j: AbvFޔh;ђm]I۱r9HeD\i@C@a 2̱PJR$iP2f3 HbV$V٦8Iάӗ IezFNn:s59z$ ! !aptget install vim,!!aptget install vim,(: H*\P #JHŋb$x6Iɓ(hEC@@Lÿ$gVI/QPd/Uʵ) ]]b$*A`f.3ħO= a;C^A$tSA&X92υ 裣Hl9\E" f8;(@&lBL6IS XS SD@XdafK+9X9&Gz{H\0b0ra=vc#'WT 3䓌&#B/CO0pK4r2!ԑʂE>##"^K<P :d>r4@$j"='$ T[9~GH< k޴$#(.A n+78~5 {n  C6梫@ RKX#. ;&K>.X'pWkmh˭+>0O^{MaB7L)=&-L#! <``SWpr p*Ck*m8S Sl^D@P̆г? 1UTb@cgjSP=.h_~c}L 0@'|CM,3EFXһ+j~x6w$[PhkmX.GC\( $ $279 ,dDtݡGƇ(ه>'9#Np$rM- q0{pi.ӠوBKKhd a= S A5?oB0p |]=NS}0@ ; dqtJB,GCr:h >1N``Z_@`3 f2XdJri#<"$;3TRD}Lt#N9He>,Ixw-b+Q"׹jjf* tfޮY8Йw@0QR*T0 @5QNr偀B QAp$.@BFC?Ч -Vdm{H%W4*jHh6Nk|(` f@3$I˅yGQ*Kæ\aFNΪ $BFIx {a:J D qBU[7 nDh"7ECBw-h[EJnClJUzKm?0PYksVCNo\q&,یdUeI4V 'mRftcVceXQ\j¢nn2Ẹ!- }TWլ"[ib ZhCTS,q\ݡ0J C2r n( G0J}@\P-m^A(Y<Ąpt+/~]2_{^ Zvp+n m 1 ""?Eɠ1̉/>VJ1+촾 xp&8|R~Hp#YR>gKLbY`pχQN=P0`JPGz 0І~MO@R0*((xgHCχ iKgIHv@F0 Ǵvg)S0TcQ8675c8#TDIӜ^_I8X+h"jQ'5 ~ϥ߶]&o`@]8 &$2(4MExC8OW\2֑85yh(@ЇNHOҗ;P5"/D%.FEMSИx6:Arx9Mڡ2pԮHRd/HQ`p씱*UA-4y< "#N$&o?E?_y5FaR`CaMB"*sPxh!WQfݘ )(K=m"Rp){xL]ݣ:5Tn78]'!G32l|7Q`1| B r "!,nS!!)ulw' %}e)J2$B!9$q3A2$6f #X%;B6ZRm)#C1p!Ϡp!u؀3!5R!)94Phivjv.bj!MH#腂dԓ cLJ"$K#'s9cycI`e!3,Œ ,`@,u RcEZs-xt5",C.33d6/-p/6/0 4Re,f5 01Hm.//12A._%+ P ,@}1/*3+ @-[3+ +&:4!Be?V5 ا/@(,1h1p4Q# P0/8E-G/`ReHycU2#38C7Gr9:#P Ő>0J*9P:S"}!?60 ;S3]`$p#  ?5p@8CQp- 20 Еah)Y<>i$AZ dƤv !P5!a`;GMvJ#?;S !UvFGA>PBWFw5@Y 7K1К=Uz0D{S{S0A}pt98UK)T@'%"ۢ0e@!Q}G}i TLD)gDc@9==u.arxtDrNy`q]r` ԙCMdMx@K$gsԑS |@ ޴E4L=L鷛HJTH` ڢ 3 `$4fJw$S%zRМIWCd "؀ 'TpIgQQ%Y*PZ1K;yEiuV<F$%0QqARÜ4 p@ `E@9S95Y@|0Av } 1֐Rz9UEHP t3\(Mzuɕ^Fg[E *= Z+`=l ͹k$zL=X71E#knW !sZ="V J>hQw"ycfWzŞN0" @53¢3`"[g;`ddxMf,46(bUbR3bbe -l^IkbZ%SHe5,F17' !0o`D;=r+_J0#:JpM* Rbxfmfa8T 0 uaK7;9dPf{qI%PhRj!B'KB`oXZf[oHjRn!j!'v!殤!}& {+ ##UCP`6Ff nf>Yl+*Vs!gl"B[uY *t ()aW rgr!-guA\a`ȧM0$duE#]gyB&XOYCz $=RHhzVl8hU%#| C$hN(>gV"M>a$G BhNPI>x.TX=dM>l6>*; 'T @#,ɞx<@=ur#Q>蒏0d*x.9`:yFf䓌&h',(DJ# 7d"ۀB 1b*Zk[ڗC zjɣ|7"CSݳCțl13$dT3h)` H?uXEb&tcvB"!(\s" 1[$XsevreAY3`V YhQL!%m p\LRM(3s,-4ё#ul&SjIJ=QfYh|k8>RJMe 05h0!(󅲋!!o Wd bc(rw, \!(J;Itkȕ_SѪ1;9x\1orG1>޵9{ɾNyHmRD97RF "Z 68$d"=J ,g`V 7Q>YI;H @S 9< fIB!Bib ,qoKR4H SNk8R8`2~ʍ[g4_V%`9K&CXfF?aexa]Aڈ}lS> WpS4QBAe>f(ȅrִ%eSr! hS稶Fxm1qUGz> hT\Cp{`fɝp{[Gm{+.9F=d u{'v.v0-.vhCHK\;&XBơ<ΰE" iv6+`h(NW*G`KS8αQB!!aptget install vim,N( H*\ȰÇ#JHň2jxǏ CIƓ%S\ɲK'7I͛crɳϟ*ufJѣ @ʴӛJJJ5dԪXj]xuׯXKزhBۗgʝ -ݻx)˷~,\†EX"Krɘ-k.y_;SMȥSO=K리_6{mo붙{o O|ŏ+|s͟Ko}uկk}ޭ/= !!aptget install vim,!! nvbn@nvbn-desktop: ~/exp/thefuck, H`NZ\ȰCJ*|HqD 2DžGB Y 0H>zħE ?!31V( &yRg=nyv߾dbU>eb0 91aF+T)я{r3S$%ْᕫu%<ĊjD:yEy WLKTӌ̩OWZ1.7~NB>EN#my)x8 >2n%z{s܁O=:|$>쓐Ff`p!mqBZV!- ?K"I=yuyYVk%գ2_څ;ŖgYą8P7U2hG`Npr!y\> Z&t21LH;|tCN:+zOCGlz# l!F.Gc9`щ>\qs,RJfD4՜U2'-KgD!qdz4"C+yw0;LpB*g:{l++Ռ)d3VC / 5XBX=2Wb)vDz.>Pq{{t,̮ɬNS/Nk&jK$e_>&fe~XE<ыj$p26>k:{Y>TqfKm0"Dfdvv57:Ubhi?֥? c;wI95+Dl/E贓 y4sva}3j7t^u0b%:fJi0Qt^z+4#YK0,($Xy%nY8ֆT/6Pju_pJRYN9fŇQ=xz 9P%bӛvFVTJ4qH"<-q?V_h>(S1PTDQF):%io r 4-&Zj=>>7kyPO%,t|CJzVi$Jh@aH=;^xVfP!&z.?"iP^Q91 #FZ1mTS"7/ q,A4.)j|8)A` { K}V.B er}-I!AbƄ 0EXºX DA!! nvbn@nvbn-desktop: ~/exp/thefuck,b8*\ȰÇ#JHŋܘǏ C r#A('0ZTb , Ӧɂ!|5b[hs"E= d*  QS&Fx\ U@#hp,ZQ%TG͛@S2$ ŕ FtJ"0/M:t0wO~KKB#- q B@%3آF$ 3D̴UW"0E'.Qig3Ebس*Tf*(x!CDI9 3ibBup tKHU֮-uW8f7 EFBDR5#DrJ"կU",D@ 9D8eDrkCN<w 1RfM ^ X <!A! nvbn@nvbn-desktop: ~/exp/thefuck,!! nvbn@nvbn-desktop: ~/exp/thefuck,e V ,! _>s&RH@ Jt!O#yŋ`ѧPJx#\b~5-9ׯP 9aN]˶Xm{kۻxRW^TÈV)ǐ׊$b_"k\&WM:9̺5η#sYA׸smNoN#ot ;4uǧ }xSe_!! nvbn@nvbn-desktop: ~/exp/thefuck,bXH*\PVCL90cE,I$ň\Q 01`Y  d‰M~XɏH*]0 !!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,1 HAJiAAI:AqSوarDbĎ8,WcHQL_jX@%͝*]ʴA%1r PURM>:>3*a'F$$!U?ΦM!,s\RE^eE6 ֞*1=R \$՘%^{4-7vt(wq雘$Ө+S͗ =q@aEoG}j*!YEr~Α [;L/5jv\ aI0=fc? 4y!j|EBArLR]ZJ[5wPxbp&|0M68ՠ@)"}EX>e)ybY_8'N1OXI>lVXe5|:ќMm1 !aƌ\L`OITFSiCoI9jU=f)\BL.3Tyƅ>_U?X Rt|YXfcTKtb8odad&cV^WCSIswc{kV3¥9?qQIƬ~xNI&s,E]&DZɲva)FyRDH$Gf mDoP#zWM9D +lWbV![TkmF>|9cF/tff\pV-;xq|Rzh5gKxrJcG>+f>:n'ЭCPU՞*. f^RG$0\H =PRuZFx; ?ZZp XyX_%DCJb븛b:X.AAz}^oevYiN.mlWKoqXq nB_5dmmJVR-%_Y1Cstf).4NE14W,h wDD6aB B+% +^.^JUڨcʈ]^1iwhUUx MƎ|$EL6 =*)U*!_ ~X Q$^Vc ~W $\x<`(qJj*^槨@]7P'"dH>#[uh!>jGPd$ٝA|ɭ~ x0@"U8`_HPi|9 dS/?d@OA#g 6PVس\.O`+D * 9@ `p؝B (bFԙ]A,|OscJ@`"pBexY %da dn`\KqmapAD=--sU=YDE K/ia=B/7dњ)b>&]A dTc@FFMH>tO1X@܂Bj᎔$2,.6?u 'b$O7YnN'pZCeB07.n#drLy`A`r4$ 9A상9S5}Z2u5TOZ' @;JI)B^ScgKԇ08`ddx@F?y)`7p E ;U( |vWaL) 4. j]99Ny" WO N'44ӟGg8PcݤQ$?1"斟|-pc"?t% !dC.F p2b BYfpXzKyҳ[S@P/K!=Y10zJ#-Щd/RhU28%/C icB`@GlS)(?FB iET}*]p˃fr,S+Ȋ!cqpT%+ pȥ2 YH\c<{r 0%>PB&@%TAj:i؉|%%L'pD⡋|NѢyw!MF FD@b8@WJu:Hj•n !!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,# H*TxC #>0"C-*4O>} XQc$}uvȑcIF'eØ ћrPxxLiDJ9 CcI }]rذaMR<[bQlaJ uxu/;Bw {#N Y&^ /cq3g!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,d HA*@#JHŋ3jȱǏ CIɓ(S\irK0cʜI͛8sɳE SD%j5ʔK5pi ]ȑ]1DH>ZDX9w{aBС]F[FL+ 5ErO[H G xwai!Hн4袎 )IZplŔXZ4c ` =TD@#*p*fT WtvW!DhHFcS Q.LOrTL.pOmR9^젋<^fj$iBzHw yU(pf9KV%j q]|BQhΐ)k6D^JݵRBz{rTpMg9۔cW,|G–o#TQ*]&Bn&2:u5F$d[;κ&;N>[q شO[ƥ>Sn/V6LeD\< Ҡ2A$*9Q,mM=juhP QU1 HM? <?m= H({L3R' 9m(+d @@"p+4ĪtYB|c+ZPtFFsC-z̙CT=XlD| ؃&tN6B( 3t=l00c<s:x (Hv?o=tNeY7M7G H a ,F>LdWLCi'BG.2 }X/ap,"Anj1(7"Ґ2 {#\$> 2ă}^zCEBלc f)29HiTc()4hȂT8 7\d9@Z-|LR i ҅=D 1>>F@ HMp_=T).1rx /r a[(lu}[3H(1k"V*(ѣCFeJD!D xJ7ǡl!\A̐4![~vI&P@gp@F94pX77 !! [n&V p m"vR_>&X5dCP^?W^cM/oL2,@P|a#A^s'S}ppe9'/r >j$`WPErH ܡC 95Aqq2|xY"RU :zl *Fɵ K Xᬤ0o5+Bjn|ŏ羑Ow~ƪ':4rp0@ 'LަO07`؇nmZ( Vy&\aw\c.@aJe|a?Bq@#@Y*αهZIN.qoF] VGy8,BS (Ԡm+pdoH!LkÂ;}!Q$Dtx/Gžt">-Y>3 oTX|n RG ؇\ǗvP@B鎚bgHZG<Ц#UD`̜Z~  !tHV)` tDj|gQ  Q榸T˗9 w6J}irNkf"OV p /$wf}K+_?Ӳ,._p>FV6PH{*GzC7}whw{nB v ]& = C3ZEuwe-rpfgsP(rh2k5C-! 7)Vbpg u3fx"w)ba =#&C`("{}&x&Qp֠aWp/$`}5hgH 7!+vۿk/;\0 axR<\q>{lr! >"<$|(*,.0OF INQf11[kPZ*|$(B:6r1k'sAY[<$J{a>&QPQ+(1K` 3X>dW'(R, ,6[!]L'Qm#Ly m1a!ʕ s+AAü2 `;kqD?L`SUySV9 !Wfh|)͙ +PGC'ኸ+'1g70f6(n'$/yJH2πφU,ԔK˹ -d0Ȉ\D8'1oa0B$7,O s+1ـ/'b&.g-I҄\KU`;bM!xAu$8G7Q9s7B49suڀY㓻5 <͂6j]8748g}A,/A??58E|C@8ҵ~6U88B0A~m}%$BlZ%tt 3?dֆ;@hsu"ZC8N;h(`Y'=0v#!y3F_m-?. ;UM99Qt:EC:z<=s-w|}ݝ8p1̗ S߭7e1yƆݻMT.NӣQQ`pל$HH,eR(RMDLaTQVI9HLD,~SEES:K$@QER>BB~GPRDE~nE[Z5s†[tPwr_uH?S⽤N9E ǔL˄0XLu&i>IS0./VyǍ~Q5q}s_79#-@Ӹt_\W}a EWVXaURPl|]ōK)C3&ZbX!78%p ~a_6Z{e6 F-s09~nr//_bcGbV[_\XQ!XT{RXĐL.e $00е#߬,z'^Oy'p5]%<0:Kqr{VW_F1VXWsUVU(&i66l|fi^Si@`jY6 WfFNgGkeoX& wvV{v6Oq H6ip&&{p!ll8ToF{DDŽ'zSpl+%$WNfw|6n -5wz^۝  N߾|4[.NA1~#UxSgwt]xڔ;@D}5ֺAXEV/# Ϳ YΠ(`;˶ C;ùݾP+փm4W`*J3Ȑ} + 31“TX ,#NZ + x p ̪:2I":|bHE1-Q2פcb#7P194#9 2)Ev¥f'JL2x!\3 # k:`ˮ; %H)'=CR:tݵЎV}W +Ğ!F% !H6󻖿 T!&npqלPZT+9 mŕ 5Ƥv@Q*D=J9)Pgќ iՂ 8ʄQ,+8.B&zϵ Vacy5(2"9i|'T)GJ[nk[ҭ䋬6["$0{)bOE*&\鑂S?Tb`\dBJB~A5x :d<9ؘV q^*) H2,G%/ITẄ< MlDZL^if<%薪LރqXqDDTF/qBHGY ,ba `ώi_I+9-ȼdGDkcx$DTu?&NK:Q&7OD/}iџe-5!{(bJԶN걩AFp }%"s "[T$cYQ 5!k:3>R~E 4j`U+^,j7i3?+I JYҒes8r }BTV)fMlRc>,y,4*GmHR}# eaWڸl8n{Duhud{}ض0=iv QD{С(m>k@EZ⴩U R7גRv䥛{47 pqQ; &G(B"UmG~;׿qQŒ63!o0 D>n{Vʈk$^XH H;31"i'*l?ۖō9 ''Uqa\ЊVx@}XJW%$>$270mz(dl4Ã(;0cx2t#M#tuE=jRԧFuUjVբv7WdHBV׫w%P+`n1i8yX)4OϦvmnwwm`p4 }aٶM Xw/ lwAJoq`(qWxIxoa\ՆaQ8 v¸4JPy{;.ƅ>tGG|'}hӥ>uWWzֵuw_{>vgG{վvo{> q5h[7|?xS.&2h|%jw5ywC^Q:pByG}N,"Anshg#}u[ xŴy?|Ԟ5!χ~”~}O;eE'nأտ~} ;1+~J!$4DTdt ] @ ,@ @?@4>@d4>@=<!| $#D²3$d&ܺ%t(B)=+̸*-Bq.0/24CS#3T5ԓ4d7Îp8C5:0Zp::e ;-؈JG'\Uu]X-u};}ыbոG T.KB$}w4>QAOm:˾>}ȥ%`K|!O՜၉Yb3f-VS$\^ s7`ʧL -bءhq|=t\EGA7l!3IՙlGxL[Vg W{,Y8,VXQM9g!I=yXiFu'-Q 3VpN38jUÏyZ QM1 넳29>4Oxs:pxBNsI(PhL:Qd&?u)g#>AU>4Q/a[PsTUJI-uy so:̒h ;m>Z؅Κ]:īhfѡi.ӜGӦIa\c|P'4\&ӊh$U!F~$ VGRͼNi#/:b %TŽf|2Xk}pWCT!L<*C$ Ds!Kh9z'Q1Wm,Ȓ>]!i,v_:$@['+$ښT3DIQޞ>5tFa՜z2sE.CN5Fx9ЪNCi(rxhAqX: ~Zp3'`msbקrDuք+VC^r= = {穨KWHig.X! G68xvSl61bpX)dhP!TdطPs %p ֊28H:Q9=OT`@~+,LBHpB5uL=pf2?Ž(,"2 Ҋ;TXY ,!;gPV(Mb >D]iPά{@è12/ ` 5QV.(q%o3}!Q^J i%`j0ÇҘ9d+pb'q]7yBMuNQ=BriL3Þ3֜DX!Ai@Iw=ZU(|H1^" *n"4 afIN j=FeLAb Sʏ.#S=}a5xlkIEH$  l %' sI-#m0TR0#p&"w)P܏@K.'AT MAM0QDNL7@TV9A0]?<ߘ91?\eLft?$Hg WtEP$qPr |ExK(J\T,@])&@ PcЈ)baB$+bJ, ,TB)7c)hwl5`i: _A$lDe:7޺ѠDl D**Ȃ''@p! !˽#  lHB//Z:U )0 U A4D*C9MAXf65q۟A[9@K Hj0 ,7Ȑ{xAT>lyzy~i(l}WUg7v(ByTA)/ajY@0%T,_Sх(BhG  B;zMd6{bQ 1(>s|31wC\бCG?F| :F v I 0I =yu,"U 3-CpG9$qW,pq&b8g3@~0-'De?ٔ4 _$!Nsc҇ } A @]!@Cl#  ?\p4` "+bl"F3DJk(V@I 2{UyXdzɕ iYN f , K>@,1$\-tp,  TT:DJBɠ2fҔo@8xU*XHRT+Z#$UPd%hU!@ K_7'eM`7Å4la[@%3X& !}}țB 0"0E'.x9u Ib겪Pf*(x!C< 9gcbt4&uK.mn:JLȰvh[B֌11L(4sbA$Sa$(I ^'88vbrG 25($a1FdXRHSzgG!! nvbn@nvbn-desktop: ~/exp/thefuck,!! nvbn@nvbn-desktop: ~/exp/thefuck, V ,! _>s&j:bG7!! nvbn@nvbn-desktop: ~/exp/thefuck,8p *DP@2RH@ Jt!O>{,ʴӧ~$.%jʵT$[#mi׳hӶJΚVKůzL0[Y-̸1 vL2SQ؏_-}-YI^ҴA?peMvTTͻK#y2軸q}>ΜvrK_\룫Ν׀!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R, H*\ȰÇ#JHaZh\#t(QFKei$K"?t#;HE-7h2@$H$9q(ΧPJJիץAr_j{ĄNK+P*YB%Z0nI≏[L[R-_>& &vT$%-QϱP/Lj̒v W\uʞM۳K0?}\Α-pݬ5Ab0]>]?JhULt2Q8y&?빦`qQ ?ŨS\s 0VdF_#сXZ)=h~_HՄDž$HVA9Փn>Ԛ>LAFѷБ~PybX!#g@@"HG,&Za0aX;h饘>:$d3|I 1#AIjk2]$}rjfE=zτPX;|x\;j䪛o|6NFgUS\&'ʈ[yoeI.sKpZ2܊||\r9/CMHcv~qAJH=Qwk"Hl0,A=#)|q~='gڙK@\i$O0Zˆ!;ϤZM8bLZt`X!idZxHNi ny>sԭ?kfCzjܥ"זאsvw1R+8У̧\ZI3'|q>P4}?0WkNG`Bwvy&O^5G5&DdcA;^I3  K7joOq4< Lo`gE|LH#g'YBTu~T[CR?4Ą(G5̑4fu;A}eU[a'8Eq@OW蚆iH\p& H@Gێҧ-ו>U5`ԹQ帐xG"_,0G9М靏J#؏P֫љU%tgQٝ$'<>aC\bs*`Oבs8HGQ$ ,hF[ħe:mUG6>% r)Mv%qd#@Q |Ďn?Q%2.1j2O? p;yJ.gt@=Pb-8@a9ڦF H91wS3A hvHf3J7ؼdFOX=;IXj-iԈUgR WN0RL5҉sHW|) Nb#L} g@ IbnItµ걑8n۸2fFuɨDSOnR[sبwD>vB5fx0Ƣ"1aݣtr1ǁ^\BLƲI/3x(KW&츆"0~SjbG> \rRLt=oK;<0(:/O)#+kZm[%ͼ8pu(.Da>E?ՐYT;BeӞҘ~,L̘KBNH yrRUJėkI2MZۺ!{"մE|5O"!êKc?x0[[HBҬCK){JvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXGjlh1lkX!v(txw(yh{m؇Ta `(vh8ji  0P!hk`  p"k Hv؋ (rȈksa"pa{ȍx!P!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,!^!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,^ HApÇ#JxP"yRx0 iH,8PH2*zH̛jVA>s6})|.4X SV*+}4%BDCNt/iȑ7|'g$z]jԀkx'v(#DqQCG; *5kDzz.љh;vfMx ߉(%' HL@J⇍!g%sOi 4L@PDhË_4s>@T#|dN #?.P=?8>3D%UO0:"L !u~>>lHO0"HX^((C@ҋ$czSdCO1f P>l gAPd`?x }i ' (e9 Б@tH`ЩP"aYc>DFP*cuPG =MZ@)&jbOP@T[tK~>" q$n}6Ԯ[E^;>{<@ Çێ Rk?Z~in0 9@h>t0nn,Rt0U'|'){<(@"BL\_&C\${2@@EИ:AA]ëA4A#\c胇q @0 FF<"@ ܵpP>aTZ`6|Ho 0/#w*FJMĞH!)@@xB$Swd #mvzmmpꊅq(r|}|'eid <ĉ}:lP}] iA@)QP>\Ǻb 1 f &z"SA!>р%lǐWAt ^܃R01!5 1 1O/zQ 7 "Bż @.:,=B@`<"nR1YG Dd?3Ј22@/d _qF`ioKg>@|\GqZ8(KAn5D$G EXBP>Ъ"(.0Gq )T0csBIdxyd86Y;$\zL<([ɑKW J,QDP)L{<#<g~1DXւ? Z~~TBAX#@ @ ¼?6s !:Fz.pI :XaD * @Z :B (Nxt*1݇3:(aQLO'2 \t xхfd,?'I`ul>?h>XA 5$Dsc#D(t%T!y@v.̼@A>IoGћ &ˑNh Az}#{>+ ] ܇lL)7 h")PX S'%x@u!XH5C+By}~hO7 pKxH@? -ح jýUJP\^HRWZ}Z[!ε3qA4+]Pш"$Wtߘ)R]EvG E.]Ia2t!K` JAW X 6Y??qZ述}4!QumjR;qC[i$qUsf4ez DBa!%nlDPz5P6T_p  "(H2TJV>lpzXrT=@dzІbFn@ @nG+ p6j0Ubū84މE(`>aQ9#N &rGgFj j 5@?8`D 1=YO@LĹЇNȵ`dMv}2壷QϺ7reT27ߺ;HCGMםEP ]"i@!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R, H*\ȰÇ#JH]3fȱǏ C H\-G 0@`eIDG#U,(M_>}|\z IHkϜLxL͛#R&$n|d2P[ʄYlzA@ې.Vķ;r#L$ذ(f[NpŻ8S T0ثϑxTj0X+uUm@"uUXq즠5?َVA GʫQzNsovG Ρ>8|:=K-GA9\>y7B( B8>A?j+\+hGЧQѢ@0,.4B W]LO2HsOP42DYBK&胇 ^p"XϐXϐ#+L>Pjy?ANB)偛ᰈ= Td[蘑zU-b΢Oc=Dl%(բxh:Úyá J]&tSWN#E|g!Њ@@+Xy+xV{Ѝ1X@ ,@'xcq lek lpCy5!` n1}xK`ZCSGf )ۏܣ p]AbJ3up (T9`_J7OGH=CxG qϨAk í=E6 D 8 Dlh=2AZJvrFGl^¼jgQ@+sӜ}_?WFO8pdIz@t#Γ;O7 B.u(ӧ I~)+7nBwAG-[{@(?ՏW_* H-1| "v@IKb% CaB KP'Nrp$EJ.L.|_SKL2S-'>@d&ImвKz[щ?iJ $``jQԃ<*|ShT2 =d:FG$Awm U!GkTfN0"ro#DP#qԜlJU(k,eqRЖku婪X:e)1!NGېpgJ׺u` !!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,( H*\ȰÇ#JH@3fȱǏ Cȓ(S\bɍ-cʜI3K5sɓM= :H*htӧP6JjҩVj͉uׯ)Kزh6<[7ʝv]u͚w_} sFw)^㥌#?L42cʘ{Zns͊= z+K^}R5]Þ]Q6m޽P7}O8ƏN6泟C-}O!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R, H@ȰÇ1ŋ3jȱFY1 S>k @6*I9>9oЛ рx3Et `*D=t7= =x=h);GLO2%8S9ւN.D=q ngmCO0pK :S,D#)&ʍHhjِ|"{$@%"PA#LN@%.T ̡bO<@wK/ Ơ'$HAR'|~I] o|J</Jv\J*qȌ Z`0&w yc| $AA?,q%q63 rc a2>Ԥ`,t`~؄h(+#H҆7Q3?J | ?vPz@=PA(C@-^Q%km[ょ/Q+o{ab7A0 |#w+ius\P*rb(ˊNf~+C !g>хBnG9ε(4o^u r]m~ Amx3Q}፯|rc]Xf. jS!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,$  U9 @M0 @-CNdkr\(S䛄䱜/ J."3vWWCq8#a9- J^&"Pn|`iruD0EX (_ȃ@p {Wphi|hE6e<0ݹgF\F_ R3 _Fg`{NBqj.J͝,X90?ƒ71Š:UQ8@ٶ= h{)d2 䬯rDtTR`MSO%OUU LB?D?#4x3>`3-( ؀AJ1 O>O=t@NHEtw>vvނ New=` ?pG  W05,]Pr7cp\5PFƒ]6]E\>E*CX 5C%^Ef `WL =Rh@GLtߛ71^2O=Q0@q j&02҆1P!諚%?8fS@fojNeXlԾ˵b[Qf-m{޸ښnn^ %o~uooo4ptp p_pK4q7tq#q r"\q&G!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,*8*\ȰÇ#JHŋ3jdHƏ CII 4xJlx@̛8E@ގI8>}40$@@d4AOj*Qua!{I"бc9 P/ҵ7+׃#tuD 26zvCq-wv,ҶNY}Kf =z} ul)4M]'D@g. 6c0Ff/ "d5g^ na@k" V,?NuuWK9>w>݄ls9 ES 60 ߄h=,NXԱSbU(nsc >L+|d!Q`S? <r`=q^ Uzi&^b1 s.J&\`S+10j.̢* &"xl#ECఈ= ѭ8xṮVk3w\"'db6w;ؠ(gM~Y7iB=`$.T r. ^A~͈(Ȗ`%\Q96eǓ+8AQwt QDۮ;ȃ=I{!p8hS`=-*dŁ$ ,A6!J#v ` JJ50 íFx8Lmdo }f꣄'$40!WG7ч!jx!Q$ O"6&q r#!"ȈLC 4@86N0h =nGQkNXlP> G=t#;{4a`| )=@rH!u[,=0e |$S.2-DOS(Ic !Z=ik갷*C2uZ3!a%e3^%$$ 9a:s A6эA$ xw&ĠRD?@w:!LcӢMa//s@S]n6*D S A^XiKg!hdJj jJ684+0`S)(t'`)nRq H(w+`&TT|*E&b}gYDS=v6Q}X )FeHnv3|lw*|((uMu`R} `>^KҞ6"O)@#D9ťCQBmjģG\ 9WPb0u1wrwOR8Ll4øq9P6k=Ы4 "]h*B@N (! d!oo(~ӆS|G[p%HDb@3xoGafhGGB#4hdPM!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,. xo>}*h>s]8mF\-f;Bh /P:$WXyG榯y/ H`e[ | $x^W7wP=f bn 'hp&}MW?,?N.;qFQ:t7wDԇpt(K4A(\ҏ4A(W1†2"aAMI@ Vz S@&4H%<3m6wy:W&>H;$`ܨ񏙍w6>H6P:Zq9)i # 30g=l0Z몭* h,&k 3+p*WL0r2^bO(;GLO2Hsm4 t@-I41䳌&psNO0^, "C7@Z!;ps\!tqșl΋أ |}u0sC7\sS]N)m uQB=( d4Tj*|*: Q lQa>!WRRCu%H"xę h`9<wGDra5E0rBL(2Z{; u$&JGB7h$gFEҳ$'Q0Dd a)| TR;aK2j%2i88t%HL 1`# (<ԯf܉uA Y kx%BNNY9 @ PdF1(`y"NGع  >$MgRI G0EB@/\JU@xW.Q^=զv۟+ >̰nZƐ;;jֿ ˬBd+<|P>,wKNٖޯm.%巎g$Ggx T.#HpK(gv̵z]s;@m=\=v]w 38wIO=a`~-#DBajw w u-=? Gq+v:ut# $Bр@KU9LQu0}]tXO0^, d"^KjN  iU 쭍m8nFTpel4riX*E!`8)t6H=E$v (S^IA3~M$v CH[p7nחLQ0 Ua<^L$#Y"V3$!p3@wcv#%HqEN{P)KqU9کq qT@UB3GjVrAxF86gI_sA, 1R*sHPB.U]F ~#<K)sV1R.dbJMC`Q n4ӞE CvG !'/|o}SB n@ݿ@o???|*ȱ?ްU@FE !̩F }:В(d)A PFtRgXuU4C@@! iۡK?c G98+p9) OFrLFC"H eH G`?ַQ "z?NQ)d&[я:(>1 Ȅ.`O|TH è'˹Zua=>BW&pцR" Mp#iԂK 6P]x&Q `YDa) o'zUhW3oyfJ@\u8(E\w0׺ $h+ꕏeh"W-Ҋ! ugTc㈂"9yhNz A*3"hG8p܂hAvےzHFQ0hl8!-rƱWp<힌^;&㾣LEڋ1ރԗ98J) HyRN>lFC_rU\ 8M`Lf`n6D @Zst"|4I@J?$d>C(>AD8Ҏ>eЍ*CƮ$`ϵZps%E"Jh^K!?jגs <>׆# 7Yd+l=3@ 2A)@Zf  <#m`> oDrui :q,s9\ԫJ rdmvb-#vܓ&܃SG*=W0O=ȳ&#$-=q{`={4x.DOH< pK@h‰7F2^b1=c6 8x3Y4!ܝ#(g-~z낏 = +L8.17 #0g#}W< %baYabw'F3-wsCt0 i ]ĦW<#egˡwn?:A73E D=+w`l-TZE9*1X,F1 0fТ` LH|cgJP z O`Q"GEzweubH$MpDDԊrl@>`D-D"R4ˀK=08‹R`L9(xw8!@';UW3RvTAMn6?U~EcU% CP_e@(Y`gj:ɒQs@bTs$H b@ D~B:YI\t(bX s > %}RTgBmv9#ZFj78L! rY|~ϴM@ٳ %r<` #@BN) B<8G!w A7gQd)NgaMU->OPjKR!3pQ{5r ,*֌ɚNjU;3-Dno(8AXۑ r3(;L!)a2[)kYohD-Q0s15g~L\:C@]e3hV8EIo1Ģ-vn7>8R=Mp{J$);Z-+É78nհ+ksܛ?M袨Ī&) cA 82:yhGIp#DO.< ;ib @lx˵Y!}(vcM࣎bU6`ϻ}?2{!,$ϽF_#crų}>Z<0B@@ 0OA&wASxz@,0m*#||@`(@!cdهҎk^iX4 53w-G(Y ?{rܗ-0 ]*',#z(xgca؀ {D)Wz}Ҁ1sǂQ"ǣf fJijݵ ! ` $ppiLj4!}U)9P/qX0)] 0to@i1;SȆN8W6 4Jxx F$ ЈxHh$؊iAx؋8Htg=0cXM5e3%FJgSI@ H,w%xx8iqbs%X ma($%ZTX9RqmCjX&-r(Sэx x L94 '!w%zZ'eRZ A>[hRtVP2aMr-4h3AcNR/@B#@~q1*c)@/)*O y3(c5'+9ݱ59C^3%@B2?4mgD6Ӗu!^is-Aǚ0%6w@z((:60 1Q y Tc*&Q%GWYcFa?0;7rC7v 7W>uS89SCb9G!v&W:s<)7f9xIF>3C6 Tc~eB(8">#! P7Uk`,S2o~j p!ES-V)e&EQa `NOiHӜ(v{ڱH2# RPEvU\Uv@_%sY _uub ,66bZURz@DsH[IJYetR^! [5[Uyf"t1#ک) <*K{(֬ Ʈ@N]ujhap}ZoKbq]fd^jd [p "<Ǖsаˍ^Hg`V]Cs-9JBdDVLl{ yiq[[yCL1I`!pit$Vݳ` t+GR&i^1 ^FK SP%Dz-FytftC`D'1;C^yxpyu;w0 AQӄ{ *4rj' ~00Or} }*gշ8%90)+~0r}`ǹ[ ~Qt;~G1.O>{ºj<9HqNꖅƸ{{t R=t$ m mU1q/]`#!02=4]6}8:B?P~G? nkBtW{m?pKkJ0LJ)ʜ|fHClo Wr/a sN vO&fѢ-Y TТĉ# b.\S(hA\P_,%VArkc3a,e9KZֲGFhp9 |8KL?iRe^ ^z-9MjVӚaZ `FVHmHAL?k\aJ@ PR]p(BnJ/F0D&JjRQ`Ha2}V=P8< Y6rx+:P!, @ЊĠ:Fb[ޮ J-QܴP1ƂZ'cd^ᔠ M !& g$ 25>l{`ío~E[}8cVR3+/~Dw"X]n" 5onW4!fM}_x?H$B10* cw(juH2S"| x>Rb.Un=tLCzG&FkƂ.CWFc&ę >e4q0h2@#4=40"SM2aS*(U2tGU:kB}Y7Uk]F6aRfTA>!J_G>Q!`pl7pmpkKbDlF.=rn(|4ȇ-}Ёu8%T#.KH-ZR@ExF\^zNhAPNdVhE$I?rb&@Ѝ׊7{حt G=V}Gb 6Q`}_}a*h8[?g;@ }>@lpUBL½Gn6 [KCy|T q0;1TuLx!ݕzNh`&.yw :7i^.v6u/xz!;}p+'cDK>0j4% ;($9 *'%k–#4`5_#+$(<>C辍K =x's[C@)KƣT6S#f k Ԁ;:^ 8sn3{?=ì~){Hpx7 qOr;J* V"UD:w`ĥrC Vܷ{S5(,t!wD)[Ž2۾[+ b-ؾ sՑ-X I?:+ nʺ)Z1ds~ `;q}X % 0+LB ԫG҆c2'S}.0{",h x$,:OIJ<{.X8M2Pm%b NՇq5xJ9439lJ2(Ls2"$% :+C`˵[#0:%,+$0`6W3+m-0s "WB׉0yY&,{M6uD}ͬͪq'"{=.|؍u1Kj .s* kرx@>ؙٜٟٚٛٝٞڠE׶a 삜ҒsI=e')(YyQڭŧ~YWzZvs)!/W~Ee ):Ɋ﭅f'6d4V]zeۼpQ<Y\n(*`iFn/h臞QV/0ߌ@hwP5G"dЄhȇ߮Cl^'RIT @\Ȅh:|Xp}ÁEa^؇q7q<;]bh ?QR$ffjxp߼F _%j1yρP['Whe"/Nj$#j ȝYH&@΋p Lp&ۻe-8spb2&ts/ omF<{XDj,pMqFMrOs&go/qSS67r8%E SZ'l >gm_ȋq/؄@/{T`G0%Doه`E*J`y3W( $M}`pwaD:=6d#Ga'|@uW\& m'rG7ׄo!EKmqH$T #>4x躳 qsgU(gI$'\](V?3Jjkh(o)żar(%oTfny 2BZ0pd5V@WHDTbnJ8v.G>dgW@Oro=BGzc_dT[]z'ж? g"lWA|3N4\pa!o1R+B|Tv0 =|丣eJ] ǠL$RS5zʂChdx#a 1_Of! J@ɗCiKiBܠ4J|֛yAtF\AZQCg-#+L)Lr˫j~S 0PI@l ,  J9I :D@|Q~nf0".^5h=uLP8,p"j)jm&N5eY3MátBdq$`UO R)3 *@M9*hzi[h hO)հxwWf`TW{? <!_+W^e4u,:~úD+ {9D L%֊\J3]iW|+=yi3yD~@yՂ< O ;B~IִT꫓,1` r,D>;$'_TvE$Et)@=|0yğNݎ!Rz)qY?0klt:E (0%'G@5#hK(Q!d" 丣a")ƒ%PMiH) Sbr>qT|:3q\C-!HpƬ֦k("WZE.J"dTJot/Dwbe<F%9y<*1A/AwGBr7!"; 2b7$H&0מf$r-ROY:!Nކ9(buS&GpkȈ!לOiSTh'ɐ^JA$h84.E<H饵}}[9$Ӏ &p*X&<.&A/ Є.@&pSXn5fhdptھ6EbL`f>~Fn9fTdLcZq/n8Oj«1_ ؏5ݨ#LBf{5$E;p G=tḌCXrTCQ`H"ѡzyarnP3q62;%6>QLg0:evX99v3'H$@(t(@sP9q;hZĐmL[_F0Y7[9LPYh =yp3ڃA@u# uX4r P[w}7Ǥfiɛ!Ln /1ٔ{]X P<asGPG ?Wr 5v9;+vϺQ6f?;3Z5|:@f.}re-.Kolzf7J0숬3nowS<3y쏗d7_κ~>: qW^X|<;"Ceg?m{?>9lVOL?GDd>x 0/C݇<N |??It?X?  &. 6> FN`(P fn vN2- k_ z 6(<|=ߵ ! ]  6&a N!I_v!f-! aNp|aV!!@+!`6a%!>!!j."#`K;dR穝 V Yd"&v"( N$`}L]"*&ƠYxJ b*b#֢-_K+b& 0a܅bd` 0*bf #2f#+ -f6U>)#(:4*",J1!1ҟ1Vb2X_Z:!%*V#4c:v""ZC;rb=*:!D"$CR=cGc 2BIdE$d)cKz9c0F#ELc<%A$?*cHCF&#J.%SKt^PFN$V!""eI$MzcH%>&QReZ6[U86PeR^6!HjaVeWfajfU¥c>fB"eE$UVe6#Y:4vDB#;:NbE6MfG#Fr%d&l$U_bOEMff%X &c^%V.ck(vfcnrdfbn%6Ʀt$bs)bt:g)%yv-=CbUx"'zg@v0z!pg~bt|'jQ(&.(6>(F(@E‘ @ @&ElhII'vew>aL((^$;tH`(E^v@}hvH&t:1H}*fRiLrnib~&B$L|$6JꃑÖ쬩L͎VI1P%ӎ)+gV{*·OIL @MÂ?.tA~V#zrg$ ћ"BHt*ܹ!fX~h aWi@m$\`Ljùx%E~a:)t? ;G<?H>,C8C 64M:>?. .nY(#/p>uϘ,2<C *83@DOu0LC> E%o<*#?t8K m(C(0A@(p |CYdMH!É<4Gznp d+y lXK͚҃\ gٗoIϡ̹! r$7ՙE ,Vo  qKm{o4qQO C݉^J oy^4*Wث &T?ln-wYQn^2x(Ҩ,=C Q!Y=Dn\UOA/,DA$9,,-WZ.U>P*ry>@Y]D>WxYA*0<=4'{ pXB>,.PAQ83-2^yA&/s7g@C(@;3d\WD W&TTDt;C.a34;&3,r@r^eAG@jRߒDkH7b((H2KlMppGs@zX5=XR8'=GarWU,oT7BD7LWG5#%n!5-)H?2r<$IAzr= <R 3{WVwarDJ=N`L!( qaa&HOfQQtS/6KCt؂ Lnȉm-@MP0kW6l6/M=;́p3|Հ‘ dUж?4CD@Bv2`F ڲET¶O/^D"7󔷣E7ݼ`@v[`?lu7?@+LU9ڲD7|댶LaeY&;?pTP"_-KAnE*ivWC(^(LnrDPN\NT$Xxa^KWFQb88!6x m@l/n`G ΁̧ȏ@5_XD [d~L嬅G{w4hHsʇ-D8Աxk0 SۦQQ7 2K(I|D i]qƶ,:SӅsKGAW1Twh4ÛenzD\C+/LK* *ʯ<>X'lƩW%QI~|$?3q 1ռh<иh ɊzC5.^w?@׉"O1گ(dYg++C܏s<0zL<8}ސ +!Lu A `<JUߍX<@h7p)P#ៀ 0aDMt s@V@p UdD)@#/$Q4R:6j$a; &d.N$B@Rb{U(J<ʙ:MJ虢>65EA9ւ ! IVxQH5u.ºb&h:  ]᷾L`aReC'M *Mt9{%Nu"x_2 YFYFiC.䞏en5~@Aܡ'M6%5`GD嘇XXG.9\x\b?"fe A"ASXJoL1xNiRYr"'f A>f)z mJD{;1#`pL{RAQ:#7w2w ɧ }հ`"&+x.7V13F >1}! 'j!kxqKm?ҷ}i\K!=Po"]3TF.@xH#9Q@^a&M#6 ~,c) GCf4T4,SyCTPc㈂f|F)6H:|Xe.>/A q4}#kX1DΞ-d7D$(Ұ@} ĭCJbZSc?:BSt"=crDE ?,<#X:pbFQiB!$37Qt?'1 a8'Hj +ʑLRiH5D2XN$##rHӉI 8`0?ܑ P" hf6nq dGke,R䖟&2H)B;3.L6ċ5G0&PS”k&t x0tSUPCMUUF"JWdɩBkV[Lȇ&n!$kDW=yk{>~`P'Xoe1Yf}f ڮ'-s׮`3rBoWp; Gnjځ /`Lk%.Twa0$0gZw-+\❪yvfl >c9x[</[ɓ05a.Lj;9)/ |ZAb{;`w+vacϘ5qc=d!YC6򑑜d%/Uoe)OU"uхL\jf1e637b40u\)hAZ$M,U7&(&!iI8X=@!5;iQԥnrZRխviL= ak]RuIJ 6ۣ4vs*mqce>tMLvmfƛ7cyo}$~rpo7p/ w!cGp NPnj ` Cb`=f_c1kYq-hAX|"Ey՗"ޭwCb9KyN8=lЃyP d3-o^c) kĺYݽ֑?kEW,haA(+ov Pd-px)T;j Jt@p7}Jr+6Tؼ kgFEf~]}'YvC\񜏅[ZbX@ 4(G~l}׽..ۃ`!vߎɛ 0Pޢ@N6$)RdB8ktϮH`oO{Of0L` oDAIԏ(paLL`pJzE6 H*VEbpp,yFO xpl,`ba>!JN>aA1΀ @BN@#O֏>7Ba Eo2`Na!u `*|" ʥ`06* $"~Gb '*r~8{ zHHHhh!fr! NG ?Zpq=P!n"20rx o#Qk op$['ҽN"cp"b2,&r`mnc P, bCdE a2o(UQ``2.Q>N (SZFLUt-M ܒ&J.//&  `(/ 'H /9@w@3, r@n*H ja4rzerw22RRv7"17s8cNLR&g'lj$aP9S8 ]0*R8kN73"wp';"4q@$n: S,sv%>QNh`IRL (Lrp-w6``NZB/1 @Q"2 0'q $F1@$& m7qP UHZ$>Cr:%R#GhH"#i#8]KLKN&;% ů#MgάULs" 3Q<y+?R>/O3Mq%5^  0> TB+ .ؒ &N  C `1`D~&`w&IYU s ?zL . 36I5:AʡE3$/OSNN8}c t^uP%R_^_M4asS`$y/^r9tKor_Tbaa@ :DQ<5S*y=o=/P SSgYvoc +UrA.s-M$ JR g A$Sj "XOL`.@W~-bCF H" Į,ȕI\!$$0>] WP w:/wP7`O_=MW:tLaՔ^p)8tEP773u/Xu97߄j`S"Witwp&Qh@wnn!g? nR?5P` Bwr@N 2w`0CP WjXGu0~XU*%B-EY?2"-[ bt]ZHOr30@EaMKg28%WOSO^E,VLc9N#Myٔ`3WYӗy~YgQ se-1lr/[0imAax J`c3w*νaI|ɡ*X" )C@ Id :k':bt`6̑7 |.+R*!} Avݩ"D Ƞҵ=R D]eU=Hk=ח=z]a]|=`DI9a媠_f˓ ۳j,a *sk%!aQ  קHiP|jʑPHi8@X KP.@ahr$D% }'dCAɁaƢ٭ ʀ @Q<,>ɀ^<@ 0)4];˽!@ Gwb-=~ɝ$#]H7ahj؃SI]Ha!񯢾tߔ7u'ɟ$-/J_睄k D\= 1ZF'(]_ w"Ƞ @ D <`xz8(b!2d@xB ћG|`$| .OO@#BiȒ'H>:} 5ԩTZ5֭\z 6,Vi@ '"zB|./ECG$>8 1r|a#  t];E7È5Y[H̆󀒾s@ŃV-o|*X\ސ&Tx#u 2\I{HYh2\ ",)b0B=+4'NF>@!MHH?t(!SO%Gbb.c2(C07hlpFpc_XYg &2.r=R6dU>tRi?kBh02fz !U&aYIB}QNYSuJՠ>x<`I>@X]> \EqI;]67Mi¸csFo)eÂI\p>qx t!OQ7ݩdAQ PHg@E6LrúT,ZO$6>פnvߍwzC%@ bABpXpgMMO Ͽ!T$`,!wU!@ sNLWp B*r@8Р"E f VؚHW0p6#kNW!h#$@Fpl+a$&}?D%Qu )8&c)=?/)c+xPbQq5dJǗ"Ƣ9MUK>%eqt3]30HY1ѡ<0>)#1$t>.O?9\UdVeE4Iu# JpI&dM:,$-YVAWta ?P3c޷ݵRcZ_ x4ox< yD.r g x3d2+PH](y\0ab`˲S$ eW1W֜bqr?J !-יpvʚ;wyьrjP&ʬ(3 =4|i1+:'&hDj7+.ڐ`+[wT.u lrׂN=k^؅l+?Y zVuh؆uύU;*AUf8'%^fwSVUk*O~uqڇ9 =@Ts#yEGV e'@k jԴ^ Oj d|1pP:04X |E F:N$C~-s# MDxp@S)x#fExa;Z*O xpU<7/|LJF. 7PC=~,AHχ>w |A%[g!!Q z'/xgxUx aAe H!a q' qj=2*A Ve*l9 PHG'_!LbE;܁K9S v%(w3mA @o67e=bpb#oag`^P 26yQkaCu*ggkvxȇ}p@4k5 2:#`)w-)im` Tq8v.ҡx  e(*!qlwk1CqeH8u8n! cO+gX &XhwdvƀQoy('kڠwq0RvjOP&7KamtP:Ӱp鸎X3  pvTRƋŒTh:OHXHt˨6F`pZHqh2 ġv p?9Eili #tP&Xxzfmh(p#a@Yv`gpjmb _ 0S`6զhn$0;zɗHx* ;i>?Иr؏ 7lIyyn8Apl^g7py`FX.)#Gd kFG ġA P @A *QeY+ifpi Г:.t`ktd%y9Xsh"[p韈'qa 0{R ʰp~'zgz"  9{Ӏ@@Zh)J; p)b3c̠'z川ky AYv|;Zz7+酇)rh~7)铝9tkȍI Q(x7DC5=\K`wyUDpI9d98Uhk KPw8=ĦRlJKy][8&yh[ ozUDV`rwZ椺 0U s Ykbeʫ^ݵlј"f"ۨ7ګʬ-R`]i8#V8 a℉/bǪuӭ _f1bbOWeCɭh7]HnJJz7jʯ +KBd:%%PU 46jtLp @h7&{?٤ۙ(-&{,j0&b lop}0{PP:Ӡb>a:䐙٤$ 5z3K?[);{(1*ǰU.D6_R14)[ũ q"v~)y3$ p%m]K(˲upJͪPrÂm[vBxy7+!$E+F[pvq= 7=4 Ug,볈PHjE,Xs81s5b/ʠ.Z .4/Kj֛T0U9Bķ(΋hpKhvK(v:7'g'W/xvA#{,!,j#KfK  {wy|8ɷ6)w ~G IóW{I  &5Ulz? L\f 5Px{Z9`yGy}wǿggvyAqɗPL~X4läaK%썳*|,\F1p3IK&!bP, #qg>Aҝə| PPvB o9A'9O39! 9@1pPf`֗'U%*;RAe #\Yjډm@žL{`3`:sXꉻVfTj8ˀ-)<ag1k9@bT/MyqP\!Y6_p!9}&|G8{ُUi`*mFЄ ͯ[%y<7@@lt7yx׿ 1N$d%׈qHﶷdpNՐ Up':iw{ ؖLcZfRq-:C`^Yfb)==1FͧJD*}U؛*Q pf Pvh9ڌWFmdބfk6Pu{xُ݈ '*m5ZC“+ւnܣm/&ݝk֛ = hy˃iI 5 98C+ RW;BYƤQ( Вe='lmwiù^XE+VkVin7:.lN [*n➩m}n9$jh1eihjvy@OJ^Z䵰' `/$)ň[8Dܤ48ì* :9M+ 0ʢ Ҽ,Ns7biżjQ0:~:: m).i=m ]qEd1G5W bE2B eiTz~ZD+HVUxN nT"gU 9@2\ jMl* ZW[~7)AO[on3[s`Yٕp>_s]Ɲ>jl)<ow ڕ߸U;c߮.xwN~};Gzzc-vd_p =絟aq0v V:ﲠo=6m0-BG;!kaIf)#3jd+TNGjiuBR'T/# ]_$XA .dC%NXyM ,2 U4`Y+r2ń`Ӡ͛> fcr!PI.eSQNZ!QH`3"J6 IiS1>itwE][]y wr @`X xI`}¶ve3.&ȓeVO_:^+'R\0 giӷXʠJ3WK#=[KnR@ i[d= X mEWDGE~2maْÎ@fkAtA#Hwx TbĊyAiȹ&P$d4枘!/tr$|@FYF\Qk6 `_T{B{Wr$}8eJsRJ)2wG'M88%K"'Gta'/qc:0Ŵr(-J6$SPCu ݉L|h?YJDT1ѦRZ!0g*0cbKʕ dDP8VXd\)lf[l)6!jŭl%^g}`g<% XmZeSHb3ָ.A]FF _Y 0Z6$.aVQ i Ix坄~^`=8~ ,V@.+[űXF;+fCx6N@+[7|p 7!QC"kĘlZN}-^Tր{0if(tv"Ĵ} sFL;uj92HgOlA8n ˀybsk׋S7|0$+ϱ[}5$%O%JY-&< j@d\s`CA&@ 'nͲI!JH!,YR&3@QC$"S($T_i b5.|oM^ `o uIF3nyЖ(A)K6!GZ#0>#/YQ^Ĥ:"k^Ѷ=D;-6O%Yr7`' gޚ=~}o}n#NDd%1O[1XO, (]RljFG6hc*#k: @B .`@5)}@Ќ <E g|u%|>^awy)?\B80/@`65 @ G" }W(94@{*Dr 9`pkC.{Rrl x{zOe[wGkڎdǡYZ0vK՛⛟*G,(~Kr>˷8>0o<2J˕9 JE;<)8";8bP$5ģFR(-8Šr!$E:PQy0L,=9 ;йIBW/0a5N W'{"]tAEr 'ZyVJcT9?>Hs` [/{'ـ^!kUi"&ƨ1Gy؈[<zƷhzE$X *zgT}!貯ҩ>Kh3H qIFhͳȉʇ|sd Ax( FP7hă#d 0 *+:H4.T7̈%h U-ˤLׄ I [!qzp!MX ЅCjL//{MK @ R.^y/1LN8Ϟ-\$lN ᄉ|TOOP?\Ѝi 0ܼ̇3>3) typ ?;pL3й!+樍 @Þ(-8~;x(*#3;:}!CQh9@%#0Ȳ-+pЛPGR$2Vy(R s`,1Mt4QsR#e d;Bpax{%W}St5/YL ٶnk]TXua,8K`i5'Q8!16׃-Y*UadP"W[Xc v<0wP?L mX|HeTxNc*vI=bTW8;z(+@kXy ?1 )8N櫌P xP( Ȑ09+8y9ʐKo,Vps9KhTja:|f9PtNVPo9sf0(A};LE [K=B;h܃<6ә BƹB ;$N( ܰ15[7) *tqѥL(SF؇V{!Ȉ+F礼Z {8:}0?ãidX=>bɾ$档pUJ^yWgo0\˞ciAa]z@?h+K]ׄR-L >X|Zb@ד#E:<ۤK[<y[Z*!̱[ރ!XF,\ony dprh`!sx:M[žѿ{G~M_07آd RI}](L; CFL?d4cV 2e@C>\d2e=;9r9sHW0DؗlthHAȇ1V1eCsb𢣍 ,mm.m>mNm\lնym5O! `x֡01K9E݈hMhN$y,lbȈ ԧHQ$\ iR Lh;-8 ,!Gq,Mxڙ͑m,Ȗ1O@PHN( ͈~ eHqNEq!qDE.oHD L Ŕ1,} rp 1TOb\0$(ju卨[ ]'28F@*xfT29} v7XL ߅Z*3mus^n"G! FaYP Zq%'E!SJw-ney0ShtH#4[ShuNIinPI=RM1j7gˆL,xCш&/.Y'nYhfXhz1?(Y`x4*&Α:њ1&zn^x)قLH=C0$XCG 6@3{йp4MʃmxÔ]*s`| Rst}uNQczr9*чw*݇pn_gHM6fpg- Cg[pƎ:Vq珩M .[;z;e3}{ ֲl [X`ƨu[kgZ!ӾNnO_k{6aO3+ хW2F r` pqFOIĄD74_gMS4ڀQ ` R}C6A:L)^tX):#:`Z6Cv-2T+< &m'4S\6q\x I~zpʤ1ֽYgA)G,t`wl#DZO\H7RrH,K&!^nPD-:[4,q {w{f^-!2 WlPs ЍJDg = (UiSHЍF1RQB&T]\׏P]D!S O|SI#=2eWn%GR{pzJ7R/KXKquY)<4[+Q~3ļĕO䯔:X' CUABGp&UK$̇㤣m&yӡJ5{+z 63[MI_ d _ _M_5[ ^>:FQ^Z^`*`0I3_YSan Z*C _ܤ>hxEi >>ay8ƘkU7Z7rF9c;,7D;=;E#;&J>>68tA-fA"B^@RdE.ZFrdG"DO8,dEGIdJJdKKdLLdMMdNNdOOePPfK1Q*R2eS:e,RE,A#U"V>eU&VzW%6fVUdWNe J%;eX\+@oZr#R%_eYe_`%aa"fbNE^ d\cƅLAINbZebY1@(C%^MY@q#AZjN&Z6j&&&kjcw&nonkff*rZCNI=f>\gQm&mqRx2\[o~yzgd plfo2g}ڧ@.KA>XS"C@@n_jlbgjdd.hy xJ(yfk:}(B("g爒h1K̹S%''dfxh|> ''z'e2(U~oZeeh*+F&qAkk'"'^.J(}򨐪'hpViFioԽtZivmn:&{('j'iZDW dS|h"Cxԙ)&&**q(z&*'F^)Μꤲj&^jLE]Dvڪ|:*>+|֪R)gi2* ^6f0DiB檛F*Tjꪆ')ꪤNzk¾i(Bl>JlZ&brlڧfNJȒlɚɢ,Pkʲl.lƬ~,5欩^iJ ,cϺ"2.6 f5CCa#g0") aRd9d0"TFH`m6lۮB@!=)cI>#UPb b(+g9t"C>H֢+dLܜ mc N03 DC4+Q^>E8M:66V/n6p"Do7R0ZoZB>to.]jCb/ǯ>-Cn$JA$.,o:(;*-t"}5P /E9+?+c5S4>64Vڤp;22 t Gn#8(H؆ZLIQ9X1q/q5qKp ,JTҞ#ъx1B o@Lvfҙ@6r"V(Rg:CC #"%AcQI/ xXD=H\|RP%Z\2  ;1B$@!$ҠD&ӃL"mC>X2d:2ChF'v<8 3HrƘk GpB$M2y|H.Ia/ !%_8W#Ӯ9R8_s6@9oriZ H,C1qkb0FHV`PlOZiMF$#.փEPh0q|q P@AL@ >N0WAj l>2lM$WՔ)vk7Rhxw P y[??{ðbCA}kY~AwW8fD\ H +ش@:Qɖ-H |sJ v*Y|X[ÅwC=&u3Z)><|E|}];Q[#T^+(}+@y@=uR[KO*4Y{D=2--e%S X}[{±oa^U" C2(6)C @ Іi 9%Vc,VNO{^D~+jK }EkT9=B ᕅ00SmN[> I@-Sn~eO]<9 ^AX$@S$?HzB@uC˾TBD$zRK#GwE?Ydkd8`X Vð`L$\̘xhPC5ziRK6M*jԨGP7$(IWcL$QL<D" Nt;Fa*z;n"ջ%y|pIw(V&= ͫ +rVo ]}.H9t\+Pg7,Mľ'V}UE.R޽}.<\ۈ+. ˢ}'}NDu oiPaeMF|S ztl" ,]D|6 zc6 nƫ"Y*`tSFr}!)T YB{]b8U9JhAXD8KF>pFb {ؽ)^YC|C"*iTFЍqDJ@! !/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,f H*@B>HEJp:$x@H#\ɲA tiq&MLܹЀΎ% <*]tW$\NsRNL%UXWգVOIjU,<|ԇm*@wYr=HT98xL 8:6 ^>-psVpڑ ^~l۸EFguzB ]<+SX1 +dmQI|msM$OV8b{$lAcE G?ćX!Ă%( VSL;t4ӈ%7}A?)8P"ud G?ă@3Eϝ*]w{,3(]G*aTq`iҚdt !w&&DUqR;dje(|&uaaJ =x8ёRD@g)A>FA'3Sbi=*z֓]s@ՂՓNEhޡJǦHki(b41Р߲ EmA^ 4҄n45hYe2u3_kdkl 7A8b0I3D>#t*`Ŧr[=uDAcգr=TjE"C0 E6Vc=Bp:NJd0A,:uP)Hӎ>,ĚDBmR?< tNlB6\C89663 UyR*67Y n9o `? <?V=c iCvti~sL;b&A[0>s(>?_@ݳCaQ{G{O: )A@b jH> \1a" `|X a= ^{h$6jH$"Oj4 '" :rhDqG24!|#ʙr /wp{#9eh"TԤ@0răzCEsLx ! HE,̇G?T"?vCrc,@:qXNpK]!I<#^ȄX8]iME=~Y5Q<d=4Gi 9ptZ-p eYy.1srO)i` `)A!̑:F;4Pw`:CRK@PeBM5`12@QЃ 8qGrTI2 Ku ~Ta R+U)%#D"AN7P|>+ϐok{c"uᦃJШLm!3 B `K1A75PkZlU6ASnJ `l)Ƃ L~U@ &A"6jhaNbxj\Π/K\S=p"ܔ+ʘ@5Ln65ʒ茆v߅c%dnqm@ ,?=&'VqC`Tc0zEd= b:F lW&iٺc#G}s~`1ְbdVMCv+ P&@%DrYnOӡ Ʒ2u\fJNLAX0 ;w3nomk}@NӘ֢RZSj g tGQ!9!CM7hDT5 l g{{ rWX"05}-FiC_[X_rB~2 3zTuJ!҆A=;"6P}B&9oi:]t [&AT c8A9Pl) ><4'2TTq\ O, _]6?HnD8'qs8rD:?<] k{#qҾ -dPp4XJqeV~fW/Ag_ Bq%ࡠ&mɄ7wA3A*8,.Xk0"h@e%rc];Jj W5Σ=hF]v@.^|}68R[9飼w8LM@<*zTK6GxNv08#-@"1xg8@ P ̣y}aP'W2Yxd'8oh @ݧXd7Sr쇃q$E@wp)Ò@z)XwOfk/`V6P^X0?Q)\v6kGd*oVS`zV Pm6d.w[؅_[>"F m-{C QmYHFR*-6)pĠ5#\`Ct}(vokpw t6} U}`pD%?XC /c@vdW [Hh sTrxobq#f}sXw5ozF8XBdWqRP0Fki ` etapp HtQ+">5k\![f'U1}@`Q8%[{r'fg e1Dg\*VQAp0A^&7pG:]rUg=C'f{E YTxi1*1 j[+(\Ma,Pr5c2;aGAf0r)!(2Rh@ؐ q Ahf, G) R fu7E*)@0**U9iU6 IErWrp,8s'ДDU# |):^_ fu[3םR039c1I$!@. 1WF"ps Gl mКe2d lI710G@Ru$I СWb/`awun ڠ4'Mԡ p{Immꡞؤ` WQk WχC1ڥ ^ZY!a? BJФk) $PСZz*XIR12SS?10Ab d I ڤMFӤUC}2B٢@Gv1ТL(z/@oZxک5Pڠx?#I#!`CޢTڞYrWy35Cw!PA.5 3QCuv0R}=42i~;C|^c4+yhT;3;Ry##lVPG-dmU{1yQ-j{i M>?7| (+-8# _1COۯR;> ;}BuT g#]7cᐦۯE2 044[tvc/DPATkp8'11\ۯ;B0BD h56+D@5R!Or#5q1ӠWS[{8nkuqTS5-D4b5_{Sb7/n. x+rКӹ;0#+""dQP  ;ҽ{ ࢭ :LQ?*LNITTUr{; ;BE<-KG<O|P A7(b|EH1/DyC5``X|~M)+,ȈȌȎȐɒ<ɔ\ɖ|ɘɚɜɞălJɣɦ|ʨʐʼnRʪ<˴\˶|!D> ˀ e"Q\!ą|l/P1 ^k?,̰\\\<Ύk|CSv&ZOȰ ]]ZF܄2I<l޻ QDN\Qِ- m,. +*12}2MFR: >}ǧ, px6}8\-\zZ}l-?b=ɬ Ph/]BM&NL_^p-q=w.c؂e P Kt ր #Ml~]uJ0-֗y=آ=ڑm͋א ׮/s֚]̱ۙ]vב֤+sTnP|X=0]ѯP-}xJw]Mz=ބ|2rIMװ})ٶ ٬=N[:"e=,m-߽==]  =߻-*02խ3~8](@B>D^F~HJLNPR>T^V~XZ厼f\b`ka8jTkp`r>Jptz>e~o{>>k> 0  =~ˇT'^ꦞ`k ~l^~븞뺾>^~ȞʾЎʂ頭E"ƌ YX68# QWC#>pG׹6*'N|% D" >%K jʊC@r Q+]K9--#35`,G /Yc\W}킠7 ?.WN?ǼVdb.+#HYg;O( A/~FPp.14{C9u D]B9Q 0a24VCcKK'y _@oN6@7ğP Jy.PAB!@ CFUTU^ŚUV]~JJMtEx gR>r7w e$7YCݷ/ʿxeR?zBLBlҙ6sDw.̏@+A oi3-;4aOZceϕ34A9LЃ"^D a>`=% g* :|@ ~j)(X 44"Q ,_1FgFcT}hB 9ǭA'*ɇ ^G: PD|o<2F9o5}{Hqla)RIò{J9kÁR)K/Ag9QZZ}wBQ+E!ƁU+ "2(Y e "0ks|XB$:T jz2F`7_}_0ۇ_nhVϱ\ ,Ԃ^g N]xzeY3ӖN8,QKb܊$azeu Q KA⡧^ hMg$~Nc=bTTcU{5:-ɧF.Ǻ";0D%%@#2Y ږjY@oxy=tG'O1e`f!veFiRĮx\qA1n`~[]r$N-,QDARluR[|'k.SSU+k#ˬ 1(gk9, = xF.<X&Le:? }P$AKGIaZP^.PXᣱ,x KB-kIGW|z,# =^܅dy+mCc@LEFOA9WUHQg# )F,pǡ$C[Opr5d@1¢Od(0tmh^@) xP,\Je*躃YYUFuk^ψYZR6dTHP5Xdu$,P˾b`t#w0v?;>i0XB_hMs1VEVԥ*UX:[Gxp7x%>qWx5qcZ5M7MZ8#"UF<_5S"ߨqև(W%Bi;\s Q)4c;H0Ou1SkB r[ץ<{Z>{U':-Sg@XR%m@z}*{T_dmKc:8=YE_-<~_g?7WO{|^>zT:xè|OOYw?ɓ?r+s939[??[ir# s90w3cP {v>?@ ;!% sh@l z7QGh8A@G8}07 d\g!t0mx hy+l"P: =:'-4 xpB}=%pux7HXIZ@>;øxßFŤ|=T`-Rx. F@4 Ux[ 6AZh9O,1 !3BO9   4 K($xU8 HN<3OKE@E]ONݛJ'RU=)_d?E)N+eW$,; O!he9 k9:)xqH+*`T(:O wP ;P]aT1 Q-Q!IdO5}R 3uR*-SN4 +hV7J;/U#ư4OnV*uϧ+L(?Vk A`֔ѕ>7;@-7T==D`ԁHTX>1/H}P%] { Q:y̏Y?QbpW:UQpY,#=,R7ӾMVD)}fJl%65Ҁ:4ֱle\|Wn@$*Z?頥-ƔM7ҐJQJ0nܢEU@+[hEl`cV0rxKȬVL7O:At= <_\0M| RƋUیa-V:p(OT=-u%-Z65Z4V%Zu1}5=Vu^iUeݚ3S ^SZ]0Rux@PMnHTsk<@ΗtH|QFut0݁(`E |4eF|FXU@Hl{0G:U)p܄DY'z&EVm$ٱZ5%<Kw 1ϻ^ՕmdU$b$z@C9K1`>,tD56=l[z! {fBw `D 1 Aj;_ a¼5.b-M,̹FFsa.=DcTNhv$^b-[*ZWT%F?7Z-Cb&bVuJ',7y\++!8l]ZSH.xȫjkg'lDgƴzy&i¹"xhKL|n?}g 状p&6ѡh8q(h陦i}YK}o8áf|A8efh . ܧ{𷟎g|9؁EEj IV)v뷶9;٭jtkPv ^y@ё'a]hsɦUk8Vjl AAv׮ H K@m!|lx ~`T"xF?:5 `v mHv +P WLv5vT!W m.j}(y40ҋ\}˜6mwPmdCR|B'p/Y/`GDtNDaF IH osЄ4GtTGv4GAz?>xtNWeq u:SV@~}GyKXxH#r|T` H ^q̇r̔=iGȇ9 d۴# zkD@| 5?y+tEMrlL=QܢuEgi}96 QebXcɝ:7ɑJ\;)X(>vE$"mxH;P̣Upr\U5Pw䙛Tqh20ww04O#Zl~u U/ax|I": w-, Հ}!xɞ8y"xB:CETEWS[ouYՙo =Bm}P(IlIϋ0TC E\=-.ȀJxuEOwϭ6Pwd:5ײ d#O90d:x=wWH^=ytЂ=X }= =g hu uA|F[˿ G[@7Fz_~ D̴w}eWIo 0 |yVyNE4g_E< wqc݊͘IG`=)j1(9 Ex%̘2gҬi&Μ:w'РB-ꐅ;:(xFʄMc: SisL."#KzuRGn-̑iV^'H`2ŝg P=` @"O=v8TQ"PXO0s@*3N`( >NvR[2ͅ ̈́S"I@=J >oϋ6 6MPJ䈆 B IɦŃǃCL&pp Ad`-JcfO})z)Sj+tɨjꩱ:+z+TjY'z߯^l>,J;-vʫ (g~8]i-骻.ګ;/{/// <0 djQ?O +|/ZSS7ǴdPDĈ1R'הWAA<MDS.]M@|Uӻv=Z_·ՙc5וo¦>N)ˍ>΄"_ @G߀¥JL1ƕ<Ӭ;t∯D|Mw޺k_8o5ғjqg}Q?$`cg>`mVum[DEd3AEP  |Ҵd~'`*x[#F e^]JxG/\IKjT"!`L@;#&tD KT umX5R+bDlC  *@=|c Nz$="Pc[56v,]&!լhʍ2[Z98U2vJ򙲔,d0MHJ2te,ÇׅҖ1]frp*p T a1ÿ(9`Vg)=r CG.D%7JLb/@؃%#g&'(}D%s4Tѝx FhpEX"$"!Ud;QL!.jԐvG,)f0)JޒQP%4aAfW*XKΑb2'LRFnׇJFWoEk]ʷk xSphԺ]QK'(xϳG0fXΨ .풱H4 E @ҊHH\r˲%Gh5J E5.z acМSכ0EЈ1z"5xk\':^*yԌ4Uw|.ӊg5|ߛ_ve{ec\{kU8&l]C'@퇊- q,O<b>w-U8D<.A,.@ۢ"h+<7@1h\0^=wc46p|&@P<_}m-w~<̪=o4^< >+<nU]UVeEf`|L:qR! 2~BbV%m|$F0bAeD*xLe@cvr+bo6W_Ck8_NZzWU]w:ƪ=RQ}4 gF{Y; |~5-EOuKcD|ke@d:?:(ى[$^=`м(@-qAkn@ 5ϼ+_%\  qns@#Ns\j[7, O;;r;~\pF-xx?;f_[ rj%1A&A\UO PkKNӏ,@Xme#SxJǜ"q=nHMaKP epinm2;$V3%-gѽ%WzZx݈fYZ1avH=pYEϼFm XEKqLi ląAL[J_Y@%TjV>( 6@?4?`@T G|=Km/>Zs p5JQUća=!`yڿ]U"/ ZXݠ`1I!ۥ^a)^^1X?/Q$\ u_B@  !-,$H;R\1\D2DJ^ L EFLKȐPd,7C$tVdNl$}#Dr#ЙJcHJ ``RN%I$|m!K죻QġQVU^}(U$VvW~%XX%YYe(%[[~ `̱ ] ,f%\%`K"RH8!IGtD@(OXbDsp\H eӬ( S&j¥ w,B8Y)@&PDĵD4\K7h~ 1PwGj6s: |5Zf+ fLx}''E7 sg`^1 dC'1)";CQ=A"ɄGUQRHlXXj=⅜( (h:TU0Fu? aL %C0xe<-B|?A> ]ڮ$~Hj .h` Ձ\!W.c0[؎4-v=lMA;(E5 y6aDA/n}ƽ->h[/ R4E3`C ]h!ʑ+șE>,L =ܖx?Ip\L(/^a*saa q.D A tCҩ- 0*)6Qj9n15>1?ª k25"vH A1<*Cbls3[)l7b^օkՃ$Udo kpJI2nDά/(C &oD&hVEdFTщjхޅA+/BE|dEgtWEV D Flr%)SRqgndpP$.uB4Bqu!k Cm lj>qeAbuB6;?|smjy83 M?p2? qwx+Gzq{+GtHq+f HȁB&j$2H$gJ|( \3 I>MdR5re D13i9o\l,ɄC=@A@õXp=N"RnMP ըn*7- `u,@Ȋ^9^ F(`Ż8"*LQʧ$|pTy`cGC,IΟxS\+'3C)6}LXJ Ҿ)~ gӇ=4"U4DYe;: j5OLwջo_jaQi Ğ_NIBz>LM JTRV f(A(P6۰6c:::P&l):kSZ2n^sjlAfVq9 d(=;y)3p"X%,b`{)V4E駎p Va-c}ʹ`AIF](Ȉ@CUBZLƋ8 P-}w*o3'\2X BFQFM)!gT%_X%W~mID&_X"k9N^wrϥ [2΄ZFY ۼbUgr͝ AWKV|pE-N[mCG:|' d=($n pD+gT!hT'(3%;Pr'8هEG @C XF^4dT9d #Mj thN{ބ(YBÙ!15w*1\&`HN1e<@2EEn"hN$/'qa`!viN`O;i6i{By) fӛ|槸s)PMt`AxXғ"F@)!MxE YꗁVES=Q&`(PtƝB8M (n2`YliX_ײզt%DQj6i}j`S7r%ĪWUՂ"CwKr8:"nI]G4nnΐK9C|Iq6scna6$oٔ@>)]3A6!Άql йbPGP R(ne( ٩wP#A|<#ыRXoi($2n&֢-R)}JO$$AE!?RoB##4WsU׈gSMD%H3B$MX4ZHǤ6B40r* (!xRu.rQKCiF7JU DU.rjrCKG`}!xDSPR0u,ENT $/duS8u57N-Bb`05+kL C48abROgpoIaHV 8V֯@&^Ig/@+F)TJgaig9J>eT)0=eL!RnU4WdTu@T,QnZ߮8TmqyVi!J`_"K,T*eN< 'h5uktħ8aCtAT@w"aoD9O"ΤwKUEma&WDbEry;V{wVV.:X{pxeVq;w@3g{8c7ld2htj;a^^>/k`Fff(Z0dHA64ak8]lr7-6[ a& ^ƒf__ix͔dQ‚AeN_MUlx5TO|h4ZXkloR4Px`7~&h"t$Nh `_#!8Dfb/ָ\j>иcFMaHq`vJwƊ݅^e8yKmkB/[jJM&_ JI['BgLftXa [=e7i5Dzv;Tô'8.&ny~R FWqAιnKY@̶PoY'(cqKL'r\a9.(CGgd'.,|x ǚTByyQ?'tpABL{)qA^@{${웭HD0[t¦{Br.rA0q {In"brfn'p"¦Z=tڇr!Q:~gGdړ\qZ]Ns-&s/tz vVty/pv{|,l*;Z:CnJ0FZb ;XuŮ~[5ؗ"(J!+&f63bJj0g6D]F [YXf.j-ՐX/Xh0Yġ < /F$ͻ_A`Ƚ!\";m01<5|9=A}E]-SݣGAK=̩}#Я|{U%~'>.28s]opӜG U}]Ey1vd]Ww>=ѽ]A^e_I\|_sA "A~>xY~IsRkuZ aT ^Y=م]>硝۾;|)?Q>/?+9ߋ2?3;IMQ?UY]9? 1)e+p0}NI: _1C oE[ӆ~L"fF߷ ]j !I܋I1jF*\! '  B\ҧo>g8|;@0c|d2ȑ!b&JX2L87K \Y<}8X)} ˌ!\8P֭27v 6رd˚=ڕT]y`ї BD dʲw w$Krqu3p1M*)7OIyLS|`4Y2`yٱw)11Mw2,tX_#ȶor˙73Y`|gF\þs8^ջ?ػI}+>|{+cH>lCM1+ 9A56> ?Xsu59$\|C$@0 %#\̑ (6eZnu?ܧAD+E:VSG`M1 ##ōy?pN@l=deB6o>Kc"M>ԁuz:I(th6 ?NNTf5B(" Fh"=r2qA?BE)t=S C~ рCS OA (:H զOG&Y>r}O]6Kshl tc7-@n.7xS#u@d[t)"!QNv=9B 1$h9,@=!$(sH#G=_8 i`)W?s#:Bd}.C<|4[D0 !؀"IO-JbJԤAq* >`řK/sF3*ŁE-bnL$ƈ}$L`&4+ yD&p$>&YaGU:bR/BBF(@.*$-z!E t`YZ(5JѕRyz*α#FJ`u$=JP\jрH>) K 6f1Xh@r.@U0ÑWD; {a1娠>Z#&ʸPQ.?ȉr=ȢGm!=)HGRH 9҉Z@ 0%KsԐ P#k1+Az$ ;pZXaPU-Hjʈ =[T !SFVp:KtmX-"Fwj UJVhRD*}("VZS dx-F@ozaqPzH%R8džB6jj͐G@N1U NIhch鮩Bv=+2tN[*([+Z&}kCe77>JLxa; !IP[UC/BLc_Y`yD|3 Du!QtI* !a}Ilvxly= 8K'1AGot[s"?pQ+1 0``7lcN֭s}φYJ1Zw>ߐ\~ LB^ͫ}D䊺:΂iE׵r]q{q,l=QeCz 0Uؽˉ[CdߙDc |ͅ aD5}X&WS @{Յ8؆t @8 G}CgDr0Q0 1~2q8e;G(`r2o ̘7mob,DG-D <$R`ap>B@j`  )(#1YF^ 3PG @X/6vWh! Ph)%1% )P $:Ƙ0 )d2 0%!uɚI#:Qɛ雿 )Iiljɩɜ i`),\q))Zr\biC=-/2{9<EɝbB a9ye%5gqag' *X.2`C2l򩝴d7NcvQ]+&CQȦwaa0D> @f#q X(2 ply+**D*'3GA:,\Cꠑgr12xtȡCEp1P@QqZ#eA' )tOphAQ{;<QaiI-h*Q#,`Q 8|e Adn2AvwJujF" !$U$R'!$"?B%$0(i4FG'P 5ap$2$L!&b O 2@"۝_hh|Q\&u'' S..`l@V43GF3/aD *rɩvI |T^06G4R#$<,F`3qD/؂3'D'ްt.dh('c3")-/)/0qA/(2h2C-'Il6˂I'3a2( +#.ӵpooK/3*kiB* 4A4\CH-ţ CQ%D@3.UG6T6cܣ6S8q+D!wy78i\Bwb ? 0{e\,'_;p tAC!PZa\C;%5+L dc6ś6ރBoBr0|7;?+_Kw 4niie4q)" ΅(m&hI p>Kl g.inFjvAj66oWp\dly Ѧv1O1p$/i%m o!kgrj[Ax12bDx7y3-kx't )t!W@NdR~yz*R arD{rw{I"@aJjd$6~s wLGǧn,Q7uT|rzbRvgz:zKQp)" Nn|钍~\|}DzB7)}ۗՄE'U~k8 3exQزbo;Ѐ:7,` ڠGPx ( paTς Ѕ6)mOND/zjcyv>cWw@~jl _8aˆ7ӁE &*i;Xɠɐh;W4ě#?N}W(Y-34u1b(8'XcrAY8Ց Q`1Ҕ !'$}~q?y DE x'🾂3LC1HeO߸(w3ʁZ^uD &!=0L@#j+"mP8U*pMN,ӡ`yoŻ8`pN>z8(7;>hb]/ [PBs 2ftG2㨷pɔ /=;/O;\r@ТGEG cH'DUelٵowŏ'/3dy"ѯ}{ϧ_߾LE dϽ+tA#$\2$|P.B;C=ADSTqhNpEkFsqG{G rH"4H$TrI&tI(oD)J,Ԓ bzc&PE< PO `P@4?TS62L -4PE3tar|{=MɧјJSp%7m}8 ;pݲzEYC,P]̘ Q  Dm5;[s{(Gu[L& ;6PYL -PWUjE`R*C _w9͔RdM6F,e̅l9WJ& p7?QFi ccHacaТ%;TW'<)^&NQ5I8cy6\P:W ~g}wDْo"9tTfe|ن "bC_O;rJ kouQk>-ghͮۛ=H\p) qOg( =F)Gstly;Iďr./ B Ab$\] Ǻ!m^rzy@M膏/P]"DEN <`B p !6䰯]P9c-Qټ*#}cDzwikAD@yR\ =l{ 0zH0X˞Xу}N{ 0KTq;Ã(s/W%x#}l v5zGKO4 glKIt >3 xEPsT( Ar(>0@CCh`'H1cE[wRic Zu V>`r@q@8{\9@"Acx!'߶ \-.QECWgЇ.ȅ2@@HzCJ[4te>z EK2H;4-j^XC#8&3 uhS+p1g7Y 9R,d{ag9~ur qŠv Ddh-$z!UըUУ (KO9B \]џ1\*EyGɃ^X`v3?b}DyKTW9H?lq{;avX PJ=` XA@-]Nj^XC0B b{mZ mi-W[tr\akW0ύiPHek"?z19M?BM f\4ۇ V+S~)"e* sfBжK`\eQcPa} `]UWÍZ+C/NO Z@tya0r&`一 dבU/g-wty "F<&e(inyItsȖȾBàe0\W?@>QhV?1Xrm r+l ];xl ߇nm v-Z [*/,̼~>ane =cYh:hg/R}C{ ϡ<a4HUnvq%FmD[ί0 G"9 e6ꈧ3Ŕe!e(\ 7>~j@ @@< xybmgePYШ p; igEd! `EٳCꏤ`Q:O< ît0n$j\c x{~@C5qCsCueNA- 6dJHف͚! ]( |ҧ .p 4'* z#T sA &x:#4 ȵ"<[;))e%lxȃQ3ȋ ?0:ZI; 9Tb3[ d-:Xo( B" E:Q- m W<т.D [*[A*9:PbKXFE,\JLAFn i5` a,F/ P; 6hűF(r{Ȇ,ڌqr|tș|g LgÕ~D\C0CIDw``,۲.Er{HMB|Jg!{J\  } K{.8S9}QEz/Gh*{0@Y_?x 0znj(ℰHL!RKMZ 64 RlVJ4;Ax0YJ"x@K$tŧPK$T"lٚN8`siCLp\hԓ\Hp9L4EtL3L^ZM`4l: \ԬHKRۼLN/l; BNLQ3~i ,;(Bx 4~2RK[:QP@8yȇ} H̷k?:} F Ȱ 1 SQCtc#J83%= )q/G qR< &M ҩb+-7--H(/ՍᘋBUk :衂pS`ISRXA0J<) .CH^ I%J!TIQ%CyH[؊{{} X)%EJX}?-XN{Xm"qS%xٍe0MEYY]ĔYYYYYYY ZZMZYQ6 2vAJzWҤxx8e폲]Z,9Axs dH5Z6Ӆ.#HSSQyVJVV[콞xahca a\Zh8qroqBux.0QE|\AhV X}7B%al؇nR2=]PɁݹ|u|K?)]Ց؃YLEBa^}x:8xM83PO4Yh[jl^[Ie:a_Ss\T o߱ʝ MY6]y81!Xa:qPsPc$Q)̹QP53E b$,"AӾ_Pa3:Hr#82ݤ4b4NH)P1}8Jb mx01#4Z ]ʕ cE48$G4 nFJ`lr#Jy ^_f~vf'e>4K6/6ScB&e2.Y[|0*aq*@|+oϽ"(GF0HEa44.O)X@28zސ0v9P3B{f8oZjjݘ*zMj] h&Zr>jM_x9~DåAc[${詝V~}TЇN*=pɱͩ~-ƆΈ/.kQI֪C<0{9 !vj(wlŊ^϶k3x2;J8U؇՚AZY+v08/3K$$"K:ۇ/`;9kʇ|(B^/r'fӱK`B/|H:Z%-GJ,27B"L f{H{1٤/:3'ʰ a 0Lb @sEx]]SA;zr. .$1XjCM>&['3Bq0/ю(hXSUFy5V{$Y%7Xc7 iZ=T 9A9z7n *+BUa8Q ҜCAOo+/x{FU{8k5@õ9.Xō)^a`6 `q2pwqs>a.U7jwP_S{x7AH*XtZ.{qw5EwD}gM7w48øs7 ׍.5_3m8%3*|3g/"c_CL cpv_ȁ[> < &=$'12"w4 dqa*(Ҿ)(5rн* RI(>?LQ:@CT@&Nv쩷'K}ߒ%ܙŽ@,EPu% y3Ŏ!gP!$tEA`NnA{RcjsΑFB@t][e{I1 `p{M;BX3>){҂_V#&_x'VE~pFOOMS[p5Aw4CCYYt-c6@ēL K ' l#X3gC8Nch4 c8p{58xClk)1 b/p"`i{c,ބo##+$C9 6pNvRr͉ŊbLN}#c^se4r3l;9z3?:Ђ4 mC#:ъ^4=g;ZdJoV4; Ii#q q dyo?t'W*pFCjXǸ6 Q~sM=._l6=`Yٞ69r )Ucjժ=RiZC& p7oys1ưM4GJdkpDr>V-w k{7>3XޅlpL۴~[/0ЊpD5an~W<0:}S{wi|)'J p |#MnqhҲȮ4rN9LtC}37Kiǟ|~vA sDހrlc[(/䦒{ԓa:t#bgw(F)KQ5ujƶ2 e)f=.P#.zAz X&> F)&C+?QzÃO$@"zWUzG_My@(F<4L Hp2 \j^@Zmd7H(Є8EDY9_ 9Cb$%]l@w7CiVyW> iYP@+lTmxVR+سM WWCDT@m(#<>D XEe`IPq\UE0!^"^quۺ)%^ P:hUR}=x d@E>ԁ.0<=q.R2h.@0E47T59)6A,"0qB Fb<>H-+ʁXQ@!N %C0xA9p#'xb9`U:cJ>O-!G*'=H&t$-:FO%)H&UTEh Mb)BQ@O}c6A<d;/R`mZ=r=>y"Kb%^亭_ʜ$:X$] PbF(1>|6C fO` |A|b=BQ8eK7lN̠&Y`e*F%Ѓ3j:|LZ/?EB>%Shz DC2Xak&mgkokҌݬy@ Du]N"/%rb"&"j&ysƯ$_\T̢U K#dK$]CqHMiiBȩ2B~[`@@JəH)ep]_lf=Yijj@ dCPD|3텣 =ӋFiک2m\)$>m(c%N "#۩UPtpWNs&H  3x ,<4>.o 6@LI(cBb" 饓&A*`"`)%@=,j=\\E(f&5FAɖڊ>+KhD9f%( */L0LZWTT$TUVCZl$Z`>@[^H͹t^ja *%û%Dv6SK^_}E*-lESOlEï.Λ~UlJmlPadW9KLNNDp-t?7Ёy-T1eHl.-ZmIMLG(% Mn.j85M,!"_\b-cpԆ@׏t^` D̒7i"GopX pAZɆ*ʆl[l'0^dgOTe@_ph =̕roLݾ$ df  Miup=kF|Iap, XGI)K7 F (ȜQDH O(nn S`E__$ /N` "z"g ̭xU Ұ˲ bLB0 ތE ^d%L1zTscN%NH v$4P%4,^Q,~͓EN 10 i-jMn$=^ 8ఏB4!T`lMMՉm v|3([tB\q$,/n"*R&>4e^.z$j Hcѫ&d7GF< `B.!1QX2S5QO `U;P}E5%u M67厺(L^H5bJL׏܏3l]) p<&tI5>`Wӓ"OyeT+"R]c$:JQ:B9NXĒ)}AdCáɈC-Lܛ)yDSq2gIa;6cDj>MFGAU~]]W;0=wJ-UuwAFA:&SVWf_?)^M@>=@UU7T]IW|i7wW`f1jMTT÷0LE>s#(TQUsUqZTbM FxZr{ݕFa|PUHp=H*u#Vt煑8k3G^y_nX!zit,KK:" Y-.(b:"Gd+:ݘ?Y/Z7Y^:Yz)WKqVaCQUzYY;ݶ8;zںz[c{ks{{{{XA){]xqɻ;zn[޼02̈́m|cC ) (xPMPg|b$8J"bx4d&}@ܓ3sȯ;?+4|CNSM|ܹ"?>.aW d)8.'=gCLX.tR DABW^+RW)@VӴ5[g#cfk 3O,j1q̂ >^NO9Fz`|x|V&PX. ='***餌هcYVG.d H g(USy7;rUg 5XicipZZHgoåErWHF5k IFnxv fE_9aR@b(j >_9Ie }5NIava@R hwor'#}f'3D5=wK% |j x ^Ny_vh)"^܀ 0"P` _%"RWKZU>k~k`KWC9H7JJУK Vq 4G! =:` +o&ICH20wڟW$k>'!\ԩ-ABH8Q'ED Ɗ\H"vWvFɽNh3 RI“iE*Bc"QT*Ô/(06 xL+.p#hhB ^AA#>" |(:e/+LgfьLX! &6 TC߄&aIu*e8G %1IG*2kH.3 nf8{#AP~~˟S\ %I^tQD@ 7zxa }APZ< Ful'z&*ֱz@S CU> O0G;ʱ TUW?Қ|cjW V$b^ Y]V}íHSQ.ﮎk?JRֲ`aD>:c3Mc5>}Q"^rټ69-nkծ&Dig{ĥv[F7ow[^U@4;D4*~_6H>6&.@ V`?)^p9aOX!p*5\)NoXBUbK51zYVL-捒cbndVY.=ֱA Gl1ӸǮarWf'XC3Kvsf9[ Asa^Eg4oʅލIHg%S~2 f#;:ǒ s?ԞtY:ՈV-:Rָ۝b^+ל!\yإ&vf_ŶXahPv^է޶<Ԗ73嶷mUVup oi&)]冯Ӷ=oL?Ǹ7#w5ٝ}&Ź_{9 rF9q61Y{^k;> cC|%G9/]gz^p gNpS\mn\-/_w}47o pX/ d  %Oq/lp glp (pO:~݌cm0 ni?QGtyv)vPE:j52Bg.5d?wŻ82%4}X28h+3sixcٽOle#'} wq ~G#y{QaNe*RYsy!e!"3ҘL)҈)"n@,؞q)h5.)*RH)#A٣ZC}ఈ= FB6T$GB&XԞf_%H(UFy(. (jgb)ԥFzݣ^YSrX'$iم4l禨KޥhlYh(z.vlm:2$=iU~Վkߺr仛šEX9.k05{d)qO[)jڭ'al+֨eخ$S$v3YD@)@P<Zo j wFܣrnn%UYs0G5#G-5Mc6"Wd|F+Ͷ =]ȟv)?KK`a\jk(xȞ_;ےGJRoϼn|l'\J+ AA$҆[nS-ϾqWƢy?o`8꺷۰'ơ/]~=룃_'؂Ȅ. |o\ŴNR:o9 LGt^Մ'5k&3D]D\r^p7"!{c!Fv3@G8 LS0xyp:L>(Z1MbH3HQimS@'<Ռk+vCN0n}"ugQ>hF:򑐌ǵ0LdG]R (GIR6}cr;-gePiZ̥.;ץADW_4qL2f2AD +IjZ̦6nz 8INR@J(1@  vO j0r$\,b xN 5^`PM$ P)B0ͳD8,2ՒFHXPfU"`!NQ+@]!Ms?` PhTQ`TB ];zZv(0iY Q=8E(޺4  QQ.zr8݈`q 2ֻDVDN$j *ڀc^ې|=[= GlJ:©vTY|b1"j`G֩M0vi!q'",ug rDW]Db` ,nqyO!$ DExB&8!kLXZy@^dEpX+rB39,k`ŜiCBMSM, YB6j`Hj!ZXb&e + l 0U3]x h1,ZEoBR(  Djf,m$/NXBf} >~`o*Mn|@'; Mp8+Y#ĕ)4DUvpz)9Yz  ``3H]xk7Z xY K2 '2v 8h@`$?贒MH@ l'q Xs{mg u6M=gB }e0C}␏|:!}q6`{)Kdz|0 yY`ֲ0AJXYyxQdhRR:n&4@'v k /A[,Fp. n.|Qj .JkquJ  p _" qyz @]iV% nj+'j4{( `tzUV/{e[a|,MuPuPfd'ApeFX|ҶdTfv0g, [j=^|gxvg0aS Y8h@yTnY{ vrzEF Gp:'bs.#P Q2t1UMRP7CpUGhe'`[[e &f` AtwQ%uW'WAw\ 9Ex$vS@jHAv`q"PFP&]vyTiUhT1G@%`ō3`{(V {l>lcd 0 luRuPu?pՃM0㕑&`Pݵ}rUζl qf[# 8\px(tCx7/ f،DY>!*`H+YjO f'`& ȕ3Y6P#[bkh2Vl*lO&lAc^QLАM_Z9vd_n5 dWfn(4P[Wz`ʠ p@p@D@_9 xedW yv TVTbN% o/ ҅]~AQК#@[W 'vUo bZP7IVu\[PfeL}dcO0}F~l=0sgi0bS/5!KUa@4:eoa%%ak7J#@w (*:,kQV t'v+:'lP0*Ic;Lڤ?DLN:TZVzXZ\ڥ$=fM4LhhpR$HAL`"` I qBq z((6Bz y*GpH! S?):ju+Qt2a%n"adZo`@]P5`Z@44 GPGA1P: z41ЊӬ 0o| #f6C΀a)AP @ ҉*QZsZ@n7jʰ}q@1q0i.KpQ>`_>1@6SsaK{PԐP ` 2"g+ c} \;r01 rPq\0`qku+!wP'[ OAqpg@}ںP0RC d@4PK蛾+i+F+[^@0{*F ljE0,f{:{m0 }^z;Чppx"`}Z g}   + pA #Jl@qXG & :1V$'=\!z@P@tુ*Vlll][UdP${;"ze #K \`PGp<`ZtFzcNVm0 0>JW[z@! LۉM@\VLhͻ2-}pF q-1̄0,ੀ=CƊ58<LTړg]-L2:ר!MJ#}۾;< O; 1 xQ^x\B!AOJNHܜ ` %ğ]mxP$-ļbŠ}¦C1\0)йκֈb ,`m̿۴\`oV4 vU8mDž`X7IԮ\ߗyPJ}ߵ<]jpݕ䞍%\ ^pP0|ԃJ.# 0ͩZs ܬF/ @) S`l@Rpo `! 1Z =x@D3Q" S̫Ɩ B%M}i01NWnLbAm,S`H`Zʭqn8oµFlB&\5H=W%\ڀ`\-Z]Wބ<%eem߅W!M>”8Q:UVg48͗rfw؛v.WinZjzFfVMi’q`짩_MZ8ֶh*U;:p(޸c"x1iɜ:Jls|(oÁL&,XЍbE C0 }$CF#G0E&ᲂkdpa,r0=.ZI!HX(@GrX@p1"v9.o`A b)#mo,I 0JosH-rRx|z:kHÒf@N.\p"Q2)h]$0K C`8)-M(Q1Ts[&* = C<(͊ t:ʹ:wҔvL Q!0"|(6p {ܴ!9ݶˆ,,Y P:f@ x g˷"RVC'Y@ޱJ(2JdPifC B>VOm^0V!m. -+-@+`BV<  )B7׾#k9kiV`+VxE$(x!RѺXz׋ع.6,e?y@j`Z5`dE)H=v[g5=-֯:YRHj+Xd~CFU)@=IM1l </j+wݱ:$ N[^ł e̱W4E`mࢤ-dD71'8T/`6+kWq tP*LWh-t :ڃi)b%ΙJlHK` s(09PKl˝<]7˅=!-qͱEO^/W yT 7mЫFQl ʢ>|&KͣmDÙb^' u⤚7De[l(h]47F,wƶ"|g{xd`Vflnc{jJr4g҈{<ф(DX+8lҷH>]&$$F0Y~" l}ym'AG1T%N6r&~fnBc}hPQ = P7|YsV =o}î) ȖFq?49ZvL!RS9n ]'$_r3#[lE*)"1@PIvZ?{TKL '+j$)H~KŬlCVsvOnhא+?~Gտ~_ AtF|5Moxv3H˿t)^3? !Ё ] 8 (A+c !!2##J8Es@ pc]hshBSok|&Đ@L "&266|SQ;,CуB:(hs,Ȧdi݁As( q6"y&tȆ}AlP:ʹ @ z@D+QC}`Ûs&x[ @K+9hJ34KH DZd;zCR/Сx;BlӅxB) A㉺!}-'oW@ƒx`ЄL (@)X%\osr4GkUi`D`ȡ E3B#" b$dFw0trE>ȓ IDƥLjG%!JS )&+1^GѲⴠ+5Z3H`J8U(& C!,ۑl + <dI!HCb(Ip&c"jEVSFܼ.ASd'P= @L)`Ŧ2)0*(X$I-K*L Ͱ}MLHQ#u"Xb \/AÙzxQ5#" ǔZBRB)ɿ<8(Ϥ@I8@9jOdaGB-}*-zBIę$2Ұ2Z94. *QB4ͮJϙ; (EK-`RXqJ}11 `=@EP.2%(3+"r EW85M->*ŚdCjZ&KHW8_3EOPqR`: N5X_ՇRxpD( 6hcI ҅Q2(ۖBxǍ}C'W7 .Ax̄)$Yx0 ٓY0Crqq6@k7+k{)ͷvڨx2ʇō}<(mC!'")ʺDZD[SF*| z: m,  |؇qPpv(JLFۺ B؇p\}*:p]h`ܬr@EHx((\G잟+x} kEr&vc"a@$LZ;NB179PE7vdAU0l!dCM baNS{S'9ViGTC ˱Y.Z&^ձ_8:JeẎBL]BmD -\=D|Ъ>Qe(T$ 9 }(:PLm?4.jV RV\_T~(yʨ<`b-GyLIe4./8LO}裸}"\H16$sltxH1 H}. 02&F$·>mHM'@#22#4!#:r2eHJtOꑀ)9!a%[cL-,? mB; D!M hPk!W.¥hf`=rB"P1% ?F!l)žTƺw"R"x5sQ(PXhakd%M ̊кHN#ٰM8PlԮ^%,0" .W^.2#oo0MUgclrm.ج`UXU"^Qlk8 Ю\r / }LRўp^4 Rpɠ\([QZd66|3yq} *dC90 pTvMxqVBoK 3 9pX(7e -XkD{LXpMT PH.YEUڣGbV6v&vp Ɋs]ܞ^-mz({!x]}Vf35_鶺CĊĪ8ܦoWD#\`<(]@a += ]z27\ܣ,'|m?< #/o=_/#}`%F&cΧ؁pZ7}D 6a|id ͞ӷ߷#~7zIm`Po1X4 > l|EF2.,v@QA oKϔp[)FC`p/t|,h „ 2l!ĈV;e|` (GY`їz( wqZ.T΀Tqow丒`̙y,ԡct;%ӬZr+ذbǒ-V$A-].ͻ˜r~7q\:ɥ`tHܒ!()^C|IBbwN*s^ -7=MWX(DOabZ͸pJ[;t\+V~z_x&0l}Ti qҊ}fB*t9B{g%}L` #@^Z#% B%k@}Mͤ=gޫY4 ~ qJ>lZ@H3m #~D$QLC  k%:sTrGTرF)@=ēu͑$wy9`Y pDxBEy%E`;`ɽ}fTR>q{d ,)n[.%i:@5@)yғ|) Q, ՐsňY7YIՒ ^:oL#tq`Q4.2hKPK/?Q M OF(%+A. 0S@5S8"Kя:$RHy`&TݚT]6-.g=Ӫֵ QIDF&#VhC.JAS>MpcǗtA\qh^DFI3S cQ:[SHLTvJKRgHFj,K`nZ:m +DKZX؝)\"VKWfd9cuwBr/.Q(tY"W]:{5w*[+^->9^ ]#@E; M=8 [$*M;ϖ&94𑎸 #Gz`}@(-<@*. sΡ/GПzG,lZzLb na"~btJ7NYʭ}Chs#> ܲ%(ŀb FƱg63!9b7v}CB%r{uD0ш sMB&$QcD';hx $Xʽ=@h׏k/գ?ܡ1e OL.+\&(QY*43X] RT EEIK\zl %lHK=D< SHKD> U ’+C0œ_nI˟ʨˤDL@M`]J&J@%I]J ` nI9@X=am GLDE\CGȹD&aZ unDRjLU œ7,B~8MT5 tCTIKC"d A% C qL%؂d Mz\*nXu H&! ?pŒ,]ہGTG,@B<@/U`7CtĄPl^1D(N#9@>=݁ \#$@c@s4N4@D]P$Go#M.B=X!3 8|!=`L+CiE1LPlҒN "b>Q>4^#CUV%p8 |U nEADBe5_"Ci$fhB9l+QP2 ey[HR*Q J5RnA(c!"1P=,W~D!CPwyEc`N ;Zfsn|tC'ȃN;jD`*&g sxzq@x:hRGK["Qf'}u /B 3?oj*CF&PHSH!{ZG9өD4X2pX[}!tH#ШGX?09C|EHhGaG8u3&a" rvXBYuS\'X>ps =,OzDAe- '`V^Cx dLu]]^_maK L$q #ˣUOtiz)ç+$=@^@)T)t gybc?qpB䄕)fLGr LlP\)Q LXf-Sx$@ÛmJ4m ZFН䖻0ä69GrR}n~+H=YC HF^y4L(ul8XFY|hJ#Ìʐm~vH#de+ ] xC-&*NA\,>$Q-v~-؆؎-ٖٞ-ڦ\ aOjx).G G/TPB酦3Ȁu^GwdC>9_aAގ̆.Iv.r?kq8ImIp4J` $mDcʬPi_5*NKg@WGYO5d\7D˻A ;<yUXL.Nb o t[H@M`(ûy5%Da&g2E+ B޴X:B39dY0AHHb(70y-V(L_B~MrnR_, Cl)j1'JWgBň-,y2˕>U|H(>^QtJHV,茺/Bt@ u9 %!fѪ}hio!J̹Wp;] \>H^0ޕNZ͆ pl72>,ieYHtϮj}p \b\ΊNĻrgP YF,&!kw ob})^W/0j9aτnh:JPZ;( 0.H'b{ ./H@"['A:)w lb6$ÐkIL J0{6"J{@/;4״J+g:oDhR pN^m< 1-2DԨ$< N/=2ss:C-0<<3 GmNtJ6$P ͂l$Yc;1C#J@t<8HGblGIW!z7ObIRD kB\ƙ 14"Z~ԸX ϭlaV1noP*sQ#h BHlAHoH)+B2IJPSH6xx[WnJ&)"=ʥV~jIԪ[lJ9ЖNT6L| (OEC@c*2CVe+2Td!TݟTqn:)}@WLfX d}hoUαvryb|%\P5T$d4&<2u!'Fo}Ls푿p5&O4!EЄ40B20A&|Ap3>A1=FS ボG3*$"s={/(D&HB,+H"÷KBI A}v{Slg ƣi/7ZP*@hB)]ΉP?Q >sUhCաtǩ:ǯ2A>265G;9s!0^4(HXF%Cn#EQq "i0䈐cՄ(^H*hV퐩t GT}C8@"#p6ZF#0bHaS橦%R/pDAXQ-'zVlDĥf4z 㬗El>!5j+.k CUUۺ$^Aa_3jnk\^(2ס"%i|t9mAO֥SQԯ9ZϢj1 Sˀ:-~4b @"6QbX;ހXcϘ5qENX񏁜a8B|>ހ׃΅U2LExCW!?9 3^||f5ӸJ8P:ĬuAnW}Fq QVЅ6N ™paiIOҕ1iMoӝAjQԥ6QjU([]eŚֵqn I[2BcX-\ְl^SZfvUq%MZܾ\h\3=l]{g-,;Ƌ=q$\4{ xOH9mr78E<$i.\DQ,8} vz HZ9Bs;v9׫m{e;|g Zl/7^0w%.w_]jw2]#hx > W裞7?NKuW8-^mypŧs+߁7~a/]w8_W=}͟[  "Q"{q3~W~nlO5On/=On.O/p4p/J0MOp ٺt€B:o-Pw~. 1d*0p. P\m/o 6TC,# YUnQ װpN c+120?7Q.1QP R 5mMUXFj,zX OUPF U Osq_01 YApdP Q% 0qQ%r>CAi."k!K9qgp!%"]5Z %%QCIrYyc!Q 1RQn r!N1 R+n,0Q,)ϑ"POo1/)y"0L :+8 Do+M?.--R#/+%/RrM+R!2'2,9;\#''@2#]# w1_y&;S$0l6LSh8Lj39KS82js:5sŲ: ;3M3ų<#SͶs>>>3?78t0 `9b t@>KbQ6lL&ĢAB$BkBETrjA D)Tt Nn RLlLp}JXgR'.H @A4YrH&b&,CFi4A`LGQ,zn~ơ J4L JJ4Y@J;%V4Op^f-[cf LOLLm*ai@aFD !|i! Buh\T>hn`^PcQSu.(U`U!)ˣ: T_cTKuL/ X[Uo I luP/P"O1tWc*=@[祜aF$Kēf\cʡiF^ԡU V$\l\WG{6!Az^GudK_Sb_-@ Vbf`=\32X'LN)<74܃N! t (V!v25HkhI]+ZaDZ#",#r֕(],¶H*%|CX67P&z:qlV Ugy|iM  h$Ȋr+vd!k@@Vk)R8 dG/"'j\m_u[Hng q)we eWh9<76"R%Tb&do-%'N'r @pc-&BUUj[@OwF`>hizK~Gq"b,܀ 5bht Dda vP&7#`x'v7OYvVQr!ė|)Cp1b@#Tyj~~wDCL/8(}x @}8E1*08YL#EUA*4,#FXRLxVV]ng8I# |}WX!!){$X8{Y 3U"#% a{_v8s !ya.>1&avˡg*HYn!kwbwG^ b !2Ԣ[.!N6!T`B+mV v^Y?>B9} F-XYrB*lF$E|O,O5͠DEbD`d 299QB(`؜ɗ3i8H\`6anĨ4 r`I\Ruz+Yft'J8A!َ>(bF>C?ȕnBg|i)(]]/?[6_paB)IFM_ʉ \Cod?|ZSuBǎi|pT0Mĉ җLx,`t/\./48PF "Hm[.M˨?AˤQ(ϥL:} 5ԩTZ U֭Zq*QTR(Ut ߁D3LB {avf+[;|qouՃVe"uve7sx|A@)Pkab{xHK|!Ϯ]tBLglyCh[0Xv:ZղMRÚͻA)[B7~(5f5Yd86Qj]TԈs]'q!Ј=xy40L&be^~ fbIfffjfnIgvމgzg~ h`6'#.h> iN:HO80Ri~ jJjjj kJkފkk lKlJ:@>wm pBB- נCŖ*/oƄp²"J9Е¬ F,qjB7D`qF\r.3ʂ;xa"4ˢ5ߜB'e>S6`>U0Mup  ,[(|w`v8SDڐ LPBrwU알Co}+* y^e$yZ)"=`y袏Nz馟zꪯz뮿{N{ߎ{nefĸ^ߩV/xs _W3w]hKUowdjO|ZrOb/8Ps]zUivu3X&~ pEGL$M7(2 LC} "x{Yq(=Ѱr#N@E#+_iQ#/hY8,.K˗&(`_88Xb]>KV%!L OW eh"CliB@-q jQAH`=$Ɣ%>ő_$eF7p+`QRI*axlt X MLcrR 2i"Ĉ&BP L$e.Y 5CP90cC c   c#amQH"S{i\5ϴ, hv+,6ZqF@YkˌҰD i"#F=gJ,BDH=SfBaK( rT@++` zHX6a jӨH-R-Dl@Ns9m+ŁQJE`?G4.N\HGPLB9ue-Շb-Dp%51QB".1( ɷIa`,`'SC+!A6BwIBVUh*yUV4qQF+bIVJ&u^a f"T:ꐺF+djWubxJJ$=b:K:DžA . :r|A+ YAd#YLƃQh싎2E@7xA }:Q @Ux !QT#A$ 17h{xpIqY SHkpy8U@?s`/^,}a4ЊoM(cCw9&ƜM [1F|x$O>GAXy!Ȳ~JyEhh|G <$w_Aޤ]~ <$cej+nt;B[zf3+xjSǪC`γ1.۹,1 b 1XP[VjW\Eh0A&oji.ozco@`/W8$WQ< F rbB3j!r"'/pfD CeKBBJ,vzr05%JYXH6]&t@t^v>FAap~p!$1S$m\4 Ed 5wHwTX[y0tBPyW97_׳]&wCu0 P)P T{`mqjctpp4U X Pixghb=h@@؁lTׄ~/EPD@t&kx`SA)97p[\z_=8 aUUq;.'VFUS$65yuP3Y6@49 EV,ru$oQD q7 @ A *7y菗 w@@}|P6`XI.s ]n eNp ' )gwY4Qjqy1ɖ4y$&mqHJLXVH@r[%'(PO'+ = 0u@TxYVZ'uN$JvE{ l wFw71P<W"g \PI#o3҃p,qԩoW p"oG y>u|@P ѝApMf9QwI)[2w0i[FQ$|v)fӅk$n7cN *aY=5NRw1rYWTh?z@a @ @  L'P_].0oʐ Tqk qTONtc!d`8yd%!W\5GW AA?x@J8:I1{c]0™ ՟CC[4 ei485p j\=T 4 \Ʀ]Q; wchP(!L]!qKuDi( b8G& ~Oz1" z(Jĕ-Hnze JQR*/#S1uam0Qa*0#!uwQ" "11rQ7q B a?b7 8[$I%1-Ur%ZLc%<$Rr$Q Gj:=bV PBy@Q [^$ 2b/?#k( !%P1h]P*dmv2/J9u9C!%m$$9[-^ >K%Vˀ{'rB'ڂN=gsOax;+1T,1  *\'&ȫkΤ2D%,k?Vc))Mڼ_8(j)]@˾ +Kkk.XĿ<;_uB>T’SuO1zҤ]8)WjP8OvL+@9󿙔[$_VSv#&>/UcK12,<<r&!#"M*,44L3,BvaX\[J짋TJ`~yԭKDK' G0Oat Q4'^D{]HpI<Ъ"xj 2;{oRIa8k V#@ú0jf#jBYĮđ k Ҽ }k;Oz PG>!6|'H Q(ivЯAz,lTȤʺPȑTC㨦\E(9@*qpG>!V$NG< 4)bTc,>"ԨܘEڎWT{#CtK@cPtCFͭ~/$Jdvi<^#4؁3]hq r 8&0tq^_+GI H%k9T.>IaVmoc7> nq\*1rF8 xs{]fWڥnuKGnp+6>@6PH z37o{ܳ*݇8ŽzE)Tp NnDp=aX#&qM|bX+fq]bX3qm|cxЯ}c /1> c)0Rb|d!A7w,e( us̜B8JLHQQ8(L_r{ %G0ІJap C<&s-rW wL,-y%^|Ln˜bW'BO]gh?~5TeOu3UiXF.[g.Ȇ$U6ax!q gh"S5T{tby)5b `Vyg殲_w?Gov}R\x"ۆ? ӈ}c>O17a耘(f4PGzLΉ8s.1R[!@"PJУBkR"*6 _>%.ѥ%1u$@"՜.1:09+%8mH؍^hm(L?0:ilFZIDYC nȂds ؔBZyR[PdE_DRI,}5GC٫ǽz"o]92he| Μ\O=t6"8 7e%{@ۉ}x+ P 7*x%Nے`8 SZ8\+ XE9e@/`$C4AȲmS/P!Iȇ-7 }TafژE Zo%l80# )8@x5\xrl<|xWR&twL x 4 ;8%j?k55 >@cEk1n0rB \A`yޘ>W"hX;UTra;;cA }l+"j3 ࡘA"8o8w+kո EE]J? lX<$@cKh,þfJ;x/Xz)(ġdž4nǧH) {E 2}sQ '[ |7U@c=pJѲ<[&@’0!U8ܕB Ftq5.A28H-FpqkzK (PPI0|pL"!H+;(bDKtLXtڷ*̊1I0yx)z sy/EǬ$ (KV8%L$Jʄ [JE#CY|Ż.0ϣ'Px8nFkxAw1 A@b"?L8{H׀ȁ  ּ @ HбP}, e'|ʨEL4; =?ҥ8 Ԍp&'] =xPdQ5P7,YԘlInOPJ=PrݴM{0a°IQFYʁDHS$(yU9dH8cHa3#b,3S9pɐ+6nT?bH e42g)T[kuDTT8HT!JJ% 4 oіz# ܏2 ڊdqSp EX'dY̖i`)娪i xќ φђ;Ȇ{ 9al=ʉJHIe0 JY-P[ԄKd[e.Iԍ.RB / Ҡ3 \W!uU%'툡b:!](>se%n0 $3aNpA[*aXҝп݄͛(:,] X@ I<]zԒ$t$EZiaB$q0ҤB$]dxt].2 #A-Q X@0r"\`%XT}T:Ӑ'C-b2r]J&jz0jMb੕a*G)RxIi'z|Jb)y,YWb-"=rjwSM+nbʘ8b*qbs(,0(;_J( ,t,Ր8})8.-Ne8+&6-|PTaTc9ܬ PɕM>T֭X b1겮XXfdNfhNh^hnh~h\ Pc5_1sf"p5%~hdipNb5*ˠ;1y$ǝ.ji!iTh킞v7&j~@Af郡<i&uJ..ioɍ Ȩ.un]_j(F$뤦Oq^gk\Zd*k.ƷTvn>/P1W{-a[T fǭ}^Vo 0<[:ט1=j:sD mR={"²Mn_Kf ]@y{qcPΪah(:0|| n쬻׸%oR H=ɣoRsp,2Ҋ>H0o}P)ꛀxeٙŎmʨa]l$EmxfKd@ \dyC{IDB \xT ! C C&4Ws6@/]3Q0<=?6K  4B,G]GwKD&,@^COE]i6H SoBFGy;$L4;_D_sEFJ,\LB\ꪜfg :aZ|frFk˖0X}q,e |hEG  \;RGȆ;b(9Y^DcЊ粓?._|+ 4GZ6ȓ@/)7ȽfojW\r8\Ď_zgluGv`|Pt4wMxgbLӄL˲DK̅_5{(ѻP?{ΰT8dA؇դ Iɦ鿯}*dw\A¿bZMLKVݸm} |X&83.M)KOKxxc_ZPtzas]{mNB gW4݉3wqJiP* "gÎ$,'!ɒ% 솎i f,š! "LH"ÂEyÏ QJkwݫB`+`ޔC3!IeM (8$$UhY`BS**L';""P>a)R?I@`K!t+ dM [vM, #^whi^[ظsN|9ΟC.}. d\)R#<5Ο0&{P3 ; w_/0vW\SzjqS-HMq@y`X*T ` A.Q%!8?+^k&dH6ٓQ%P6el FR?(T} 0g@fzy8cLwYyrqlJvǨ'iB(urک{8%*^|fiI*%1gf?,|zU14a4,qji@+Q ШȎBb@*FIQB7K<9,j 6@ EҲ֔W8𱕩"nBKb1ilΎݹln|vj9)2OB&dm͖Kzn593͚RG#Ѽ3sL0r2dKA[I;LN&#BB/BlO2肏F\{ 6'c'ޙj *vh 7!` A@# N7_I]ʍz>/5BtucZo%,30:Z+>6ʍ;5߃Dž{9d++͏L*/!{&7"# h7cϥD Z\Tx%R=S+hA)=Q8B=hL= ),#@E;z@:8 ,+G8< G;ʱp A! V&a=ѡT1֣PH^E#֟F}B!#!UFx|'!># ~x:P7̣jģ?q !!shN(ا Itre i=gI 3G)A2sF^0Ҝ&5)82uIHtHj38Cr3:L';wvꚜ"#h_ tBbTqM(CPqsSH>.zFqvԣ8GJғ4*])K[җ42)Mkjӛ4:)O{ӟ5Bj8`DiRQ:AhJ3JU}H$];ruސڧZu.eYCn[uiWŚ\`J̈́ b0GLy4LSUs@C)JcΧ:`[<Ֆvjh,VC;ZU+W/͢(}Rf-MVa6}`!iBkJհ̏Vx簫1W~u:#G[:Q^}ᷭ!6 ZZ6$S;r(, %(3_,!hcBGȖA !\UjIȯ=j[@GS:7Vi "ICOlJ{$"KXl51fDPm#h>* _c_|?sVЂu q/GB\Zǡ \D>8kƾ$X'AgBB:`b `,BME[E`SHW l`Vk]= dV#g~<C;T @4]h yw}i)N +үI-\(Vi&dB6ǚƉ(ŜÝW=hw<6\'<@ 1[`: }N.Ղ#^Ȅ戀E j#@w=zv`V q@̵U=>edXE 2[įp9mIR6$"tA6`Frp ;)x :Զ^u$P0sqښ=(_yLO ptWzqʈ{mOOBpon&A&<9>"t>|"j_˷O&!s_s9[?%CKLLՂ,U+{ QVZ7])$ʿBB4L` "}p^2D?ɠX9\U`B%}ل%CWG%e|!B9,ZPYMX\]Y7 @%ڶYjD`!Xa"*HX &l @HAaY!  aĄ` ZB<-tIbeB"dL,$ !MM=D HJQ]S5>hsa)׈:^½c,qH#D OX#4$@;!P6] @ǣU -]|)8C>hX@I=\ID4?`jXIB>"$)ǗdaR:Hk}HJRX]E)RjGF>V.ĔN4ǘ٢Fl~7bSҚH##<;#Џ=#ZdvZZU _f/DAF4FMSB:perH O"F/@XB*&R*C <#CPL":*1F6+W\)7 쫾l 6yi6d%D!, fH@0rM)ԭvIB =AD]?R` ` PNRmD®OܒD|quWT. NvF ,D,.c,۾ͨ ~,lb,F4rD}-l)h4/\m.xN)0v܊+C^8mcyZS-[*Q%=P>D P?PQ>1 Qm g\B?D 9Si t%Q!!SmPYq>s0W%p(QCCP&QɁ0*U 'bPR _-q ]/5SDƈ3<48øT HdU 0s^ 3l(E51ӓYؒq?G$5"<,70dU!:{7'fkXyݳT6I8t#3=k2@ mJi>@5KUC??e@jh>4EeFT@!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,!! nvbn@nvbn-desktop: ~/exp/thefuck,x H*\ȰÇ#JH#I:i9ł9F̸ǃK4$aYVlYGI`d#)ψ/c\ʴӧPJ:ujV Qф\fAfq~ N$\ ZvtȂՠvwx5͵Tӧ/RL˘3[]'Y-Wωcl.`|њKjL|s[Yo޹n٧E=h AI5gb0ʷ콘c/\+DWsCx_2(LɈbTNI`ݤji ?c֟ Tm 榛qsVpN3ߓPFGc@\1>:\oV2 q1eyd1y8XDvge>ŏ/rO=1:|ŕmR>yKpޏpݕ~\h'ȵ:y(j)>i1k=XгU]ąwyr8qv:C\& vQ'W^$*#Fm8ivYŭ^2Ԧ3lsş^J$K: HEڬ a:%W8r?!yCo8it[NdL*/JN~F=FxN=F$I`!I$ಟ8:%zFS=9)tϊI>Ujޮ o𰷐pz^ȩ\oz<| `$9UH~YFz$Ko-#.5OCcfϏaQvbZ (4cyH܅`b=P }wJAϬ#`)$Y +rS}(q}a,3Ǿ:9õ'Mm'wOC I)[\~A$Uñ@` ള}N,}z& %L²qg;0fQTBB+#y]ATb Zt$%U6RTI&}8MXچ)Y~CWBCDܕƒՊ6cO=jJ4ZD&""\ IR$Fyg%hD  gLJ[Z"> G}$Ot膤 *ԓM՗e퓤 149#P\5AiWdԳNf;ЎMj[ζn{MrNvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘwЌlkX֨،ԈX8׸嘍ip8⨍(h舆Ȇ!! nvbn@nvbn-desktop: ~/exp/thefuck,h H*\Ȱ  #Jl(3x1 *p㧃F(>ݚQŭXb}8-Z,O4T: *8+CǠH(F~Xw I A?fhbDagRL-84:*ѬT0 RB9H*0  ђuٱ @ ۂ>)RĘ4Ф &^L=]ѐP5kBNԬv HJ-v%&wt.s\@_hhYL}@ b,1AYf'0XbpHLt"r)! Ԣ4`%E8L4o #A-oUiS%x DUБDBqɷ_ wL8Kgaш%)K,P-^(ˁ/@H%|B t^b _1 )b?&| 'VVDEPV?D0N01kb**p.d@gl4uyۉ8 pvp,v.0M@)p 7Q@/l y ^2W6P f.A5pB1Ft0DK ?` Tp=Lj7h\+D@|~t.~m%ˢ-PHYf鹐x`/( cl@ p@lZFC?SAE%eQ&;1M:d{^5gqtl"'™ۦխ[K/]gWZ(ˢĔ@% 6DU)g6=s$ho&NY0͘XYI$ʿ;~DiA7b%i)}4'PkWɣ l1S(WMp >}u/ !! nvbn@nvbn-desktop: ~/exp/thefuck,f 8p *DP!AvLBAwNE,2#D&xO91DCǴ)#e΄S@DutϢ NB7gF%ӤҁR7.WJ=å! ! nvbn@nvbn-desktop: ~/exp/thefuck,f8p *DP!AhP]]L(pŻ8)1$E˧XOX7&@c!@ȢvǤP^I`hӷ/\.)Q)۶0!! nvbn@nvbn-desktop: ~/exp/thefuck,fF8p *DP!AhP@-beQƎ5b9R$E'MBDReCa&Q._Zڼ 1 !! nvbn@nvbn-desktop: ~/exp/thefuck,f8p *DP"< ecƍ.̨In._=`"TPK4Ms@rŎ(ѓscG)ʱ0=ԋZ չ\Ӡ'P3&fO)3vn]=! ! nvbn@nvbn-desktop: ~/exp/thefuck,fj8p *DP!AhP@-beQF O߳ W K&7R#0 ws<(`'͡D QiT#QU%~ 1 ! ! nvbn@nvbn-desktop: ~/exp/thefuck,!f UH*$p#uի3AZrmO΀$@pYB Tu"g)RM w8S(NB!! nvbn@nvbn-desktop: ~/exp/thefuck,!! nvbn@nvbn-desktop: ~/exp/thefuck,!! git brnch,x H*\ȰÇ#JHQ⑋G*VĘq#Ƈ&餥F<@$ t2&͛8sɳϟ@ :q&QmT.͑$\dteEV "5JٳhӪ]˶G …(֡X%՜n2&ֹWOZDrFoOH˂D }IX\J=7aWݪ^ͺn;˔{:.ष*W_BJrP!T/&-fXK%՘YŽYΡFK;#턟^Ͼ{?4I_{%F2P`?SEL?hX=Ze>cX2iu|&@E#Sw\2b^}aRf~Gޗ3t'TVieCOfi}aE >s0w b0fSX!FuN3I &I0E =&^08jvv$3DdFL'|r)J)iPy婨j[NCyzG{9dfd3bDLL`mV =PlO#ܲy텇OTCT&`HΖDdTc΂%yj˕^z+[j^~FbbSe(}}WBVk UMuٳ4i :bPGw\p.\&sK:Er[`h H~(GUK,ho)gOHrxl0B44[@d{ G\Ү bSi +f :U[iXI=Osm1 vsK-loC sw\ؕ#b ;o)vսaD~6gg٤]\=`pa21ĩ:*uK6|:<\l' xΓB~A wQ|6KR*pX"PPY' s e;~TR&BkI2hAŌh H*%VN'-bZB %C C+")TN Є&`$ Z@}f.xtO9 EU!HF*Ն@V"V2@ZַĚB>RX@T8r"uaw;T Xc+؃4=  ~8")O,En,`_~@zyPQ,@l,j "20S!H}_X 8+XUY X@(&4 o@`n {  R@p[Y hBS=`)A7 c}C#F1yVÛH4ڡ},# ^q(ȖXoi 7d*r]" ,rEaB4,f@}e:EsB La_idmt:iMXha8:#i'4Npj& ` 09iSHC4@ "!@5Nٛp= N<+gۏTpMq'!Me@̲ JP&w,(y<SU5MAĸ E|G낋K j@ < ,Pځ`-ڄH@jt'p'5~ VCWC O!i;%r&Hj;D.iq;i=-e{"09C1xJe@Xy r&w~P&m] @/~tڴ-tU]pm>v fԟwTV3v[b ll~~o7rZw{B7-1sB1"&VFq5y h`7Pk?`wA kFPJ<{`6_g)k{AGMPGd S p}:IEcW}AUyPvxo'^axwUxwU4hi_E Mx&Wx7rga=7`*fZT!5w WJ}a|Og OSg+|F7X倈;TTXk f AU@P @Yd e%UPfnHp `^tm# phǨkRRYJ% Wh5ZF$,&7wz`to(`-&fb txv`UJ G-up+XdGpCpOހ8y["0T cve@% e^vYgwKFˆPp4 g' 'ui'ht6ZPhq&І`DPkx`ƕ`1x qlSǂN pdӖ Dm` KG)FJzvW\ ApPY\~ Eppv%fee5ZYQ(QS-ДRɍTiz`A%vaWIb&6a,J6&tx=Hx|!0MVOiNQ%X9q%#Q{7a0V#0 cYj<,k AhMnqR)z/;P[@Q1$z(H.02:4Z6zѢu%AD/ϐ9 e1T!0 ! =XPJ\c_U ˠMOD0LQ@X7R7# =Yj@@ % n@i Ѩ 01`vNu&_ @BdԐ@I jQ1m9Qn;l!q'eU 9Hӆv}c;aZ_*@QWku }d&[Op0jT 0dT Х;@ːjO6"@;pe+> ЛT @5L+?F F`wk{틬V$;AEХ[;` Ph{p!ZO`]J @0ۥi<t` yuc `= Je@~ڥ{c Q'Jt7D(t0D"ûnJdP K`"rc\c P>[j%GдLt&'F`0K۴9>ƯLRSh RXlp:h<aPyL0njk6pŽ6`9PLo,/<*,!kK-[J  O֠x!δP 9o\O[+x٪JOX̶p9ܝ5{`\e0p``"ђ;+c̼b\Q> mE8J@~*==ѧ ʻ%J<l3Mhk kU{@a8 @ROO's+zB0 !~.0Pζ{.FPD `-vg.5% @Ϡ[ITL_<b ;kbxl"u0H-d>y>l*T9}>jEmԇec`ek= pؕԋZ TS(Gc`0Ì]|m* RQkc h ~,@ˀ|"V65mw,ĄZp WpYt@Q!ԫ$m-MMBNzmRˍ8-R>>@ Fp< kJzdT]ikY@a`(dmUo˼ZR\TmKY]p}қV6 c\Jj P㣔W`@P aDD#IPH%MDRJ-]SL5mDH>}qv<oQ$;hz*_V.YoYӷgu tD-\  *{u!-/ѓ\@6Z j`B vqcs]Bzݭ^+A$q](Yir8G.2 }qt?A1eQqa c'#JtLBƔV"a 7p@ (_\ZC<7:"UqdPp"3,6qACeFt`AQД/0 g3! !voHnm&1,|h ƮlJǕT0{Q1rRRhYLb#8KcL@,dSp!UM+9P3Äe~xΒ.$uja\rܤJ!-eRIs8 b\-RC+!T8P.|`IS8*8!!ؐ%aS R DLyΑA5JW*J. Y8G,*`)P v@[[1I:R"65 4ʷNfRg id%ՅFO@bB>{ȅt0G&Z+OCZ_@ӈ+V0Yw;q:W2*,m^@Ь kO+yr(x`&Oƶ|Ŋ*j5:dԃX^d 3(1"|hu0oSEy).07+'@=̕B`7/tBMCVp* Ǻ^!9n}V7R+ p@hX7 $cw6|l)!?Fq = k mx;]º.pcCAmw:65 -qc Wk+CUJ"-(7غu+ փVԉ>љeS(LǟnLz ~TVP?No?!aZzBe > )ꋐYwܺ @O!>  ʇǨ {+ =IЁ湋] n A[cM 0PE41 q+Pd@"TzXcv@(Cbx@-kX2 d"iћ) ر, X8>2D؆|hl `):!qm0 هIiH?ч} RCP:DD̙g!|F9dADI17%Y30't[7S0w_X3wp4G7y3*mY{ ~i/mY %}ہh7$z:6Wrg]+t /r{H8k*eZ-R&i1T*``qPU 3"Y9 D쓢؇pRԚ\ֵ-4 \T}\|ȇqCDm * ; :hŵ+za2ǥ ;=ĥ_`񿅑yC!ԛ YUGСM!iՐI" 8Ǩn`y FVfva0К0z/a @z˭dˋ&K@.(0DAS#,H @c5k6:֐sBl8B,bAc*8aY45u:ճILi)0ɯA )sbED OJVe P[ ȱ%yp@&đ'!bpJ,:M䘨E2lrkҞEJ9aT޽C J PSDE" ÊiPz(WF[,Doů翉F^e;- z P}HHɕ$ރGŠ{`!v|GjʧTHi"3ZwV।puHfX4R#6r;0:I0>^}JӈB;uh;MYfxh0'%P%~eWa0!z V"`'1"\I1|3tМK0쨹طůt'H rєkȶ)TUvP`~\"t$MS: y) Ϙ:_@0h0"Ӗ N&1'Jn8ærw@TY@:h\:SPHłNJ :jm6F؇)`)v%.kJ-u_ ˮv5-_b8F(gq}R?C_\BEa<<iL nöZMp٬`YMh8l;g{ZYRYlYo'LZP7vwrm/Z8/Ä́COW b; |Z‡xٌ`>Vv*E!D Q:J^% lyР NGuF]cz/. g$:N>! 6S] &m p}4\̬r:%NN_>sVz< -LrW&.ņB#}u"$܅ˇn{A lmm',>'hTxŶxءf]w3?y>&b=)"-(+T@#(3=8 E^젋=x8@$$4X:L3Zi&䳌&ptUO0^, ᰈ= DyIi9Ls K&o9 ?6&Z)Y䢦rO# 'qgE)uBi9DwXɨqICХ`j믍>:,#1ܹx-j-F1uP >ȳCw>jbu 2)H9* YEO@|~8[0Mm'KۥQ@}dz??-$ SE̔Z_@J! qJ\G?\'[vr 2FB5i`g}N \K՚]Df#޿PЀ@`M.`Ú5)| 0x|onpY(1'+7{ntc̵]::Nb q$!R{Ta3D]  d p:pBܩ*Ytd6" 5::>{^(7ӢV MA|%ux5(iRS#?rg. $膏gɫyH(* eHqU#܅+& Ĉ*rg%)XvDhq^23hL.H"\Q @ZDZ&Ӓ]UWTrUFsBcUa?aG=&DРJўqDqęvHMa䅤U 17(Ï`p$'N R( DÑ+1yZeZâ#pe~3,9+C5f(nt,Ae<@*Aqt#eO2mЖ43MsӞ4C-QԦ>5SU?0Q`Hֶ[^cD%.JԨ赸fD,Jj5q-idP Ihr @JIq` a3 Bхw~VsY2]tAyvB apSȠp#J(͂ pǽ!bƏ|aa7D>paxN?Ⓩz> snӎf6NeN"M=I3}^EecxdB>wg9‘?$r왰RdGD$Q M6B<=7ީL$tŠbED/#@rDyb!jG0"Jߴ@N*VaVj\!QS=ΙҴ\oզf(Sp~4G-iH$$'Yq,$Gj &z"SuyqWr_P* B]ȴ#%C,V"I@L,zac4涙dL6% ,'%"qg5NGu1&}~A/\$T!f7 @+ 8Tib: 2&6q8[q@6C7IFUN&Tw$B(1HE X?@+nFFAȋR%/BT(o>%F%\AѠl1j&Gj%SE vej@q}Q Ej*`CDlUV B?&#vy&VV\i]5tit%C~x $LY&\bGh0TEG pXfA^ k|%6,G=ܗB*[m>@x0uCxؑuxzQ%`b>@эѪjy 6ļVlFm>Wky b:kAN+ xÞ-6,<^-N]K jֆ؎-ٖٞ-ڦڮ-۶Rk< @ N<;Jح49DU;4.B@VuM} mnN [BL钮 O<jDD}.v`>mtV[!F!.O`DDBMIS[Q@oE I h-H45Q}A6\f. &-w3DJTprAKpYK"̉  N-XO \\oq&nQ1q0icSopZqX1aPYSFFB 9^&&ׂ`L*8 nX>$H}}yTBvCCe42&+C䇃aGr0x{U]8ލc {$X&CIjݿC3e +q>]`)4o l2,C sh] NO.!2g) ?s9U3reG$jH^@/DG^.^%4#s" 90;rhȆy?J0F2eL/KGq\Il I#5a @%QV ۩a D & >KJKxoD >l >=CBVB xߦH5'xC+D V`VOV@&՘Q@,`f4HLY dIM @ ÿuTt.vݰ>7+, k HPx̜ "$b;Pjx'ȃSoW-` Bp[sI }n;Y Z܍n_FuT+SoZÒ(Z`A6aS|g&`W3|"`R$*[|(Jre7/C:;v3dga)o !E^% FſMʜ_"$b̲D |Ql z G1 #(M4c<^8'&D;dQB{^!̌!8x Sz3 +lP^:+X BEA@>2dC3 {MhGEP\F#ࢀ }pYAw<'D)n9ntcC1M|uqġ֓LqU; umߺDNoegp}JqB0d@@4Jh1>O :;AW;U^r%+>e i x5%{8C x9Voh?4*R @ΰq3(N0vMY7eeEXCDd1@g?$TOwWXS>`7tL;wPuN@"$PbFET9Ut?c3 ڈ6}L81O,1NC)͐^7,B.9R-xP>csF);:%?tEJ.gZ8pYXZZHSTEN珘 % :6jd*_ݫ_|btԹǃo_u7eR ʠ@칢;k)τnp@:ҀX; J1Hp9+@ o:;NƋD8@ (3t";N@rA RḐ;H {/:/<{  DNRq7) с Nvc( DrlHQd/Cs6|4l?N@@LQS_3ώITLTUvPKѮ~LH[.BAr-)z0hItPOI=pa᧙ \1 ;vST!ҟVSJBM kw5oaDW(ISlH X EkiV̹SmPAp&BNԠBڕt!|nSoh@Zv5kg/lܬ:C݀ ېZA'ڠjli)y  p'PU7ҘC^K'kb ϳl,H!7ϿƘǕ+,RV6_y愈 )-\S\pWo90ۍ`er6 x5!#|D|`B _#P?{ʟT|}{wgHA1>!|pv @/2 _y3*0)@PIQb<\f$~_tG=P6#5@a#O7RW\0Bl $E*Z &t ^ЉD %(1`}LUmq?=Sp/t֦46و('@FL/O$bsWIBM6PTfH­h bJy|_~ ~P-P}XK8Â[ɣ1IR WBTNM>a"V "@"z!9@*ڡqD!9ć@ zOuN%&`h9(:/2CE@͑Wl.X(=Qc4*HGԩ{\fha^S4x%cP}Й !Vԝ",T5*?z}??eh 0Zq[jV3Xե}= @،tp8䯐 |c:z4;/p+g ر:vAEM Wp'PJ%BZ&@+5g ثRSsnCG+h627F} m/eگؐ^߳7>>/"&vhC+OED7}g뚯x~c~6}\>n_Wd2  XOw03$pڏH= @SĭVOpboON~OOQ뮎/麏_Yp&L0rpZ0\W@Hm5j6zSJOp#h OMoh } / 5nϰ0 r0@G#ޣ 4,g܎A ?0_/0 o'Q m [)cO4P?S a -BpIgqco }aQ7Q*3sQ_MP!i11po˱ x)Cn"!PP1u o'Cbw'&](/PCO)0(-$$W$ q'5R+)Q=h bɥA*!O,2o QÏ(*+Q/01 %S Prq rr 03*1/N6)/DN5aS4U^36(Cr6L:j7s7i72eN#3ps91YÈ9::3;s;;;3s>3A,d,d$ *ܾ#83@%.V6>cLAB,A@A #?1A * ᠮLo\ RN NAFWT4,r"664d3@q-0D&Ov4d FgFo0kG]tA~t,TЧH1TvA`@=LD!I*a:F@\`E!ޠ䡉mO_I r`n@EBMAt(ܴ= LNCNN;aOOSuPL,Q4avaBR-S͇MLbeDF6>@SC{AR$tf'z-n43guR%XeYiY&Zu|&ƕ1^8"\UZaa7Ys؎&>O(@K""|G.6)b!Jnh0Zd4ɭbVJJFgdZ`tS`C"tKv,ji)ʡ['2X-Vd,ba""\:cFdB*bec^)R4hfYvoBgg+hahh!ViSibK1,a%6RV]+vo 0֪`PT7p{vg5 lSS@va;L Ckp 4bk`(umSA>0P@7` |H07|cB,U A . @Naa'#6N"8: @k_iF 8@5EH@7?y3y7%5a{{g7M-Y}/|# ~+~WRb@?~T-$A'졁ۦ ${AZz)q<AuA=C! (7y}[W7?rg.?$V7r7:68i&J\\T_.A`jFDÐ)&!mfR!^ca,Sb 3~by"!AWwRT`6KJE=Y4 $sc !(xTjc%ww-r1YK #,X7jtd p-Cf7 |RaYjGuTVY69'<@JP% ]H!M("-.LF$ySold6l;R4= /9aa#DPW~9ċXv9!FcO#{nBas9.@\o@ y!JbymnaB:uޣ|9HڨYR `#g۪)^U8œbyP Љ 溮 c[V'oBSZz'|:+-aIZ:1eNBfacx(At~Ǣ^s:[Đ,(/B2pCR05fQn,;!D)h 'N@ONWxb#kiM,bDxa"ulų{ /$;%]CL)bna3\DƖ+GR;!|0J5\<(Z`0\χGBJ6GcյͤSOK`ruq6 v[Cb!'K`&ʡ53NQ#ۢc@Է\Fklab@`戌Ƿ%wEo3fn)J7V`\胰&`̘@oh` T+,5\ c.Z WO8s`Zw7A~잉ȕDd|ǒ?DqV)yX3ɣUb_rT KAU}D>5Wi-Fg߉l_3ș‚FiĩMIG`9 ˅P 2AiE䟠wi+ș4kڼ3Ν<{ D+*ѣR7.JQU&o_`CY6>$QDgWZn>y7v#uуAAHiaMW8mDsZjU&k͖H\n7ZLVr"t_Ssszaw_][4UR 4~LdN> eRNIeV^eZne^~hfffjfn gO"&ƒrg~ hJhUNh> iNJi^ini~ jJjjj kJkThݚP @>w l.{'d2^܀, B6B~ $\…[CEZ 﫸n:o"J9(p× =O29| >Q0"̧ < `$K7(r/ߌ,ChX9?z;tQ$T1tNIB7ǂD>-'wWuX 6P;QSD؁-rݓē@!rڍ챢߆>"Co3_yoyz袏Nz馟zꪯz뮛JK{C1CYH-I:{+S9̄<TsSo $;Cr9eG}8P\p8 5މ`-hrW+GpQ5 )3)N5 :4$(y>q`O a ox^HxPQo*sLȵ\8q_fEWL >vOK[V7N&,xm(.>Q7(ehbR@@r ToN%OwrFꄄl 99JTXb"sE}"d4c4Ƞrw֗$[ۚ#krI(eKd؈{cĊ @9䢀kY9q0j֘IȜ$Kbywn(J)Qrf6 E)4uil`S x8 r(bPuÀ*/٩UfFyomC|>$`&< Ƈg^+(}DN 6FxJVF!6+C&>0wCc0A(Ugh@pRT`,$\HL?a ƈ@RXxH(!Pry IҕVHq9 Z [t T[Jxd(E-BZ EY[e#x\ V IA^IA.١ȇ08q[)7 J ѨXrP5Gr1$C t@ÔT2 !xH$Mzd= {# AFUCz1(w#^X((/pGK⋋uebƙ&07D<N" !QT vӠXl7c7.E18 TF`h;|T0 xP@C&@+  e83_Պ3v̐#9 魷IJW!' r'M f AVU<@1) K'H gVMl*߄m`c['6v ux$QĄ!$v*0X,6A2bӣ 0tmz;+V;}7Dݍh'%U+8IC-TcҜC<ҝ=^ z2{e`Q` \)MiW# }vPYeag`H5- w' 3`^f i-yQc^%x=>^3o$W8VA n,Xz+^k!d@+EQ=`Da ?1 6,7Xc6~Hoh(2,#]h7gz x~`0Zq{wp,D+`:ewt|%,'|N6%cTUH@ th ^0m4fiPQ7H[YV<q4Ah4@e@_AB We{Bx*G'0IրzsWdTΔ@"h`{X1Wp:pAf(i ԅ,0FKOy9HU;FF4'FN&CD?4δ 0[1gh#z}JsH'Hmw@$ Q%`_8)-84\W VM3@ "TRTi9S\hh~guP9WV6@5xkVD1|(Ɨ'Fqw#4&6 ! FHx,XݸXw\> yБmDET;WE@8#ZJ1\CE`y]C)HQ)H9ّ`)I~iYA>"elb4 ԇlat'57I1 P2Yyb4 FЙu Ni(838Wk9Chrp3 F#pALDA ȉ9Syx 104FйC1 o31PJ)v݀ImdD &e@y`bCeQ%RuPe#p@1)@ }"v3ppw'_`(r  P1'v; ڠ0XV4 G`$0tlot2sTGy?#@F@ ^ <!D0{b  ejlg|`O (HH,(zD`{z;@90.d[Dw wvqgk 5 >0_bWA٠ҕ#'ZfNPKU`XjAp71Efj Ajp!kr:Z*.2Q6BR`5"#FSt 'VxPQ!0 qJq.`!օmFs#x*v0PiQEy0$AUQ@EAQ>bD0Qӹ[wX"]t Ja !d! QS\8x ԱF [#@hU#Q@b:[$.XW1,bB&j&)$#`k*tfBJ5t v'+5%%Dv$r r+b9s(3BBRr(/+Kk׋٫˽+<E乕;3*<@^=_b=>K*.=9{# ]\C*BCCB0:Ka+5AdA%ߓD)c* .lb"]B7?TX6"1 ;!C 2D &%,IsͲ<0 J E}{B.-ՄpetFTB Ϡ 4x5a$| wHQL<l $ٷ"D%HvTS\B#gI:1FEaP]ԫ Ja'8AKTB"-K|J|=Tw&R [iPhHM MRVA(5Qj/b:DZR |&'CVŏ47Q|̛L\yGQqcS 0Q<η0M<.KSiVDB "PQsdvV[^eCZZ$J5 SPt?TC1DSQWh]Eta5VXӵ]GV^Ue!v^К 3ruXćh#Y$6A*YZ,or\1 'M]lV7Yϕ7 2-ҨZlMݐSHlіGBey6a\6/#"&M*eRZ{];^#cdHp7aH8 97PYqktgy5EhЋVHE25I<if' @box 0Fc[jk.j2Xkn0WV0`Fe dD8`pceC-`!m}S!DD倲g1Pg\0&cI. je퉦ڪڶFd0hI@iېb$x,6>LIEvޤm- =c% f-I0d.l 6`viS@_Pr#TB3>^M5yP 0n1P_LgCA` pNfn'o.-6j!8 p7pqcwe[Ϙv|G,mtq*vqz`Nrpr8FѴq/(K.vsQJ6e$g gítpPo@[]aSŠvn|0uW31S5kmkɈξi w'w$z9ǁҰN  Wl<~Zxgx ȭ7@PZt`w\~wSz}"zg Io ΣSwH[S|wX @5|%Ɉw_ ﭷ׀`W1~jԠvE-/ a3yY 3X3.{P{x{p0,7(~i63E윚M2XN8i)z܊\!FHBT84DZ螑vXf*| HoI,$x~`HڅҟL+#OP׬AV3 b\LHվ_7tL;$b%8+tDZÔRɋ) 7g@ԷOߞB=@;:QX7Ea%O# AY(6,IPd[d(] )aĉ/fcȑW^֔|-hn.,1!"BA0߈EioxDt59=m^>xSc3r%DT IʼnwL2Q"She."D0M1[z(A(J 209̲fG QO"CM5j ;ZN^B펨h.;&C8?">g :zӃ0C ;'" O2B 5PD]l`}HDjRL)W "Ec,ZY?LqVXWYk8h rWYQNWb/;. )'i/r![ltȍr]VAbEO &g N[ܚGDHYbx#)ЍR0}w XtNKӲ~STfcY\]U)s3V#"@yt%Yr~ ' Mf ^zHLZ$Ӳ6Fv#7%IWQ6C`$pr68U !Cz~D*n}bNeN~E.R@ pa]'HCg4F0hΧ< (%M6&[F}DxfeernKWFsTpy7ׄ<ۚgB} lR,[M1<}g!E85gh>Qh<&@(aq6X ēP %a_pS5a>(2Dl#]UKYPG>a.xA#:ivP%"t"ChpK!LX"8b>ơ@IXFt:iI?Q`H)=ds%qiLd(1 kf*8$> ^8F;8Rɤ7(?AP04Y *g64-@)qҘs%Gt,q1L=H*̾E1 i9DINoʱ@#7OZ90)Eyz#d_W6Q,aF` dU a)qd-{B貛lg=(Ut&f{~,i`|VBlZCmo}DɲHE< b7,q۩BU_`"wfnw]W%oy{^Weo{^Wo}{_wH~_/1$@~!;X_C%Vg 0<~!~LY< 3.B ЊnRjU+4+*)9#N tdmǠEbCYh1#dcX]5qAb̍A"E&&ܺTD0SWh{jepo&\pBás+V7ȇ0pZKuۛC}L+٠&TFK&" sՕgkN)ocg:2LĶ3(ؚYN Le40QMX-0Vc7IQ*1†.,1سY6y lj|&0m2ձԣg^(\6܇2k#xUnN(Fvo G!G4kzo C&\@*7ч&º^_lc ݺp$EFp HH/P@V<^sfDDE5!w+}jpqsGnR},cUw)c_js?#Z VH"*v{T3y*`xtz~OKovB#|H{: ]G@E8]6ýHSᚬP1"9@; {ڻ=np8዆|({ lpa> x<)>÷C=|sC1ʂA.=5B c# zAAC5dCb H h! hHdfxy c SU/BѦ dchCE$C+6,sB ~`8 H,(cHCkCl<`" ؛zT0 0`}KӛnJ]b62\\LCqZaA f`B$fAC{ȀD\5~%km4dE1d)Ș U0l>QApٔ9ːAD*U`#ፄ}hNQIC/ H(23 \I4!+HBۇ'ʓxpLJYE}iDg2xy?zʳY`xx/E(KmL4KJfĚ )4D'0IZB7C{F.B3z{Ⱦ*i 28( @ ɄPqȿh1(&qI\hL Hq҆}C2?\1ˋ( M Χ6HjLK޴NWZqgy9aa2L h( {X kF 2L:D 8eM hǃ[AOᤏtNGKH˷L>ƒRђ́jK:Nȃ= ʵ #ŚxNrB2ΰ<2퀎Wˉ@{й 够mq@|7Q $Q[0q|mҗ4/yh-60!F{M=+! RQFhM$RQ$,E b)L ʯik[ck}ђx |I4L~4VgDzkn(S^\EL3!9%QPMH@P\ٕ; ĕx KI%x19աVd2T~ <t3[@Fq]dMVa=ZFs,#g3ҹ/#(OҞ OɰA >R0AZɟل!ś0a8NhHA%m жUN!8p!A# r|8 T*y'؜Tԅ]g84%.b:H 05Džo֔Þ^2]9 aI`X!+<҄7 #R]ڂٜZ)ꍶBb]&['wxj}\eI{(ܹ(xҒ *RR`8( 3(h%y f\u)sRDK] Y>$ *}v`7EbR"*}HF*(Ix\܋xb&a&dd)Z E: &m|8%ri>.X,cea@f߲CRIDraZKn/bd­*HDeڑ7K&eO"%NUVq`+@DqҪXIe`fafb.fc>fdNfe^ffnfg~fh=fk4s,@l 8@eǘ3SfA2gv^HQ#KkikC]@tVBPeg~ngoe*$gq-\H0\Gm?6~ȈKyz>6 XCY |$gBahΉFNiF9qfWhdRCQ :diɠKi{X"$6-ʈf Li(k%n%֣ѥ%jj>Zj:g"C;Qb`)7)RPbshbt ad3ë ɖ60VK$cDG a0:{.#&:a`W|PPҬGK(զl:ŃmE C!C8˺;8{P8n6lp*&TOn:z&J[7d<Bm>>dk˩&KKȇK@|V63;BYEaȁJ @d#@ 8XxXg-Z qWzFMq7qɈgpEp "= ʈFa|61ȈAѵYrfE?!i@Bk> (:rN9P6@g#OziK`{`ߋB?@0tAMNUWVUp/|p>y^̛Ǔ~_u VGS)Gՙ;Q r)_҃[ +#`Ԑ!`v{a }w)pqsYf/q`wMv?w3&w;,0!u9؛%ct;`76,w!ɸ6֍u6jeu|VwyujTgL ,ϴWZ@j|XWq{CԑGLF-k.Tʒ3R|vxњap0@qnqXLEp n=Oyʼ<+ȨlewoPLʔN,2v|OwCud誖uU5ڢQf}f}6钞");O˾kh)<H54} η* -(L v VEP>Q} ;X$xה0! }ߠEv3@c.ʷ/'D+QA- \NCh" "bလj1 s@dXN",܁Q`͛V i0+WX ࿫["ܪjYm^} -׳rͫw/߾~,8 y5gkd(A8GџA  wq6!;D@$y.[,@Ϲ=&H["k.N'Lސ vmxU«fM|9COk rA]aMxBKR^vH+lPPSGxVPD7DQGUnlYzٕU:jVwVFSCُASRY%^#WrNE6hu 1iB ch!Rdf(qeEfhѱwb9?B)XFxB7L0TR d/vJ$g7hAXrz*]Ujb%w =EH$@6)OuxJn׻A.L"o&SƩ0^b1`;pO3H>.m40>x4b&@?K&P蓌&Û܃q&pLĜ.D% 'ܤE$M3䳌&䃇tgBoQX:p>!T1>lFuKeߍŁ DMν`v.Cs2Ӭ-RK>SWи𽲷K:ed63< <Ҏ>ShS=phCQ=vXJ;S4TO'B-O8C (cAw-.>4GD̃}}|oCIDQrJ6g aMw 1xJ" !p~6T^ZҶo|6аu@I*0|_Ou Ci=&w[L;}_buz|[$#ȁi_ _K>2䑾6 %Lz2(KiS2J Mll$2A2.9^&1UBI^PƮO04&5KcN̦6o3'9is3\';w3'=i{34"sS5;΁TJ ?΂4J`_@ js'iє^c܇` q6TE1ZБpCR Tt4 }# g"%/H/;m](DadqFijgNR{P5G~ܣYyG&.5i^S2Cx&$V RGx2vوZ]!* %, Z&n)`x65^|UI{!$,5rR]6/>ˮ lM+XvksP{#88UL ;Wqyrk+2z:MnFݡ +Gr 5I-N=աTr0`c& !!&CTtXdM#W hAwI444!t=WdmC dQGyt\Ð>YzH0BTbihs3 5^b 8V%㊘~71 Lqz!O >$"bp9F'\; lbEw2e (mf6nMŪ07g+GT8(@Oap}Qr1(3609v\L3!\hZ"tA`FrpIQ|ϴ}AgG4Ts53PbEǃ^/Uȶ8Tw3 ){,c{Kyf<0w$2>rbCIXZr$Ng~ou|t3.7-/[D;v2c\n^j]UFʉ'm1Z_dhE9,Ш293Ȱ$,u-b4A,f zO }w@%XJ%lJ`niK+ėq\`AhGėn$X}Tyt1X qJqmDBffA8q TM\h4G Gy3 V O-Xw]K1uu ^ |U@LʉWX~_R__tUɛ {KzcEқvx *ML9lmP v({\NXEITD])*F`]V4U|`ΩPB|l (sJc<`G/H$)m0$!1WX{XK@`@8U(zcN],a}%a^4nq"Bc %bR?d-Ue DOE|Gm+d#:bG `]\t*^H<ȁHTX#y @ՐOZLR-Ҏ@?=UQ E88 |B lH$FW6EJ6=ԁ\؝8/R U%A%MDS ܝCmW%[ @ܣ eWXL << #hW >LWWfhQDƪeEaA@WjSĽy&GvEd$PRnD+0ajfJgT*LcvM u]JMPHv=dQ&rrc =Fdd]eN\ZO|mŋ ||lC'W =T%(\(ґYQ@*Ck@gr ŇƈgD3^ťJ$]<¢Hj(\ू=Ѷð>́%DSUCi0 4DĜ-Ħj Ӝmum&Mym毌Qʒ dN4Y jEX >\ךj L|(-, _Du$^PжOLFE,>L'AhN0n.+,g!OIy IqP̏!MCTeOؒ!P&ŒmP L;.oTUԞ*XՎ t-}0DpYn68ߘTt?0{0߰p @zW  )@!lVT4^Oݮ rEkq B, ?EҐJN*iV9/qspZ4=2s qH L3Л77C4oZ#b2WtrM!&+yA,fSjC),7mBYn,C~ .,As@rŽ8<^34kB)@ 5iOtpEC.<>s??t@ @tAA#tB+tB3s[SC=4`@0rH8t1S8ߤIB; |-@`--'T4jLT B(s2),d@StS Ա_,NTA"Oo~TGjBH L|,3dtF H -_@\]BEK54Y)[4,B uh @35SSEN#Hu8APfED(Blcl_(؎2C3_R'_6@_EQ$B^_5`M/ Zqmk 4 ,f7!B(vh#4A`@] _ $tS[@hAh[ՙp_lEԏ+szHlTY(tw!CCw(4wtw^LxP t7 +u_x@)B47&-@AsQZ$P *^v6cskkӁ'n08]K]qK4 -'$wO9-@\r7'u,, Ԉ\'"8c/)yĞ`B)9Y4"A@8A8A<`A7XALw,Ax Dx3dz[Bw/dķr]uCEOxIO>hMq3lu)4>,>C_x_bf5";8[U4U(斻 Ig5!ttN39s@E!]MW]_$u!<ǂ,̀ r(,`\@\q#,)(d ˟B?<z )dP@)p8:  zK:X?7/A@)zADu}o(m$l]^4,ΚHyA=uY,83w# w^_T]πuq [H"p(Ѐ@ @5j, :)}c W %`OvDx/h}h:H P DVA@ @  0(S=wCsO%fLY0H@9 xgljjVJX"Iš lbPb͢X9s&ĉZYv+دZb ؈ed5,YlܬiJp` 6|4k7v̘D  Yf{AKւʲ>|&$Ilt?`68b,Z-;(\RBh+T@~P Fh@'4q/?W 1#ob!K~!~08K."`C4lHxVJ:IsV8I*^Ϡ^UJZ;苊(F"炵R YJPH!*|%L2, l2jI$rDļ0,K \D`:,RM-f M5Zh3 6f` m -OqBX`K$ 'nRc&h V&@%/@?'F`aȵJ"5hP"*Z$PYD~cq" ǜF97p"] ( H$j֯( rˈStk2+)Ҳ`5ac,:2QN"`[8#E;3UV,h68 8xM7ꔹ Udˀ jA;;AW#hK"!_^{I*I52#2# Ğ+Nw5(ă*WQ{HwEܹz|#7"+vr~'+nbJ(|xv}Wv3JXf=A[?y30{8mAb mYD h6Zz]P(?.R^d@Nٔ9r65,"bkA \hz&ms+BҀ 9֒: 71EpDA$V A 3%16_. zPs"ŔssS31aK; iwF"H;ԹNIernH3!KT'?y,>pIƏp8rH?Ɔ{ 5&4Yt aS"i!`4D6bS; 1Cr:!Oy.h"V.3 1(G>8b(lqq\ |c@PPeI uB 4R춿%qǏ] N hD1(aZ.FQnv[^c%/z^2j2nyUʏYCtA/Ec'w7FG Džƻ>}#C#\a t6Nq:1Au5vSVBgO, "scdңed#IVg '?L\e+_Ke/a˲e(OY,;[3\g;Q_7i3fн]hG[9Nn^l[>tLF|izZ?]hѩV5#Jm3aSkw-g]QVZײ~]l ota7׷)i`'06m^dZucp3ɸNIGQ6nurӻmPkjDEJpt.m<u n~_7nuS{Tv烟xK[8 "-ۅITӜFIƢ'mxlm;mx׷ި҇ 5Ypcޙ[o][%zyHWu0;5i~ٙt?\uv2= %nmj7y͟nPL wp+y/k/?!! git brnch,!! git brnch,R H*\Ȱ #Jlċ V̸_E~ Iɓ(S\ɲ˗0c\: GNQΒ<5*Ο#[ELH^2>7>rӡ45ۉ,"GlX!s^a27_}Ts Gc9R> R 5V a$y!BPdBfI@c>(I\)pƉ̳9u4`B7O=BB4г>h 9LЛEFO0*V0rŔ>wcN0x:a*L*e{:Jiu@k+NkE&,Da>D@#>D"cg2VV_@ex"x ʛ/ ,od5f[o`D[#aGCLh?Xh[GI@ʩ,.ez:+ z⨈j@)<#3j$5*2f B0 8h÷i<4{8@(O/UؚCTj 8р\KG$+g̰[M[dZ>$朋 a^?j ffUE > с<>n1Ak;[3'شw"胇)p @})D <PA@#?]a+]G6p7 Oz<7IP3D|x W2TsWLEz]H 8aJxB"Ry15b̄2bM'!JP5%]mZp ^ž *lU.%$9,p =/za'[YR7 P=`}*C |(%$%fR#U6)D5CKģ9`^g0> ?OPR7JE D"&mF%LJWҕ`LQF P3G#tC;+|DV\l6-r;f-tK)` |)E*m-BRֺI#`UႾ}0)2ʇAi ʵYfi h(!z2 [N>]!D#[*7"$Oa,pGs"B{!P9а7r2fap:7p f>h-Hh12 =Adc8c [[S mrTJ37VE"i~#lE(cT }P.=A샢*E@)4RZ@ixw*c39/ersV4ˆ١kЭDٺ@ \Ձ.CuE"{sBeG:X:q|aMJ5M-A zӧ司@G=ؾ6sC aቸD C$JaE,Z$=1. ȝ, <SΚz,UjхԄ~7uebP '}䙚gv|a,zu_hzfbK v1dMǑQ̎a/sq[%`)Bwu6"#yB5-#$` px w. 8IS?ғ1- (gSu )!\w\){?)si@j}7| y2yZmW? T`1WZɠ K b2 C^Pnc 8W@ p%.j v0Z{`9p5iƃȐ 0q*&4RI n ѠRq$HYn#jT9Y"z 'JPH }ո'v NjB`@PP Wb 00J5p mJ-yryXژPkJA9VB _?J|cUW`ոUCA|e+-5IQ?)C|PjGJSZkys[)92w1 iRB ci a @u5͙(gz%I ڨI4 8|ᑕ Q C0:9r| H:0 Ps\S  `D\fG_* ;oB5# I:4G($׮ XB2¨jZ+.1CpJ9Pp[Fv$P[{6A .ę)XkX  j: IkQIF; H[b *G ]8W`:.+ٵjIX;(Q'+j)AjeJIm) `nל*ds"\1o*Lؤ&am*PABٶM6 EZ(CA6,O^˞̪B '.ɋ())K Dfqneح ̑ )p+۽@MZ<3MR'(~|+R!{rCy''8s@Yݛ9> 1JKڬ d㞜^ ʠp%I\\ @{ӀE=ޚ3Κ .+q9 ݴ))™dNJA^Z$9> U>X"˅p )Fљ}P #< ` mZ4=hEz`BFF 2 Ѽ:'༓0M ؼaB5q͹ ŮRB t qF5"T  `?o5qT'̺ta.%q v'.0r# Z=:Ǒ+ t0t^i`Z.`fKL xY>Qm8;_8DQ{+I3AQlW@ p9[:on"D/. %KWށ n'U$>e?*g/K{F1yu}ګ= +i#|/̷ݰ' iy P۷ƃNTP65rXâK\օmE .:&_[/?{f sAp[{BWDo$ZCIJK 穈j aP:sC<|xV3 /="@ QXX#D\OzC^>$0&D B%ow3Kq~PYpZC,]x稊n$,&*zR$2SK`TB1śW^}X`… FXbƍ_GgU螲\pi@>`^vLC$/@iE䭄s ﵮx(YV`K\q4i zG/XM KN-Wn{.3 M b054'x*_?v\:PꊀW!Gԧ ꉧTx/p(&kעf361GwG2H!B$DGzpPi'o5(}Ɖ;lPǜv4Q'zl)3\0N} db:|@i'5#`|y2J8 |'<2 Szက\`Rq DU?YmɠFq+vc*\2} UHD}Щ#J KTHo7\q%\<֫x"u_15^{7_}_͖Nl( ]U+Hf7b/8c7'wT"'.0x<4 M9fo9gwg:h&hF:ifi:9\owZj;l-"Vps,'R ǢcΑUp.aZl'\d]d— =$ \"$r6Ѥc |oW;p`\_B.\ 8gv>fM}/bgUYrFwxqrO/>cb9 R`m?AU1 @ȟ>7Et mI7@: Dql1X#}%X6x9#摦ymJSUj ,۰U=11UR*9aH9$& j )В F*[u@OR HcAp7kle%U  %4Y6TDq+!kaX@>_*p T @5X8As܇dф4g@R::â"5"'(ftexAKС MDCxJzlHԇd209"Q, !Ta,0rD,L&0Daޒ#T4՗yϟ:{VI92!ς,I%ro~d"R 8Ϩ@"%FT `99]Re"" L"9H:6bf/!6$%ACxh~HW)N+wc`Ƒ{P;V `*|ꔩF8 92&yC=yϔhM 'H)>;`[I*Ǘ##yH:)Qrضǀbj35MfNtu>$:̩ALCٜz=dt M`2HRu gԈ(#ץ8^I/”j%)S2Vue[jQvxQoO.>QQH VM sw'A^&*}A{ze߱o`V=:f@?|!`^/~S xf8Ǿ[25{ "粿~?5ͼ}+=?qQ P@rsi$ Qr/iq .]p8 ȇ `\q}I}p`%dM`0 Q1< ѓ@G; H.S, }cy@c:̘ )9D rBksBÏÌAeo);Ċ":8ӈlh* `9;[1`X9G ' #} #z ;\TUQ+#|T "(a) 4[  x max#Ær }gUf!j!U"m!:āl @D*|'X `b$xH,jBRT~k}/X]N9tZtx"HIuҁv 񤋬cQɕtj&ihxxr`:H|G@܁[&\xP'v$0%(- p#Qb)qU ڻ `8ٺר-Cw(`Yr9 0m˃۝sVĻ R޸'xГ:``[ ZЇ ۀ3[H9}ZVʰ` LK8:Td+Z] A>xÒ0e%X'8ȀBȇ$;L * Fɻ 1/ijpO5L!?aӇxXdNiR \fV$!kD̩M$ea&ɇ-3;}t(vܝ^AF<P HiE #;}Q2UqIfˠK>}xr@ $i@.>AaV"6#F$V%f&v'A8b(b@.4ŵA%d[/"6.b}7BQ€aQ3c?y>ltİ/F, 7ר+1 6^)6U4ۄUC!N#1,dðdL^d> `ƈX^fdv+VOCȇC֢Ȟ?؆EpǾX +10h=9*({~pq8{#g[|Q" P؃FU)zL1`:j%'"!|x# =M\!y<n dƂ\Yx.KEx4qlޠ}fhf~dF-Gc@`Jʩ> (ɓyI OHJ/'zK{" hȪ$qMJd'έ|pz"&k~LQJkeRH{UXI %{*Kȇ< J̋7Թ%}jy"lDDe눉N?`v xpA"̆%cL؛8Vr.8YX֐%&;׫ o+ /XH$(+έ9MHTTJ\Âك厗B"xmmNS 9Fr>NY)lIb͢P*#в#l7Gq}PFR<2{O1-S-;EnFkQ 8224RĒSdEOϢq w`d/<Ădox𖼊a$ ԜZo#oF`/?uB_ݔVA;Y-Mc ȁ%QZI5XS ] ,q{WTUI-RJ=FӕJWgoMɨsz0`+ȸSF)H{ȱ/=I: '{/A<2Ǿ @`6%heN>` ZUk|]3v2 芇<]VS3rp M1 ;4>%X=2ony@0w20[N2ċprPAKSBՓrQSӌ0v2{vqJߗx(Xp Ѭ}ٙFt%e"X#)6e>h9(#ٞ6eh s)W017>VhX1/7ՙo Zش0RpZ?Tِwkjp*b0[{Ӡ؇8 ߨ6XG9`~t?W1[8@Y}Xh-+Γvg{9۽x|;nv02 钱Ki꟭U^_ %;Mҋ M;꺚ؚUgР ЖO߸!j1 s@@P_=;-.f% t+Xd6IO;cA[i!B)7XXgU-*؊x·φXjV8ccB@ I!% P e K&Aa4H&n&!P ~x&_'})]KjC=wFgDBfddNZbgݧZa=C(9 Pʑ"_ذ \@ ̡*cK ġa+d۝'6[Y]` i&lBpkK.WOVoչ{q:)wpB/DP$u=e@mI] h~XSGHe0O#P)죏9gdB6YcS)HXa L[ld̉lu0'н9o$8 yR7 8- Gж>#`M1B?[Ta0 ^/#L]@[5M7=v;H7A k##H<mM!o w=.:mO_v;|W5Xb g{΍t: ?kJ3\GOA-lP990?y_ %0Y]ū  (^LD#]# /q{*7T&zғY 'dY38Vc:AXV t䂉JT!F\p#D{ZH2 t /4 _XK(xrGF/ 24ɍsK0BD>E *9:F Sq1n *ZQh{)Xu:/v0GRapr$$d7pGJ $'1tŌT +LD Y֒ܢ;cR}L]>(Kr0U':4XNZS f&L_23ih.6D:Dtc`=85nt@LDPUBx#f[ G1yUhD&2LpI졼9* ƴKB/قBC5dnC=.p+&GVA)pWQ0^d8hA8VT.[@V ,F0S PE 8A9SdWv{9{$ٓ{]k'it“% fTbv.-_jÔFSDy q_/sB>FZk@F%pzq"d;FDS""dx!0;;W0=@Lp_bP9QYv=TyYIT?("$^S^I?N"=l ]>T ^߽`!_-_eZǔ ښۥe`FpZ@ \a dApa\`e C'pC'ȃV؝A=`ƿ`bQEQ3@K1#YJ;F<,Z!fQU!-c $\$Z Cb)F?VJl_SP#٭B8DTDBb ]qę!%/ڤBE`f!52L+F(%X5MQ Ɯp%dLF -D8Y?!(D!ÃAW)UJ dB =Th6TAւ>@MIAް =S&@(<ɨaa0@'=?htEH#2T)M`i]Vb&@CJ6c.&>Mf&@T_VA = *IH>bL'*i;ƛ&娅iĞ*ꢒjHU&pB\$v iR*Un(GjC^hubQFCXkjkEBjT>DR΋B`UW$v&NV"`WxExͽ^L`C!([D!vɼ ЩtDԃX 8X0ȑ LYCkBDS*P>4䅼٘X,XZD6ώ3ÁD&D"CC0?4Dkag]2BD C([:ll,ܒA@Ob5l>,|-n-HI+3̼H `E2$ҜB-a߲lA`kD`lsnu(IpнllnH\EEО#l-ݶ Vnzn ]/2ogfO(>8ΜHFC ̒7ho8B)U>mlܰ'q0d01f1HWgS/2 ߇7Q@s~tcqn)0# ?q_CFLjpso"c?2Fr#"q}(Kر$wt'WGo*S2*(G+{(;$_2j&(*[+̤M #ELXrm1" 32sE4CSds 4?Ss`!c3o-/s42tF8{307Cq*3KK8:tL+P5L";5Os`EXUB(B?AN3Cts.2N3JS?"u=rZ+s]\tuu_C`߰=OPGu`\ߵRTkcIOu^3Y4f5Y_r[SgovbH5@];dйAue+r$uagtR#G4MqM۶”3m Jv3vNvǶavPupvT6tud1TK6@=[6dߴo6s01B >j6bw1q4|okOvYD7}4^wSZu|p{77p[. 8h[stowNxK;QHss/%#7mugpF=nBl7t339kl׷c+tbCx.wbuu{e?k6c{3J۷9#9>W#K6ﵖ3ydQr+p5x5X{rKO{5rc8 Cr| YG] _jaǷPO8}uu36ӸX߹yvrB]Y彂>puy׺w?[JSTwt7b纆OyW8~n97tp:'zK7-g96C m&_0Rr;C;wW|W#zx#{{+cs~;'{~vk{S{]Smc;|w7r|P:-7iwSoz-_{ʯF |z<#/8 ||2ЇrͻF='/=7?=GO=kοf@Whf@&{=SBKĕ4+Le ڧfq;%޳BI|4zün6P9@pb(+Ȭ b :\a Oɚ,_W0 PC<F9;w"bx>pߓFg(#K fW>Q4ĺU0Q>ȯaJm^YO\# oĵg3 .aÖqֽwoJ_^WӧϩAW֐= oFN fG∶̪ m/xQ;}QKDYO?G=}A GYΜ0̫->8 /&hI."hb뎘JG6C!9) Jn9I}c48\nH' f*"{/[h@ 0}T A|癧7I e2E$HHNn6iCl'F`"+>.rOGE`w~d OeVMYi%j[q}H:RZe0I% NF@'{B{#m/vW,&'MG+ wr'/2q*'/хc3 iꙢB+xV,|y@a3jNF/2@x$TX me;vKuYZ(ogqmsӵu^y-ިC|G_~H >+b8o2Eab'6c@L13+Ņn>v}ޱ g~#9XUzф_`aWҕWvke㮸Uc"Öwq`"`r*8ỷ-cc!Žf6,z/2!i#0KghU`>t`vXc.H2FD z|H^y0CP d2ӞUjA FɃoL? @XT`$B@u=+:D|Rx RI/Bn8]q@[1"\9C8H b ,;a0= UpJ$ 0w!rD`Ή"*Ҿf..tBAV Y9saAJ{(IGjt5 rI!A6Cf|E3"3`%+ @\'LL+.9ĕʀeFH(sb7iK9QF !IMD*$(%Y@\$OL @юңwF=)oxGp\^qeiGx%Tb9 sb>14@ G{LԫpKFp8TSp"?",Q]r*y%dWDl'YiIDU>ĮVTih_GX[1ֲnuGTJU8 `Α+=jgA++U)A^Uq #M]X,'pl]ݱ\loil9ض6}5_JPk7і,|emJ5Zb$7 H#)H֡ npB %8<)wlIqQ1M xFX$QQ8S&-1<\&BT vP(T "VU_̖T2cf! &h\^V,!vKAܒȻA\ yj1s\`d?^!]\r(*WN[1*G{1$?(X`5rVӸc5CY)U*BGsA8> \ OcGC׵Lm^9CakS V#f<Nh u1&PC0HjcL<¯ag3޲oePdzK&Mcc5 bX<#/~˅* NqQ54|seB]`xIs",U;YYRoy.h\!0t+ɇ2ōG>Ǔb<|GG,Wd Q/|a-X߫.>i%)^8m>A2)0G>;@aჄG3AӂA.(B1b> Qp.C @\0W!BLOB$X1@ cCXrc$B&0E%tH}bʡ(H,>(' AJ&"&8-Waơ b) "ZFh!!F'DGEEaC !^J* /64>5I'N't,NO ()\# b&" Hd@SPKS#',U `bH TKPP'ä3BP#tO{"'vKHjv br$hgK!@$kV".B8&o>u& QoNlrPi5DWOBWS\ uUEN9abPgBr.5"3"-*T 3 Ka5\gU7~]9`]Tv B{6Cv.?Cx4Tb-N(\TڄW~ARBK&0?:K h/]KC$)ZJJPHM8.COEFH%V:uVBR<Sh`4slCF`MHTP94`8NUVgas',]VnH$ I_*cvff%-I:DgRBth16,DZcVbע*PTv6k)Y5SR$ w:19j: OK>*vTJJQn_EX&W8:t A8a;q| fe5b , bacog~V^K)XV-w4S;qT|4'cXnFit|eV)^PXUaF)D.mXep|!fkvWr{×, :X\*8Xb`a '9@U p"idK_,qnkEsrT[0}_f_pxfHG<8uV9ӌnر# le'y\ t^J:gd) @go| HI?wOP4)'`!b|:,X5htoaJbwR!C59)TxGHdwtGPbv P,Ί z(~Ȇg~ (hD8Zkat g0gǙ"(3V ).A'/Ty`g@z:j$crL]p|LDC * YH쁚Lʦ!I @Ni좙/@ Tfn >VGrӾ)8vयIp4dF"D$dƸWA J꫖){wS/8X0`=8Ez T(|Bƹ0dʬ='8hI+ \:0F4v*D1krSka0=>o٤h8+UsfEF!8uY[m1 a@% faU.LE U0xM&Rl9\E; S {R,EO&5] oB ovzܻѯ 1L 7hz3@% K&|,.d6>˴q"pM3(gz DgN=4 l~8A (K|4A53/ Y%{")G)0PW 찀C @oHdG90lS} rWTa#a @'4Vj8F4 bPD=0lF(~<`&qا|8K` b|,G)`0)A _H 9nkHf 99$ͅQ95ihl0PM > PGXЈUEq@Ce00I yFjӚ y/ nC*!J rP/Cنt7Q1{̤1| 5E6%+ނȤ!'nT%=RF au^"asC5% KC:f H} R82 12 b9 qx@f,"An0`T&ܠza *rg4Zdiܡ5!=p\/<@ U 4.l}i24 oxN%*BCʭp)izIN@'|B(A5V`bP7  q8@ p@?{\d*uHE81uuu 5ZZV{72 xtc-Y[U{'U2G|+VJ9_,XG4)Adkp,Au= Z^r1^վ/Il@wi7o\w1*@d҆6!)%3 TPfc!^`@(9FlnRD4 A HdNoL 9c3A<P %`@ KcVw4K OpkEC sv_lCw8 X0@>`:ao@ΎguxENr a5,7]$Xb}>I }݀ґN{Kv*<,͐fG{yh#x}FQ*rw{㜢DnSzbmiOp P0u+f^r@gY{7BREAgQJ):sINlݠV2ĨyQvwM0 &0ϳvr3bB& ىyt m}k9O8=]w M!zHui*GATat@/quBAـNX៟3$\d*b @ T+ ։著Zwuvz516w(@FΠhe =2TsQ`Yb (W4cO3 P;: @Qjg>C6P3P A ڠNRXA_,1H{u&vL>#B p`Z! ܰPy ZA e1BJPs6x,b0z i@0<1!P;Ӏ)u 34; i.@];:dkIqU`7qBYv)Yg@HA?Ш.:(Mr$) a%i$P P4b!9w"Q!V`9 fbWwp3DMI#BPYÁ$~ŏ%^C%L!$0#p!! `\!c ^CʴQP!9q@qg· D'k+䀍1+3{"8۲.* r!;G>µaAkls6!ޱz# DÄ' /4'( Л+ /+j˽8):r8**.f(k/(ӽ,k(L␲B,b17k  ,Ll8< S1RaLM51 3*L'nw}K/&HO18 DVBZshVËbU5's"p`2y]`j`;ǵRL\}72?%Xsɕ,]C\c@k<*2<9@s=@L@S i/}n{W*r'i`N&JbB̑p0xh\c8{ N?mכV-=|GvqgvV#/9n W뾡Gx>gr-Z⣇9U pN04a݇gR\{˷iW Cr'!pwvt{s/6_5{aRlg0p`E'uTu }70}KXp'rJ"p`zt及csB#)a  =3b P1% K5Ҋ4k珻{MIXc(=%T^1؂aa&3sQR Ct>Zʡ3Qp)uYTʲ#m/݀șpt]LJrRDZ8r8җ^ ˜׃<f)o鴰(iٱ~A,ִj!j"'\49e) 0/ߖ?e*݈gb`C1Q9EhN 2?.9&/N(/1E& @{X @<@بѱFI0=~]`A+0ӧO~9gHJTҧH :jѫY-JQaŎ%[Yiծ]X/ |˔HFakR0 ToO akŒdgȑ$`1H\v$zU*z`տI+.Y¿@B@y%dP&7sAT AOmЊ>kVԯZ4zRpP4'wp{"Xi l3:ݺykz0`W!>lE 3TlѪQLzG r,H'Mt `$er607')9i^IAAR"Dzd4ΠBLD<^,G7W!yF1e/vfڛixʽn2)(5PHuzIk(}~tΌL&](-L.UdgXFai pa%b>V?yFicLŶm''dPr*$XRP`S˻<]77eb19]H_X"ere[v-@iGs)?&}POgyٹY;|' \É': |yjv: ,ԤG@P0TxrD}g*{)>54ЬpDo;٨d5VFzik&phďQw 3{@Ϡamzd_f v< mh7Z=HJm{S|syāGjܤnZedxdq,+O?ee$`[Ā d`H@ .l䄄k( ]AP@"# gm+da RF#p {$ (bC A$b) 0bh@$-]0!g㠢X? ~Qc$cxF4QkdcF8QscxGBsLzXo ?[X)npxZ˻ c`:d 1gW3]B/9m|P6g jz͌&+ n]ҏ) /:tG0.*hFKЗ=꒵) XD$;!qx#9AFTjUUrC0l`|ȎV++fEx7hZazF. 7Tg!QTd= N'w`?tXI5XZ #AP|n.-@L_$I#0p,;ȟ'fBt# NBɨM%5dl D;2P(eo{G@Pb RAU\C &>WD.2H"a~VquDIA^mVRC!^TN€殚ɶ A>@kV[fw|k`w8D`%\ָC㢊[4}*^m/{,P`L d)`΂aI14xGty,oziS5¾P{O@fG>N+pJ}=B4G˰ <3V"}g$Zqrɥ S}Kࣘ")`:Ђ`?SQKrɘLO. /§0w {3)#oaltpϾ}XE7?9dP:i&][p+{m\ Њ@<݇)Q4*}V`?6; w'x)@r+N[MôٹC vʈ@{  HӾ}ti<@`؁ |P @!AD9 26 d4ۺ>X!a8ؓTۺ9Ȉ=A@s]V\È xŕȀh/ p{9s9jLƧ۾{_>8$";8P蠐DNl(Y:olݘ s>kڍOΈH mȎhuëv@_pHD`D@\7$H898KJZ +sp,my2lQq- vT (!)T#Ś>15K1@F SR 7*d`(p8|- nH=4r.e*.S`B"'`@` -6:)& k]cNc/ =Vs`Cƛ 2>c:FS = wC F_ S4TV5. Cہ`Aͳ{8{ ʐOi5 PeVΊhIU40˛Kb`˨kF}/:B#Cԅ!d&sپځfi0C{0[3N(uj3^ճ<)3O-81`Y0bab6eg؀dwοF+O0COk0锐y N7M}h {`MeЗx@^f? &6EeʕFPU%9 1ћ< `v `^NbT?8P6Ghif6}3vPBWerM _7RAȳ2)ByR}/?0I 0P;VXbDz=+oo ^1nmܨwbUT?}xv5oߤ8gpPYAP<_NH@F6ooqKR˹=hwDJ1/N"ලwB*~QL>6;)ē|s潀kVTq@z;b 'Tl=W kt}rE[M:K숱 _ ǤHׇ=ܼ?;DL pߺH\ɲ?IHG;V|GS6{!o䕓.΢H_O~066ߍȆ(J \(= ` L?1эX>*V\Hސ/~|)pZŷ;\j,f"Ɯ+[9F.?fLY`x"9 ]Xp5g])n"]EO ^Y3ƎPViWw:'E0kJԈ]ѽ:>&]tFMWw)nYX2GtS%"0F~sEZ(=U$FMthPK 6ktQM -̣?#ADO=PD'(cN;ua &C]"%rEhv1 S _yEDb$t#'PlI*:R>@Áa.p=܎/=>_W='-\1CCUIИlrjugd>ryC 6s*;Ckw^r=ϴ=}젏\2=L+rk27x9nkN|\59ܿxP3[T3Rprl t L044+ 0"! ט*%\! [BHdNsD. 5{ؐpx . x@flJ !.1RbN8PoE*I I[gKP.~5>8Ѝp#0qdԇ8C"2\$#GB2$%+iKb2$';O2%)WaEV> n.#\HT90y] D,f ܂'T`".T{S#"PV cLP >~uzOc^c14+P*M5ηgV0#- pT: q Pd)pM@E ~g"ѯ@!AU@T0-]!D>A@]U:]i{vz&]+ 3d`>,|z=ZQ:1([#8k[k4 hY]I,ղ@Ї.AV{V, \ЖJ븫 iL+pZz\k\e!fX8 %%,| t[ cH])Yu׻ m;Oу}w}[!6:zT d.+m,Z։Uo2.҇U"=Jc!3,>Q8g)->MVD(ݎ lnSt,MKA9˧EsET'-H M` N-F ?hB:a1( aΡA0!ACl@`gB3Vy#$F),_y!ײbS@9 !A)>л̳)@>+ NhX5)mwBaYUK!Nx- A`Frpc?U`%yan@DБn1/p= NbyG} `ip@Cv%'|9 !a5Gq5m)<_C Bj=@a17Y՜F?T)hDZכH  mt  k\C4 O9\s9\611-JT-Mpyr- ^ އѠc-3@|[`p]!ށ4}@&̼+R(Uƕ?!SC@aݡ5Fʥ\5~ט9B@ V# 1´dLFy"(B\q;ċ)VIּ@zC!_%b9?4-@\؁L=@9}ae5i(@ HC_bJ$ZIf@N @Cgb> %V9K=PڢS ,FitH))^Db\`idPQ"R"#XҢR Zv?ng0"wz^2^%VXbb -,,3a'-ؘ֞C ,Ԙ^g]>I*Tc\G–eѡ(h}}}E9x!ebfuffN]Yf͢Bٛ h.ȭtŖ0D̸tpDYhbYLK^ s1) MM$M^1J/. P6zjiur'uQ0yX|\ gG \Tm8V4^a u -@V#@(L9BAzeF  A.Cڍ\~ YLiģ!"DȄ"Cئ,B=x xj> q:VE݀BMnsQeT1"/+P)tiVl݌Ig9"D_XEG(R* Y• Btr|B,D 4*T (Ku$*qh@1a9A m r[AZt$( P\N,C8t@)t>CxiQ~,%2DAތk)V%*ex.z2YGJcH\(OfS LZB!,^Ze'iy@ɱjI4|c^$8Ґ =Ty.yvVo2n㚒V#j(@w.̗|$ohMP$O8tf^oop p#p+3!M-FٞO.v/g~.c*Qpq@n0=~FzWp KBi%SYnǺ$R W1 A%ϑ0V$9(WX rjKfD/.gX"&zWdG0?F# jcpWX٥o/0?yS}p%BPD@{$W _(gn;\P/G0c$*K((w'r~nVc*gg;-I. Q;r{r(r${ &+sr'@G;LrZ09D-Lc7H0:q.2{` s=}1r"3$Qy<+L. |l3|,483C0D'CW}ը%OH2=tz6**#\NG,D >(D>ȚxFJvZGG$ۚMtCNLHD@6TT|I uutZEĘ/l>u>dX?wL@ztL0؅c>pȜd6X |OFKG{KtHOP[xgvc*1Tm E S<Y]d=pID>`Y0,=,uC ePf~<+'ށkyC\wunVB>tHPO-]yw~t"8w}ݳͲIDaE r6d1xtw5 ٽIA*0pf>> '\K8y l7ub~Q2xA/,3GX er(7[Es?]|+˃WT':+~|q Sw`M 7m>+<"N%(`D BTnA31ilY؅ i-Ew)gQWִBLWN +}C( !ĩXX(/Ɩ HBd]7HGNu 䀫dG7 CiLi2ENG|r̛sHftw\{Ey21&2J1_iם )*S@,.5lŠ|A, ۻ7C,̕ϰa:dr%h|B=]A#9缯:$O>(* W0nt<4Op @]B<|j'龻@)H} _ח&" W}ɽsu1cmUn)YLk+d=swo6=JL *p $~|i`!B$ͻ߁";M+ 1o߯ `߈k"V'޻Kʓ+{MlCpwƐ C}'Y}CĀpA  8@-fgwq(Q炬pwǠ'0HC>$4SG,KYR=0 -qhЙMt $B tAY sF>4a+ʃC |XSj֜ELt%Y )>ٖ }SS4 -N)u8,Q4ݘz;x8pwoEC 'q`߹W~{v۹w|x+ )YzCvײyuȌ+S'E(oPtb¯2 RoA"t! b(:`\b*b tŒ<(Y  J3 /)+dd즜D$,EȅT" ,Šjj \QJNH7k8WRAä)@:J-L/%}D{Rh{D)TD}>D'M!Q2'`4ė ;6ӬIR?ՅLƋ8i Sbh laU"}v0SPE5k kAwŖ:cIvfDWu{I>qJ pe{w.UA'sY@}FV!XBx${%Nhgs6ӎOGZ nJ)3)#}D|̫W\WӶ~Cv1H}Ɖ Gp{f5Gn40W\£z+ˆo!G#W'|聆O'b HD}#<G]P hŬnW!"^_Z} w}^F"oߝgydGIKf:(IYJS1HwL)YJWw !! git brnch,Q HÇ Hbĉ3jȱǏ CIɓ(S\ o$>}4 $@/\I`O34SIg #Ԫ2l 1HnJٳhӪ5-߾|4xX9 I1-NVGWnEZ$iB"S N>SGO%>L َH$"ڸLO9L=g6ȓQ1vCΓeĹ͜g$4_ҳL*|ǛqM=EB(s3xũͧ>E&hWPfb1T"VҚv1fh& A ܃ŋ5>0ScC_A&`LO2HsOnLԂN.D12p9Hn>ܣCLn&胇 eA'p;obA&"A+%HAp8,09pCލA\0[XK;ֿFVWh=ܔ@sU&u726Q3TD3 22A cmuC>@9#y+9PI0P48nL 0c=Che>S3 څ <899%QRm]e^u?dzrbGŪ,6蠋Ὦ=``7v.ry T&3 `A<7A\ C. )F@T 7 At#v!DD>Զ<^  Ia5D<|AKJ%oh2B)f|S(`ʋ1f&f*[<vp_׭ r(YBL. l!Q5'QX O<ߙQtO} ST9jsx'F ^zcguL,nҖ.>:(s fBGB@zL&!T+q`c^^QSjPBCA=%*`tbR6PnB|RhA|4̔Ϙ=l1SD.dSĬc`*L aUtA B eh"72=FK'*>ֳֺj6Ɖ64]Fm %8EI+X8k܆ѐ<\Z_a*% 3={)9.~;R`iGs`bTdEv Rю}# :@*J7"_X|@#_ !)Jvp@qzJUcQVJ<0b + uh'fF-~YXȸL &^W{U#@ְBuMH5q)z oJ":6F7G>ސ!N%JrCO,F 8MZ4|0,^FA!}@0&JUЎMj[ζn{MnK+=.׍W%ChKk&f$.I%#t[Bp.pL_lFpBa .ās O 2$ H΄!hQ /aѱ:)izr_&2MW}4U-!`x+XV7 ^D<0hk"+_Vz`xaz m).1@#4T5NC%b-(1cF#QIu @/H0G84-b \xd#jޑd~"/#]fD0 5 |:8m, t1`FS<p:-rcˁG:B<@UC#`tc-Vw8 PD~3:2 2R [f@$c8XEPa0ְPQ4@u:C#@>MB X&c \G:3;؉sn@``A0MrCcy t8H(ttrK`wV7c_Nu`%(&%uS 5Z^ë!{tHodª*FW#suڭ޺oviG Cj꺮`&}ZzگTn$A4 ۰o#rvKb=qN1GU_j5q.Zhe 1 5PYiysIdU7U9TjV#31 h|ZW_ ~X` =>0!3Z`m- !Ne;" 3AנL9wL-P 90dV+8M|13Y%I_]ǵw[]^ÿ2V 'z4j\L]se#E1; N5v(5jyPnU/0hmJ|P =ް]Tqেys NwrƦmlz8#bhd`7bېb :S㰺qc2~T*nAg` y@A0g)53a/Ѵrݍ>a |Fb{ Y]P^f8+- Vmo& P8qK+g\_&(*,.aYa $oZ+%P_ c5Op]#Lyf$ `a(1oA(#ZV?6yeO䨱!,J v1yKj6[y0 ^h}!ˈo(ղ⊳†7,(o2q:_f6h'; @!!Pqן!4s*~?u03o<_A̦!stqO@?6ohOIa)q:X0"(z!!@? DPA*TP 6`QF;xgG EH@9 UkRC#5YGYYϠETRM |LGNBAI`ӧ|. H>t[ nR ŝ[7WL;0p.߿zu&0 *6\ȖO_=w . U +xu.7Ѷ'^gHx_!w /O#p=p+I>5cp6~zBʥˮɧ_GS/+!@JK)N ,et ) Z= Hx ! TʾxN0?PB4HuB@:y1C$[ tD(TJ ~w[Fhd5C9ͭR@ ̧0A7љC ]P$>PM6 )QJDX +Ѐ!w,H^~mRzY((@l#i# Lh'3$g` #d!^,ao`0{8A71,IN@Biэ!@VA M~X*fP DŽqX-R ½\O%"v ( 2Kc yww X1,("ɂcoch\h;'(});(51H!!!? A,B"L>x8hE*P!%[ jd0z=!X7lQ(B&`@#|@((NE b^8h _D)#!C%2 gH{ N% J +lN &TW JڀpԣS!rP K\ 0TJAf(D@C[A[U+Y>j9}^.'}$BPR.CA\%C'lC(RA*ִu @0B2ZlvaP\ mIj&7xH%/PRt%cjw3"Vⵣ-M\0%/tN]IIa%BKT&D2 `TG֢+UiKA\+Qtä/yOuBa /E c:AyA WȣGM38VJWJKJ)eV19d+|6 .-hX!2 NMi+nq!1 yd+gQ+Y)%@P;\:*'ӜM'b2f=Ѯ % ka.+V!vuWM9L/-Hv!n1K]\u' 01G!nϓ@R8K역$,c6Ak t"iF#z؃TpKՋRh_F'!ț*}|ÁuߦC,Сaa + rz'8^R{"@/.lt $cLJ؎nQ׻"D Ӹɵьg }&w9fL y[D9Έ2ڙЋ{vz5 #P8 .O2!aI~_mF''J%F <^/}`U"kd+J@-o?< rcȌ7v?*>#(>p!T'==Pkc`9*I <.bH, +9}#Jp C $th?@zop; Po@; "v`? ?q =  1*4"'s*;>s;A,Jp@shZ J`lPnIXBh=c5t7вbX=c*$+:(t;mBBʻJ#܈C s&8Ll{*&P93Z݂`o ΃M$7z0D?B+s6{ cq;dхA`̪ey(b" 6$ρ (}^p+,AxzL؄`-xP ǰ8G*'m|Z1\hX1aN*ʇ9g 6탫pH[\{ 㪕LFAp;HrQԅUx0y`"8y#ƞ{PJ}5(c>},Nh"I"G`8"A`i,_ȲZlC<ʪiM˅VGIL[DEiTIiQlFnHD LlK[ &~G;q01˞ܾʈxIцƬ9ɒKTg :T}̌J@8 S"PF2jhr@oTXZ hNǴ'(0:h@vhO*$H z 2 % X ;@s+}}8rp@NhI2qP$͇|hV2N}NPOȇex-mTEN&1%nJ(LNhMrQN %Q|$TN X] z@SQ-$=ZN;Y#ՓYVb ڜ5ڣEZZU]j٦բ UE }URZleפ۰ێ0"V ծu(%[Mצ[ڱۼ[2;۸[]ۺ=MU W2\eeYMIF0вܴڪ]H|-@|]c]U ]EoDܙP4"ٍZu݄EqйPW{]QMU]e޶58 ]֥^ܽ_pŢ`4Dc3E:޶%2;] ZEu[E_][[}ނU`o v^+(z) ݕ5_%_}M^ v_}Vap[ T`.a`n^ F.b!^a_Uafb^Fa],F %H""fWV45`(a^(]^c+^\-@>ҝ94$9E:xKm_G|d=^?bMc%Z>dRVfI^>^]VfAHP 8=g ofa~n5cNQeG㻍{g|~g&FVfv臆舖艦芶X5TxRZfO=*cxU@XrK^+ؖևi`ۛnrzZ6f~!<8-Gjq o1Z{-i)9 cT|}rk'RDdF]hi&# bRݪߨ O= 8&iѐ]ȗD9p5}]>*h/v$|**r= 8 @/eZrwhak,ъr *7: "zx- ~Knj5 *)sMsoCQ nH <=W)iwꈄF ;G@?']; 9< A!Jix!IQPX `I5]j4rkY2yv7MǞB`*+UYɗ9-Eٜq+ٛ58a$*i28@Â%c)}twOs9wNww~Z܍y񙃟׉-JЇYS)nYC0K.K?+`6oj\yW1?Ʉ! %ApYd0rD IJ"V:U؇.oZ!3 %'!h0$4&|(;[%Z]0ҏ}:cV! 1o|H0q&*lm81X}㠪Дx" R|l(BQW 6§; ] "N5"_8|؇<,H@+r"x U1X<0ݹ@@PŶ|% n$#JaLd& T'@-d4X{V!1z ]#U@(^r+ذbǒ-kj\K0-ƭJPA-fXU|o.7⚾sCޖ8CZz:w=0 dۗ@%oΞA?V{ʾ@0q XMo$YX nWқ\ퟏڽߏo#,W*媕_k+8">,6A ]f}(픖9@ZMgVoo'C1@B r |eS J#Wف:ne`ĊywO{Նh^4CS_agVTE Yi&muo^\UdR!QP_aPQUJ{4P`^ !*ո/70MVњBNW#x`҅661A[ԸusdPCy &gXU AdUπ/EVUU_|MVӡpACqiTa\hPI:QA /&tp%J\%@Ͳۨok>Sfdʕ5E`EuY5hy4I+fJ'ٱN y $B;Bd|JZjuE ۫9?u7WA=P0P ;@tEun 1Z18g\+TZնqsEfE@ē=G@#(Rۀ PƓ x猧~CɎW6iQ HлXzu;~K۟ 222BjSLL82 rP[qZB e*d@ kW 8JT9kOZ&Εob8\fq4V# ӭt"Ed`"QS5 0CHwi1apx:I01(0-/1> $‰ c0q_M ˞.9DcEL0 ʅadM WhR$+Fi#,Ra$-BI'd-He2k S{$CbQkVOMl 9*vglW"hCl`xa]# Mpœ 2 |:Dl!)ON#g)~ \'li;n & ,G }(;x&0W#ISJRG(LsTL iM"qR@yN]Q0]D"Ozp>i%A0p(ID'ZQ&ZeuᔈUծ~H6XӺֶ5]׾#깉ҿ>6}kh*~` #](ms6-q>7ӭu~7UI&h6@ `~wn~;+KA^c5.\OC=e, *k܏+{{A^3WZ@ Em18BE9P\s9I彶…NLw8A`#JD_' ǽKKݟ@4CS?=xJy"4U"m t]rX. Ӹls%Qb>8ԕ?PzҽS_}j}Ok?>E;Ce>A]&py dC>Tȟ!![F}^rEOY+qP7AS@6CaM1ʞ8C 8Q{4>a5u3}МE U }R#8lCD.N:aEdYȡ!RO|NÝA@׫5 ԃX> _X>0vW&8B;âG%fV@(J<<(ҙ^եELAmP?ILX>O 0 y!΁P! \b¼ `(0bA"?؈ JMX"&*'=F(Y;~ݣ@+RW>?$#>C=^?h 0NȈC @2^2644c[\c6ޙ}9Ö=9ë=~a+nS!A H|-^X-U^Q\. A%9bE%2 :_4`P ! wGDE=X&\2xAdSdM5&H=dQU$ B=TS:GZəEnJ$  pf_4FFBhbiYfl%u?`Xfq${FT0\%r <كaQ _ƃ_N` fM!^2{Ɖ(..ኦ(ӵa|IHxNQE?F\C`1cII5\ RTrt6 xTOLt\CXZA+8BTr6䃃FQPC LiQZjDB>tw I; @ iC2xDʉ7EH A=|7滄 QKEOPy.eģ Δ#梙D\W 6:2\v\p*W[KC>,SijN, + D INTpl * D \Ρ>ѨyjNj*$ҫFǷ-BEibXZMH,l _,^lvFy?  lUb [K!]ZBv(=8LGh |޽3NA "j(-*Ŝ% , ʻMZbp i>Iی z _-tD {Z<*h1pE ' NaFT DK40$?ذ~Pv&.0nR6.RڦW.$w C?4< $K1M(D @FNx.0N7< _1&2 /+\`qNMk{ 2ٜxg̰hq?@Tu]emY@DE];!)QXC\ʂV=w"H<iOHN=_g-gu ,g)SQTDhOUWJ9,,k3/]X%TY>UnUo7mrqC /x'(BI4J-B/LݐCiVk@b}8Me<L \6WvlX7{_nBqwՉ nsb f[fs(u r_&wyxU3 C,GծPД|*Bls"(̃1X/I;J`KmXNZ0BaD=\ZsQ׎鉏iyqgT;U W{W[JfYW9c]b(FHC2$ VWjXym0HX=CtXzhpX<.&bE? ;yAʑ߬J JE%eRdg<{ds=+sekJ<]53T;++!~|T:ɓ|e\+ XʷIӔ)%?۫Ü'W=7?=GO=W_=go<=؇S68?]mPy؏ڧI;7ܷ=սݗZ4AF6S}r<XTڅb-1CWZ>Y9-94q LءY)ǨSWT6 ";m뜯T`3Qh9k0fJF`D"`GC? @!w'W4sCI_PCuEu@p1M9 cM߲6!$8bE1JDKČA9dI'' P)!U49&HUxFm#n(;YKZӋ3' B9,EbUVM:\t(BGCԩťCQoE %j:*bFz& mK Ѷ'tFtFĽ V庺x'K\4'{`BD͜`#`;#V#;뮯ўJim0,I ԠP0k,XЍ7X!Iʄl DP;mnÈ(,@򊐑`#pH֕ԣzG*E"ޓ抱%G2樰}FASG!ʁ_iJ r73K2=bm6ӦXt]V7t A" !3lT;Fh > (>@|$`,1$""@fr(GV0d4UOE!,A )cHFo"%x=T` ,! W"qO (H]H0:vRd+(! y` H>2O GۤLOa"DS^7bct)71Nʔhoć^"q: $'MN^3ȦCupQ+ܘqrTfШ3AJ_-p8;ʑ$! Њ}C+ͮ6A ˣNX#9+΁Q31A^Q;sT5lAHHV}-=ҖCz<= FQ^S}A<̈<?^,_΢NCҺֶv m  nB t*mS jXN]BȼV}7b A3c m-}lp0P+]9c[.rLcJD֪*y$#x0@BR<9mB Q"@Q WP4tfCQԀ=` FLbZoܱXuޟmKhI 7!Ҙ!|;%y>nqxZFז(}PMIrøJ̠˅1j${9 |?w͙=U{G/k*ۭW\4ёl{+8ȏ8Rml24 x;NO}Yj?V%D=NQpZ5 G;> re mXD_hBp /`Өr iG܂ZSHZ '#/V$.2oOFJ4B6J 0oo@zxLe."5/b!%atDFa :ΜpT/./!O&gOp,6ǩM JdSRaC԰Δ":<)@ tbPJڡ?`AVo" jT`&Yb?Â:-)!BA#Q#d4¡ 0o8䡖Ā*9s!Yky\`3a &B@߱hA~*hJ!`1 er&i"&0L'}&,́~rFr(2)&^dZQ Z **r*䰒,T+ɲ,2Gcr2Gr(2..%20s0 0 031s111!32%s2)2-2131+23r3Ű3=s4I4rRR@4CbRRB(R8c&PtHF#+5WRns56]S-n38]S%ҥf8#C%F@5(*E`N( 8a;P!)/aS`@e)< j:O9?C7Gov06;v9 T[ @b:9p AԲ+"S;3'$ "s߈E؎M?S3`#:"4eX`=:3(~!e8';"ZA"f,AJd?H=VlponDM?#S4L{A/ HztMTNSiAk K6#HEO[t*A9@,T"K i*+sNOSGɰ"TOh.."f)8"0UK-VR_S&2GFT3<@5u&>B.aR9AU>*0"A8m 4F,40 SXH:avވNMaOZӲc|?HK#P#V;U"Xd܁=TM3^>GO$_4?X7:NAJ35d# C'6`clDJdA*VbXEsT"H\O`UIHUr6nHYP8$9#aa_[@ $eJRO,%m#GvC`F``ͧC֮_t%0'<&@bCDy*(L "`  ZM2nUl1ObOo@k.lQ4@][d"2V`b%vW!Y#pZa(@S!H,;BHq:5XGuS [\  = 6 nT%RM_8LV%bFTf0Bc֯c"VBf?ULe6Gi%^Bf!@*~lr {d#jw5AwYUa3!| r=y\ bizSkh|E }dn`7Z(pp80&4݀H9adYr#~'9Z@Exxw3g*Ha vf'4n’i`Mko4Ïz{6 'V :OHb|6tTnqj;dCg%, vGJX9fTQ&g ٩*ybmen}*n7āHu`V"Nh;}CY?iz(~{| ˄} :؇mhڼG jzb230`*`l5%> ji"Vd=2%b JSnb0gUblq7aM Ջ1ØU@Ji[p lZ&?73O~~IaN(4 ʞMf&Ɖ GK2 0N l"*I{Vb34y34rgBuTEkil"HJࠕ#µi[ࡥ^*µ馤I.Aix|J8I44Gs ^,jVve4v4f(N-_kh38+$!@d=Y !4^" ͜&3%|mG*!ۭ%b'|zRi%{ۤ,iZbdJ3{JKʭ.;`෽{+~;r:hu[f( r&@ pxZg,Q^+1uU\,b_Ҫ,|-XBÒ䫧-V}a{{qJ>:lZ _bcImH,ܫ/4NhZ]]8-diK,(jjÒ%hv%FA@ilCmp=,`+]y`>l\L#F,8RĻԘ,;\`bMΣ/"F[Ĝ0qm)V$eOhM%R fNH51&3m&Ao_b((QN fT`%?L~D"N%B*FNhS"%34!is$E7H~M/*~ *Z._ q%!>]$ %4 ).01(p3S%HLX^G~[En0m/ @4^A@N˻b) y~ig^zt׀@Ѳ M/\s%"o䑹,DZ )Vs!J;N9O M>cFsRC.hs>DQ_f :Ma (쳏8m,#>V8c/ȓH)"N"Ҕc?d:$$CNV0%hcO  ><Ȑ -%(#mH){#-6T=r\"J0`5w 0*䩩 ( &κ- C܈h#?fPFZ)NX$5>]r`!CaJfn{>iy/e C\:0j{M=(k_5(MzRr* w-Ls6\dJs>ی \F!tNL#P>->uNG=5'ZM6RSmvn75WMw>#`~-V&Ꮇx_yoyz袏Nz馟zꪯz뮿{=cjfۂ 6|[ 3tEcn<+\`RI h=ѴD*qRݣ> r9ԼCX\>ec~%)k69'{;߀B0{&!@V# E= KUB"m-/L#H>жԠn VжցME'!ZiSIAhmLC~!>}HNx#kD>6\;(TmV2bpG%B&4< _~-%+S"R bG"8 SvNꖷq.tqWCFbj /q$Ẑ~u!9Q\.b.,ldd!cm'0 6t`6x!<@&$7+(97:.!^jW.uŋqL8~g)/Fo h+Z +D40V0ׁnZilHAR 0 }X HuSZRQpw{5JnLHypr qq:wz(? &g%6)tpcqida@`E#sp)AbQK@b `df")%N8`5u%pP36(p€:b~.5%p'k8s$ Ch|`?);!@$@!ynuP5ȁA׊XHg~p4x>_Af";7G p@%xdgU7xKGy)@9IQ`' {0&@ Or}P6`θ7r& v{d-(Kqy5HqqqgC|$Y-Ohȏ(ُЀ.g*67;VGh1Rjwpα@M(Ru*fĔ%!P)QI~b@@ p? d+E&]93 ^nT[u'M@eJpu*%^* pV9CGyfh$ İ.\K Y)V[ޡPhXYvPF0 _vMdD ӕ}V6aW~g91C1QD!aRJju’d,7$`6C8#! )/"`"TWCm` 0} p #cvZlC阽r!t +D!6 WHAt1`ѡ9;4 HtbW9$ߙ raf~X-6gՉ2Q!!zcN,bZ{k K[}Kۺ]vӻ^R=/2C2 DF̛/dG +8'A&8CE[˻D ;zAcg U-1>t{KJEA*1+vݡgsdKF 8uT/d/41[$l{ alu" E-4&bm QVT%U 0Bl%?bdT8Vf GSL|%ju ZzZ3[\gO S/U$a4CVrXOQ KZWg<[ joTi&J8}PBQZQueVOd>!캞)¬L~*d kYWa fa [&F6c;`P]^ Uc]ajg֌LEiDcO9%QWל7I_/q6gn@mf[u /"\aR?G~h&3 )\\`׫=^|%-cmvɤ|a g{B͋`=HQf̊.& tl#C]{I!λ{LO=PGͳ(\Л&!MF*xYP1[ Rlg Br[ F>cACM&hlD:XwmB!WrB V<ؒBnݐk" dq;5 r*q#+ l42jnрBчr URsc|׭\Eoժ|ۼ+kck_w5Jz$U'Gpz2ILp\ˁD}b]~r$Q} !J}hAW *pF6pnWV˯-'-Ρu\`@ `G ڇȍxuXw M?mԹ}ܩ M~Rm㽿,,O{t;剴ovLXpuH~\:pA6TDlh Xw>xuspr>Iw0`X X0.kv( r݉gsCB#gS~`M~  X `ZZnM}{˰D-M^#"IEYZd)M*HoN* ȌF&Yd(B(T4֔sM}V5`J .~'n)pޡK26/塞h^ԞM)yَmr-kJ K >U]~<+MVL h-A" I' 6~I twAshn{A AnvRK=b1jkw;5 Y <vmLg0]cO}Q=Ms ? xL9MMeX]~OL^lMS?S޾ KE]$ B\<֮2oPbQ)a\iEnFe { @L&n,_t!(_2Mq `Ż8'=e2jӀP!# geXr5}4ӶOq3= 7FuQH#47pRlS7&SP;uTRKTTSSUWuUXcɘ9QŋM?YmVbծXdeXeōYgvWkFH颁AvE5rU6]uu]xw^z^|w_~_x` 6`V_&X%b%Ř73WV9@e=f4qKQsPw f0O*|8V=G5uP*Dq9v5-}j2?Pp gjm fD5B:Qh<14[70.v`BC+Ռu&F>I/tcʚ":/qaa 4ۘw"A)P uPm@I$9IH(8gl@&ȆꁞùOt@ll5!Nn ӟ:L& h!eoa򂚞}p9I#z$rI1:@]"R2+9DHp",Gό$N%tphX x8D $g_pc>"X m$HYj*R&'N.Ć%QpO+ʣ1 %s$4k:=|*imq70p^v&t^l%EP13,%/LY9*pocJ] X8"#c+xpisP`$hs\X(ky=TbS oYʃhFfy$[ [z.u![M56%#9A7p;R# VsJ@S,CHФnYczW%1u/VGLIOI b~<*q5Q5Ϥ3a9gl8\\gG&v*'~,@yg@ !;Ļ%[;ю7BcN]gKpTmd>O>` H|@#c,S0 A#ꙎT `F; @ @zXJoR\IbRk 0J||Q}c=G p}ё>@T;QG, $tĝEpvY2i"1kE _ipavd]}ˏ1sBR^ƚ)yh>X`a"2 (9h>Ԋ{=z@)(ӽ*: *"140Pq=1,2qE0}`'88 "d4;(b(0B}8)xqx+@6XsQ>.M5(}H%!ij DCD0.\8P{8 &)jH<*[úIDhwP6B$thD$BDZx>ZÓ? +hʙ>{ˊ3 X0TTň DIy_ac>A]E"l)/;@3ϩ(A3u좥n.ДG<ށA0dKnB : WhBx 5ҥ Eȉ̀oo~7 |J2# :@\`H44tTFп:0Ɋ\ "np5RIDJ4 8 J' xd( IH9LKt H G}Jd2@8ɔƒ9=X9rk 5J0`HJ H\DXtҘͯ44y"J"asj pVM ;,HÈ㸹nH>I9l8=x5[C^ eW0ø JPf' Ikjt08;%$ǂN,L@XĤ8Pی$4"@l Z#p .\")Q 5n8D'峇_Dm ]tLJÄ0G:x*28U*R">a餄}9mA`HG3Ӱ e sFP~Qw Yͤ a3Z؇aȅQ,MmW&ŊEJ+ h-` $ˇ@{ЇČ@;㌹8*1 /| r{ֿa4V)bYYbA߭.(c:dAdB.dC>dDNdE^dFndG~dHdI䯩q! Hs!pa0 d*cIO.iJneWn! diYP[ZOd#iZSSPST ('GYR! :X?Ѓ0nV`΍ݐZ %u& }sayn7܊b gZhQdgc~hX ؊0F8XȀq#*9R8ef84cd=PčBqtI!4u4gס!zv0>0Z`FY֍B(}Ƒ~SykB 8njP1'h pd^䡒=p= "iOM)jdbrl(nzNT3X5V bgf|VTxS@~&S1T^>k=IaQL\lu!+PX`SHphOp݆ F8l& Sf%h'kf[ `nphqwq&0 ((@hm@f鑨H[s`B3q|xj$$CJ )T cHipe~ -r`=圬3Sszs,Ͱ4ԖnOn;Nh>Ye6DHo0V>ˠ>THpS0 Wwp>7S uoq'`q v'hqo&x`kv /A(veNko(2Ź!1jߜv{PqsJ9䚼+zȅ7TEAsx=Of愞3PpL woYXaj0 >b> ضup\Kk~aPHFzx%h86ޓ(&X!hq' H?$kHo+(& l/ 9ТVѤZcZ9LAI_fys}na"~\nx bڍ`T"A56oFO(8`LWFO8u`mm7>`zfMcDfefkgf&px#` ^S0Ф ?4q2`@B B S=<(1F3zP' 4 dX(r6J\.I'5B09 ~E)v؟dˎX'۰=ͮm 7mZ=E ٹ|DiW.†#Nx1Ǝ" D,[> e"YfsAKI^æuע{xA zpעJ%0T/L DS!.oSLj*B%(dAN 1F0cC+@6Q#G, R&D=UhLҕpJ[I:1 0PZt/\YM4nW]> I`U{1W^@npJcWb[rhdBTUHhc j-!gHN! F I%ADlAFb  ( PB)\7I0A DυF-aA P0|,tB=$wA[Óo@~GAPQ +ID3Q[KC&p*$1U7cWed_P% 9M; fhJ wٰC1fdØdd,k-,@@ 4D!}b F-` PiVh0J(#b ?$Ԑ"0 s]>eP^DB϶4P ('!RHd@Q l3['|sGHT =/a#rbN:z0`^WcEonK|S_=[!BʃBl?lvk&ȩji$6oc)JbX "Q)4H:ղU TckVmϮ'ԧ a ]c*=| "H/2qD mD4X-E]bQ`hb XGK$lxS:^{ h?2ӫ QXg c mq YdęPb7"^C΀~,d39IyOFBL'DuuOIp 2L„,Way.!ru+ؗDRs/wACJ~ 2*])K[@#8P0_k)bF0 loz]h%0:H]*bԧB5R @2D)>BM)\xx3tN3[SD׻5zRȜU1s-"XW@j;@*⩏ptao l^)WZ,g; 1hUN-iKkӢ6]-k[6-mkk6X\6Qpw{*]nl_cl3KRɹ BL׍.[\8 V\KRC&]rc[7خbt}K1*a sk= [P.l:w1& _Xm*P 8ȇM8]t!ӫb$B'ۘ 1}r.1Fti71p+x#X5Yx<Г!+b3D@+4YTN0\+$X3Wdeqex!Ұx|.{91s2[t0gL2bl'c.+W!(@w7wF'.jզ3_g< . ޱj,`'lR 3%ԙ^6&|}e`ڦGf|\Q|6gCOGcxuCC2iXF~ֈ <1xmXmmߗA2A6!p`.Ζq'q"{FFz#bN~P/aL@nz>.C2kp{s1ɬuq=Bޓ07]antFQmdRhN BPf!dr3;m= Nx#& A|0rLpjB 1n b.2 }ȡ%/p= _HݹD/';M);שּT".S1)@#a*=MzL ;Ѕ=(s[1A瑌l/B<^^<!YXHBqJD CXA]$IÀY@ %X GK1F/eD_Y@y^PB=^ Ġ` Q+I@H6CQqD|"C 3p =L?\):SA\C3lSdٱ+ 5=HB<ށ"ԃ< \UHB`bz  / x1PhHIc-uZ$pCpbxX*@CٮP"6#vC@%Ѓ^ +cFYWayȡźt⻨yMFŸ}lHlRB>C>\XD4c8RZB<$~hH>-$5+  ," 9SKHaH^K @4 ɿC=~5\ nԬ?V"9bb(@ ȥt\]7%0M"ۄUأca&`3xOH5-ȌU8eHd\d}$B>`$=_+0M D`($@<ܙF毡Q,0,R* neL.&ٙ `挡0Y:bZ$DȚUd @%>gvףGnaXL9iL[ $&jUfJĺxfKjD = ddI&RHtTe(h{eDC Q.DAsڢ*5 xC1 AALXa>LJԁ NEd>{Odbi0er"wDXjHj%۝({JZ">Aa*k v+Da*겝? >tg AI(9>!+CzANaMjўv CQqfIB<$0':F&5l٫L D̬>D-L B@P46)e&b'gNH)Cqbka(2a<0óY8'Ê`y?Ti-!NQIP4 -1|+¾Y.J:i↖><=]8DA)J<[@I@~$T:5T톡)GS<׹>@4eyWn>*>4^\8:2CS. !BΜ!nD&)2}0T@v/CQHD#_<"lCihS•I).^4<. ^eJJ/GIp.*vaV=dn-BSYUKiDk*~Aq&Յ9[㕸~#)8d qȞeCd/V 81jr r!!#r"+"3r#;#CMZG2k"SrerTf1z?2ab'+~'rU+2z)'+2&(e`r]3(w2,2q5s.[2/3122;gs[3R1%731?39W3KO8"}3@:7˳._;32:bEYHs72_TjND)K,sPGRFSAk#tkQI{Ks/KASTM˴FfKLǑ٘QrMRsRF+LcrKF'S5IhRYH5_N?U+Y\;Hyw5EKI%IXuQuWw=KuB4]gum5V"t*\9]oD[C[adv[35tY3tA5?.WtAa%XQ=sgIw6dQ3vGζQ32KZgTNQapZZ{6B5oddTvGJ_56tt۶e3l+jjmc3p+cv5ӳpvtWwkZf `2rk*Ok76Ly7JzO6?7~G{Y7:ߵO5G mSO}Ӌz7)/8g}k.o4bruE?ix8@[Ou]8h4t 6xCOI7r7v\C7U+f77y ̎Cyy&gyu?Ve3TE;sc6\qy99׹KIvGrw7/':T%5O2Ö_:^y8:_8J %1[zjze9zzz;m@wJ%_SϫWyC{^ŗ\;:w|l[G'8I44gG{ pj*DgGϏUCw5.:tA7WK63[9KH b-ÉM|,N5_Aa}-B d::ky3F1gO}?a\Y$hD{'%xKn" ֊=0Ȋ(P=!+)a@d_JVpV3 XsV!E)YS1%Lf3Q\kӠsT`LŊzADZrׯ@w͙WkULSg\p%[{p` 6|qbŋ VN΀-ёL@9)SD g Xβ;:,O<8 tQDB<% ۗX+|P9`+r,bƞ{ʾ@ PR)u-m7o| 4?r+,K?j|% yȼ!$*-x&@AB;:PDo!|S;'}Zt&,R w.e(F<<m8,Ŏ*-lMشOL9B@-@B{d)8E3Z,()ZJC71gtɣXc@=Jr&ЉrT;^ 2c.T!F͉ KιVD=t]vkac*TU*N*I;:a MȩsxԬHZEZ"\wj"]哅oV<-o}K<(7^(=rʙ|At)hL a(.t@A;~G<1^ ?vȠA `8r뉈ibXE+^*>1?,iTcxuqXG;yG?$g 3r"t$ IÌ˒8Qr" SdRJ$sVR!Z&gL:l!xF U&f/נTqe٧X>/ȈhrT2/eJS\1D6ә%4)U_(rC/9Φ|':ePw}ܙ`I=1A;dO?N ?VT|uJR CA =1&Lp׳AtB7h*Z %a-9'qM <Q%&}-;Ƒ /d ;"x &(\4!x8/*0ѹֵO*VZ$b뺂pBKPub[MU3i֮0+3CX&4R96%&<!! nvbn@nvbn-desktop: ~/exp/thefuck,x H*\ȰÇ#JHQbNZTx1%5:\2,#(EnRA$\\y g,HΟ@ JѝJ֩yt`4L>2vPY" gKKщ:$\ Ljux5kӻxTK~k.ZRL`U܂ƯSrdU%o٧EɽƑ"L&d &)|ZXrƯX\򡆻/ȓ+_p6hLiDLz&ݜVkU"{CSzz?AYʨ#iռl`VXZWk!0Y;܆vHĥ }8N8!*">s\:ixNW03"wD}*#pŵ8dI|hISmGl?qR>Ic%a3c$dìqGtBϕK3U&әdaEmZZOk >KT\nQ?\O8NiyyAt&D'(VHFbIb ;;w$ ГUÊa%&q\ĝWcEvB|8 -:Ӳ#̸6; ?&&0Dms0O]ՠI C,;;XtvGh[Ǿe @{)A# 'EǮVO\L<y>uJb51ω,lf);Cψ[U j퇟FIў'+>&@\Fm:w?ى9_9HxyxIwK$hR#&Tkԩ}_ sT̕aVPw+qq﹗AC&np y2A&soe+)>JIen m&xXXM9]u QM3do>_,bM#ڣOni_k/w'߉?$RLRTn؇08wdA4APTiI | e$Q[im$%}vYY 2&lm tlS:A*=eiN^\@4NT[dd,|X̢Pܦ>jkaH5lOA·牫v & jKGVDŽqYwKt3a T޴wp`8H'~C &| =#{>^SHli+oV32NՎw"bPȘtK F KSbsV)-:en(#%egrKC *)|T8OmAblsmSd;Kd+jæFȊ31\!L?ʱiMN]G< jANm5P+W )Yì/j3Ũ1Qj(oֈqGO=KMr;[V[!ӕpU!G8<.< ^H\E:(cV:N n=蠭U-d+ vTcoA}75ڊ =Ӥ,ITPIqHJ5 Pzovt"`Yڡn@YQ%2?. TM&2FLjL*[" ]BM";- &+hN6pL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMZָεw^MbNf;ЎMj[ζn{MrNvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^jb(7fXfHjlhȆqsxku8y؆pxr(tHvxhz|x~!! nvbn@nvbn-desktop: ~/exp/thefuck,h H*\Ȱ  #Jl(3x1 *p㧃F(>ݚQŭXb}8-Z,O4T: *8+CǠH(F~Xw I ?fhbDagRL-84:*ѬT0 RB9H* 0Juٱ @ ۂ>)R4Ф &^L=]ѠpBo#JHJ]j%&wt.s\ 0ythYLY"AYG'0XbY,t"r)! Ԣ4`%E89?9${H_oK8[oT6S%x DTБDBq!sx-$Z0EYgaf%)K,$EKʂ @ gu * @x),6cB DB) DAT:QѓTF:р~JZ8o*@jC&A_qCJ% m@wv, )Nm*v.0M@)` 7?/d y ާ2W6P f-~5pB1VtT,0DK ?` Tp=Dj7@Qm?Dng1(4?[][Ƣh eYz.$^( Jp!²=P,L8QF~EWMI@S.N 02BpUBq\rz`<ќq4?սʢ 1e( (DWMg"S(܉V>[AW1?tSbKHC)<[qzl`'mZ X@zIWgMP[gA)8 gUAqA"0$ m 3NH0HrIg_r(&=A!pKD]G !d(&`x%0f(Z+!#墰 U>*bq X%0uX%Am d0G,PNH(3.0+<vHNRLsYAp(mkԶC@`7|6BNX"Z#:VNK p0D`eV* * h&RW#p# : #?E7)Ё DDtDHh7a X"?bl)A"ؗ@EPw@P.˂5 <$)W@88I0KԛFު7+Ȫi! P##OS2)#p:Jժb0 5XTԪ9JֲfbjՓ@5kDFxjEڐy' !5! nvbn@nvbn-desktop: ~/exp/thefuck,! ! nvbn@nvbn-desktop: ~/exp/thefuck,f 8p *DP!AO9; Hվ_pѸow$)pŻ8"I7mEq]-_x4)̕.8BU]#~6C,RM{j[! ! nvbn@nvbn-desktop: ~/exp/thefuck,fx8p *DP!A#8*ĘQ#GX+&+r@*YdJ"9`%HZڄ9M7m1sgE}YQ@!{4mV)Dӧ^ ?z؉ ! ! nvbn@nvbn-desktop: ~/exp/thefuck,fx8p *DP!AhP@-b%SHko߲ _ \6"nB*p ysn\C q xeڤH.ӷ/\ h#Y!"! nvbn@nvbn-desktop: ~/exp/thefuck,f8p *DP@2IW;tQ8ν}q8Z3cxv o+)`$-'I]|7Ƞނ 6  6L fV 0eN;8妏>r:ST&΋NQEP/>  P #S`VE9n)>6B (%L&DJ e%Bꪬ Q ܳC̛,䓌&e80 P :d> H>h‰78iI%.T"7L lțCY.9L dM>"ނ P8xO# '1@c,֫l0#L7_|X @@kf\B =Ѝ1& 0 =R@Mu7<5c0"j1TJ?d+δ7g.čAP?@Ҍ} lk, !ݱPM6|MCu*l[??cbK͙xA ){7w' T&N-2d&ߢp:$܏:f &@"pPh7\p|X(ҿsassO@@Ce  p@5DʔA@~Q" i` hoaG V!\P~nxC %|>6q2"q%2xj#0lG>@}67BU#4}Ĥ2PG  z%G01&d 4 @x!q* &UPL P/Nnk:̀`7 -z6ē@=xH P0H*QRl;KI#„"""DIMR^)3N$Eby X4.BO1&Z0+C mw d$<3eRTs!DU~uK)6y!)JxR+փH4rBCbUM  ӀL?Xj4&f+׶ RvQxY};^uI,TX'՘jR<@`ka[@7C &cL9U 4MAJ!ʟ GWI+S&6s|U\.H0{=>) b@*Ah4sȗmH 0@pXhy}pDZ3";:-4I#\0ֶvb|#vDŧjf;)Q-Ds6n{#(ʖqD]ҷv9>16~NO;|ɚ#ç}ERKc'U(Ǘop\0?B{LF#+t 1&GZJ~%8KZrĩ b(77񦟤z8t=T;́Lҭt{̓Ry'HAj AD}QQw/No"XpQ-a\!} wV(%5! x8!;iʩ"^!),deG0SJҒ`}sD_{4ԍ &A4ĭNu@HJ_% !ϼ@rw#{ v~#a0-()k5#F&wJQ'F@3pA276Hz!d ..B,1CT@105d5?"Ƃ,,6,)Rn'0"1b-0Q+BU4V0T G@YX.,.1b)QDsGiX ..(-c1*->sia.I$PEp;( h\|cu a6 ;kch$7VB9A!f<P l#yAKS<6R` ߀ |`=5>6+T&63 #xVu=j=%:T<8)Gx()7$K9AtCf<rTQ3 $? @F?^CUb6BT{v8`D` ?p t1&J _@0FCw% r AI#Tz5! 0J sxIPL`@E Gt5x0)&P;9H~bpKKJr4GEKzL}T.?pDIՒrOM/ ?s a P W GCGq0~t)iR@!u}iHC4JTޙ5 IyJRQY`EPsUUO[@u`GN'!ēSv1D u`%HCFBxO' b _ Rz5P?(I!PVdN9A٢ZQX$1eJJY V9M76qrhta3!XcEZW541UC3M!G Ō@AXŌD0H|zP`9Us Z, HzNr wڷ q%XjX EB[d 1֠ #6^9BYt^*%eeI%Hd K. cFs)0u0h, Ev5d:]ֺ9$Je}e; _?f%yQР ajB2NHj%V184A@-6c:Q-jjQ1QS7x3" r?AeF)]g tF)Zf]6lPe@S2:a%ffC`-6eBZzJJB'VP bSYAke"&g@6a+tt@'g.lBi䱨4FmM;n*zq;]N[Q?3[x{ۺ;gqd'%PGަ,aGH!@'`U r% K;A b;vDֽr"sAAӀr{cv%Ar T>bO̚Z;ssN(zu~{!)QUsGeWKq%cjQ#s#)b.Դ~S0{P'v&!2s">8Ul%Wbh'M'GR#QB6L'N2"'h,'·~lzE"]{P}<("F*uӞ\ӱ!{*~$b_*XɔerR-~e'fNʵr"o`{s"i{<Kƀ=q6,/d7U5|XF11Z,d|{{1)Fw7@ : ص- aj O-2BH1 HSS#-".r*_-. ex7gW8 ÃZx5N3RH1`@2{=RI0۵m"1/iӆj„^8n†80[2ֵ>ݘ6E,GMڢ͕,8s֭3ڲBژgƲܓm`\~1c=ߢ] zn[B20UʡT+c Ѧ:DѦٳՈ&i{ZOU:` 40mTAKh,K20 .qelCRe; qN>4> 9c"0>xWU7On yOKACY3zZzSS!t7Dȕ젺hl"n,  3a8ops#>PJUr!,Y2J{Ƌ>/)Q @UʏA f2lAf<"A(~'2  V2)yF:LzJ|$3A9U.bu,5hSV=}˲T 4,Ȼhմ n<{c)74AՎPƯ:| ݴgC!V{fnZ9Sem4$0]%"- o mP; t$&0tt4Qb<`#J".*9z(s"f5Fn4̨od&{TO[&^onhf2fU+kisd!L~fSTa\haB؁eS;JO-vt{[IbhϖZ[m7|Q<<5rUU b!)Em!F9fHNƘ vL^كk]Xnqh]Hwo'cbA_dHe[jPS!O}fo`.]x<Ѐ㙑y {E&pц;5+5iD>hcs )= "`d ehBAF3 #G[tU >\gG/'<Ll+|@P -2v@@-$y:É)C)AMt '(~L _;\k&4L+8T 9A sFуHHL/s|D^a8aD:X|BYF`_Y|vp@4D訃P |cQXXMP*A:bQ):()V[vx帥zc"BP\0E50`[[h*>  K9*xJ "%P֣vPA#o1x4 Ր[ZY} m>aZ̴bbI:bn}l SvF^-K'4ioQFU-=.`Xg԰}l ~VPmezM |󼈅lyr :P(E]Z)eڢc -a/柉bε(Iޗ re^D4!>oBF4`C](Tu8#`G hNwck<=jRڮt-va8#f x_ wE7ijo{j_.^' Wpǜ-sq_[5O9i t_kK[,c\E:!7u;>z>m]sEh= S=NOP. T6E~L^_x~o.<&xO33?ވ|I+yz9nu7Mθ /:LBgsz/}c䐯~Go{;EO{W? mTAO ?@L @틿ۿ*[;A[<><AA :$@lAC:[AtA[=mKB > l\$ܺjB'Ai )9{\B3C,<س;?B|lAC=\A; ?-C=c<#LA;,DD ED2B<' OD7T& ľS3,>L7ܷcvJp"`f<|ڇ0;K aA;3Ayأ[ TeU}0S\ځP1Uc}2U-2eȅ>,H|U_VLVM ulpfȢgN+SաU3l%2mRPop@rP۸Qgh՗yr(gKrfus=!#Xk3Xe'unX؋ؚuT2* W X Rp9RZ~:Ȫچ|0[2⇳;k(;phqHx27H>W/V0@H`°&b,AIaZZ\MXX͸ڏZ ۱Ml@,U;Z[h[|@ 1[;ۤ\V(8UƉƕՀ\e/*b]E[ũEux- `wPڤPie(Ų9D @ th؇4ECa·'4*X2>'Z> 'exqLp Kȇ&Z]zղPx ^( 8W69/ ?_VAsb`6Z^3>`N> .XY a68aM  U"by0b$Vd/Exz&$`N U}7c6c߆! M_YD)H`ؚ c]Zzl(!%U",naɪ, '˒%H xt TbV0;h`BV5mh)5X] 44b>fS5 Pu ilVe6X1*<^-%tV hw zYXVgH~nqk" \[ĭ(ΐZF4Z\ `^}h 6g B|Hs y/6x/S(kqXA,Crn fxA7Pk0g(GOc\ܙjl%x CB{QTbk PIP`elF&羘+nǎa~{V] HpkО0,/gxƩ]nm}،؇ŽPD X  ~گ}UЇ%t$6W%( wq,pxY6)ljO%1, `wfU ! w7 Q `tppW7q}ՓXqe׆]}'H877x6OtsP:ֶ@eHhMȁg%m{j!( oPjW1Xȁ@H؇VB择 Eޅp(*@\U'NСXHdCOtزRwk9hLݖtjY#W)Ȣ,X2b nYe rF1I?gG^Aos"¥WhR>/?Iz(VUUȤa1,߿,YM-zQz'("8o#җ2-Y' $l"(X&q'6Y}.{\XpOG΂tȆK \,%^4|;e# "̈#(N%R4mҶaLHKIW׃V!km{eϦUx:}A.P!=<xY_zBL:L#Fvy_;O=6NEd9JeQ\vblF@"ۅ6=)= VVlن*pWǙY*`tٕAD4ry !@{?d^LGϩ39]Z;F="kXbm]8 b.HlDA`*(:(J:)Zz)j){a:*z**2 TD͹z+++"8],*,:,J;-Z{-j-z-;.{.骻..*a,>w:o! ;0% 䓌7kMQ0k נCsKT *2)U>.qS`25gːRٜ-IX@<4Ӛ =S|EK{4=,LN[}u,6,oX;8 /2O3a6۩" `>U ĝS7GZɁZB7|x7=+>92 DP^^&%9% ly0g~k1=ĸ:6١v p3A+<;&>pItE|af^PebЇB9@%!LD#*#y%.a vpH!a ~l$TđK(J1($YCJII XQ}$.HŢpX٨`^y ň{`Lp$t ъA$А8sMh#K` EL]9 L 1( rT05 "!^hwЏZCM!6lM / VS<`FLdg|7P#ph@qRPiIF;3Dp3MLGRap2SdKU o )1[Zhg "9v) qp@+X]̔{<)[N30KX~?`pm7`( qL4dG3dK)GYKBbU|";\b!3aHl1E@|n 0f$ "ZxC^5[I4M="/7 #=I'@ 1+9[a\pHu ;!7ëo};G1sCNo@`-W I38~u PR~st(W 3mŠ G) e}D5@v> UĥyZJ!b͖l ĩ֘ <"Ym1= " ĄED)J [= Tyӌ:EeWfޒCޡJ܆ab@+@4}>?K@l4>l`-mq#y1tWOݟ*L4V5dvT%g bzA> X%ރCT#"J!__čF tWap⌡t3XZ  MD<#"26 $jh%f"cjm|^ BH]p S @øby+mY |1('U㐗yS*Q$]fXy?Dd*Kx*EA dNfeHpMڀNրq"˹Qa,6)&(( C2BFDӍ6d= $|BPW8e >PdDXeEF-ƾ+1<4 u͍yF_^LS @5 Ldz cd`EOvES3hB4쩉ڄ(E2zEUk ƲIXYمX)\éօr^IdB Lv)ev,b\~HG浇9LI1|lG=ьHy4 >hQLȚCdNIr#Q>D" tá,c=8g0H4f@j_7ڃcƦ%A@|?Ѷɛj,h 6]bGbQ{X!>|B>Yae- =(?`UPv<Қ"ǜ8,k J lh-]-x]V\eVB<-J%~ x]R V]M>P/:BT&> K@Pr)X\8tSN//00',_VtJdp]^.t(f$Q+cjA/U!˜dȐtTuQ`Lğ*Imʅƞ0~qH( d^x8=g /pB$.?*=Rv12)!C3@ı>P%&mS7م"V*lOl2/ ӢT!L(k [q*,Lwm)ӯq %7ҍ"#{]lRVC$WrDS>( )۱\ -語.bD Ph TLu++ԇk9SKȎ@YxcF=HKDC@IۭsL0D9'O^ @;oCǬbcY1$D:b 6>BHT6SWUDB,a֕BUrU}eb5g bɆU dV' =|VhRLPpj*jhĉ4nVopCTmpHW_m?qtuM/WUK x@I% 4aCcn,]-*DvATZqxE]t{|90ӂt)~VUKDdKo[1Iβi"C 8"؃0L YLQG7=4?~0:FZABÏHE!Y2 QR[mږCIo@h[u۷GD!±YcgH! @v^h82yM-BzOZ-7<6B<#,wwO$pTwQ`Ga܁?&Îx9@"Y2/7NxE5<(w]# ;|NqH`Y!b2t^apl#P]ZLohz.Fe}Yebes:}*6v \>: m((%t,}fI\eV.x `Z&},wJ`|SalL`u=~%z/*}K!DSIa*Dp``{XC!-5@ޡEf#>AnD .0^a@n-> + E9N>? 6vzDQ+@"gA@AB7J{U4hPIPi2"+p U) ?4 :_͛  iҦO֊E jpҿf %jgABpw)c9 1 "ː3+۷oO+Hf~ )3ZS֭JB'w:"@B8@^U:T>R0/ľ[CO;: Z7am;V9w`]pl/cfzThkZ?|yѧW>vkȐQdP)PIf(Q-v!+zjHۈBh= !,(wašr "'NDpbc;-:뱎 OS, "+ܹI^\NR.*h露E $dc& *,tBk(A@*خ@ǽ C({w3迠@I8M0LH)4D-1\50(Ngq^J | h4ɹ#K+4.mw7!L & XFbFՄ:~R:5(LvzhRb|,Q*(դ.R A!&6f-oNIB! B4#o$!Z X9Gf2鵗}%0 T^tk[o挜 t`22xg-_ :*w( T-7{ų>64az:|ea&GfyYY'ALJZoojoC(÷Z(ϡZ/w `erɄ6psF0yx_2峂"}"$`EN_al1\ iģaxMG̛>t0(@"@RC>-G24 |P^8r\@g\BCa&K B @G02=ZBLAa'p?):ȍӹ!A6q$6N g )^ucn.\^fFyDY{^dvq#^E`>#_EHC4hg&3yASB},cra>j6# =E. <=rbAD& m#rTt ?MH(#@E;"Rh 4>a60S_ wh> MϚm JOPz PG,(<ڎrH4z&dt<vTc'Ix *'4 @0 U}bť4LC"cOWs:G`:'q# Q_$t:"2C2҈iD?Z{d i*c(=0:(1i`{:XaU=cհ5 Eq)= y~յu[@LVx*5qc=d!E6򑑜d%/Mve$R򕱜ǐ/^oRUaI^-wi3v$ ^!,gtrD~g%&=L]ȪM{3a@{]0xE0njNjnpTĻ"Hxy/p4K&77 4sg"'=X$6q)q6=E`v}k ֕6U bnbX?8(V"0x=o4rѨv{l}fI[+6yl+T(Je'cms]x"=@6(ed̪'7nIp t y4<tƎqh@?n#FߓuK۳gDR5f}y(*F󱌭J]*O1excgA]R*x-6zKM>:t4 ^_lT4ApϾD`bG}9l( (ݴ`I$@Z`U^@RF;>v#g2zf-{QuzvRw ڙ++E-.ν8΁ gxIlF)СyLfyv&!2 &p|"M(Hp!.TNg K6"*pc:"tqCgt_T|<4p& ayBf&PHxMup( ͍t: a pH0hPb8Fd#|AJ.9K'xbc6!JBF7 ^OpIQ*H݀(K^`ptk'.+O\^!& D@jZE)$Bt@B wRi zZ|D,M1q-,D-Bْa^- .#"%rOV$>1(#C+M@yp4`2#&(DG;#h8D쪪.@!.2B"Z(dN`, 2&-44C;"@r4"B3 kR7&:35H4Z@怌d!B/2C.J(EADQPEt3NSW[Q 6MEnD<ΈNĭDT8aHZmUf '|2V@W(WJTVEJYuN%Ue&G$eRӆQ S@/Ut,T7UBlTu*vl&VgjX}(j$x+ej$|4^(u:p&g45wj1fT<Ψܪk(bTPfe)Sa a@;51S"&Dd$QrPGuXgOWt?3q*nfۼf5UES1wdCVvB?NTGd%̈́ƐDQ>2^yib3&IYj(f|VW\iBq.$z88'xx}4u*%H<ѕ"jU(8ݪBNc^w؇{8XK)a(>i FILeT~^ *!x)V6LR{u)X墉>ꁃ6鯌9=5s?AsoTIj c˦M܏("f欌 k,m&`e ŌJuoɫ 6¤ia&A+<+6jsC&ȭrvJ. T *?r"bk"jH$&\NB,YBn +ʷH@Q6qG!bh%!)R9wqr,i-AG7K*t=Pњ7d2 $zE¼@LYי@,?,P̸x^#dLŹ!:%z)-1:5z9=AZ7<.CRG\^Rϭٺbz=Ȓa`>Qۥ&'jRG$ܲ-.e@ (iI;]|dL1,/BkXU[8;=X!򡍤_I^Y.-B!&\}d'j"I"/GAqzޝ<˙r|;WÇ:% rdrzKbd 2,/m2d/ (D>h9?R .IcX`p?U?;i?AZa/O} X,, S]S-A-~=ܝ^ Ӈ0!8dC 솎iL8d.TJA|U*"g`B#S|E9A`XL{jfCt| N}pݕ0'.)reĠfٳ*_W2ԹM+]AGMkW|3о) i pވx!kǶ0 )ܺ{nɷѸY57yu7«[=ܻ{> y#(^g;]CAǟؑ #t+CY  Q}A.Q@v=0#j)fc QK|b QY%9f=h Te+( ?^dt dZ#ys>Bfh6q!zoIɜP~B)5ix~ j8 % aZ*+H#:ED,\VkS(jY1KpRМ&?6$JwLJ#x~ 1)P 3ByʺY CDs]GbB* 0Ⱦ;1uY!8JG&eD"!Swnjr|v@襌3&EjN? 53sLRLL.pFZJ+Ӡi@4K&蓌&dK DvpMP&p4Oz္=egyCbƺSmh]u J庸|g|i[ٿ#\,yQo=p<5QӢ)NQչ@ḾB` jpQS#ڡzr:z@xA6R;pPюШqB(".x>+(ю0Pă 6!BC%b:G0R,c3@"NX:P!w(Ø 9dlCh0zɢ>.?#qXDVGA6? @U?faWɌX 3 0Cj!s04k̇hɁ5/EM33 ~G,9ǙsGl':xs6CEGmȇl鬧AGЃ 5hB шJԜL jk 3Љ;!iIGzΓt,mK_ Әt4MoӜt@ x,ع77>D nu*$89NP"H|1{HB% ==G{=ѐ}HC w8w/vDAѐNhȆrMl9r)A#=GR 6Dd .aNjGZ½6p&,8;t8b{'þR8\N?!PhG uKy; `i:u7vy3Awp ^J B Ɛ" M!#D@+$R sd8( *1 4)Ӂȁ A>נd+h 0l[!f}e,wag/ AB(` $,@BA)Q dlzAz ,*_!aH3`W02* /"HV4a1B,@. ~&$u# wOjHb, ^pg $S1q/,dBewT0,,{8KRf oj[shj/"!%A'Vf"x/"0Xpp?aH@wPPJw+R$ ԂUkz'`[`X DpdcpR!hgҏhb/{^9p QG24وN&gOD„H,/H!78QQO` 4#Ő;Y츗׍vA!7GVQT!\#69L]b6-9K|2`P{c QvM9Q/t J$Q3Yél!)pA0b{QW%1MR@Yqp\:_2y2j垏y^yXU72ieqXwccAy~RƒFZ $<["/bXY?&@2V 0t-$x!t”b(Oi-1ff)( ~$-b _ ]R@3>6AP2'RK1G2*!6mo>_zQzam@MIA1G$ZtT!*Hj`qO`t 9c ? s0 ʒڧIJi$L98 16cRo-2HSdTxh+' 0D*c4FbW 0b<  b1  @<;9A7-a** -%S}Lg` c 4J(680("(&s/O/G-qy؂2%#uBQ1`0)q*R`|#z:{H] 63WCtx`3:X w=0t (xZq37:t `3K @:QukiG$m o"? ,J!+`384~:Ǻ35] }73@~*Bz :!;s6swA@^^hA󻂃==i2zJ<sm6>[K;:o~~D? skvx7z{80X6:8U8F +<ԜbpeW tk| 5I6/Y B+jF]fAd e,zQDx40D&p O$rVIjQn;wJA^K{dClFp؁btBN/`Ê\A QZ/~Œve>N R; IMۏZN o>mpוngp 0ۢ>P p ~ ` !~n nPp < ;Oo֒NnM P}Ru뷎 ~N` Nm-N @R>G@>PMN@Nޭ!-Oixyy{7Bc|},M@ :P58dHUo$Lc(A\r䉞ȏlCB/ @gpп.3 * %۴ w- 4`3pgeV݋ :? ( \ 1"&K 8YF`Ĉ xPAM`@O@&? q?0HQIz4Zө4zn$eEBDUF$]=PYI`6QmI3 (^r^~UXjBx%K92ǍNVxg5-iҥ-ny3ձ;]mܹuM :2BDT8b^В,Y??cS,Q"xNC:-h@|籲3'M⿉&($QTh > ~(* z &B%2ɉ0j¥hD2̐>H=j0"E,r)#8KD$`r.X;DܓPPuQH#i<LA!8(NHnf%骓Vc V%?V?G#Pc<\iX2? +4?H! p"x8 d: !ib7]xYlܭ$ =EzLc U4J,Pr̰xAR%`EWvND=YfSEkkAsOXR6ZRA m  C}V0DT("r ]S` ALIvYzh!"2  `Cf:Q&w!Q5i&2?%У0<!Ȯ`$ "rrh(7ʋCH˒ O|'o z49Yv;?{g8y6S^h }zEo<|'MP3 (aO0 nA:#E,DAV; :)@,!<qSd@%!F vˀSd$P: N8 dB99r Ȟ!u( jo#\YB*AwX b.uQDs8ƴ͕{s dSi5elV3Rf:3T#DgS_'=)hA48`UY:*C jrGM`R29M T4R%F d(%@P`\BpL{"gA lЃxPBЄ. Gz"1 0\d"(v,i ? z#gϬ&F|]h::=mjQiI&u7)@DDć4uD9M\jW6L2#h2C173nXJ^Q r`ѤHjt:,'dvM@E_!In@}`R}# q6p(E;6P! J*iCXF^JR m4k SVei$),H>Ty{^O+i8vJ~E{fAj(,og'fȵQo-|aQp=Npf4!!/n##rNl Z?c s r)FGCm.lyi9r|$skfs&oos|g 5=Ey"pyZI+6P4hԣ&S^c7^rWEAu!j>usf?ת)O(kRN?V;4V/MW,vaBXtхCᬼR`_Pk P&omcnt/>T]s( fy0 8|XPG>!.H[R.m  7Lc۷=@ohA"X,8g|OWolݭ+P5iml<<3ti3w w,K&̇2jBNsmL^ۭ6T -kIpwTaLJ'<)4fQQ1*$Ҁ>هKA"_i~sر8;=s;>>Ȇ`p !-ߓl?s29XvTB?ma؆|(A@@)@ GXA2 XsD-z BBڐ>)p ܆| ,.D+BQP}X/=@DFeN@9E\{ȁH#Q(M{ Xy7@\؄h9X A2\듨WYÉi7}*aEWŴh|(Di(/HDJLBΨ9/r>Bn; XxJ1`0D_p rԄWă }Tax{AaFplksȨ]E',*K1;ATCDD /F;hHJdZ]Fɔ\:;XcE(SQ DlЊhI Y+q EP:XʢB )#!ؘ@C(h(Q n;VBk¨8.8rX-ɈCȹJ E=Bsʊ1(zȆ;`z+Pk8VX̶X 8o 8NH{(*n`(J @ BpL u\.;(AkX44J2ahxJ\2K)q5/4D2901k<}Oϴj3ȵ̢4L`~ U*!D<0 >pQ|+@ך.~@ P"MZ?|tl"ɵx{ӍӼ//e/\'+Jv($Ϟ$΀ T|7BͣMK;4=Az@ȉp *Нw:\3ه_FQN2#+Ӑ;8LUq!xM}h}RUT".q rB0>@R0tu5ӑ*pnu57#1 S~!i"]R㘳I"2D5̒D 㹲a=HTEȌ*OxWʌ@(H‹= 9^k=YE2΀Uyp܃ Ѱ #;] ]GQu͠4JX3@_[\6O|(#"(j(DՇr?Z@ʍHXEG A&Sox[O`D!WdL9f"сX!ZBшP[Ь b`FdaFnHX7L=a/Ѕx0ʌ…6X 4L? arBP`)` -阠A~N^Ѐ5}D~Jؚ-:$/ӭ-}-d~$2:.sh\5V`/Dm>V.ݪ1u8.zЗǘۣ#-YBʇzڂmB:<PP:`.}P|^Ef g\TVg PFH[9`G5@;6?;C@gjUtWFvidQYB4qz CĎ*9E[@E`{X=~f_;Ӌi&sE}FX:jF[^W;[ڨNw2}81Kj`kdjky3I3SkA*3#lNl^lnl~lȎlɞl^î짼lF1Уd mjhm#cm6ަm4۶FnvnNj~m~nE{:3Sn!n7f.oFo)y+}/sVCbn /oe )[m~kon .o7 K;q.:7*4BE**q~:Yqخquk&7[z?PqmVr&Qq I/1dF$Oo3G#׮r+/!?-ySh!ss$ k@ن{b~r `t$qC.t/sL pfTә%?Ws;8ck$FWn6?6s9RrBG6Wu6??-buCCtq$)_r5?Kڼjo_t_4'sm[qr\u9ukG3")8vvqb xsdoxG}Or#/OnеsoOctgx/_sv'p`qvgEGWy"3Jo7zcgFxl!8z6szl_z{{/{?{O{_?5hJ{0jS6f蘃5;:T3| D!cf 5[n B:x|cvp˗xE<0H^8i؇|{W 50?~G<9pV7TVdXw5)*f| c___48)@$Bf6@I%4sG*΄ղUse)@YRRk٦hR}W@UqCOYl LEt9TH=5sc䣏1@+r3-YeÉ%[vi"COD@)vګ|'hIP2*#>UP!WRXٛtQ'D DSG 瞛q{8O(ɤU Q{'A)r1[# Þ3f}C#`L7x4OwʍrcZ#DA r ݬqTMoFt7wԇjZ5I92AOCS#(l2h̓N>:2DR( '49UJTrOٛmCYL|PV8qF0pMNC+)K&/]62 \?,|OBT޺. TjN0p=\)3NV%#qDǙ:SG$28IVZ펀:S4@> />Of#4L  hRdxCB0 v o$o ;">h0*\! [02! kh0:aC?$ zC0J\i|D8q!NCEEƉP"/F16yYQTfcF2~1r`6ST#/8Bf#! @11"-=g" iK&MjQdqꡎ|P B~X%Ԉ }cA =E^ ȐJb2D;EAz$2Qc`8rLy< b0Mb>Әc2iO_5SdOcRsS㻎M)9<A-*F' ?9O7V(;V4gH$i<-wjtRB Rx^)OQӢ"fFHP S(A`p6i0F`D.!.' /N3X J@ R>+71"P ~ SE7O5*7vB`Cn \{} <L?h?I LoɡYp#6*u,-oKZ +oۣ6y,bqV_ ڕ,.BĢ˝WR&Lb\ ,,t;=)3G?Ebs 7A_;h{(p}'8mw0 \`{ۗRP" Ҁn0\ B9 &B.H}H:LYޅY@_QķuZA,͹ l`|(@|PYQ5_ B eQѹXiL? ,408?8B@@Mx]4*It-AyH@TC$@TB(A8Dn DU 86`!D@AE( 'XbYE#>╭$@S]'Ց D.0"@ (BALAd@IaU@@]\@aAX@t4h%HIQACa{LZuH@:b<@T#`ġCP`ɉmF˵=͂#Z`+N[=WDG.-@5vA}4c5h[2X]?.$C.@J(,S O6?Z qX 4 FU$J,$e@ ,$].Ҙ[FB"aH9AH4$fA t߾%Ba!7B)g@ e!4{,OUE3@"pi\V!-%UBq*̅|MSy<Z4BЅ d'(\pHDF\0yiiٍ`@P@d?]!*Cq&D@8eJI#$tIuOg!(N TBG($ D)1`E!,B,:ȍvi@2" `'x%ŊxȢlʪʲl˺ ,k؁lRj,T,q%lHm`UqEWlVERϦ׫)mВ^ҾW6Ehml&mHD1Q-VFזWڦ$mNqDBm7v-֚-ܞWJmw@V)*"QZ6.4&.euN|!.>jna5n.gE.VVf誗=زVҮm">W@ͮ?n.'M/n*o&`Mo^ /2qEibo~?m莒j:/Ymqn.no>pFGoa*30/o?]n0FDzŬ<U W0 o@}o [0Qqme 'q-b/0|0WsN02qVEWʯfh813pֱjqGqj$!+j@!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,1 HAJiAAI:AqSوarDbĎ8,WcHQL_jX@%͝*]ʴA%1r PURM>:>3*a'F$$!U?ΦM!,s\RE^eE6 ֞*1=R \$՘%^{4-7vt(wq雘$Ө+S͗ =q@aEoG}j*!YEr~Α [;L/5jv\ aI0=fc? 4y!j|EBArLR]ZJ[5wPxbp&|0M68ՠ@)"}EX>e)ybY_8'N1OXI>lVXe5|:ќMm1 !aƌ\L`OITFSiCoI9jU=f)\BL.3Tyƅ>_U?X Rt|YXfcTKtb8odad&cV^WCSIswc{kV3¥9?qQIƬ~xNI&s,E]&DZɲva)FyRDH$Gf mDoP#zWM9D +lWbV![TkmF>|9cF/tff\pV-;xq|Rzh5gKxrJcG>+f>:n'ЭCPU՞*. f^RG$0\H =PRuZFx; ?ZZp XyX_%DCJb븛b:X.AAz}^oevYiN.mlWKoqXq nB_5dmmJVR-%_Y1Cstf).4NE14W,h wDD6aB B+% +^.^JUڨcʈ]^1iwhUUx MƎ|$EL6 =*)U*!_ ~X|9eD"VM)X MtѦӁ$Cd$z]j\NՊ:9[Q@4Sow6h C|Ҧr]'H$ X'#L%/wrԼbC:[X8gc'2krĕEa0}vtb|xN`BVN}P7meQ<Х..^ *Ҽ GE6|[EIF@"@e,ȠGD(d" (`7t0t`LHtb5Q CA,@Q+"c^=B0yP'!S6>f9duf`V=:SL]AMѦN{YI@Fx!(@~h  d!B(F[F`x$ABiFD@N<>ogM ƚEJ铇Ø! 5p#3ėp$@>5^D|e28+]v5RQngp FVK[|8@CR(&~fR@S( Sr hݸJ}SA,`E+CmEn8L&uA7v$]ȦUj#dOȡʅIr!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,f H@ȰÇ# <0@"D XȱǏ CIɓ(S\ɲK/QB+wNCKYphsI(z%¢NQƜիXj$S #"ԖtFهo `%(X#tu1@-__7P]*:{tL˘-3n` $ۻpQ˥[q`Մq3\.vFxȓ+'VY*n-йAZ;_J[;P+_Ͼ" òPowXm6CsY'>QfM>LՑ֟M <>=? >lHe #F" 12b*7@\?!O>h @}:h}$?ta4gꩨo|Lh>U C|(!ԑJ> " yCub<ʘ\Yla!{ -\aPZ^)Cv5Xf3/2Q L3 | rp?Vc`x!3[c!hęE`;0DE jF>@ʷ^c~M}Oa)qD6y(&$F4Tcf1 ";PӠǨQmJ(?H ԝ1.F>!qDћ2jNdʧ%jU5 @mW]={ۊhjV=LonXt&MSq iݷO£N}]'N81k{ yr(}@c8W0gN8Ϲw<$8~%58ϗ.}$az`9ރ?:O7#d*Mß#Y\=Rɧ< RڣE]9PAMШ{St0OCV|9&BҲ@-j B{>"`[)#N b9}@y#=Glt9~ F0J$9#! I-CתF/<4>!m;q]oUX%_,Hg@{_.Dywfӱ|3 5֒_LW~^~̓l8-x(׀· xtX$61ܴ!Bg$Jp)B-r>o)H!;$3 x7Jn_ub&FA2'$p!f A DsQ'".ov#i n(! ZXA"mV& q&2m+b6^bɵ^2e{ R!'yLSwR),XoXRg %x$$aGousA'GB|ǁaI2#w0rÌc6g%0r(&l^)Uh2w(Mx#2weHLkX(X(p") 8U >|H# "!hxT0S0C2q13s>/TC95x5R0j=@z=u5pg 0 T$x5xL,bp@c6T/0 ^ gwR 1%b,,3f@=04SBqӢ`2xBS0 !u},"-`2cY r_2.R#/xY{~!S֙g#'Rے1“a5MICg-F4v{߉1@Pb1vdØAC EBC4߲1@sb cb )gxނZS_:7t4"ÛiA;@ HY >D:Lc : Uip=Cu/jo52^V[jCԕ!s8WS/|Z#8|-2(.z #E7' \ʡڀzju6- C8-et/QH2yILj&Qrq*h9w}"PRCv#2S jz:e1ÛI\:C>7-x;i mre ;8+ȧS=#zxe2ZRfk>V]PDDt*5 qaRup6% b&DKXDJcA+S@V)BTV\ZrDs8EUtEA A`C1;AB9%GJ֨`@#Q򦍂[۵u~dQ" t/$n@G@!^ZK^F>tTB}Qf;CDWQ<0KB `HkB_ACkAtǨdAW`9#:PDHdX Z3Vi gL2:4C ~jŻ%ETEU{ ۹=Ivay P _ T2AEZPr+G.)-Y=BB+ǚ74[b[e T+u.u06$ C7|0<"br'RJ!i{QsѾXnnghFd `Xљc-~1B&&>{Q#T= y(=.V30N`= uQSmSF^jB!! 0I2l&T 6Ƶ(h}OTjQ|`.qa a8LЀY@LG{6kr5>lo=Ѵv0o$kRA%~LUQprVI>l"C1͖Q(92?}!eKR- x5qsߦ0 `ůUq;"Bs\]3 4V` gNar(r/Ho_?O@ DPB >QD-^ĘQF=~RH%MDRJ-/ 95UŒiSN=u P"q G`9 D@/=ZTkͬR}jUȯ:1օgVjUz5,صg܎}k61ޱ,cS'|y#smꗰBãYsJՌ-}-zlkҨ!.X^}۶ޜ8 +ؘGyxtZG<{zҵv2k$hz*=h?sddO=+N,<@8## `p1jp( '0 1@daSC MD1{&1PGغQ c0-,"?g/t$d4`:}GYrG 43,FӶܬ+O:$]q+tMDlsN9mCFe2L3]?1J,oL2 P: guEa5P#N$1N$osWRI5, wUa6WgwLW+2f 1Huro5sD7D߭49Y0 0@"_0:=-Es]k+PreO_}Os8=uxFO0HTµYda ]=e}Ry֕G#$}FEL]Wlۍv9d[%Vkl^ZccU[[6[Yn[M̚n6k+:j v4pxg_]G#4cނwa'8_vNe-w!c7>aM3OSc{Նp'}ϔm^M;㸅unrm/vdyۢW: X_vzf@}ͱTxJȅpцP&6 2iLHVT5.qS6¿M JB™qP ۻg;؍ x; 1{)j2+Hzaz @"qzCi~ =[U<&gwtआM'x] qnZ^XuYq^7zG*OܟySDDSJVye+OҒeeĕK^ ,e/CrCD&ؘLf7Ye39MjVӚf6Mnvӛg89NrӜqP`td&: ,ħ-aw( q3D`FAѳ!+x?J$M(GB:-Gy`hAqFG Ї9 @U >)VE̮@,{jD LGBK,C>`c *ad"xC;w# r4`r5!~,AKؓV]%K%LV!pe[+,EmBHkZ}D7*e-Z_ֶ(h׫@oe \ ؃m Bc!A7 hAtPL#Xz߆*wB̋ޚ= 0o F&^A`#8* &`ƧYRy S-]ѣ!E5TLE=PCHmcq6(ȩ}|Ѓ#8qgl@3R#OA( M` R~6 @S!6x >rGCdԁeV2| c\ +Z֢|-AM]r樢r>Z8lf43Ri 4 ih;!􈱑h$b=95㖷e uhLf *т@h2pc-)TTԵ@G.<: ɡ3"qK c2T`^%-qx=TN%T`&p%K#^X.  yjCR1|T!!/ l\Mu /p5.KNb0E#Dt*4)!ue`7.{!`; $ 57yF9r_?9yR @ܱw#b r6(*M SxX?$_@}0 Xiz|jc=݁l@/ RMІ}hۅٜ@%[:ZÚ#DUӹm-2C) ZC| [YB[5[ ʹN`[z)ǹ][[[1!\ ܨ4z`\Dž\ڢ]QAŇ/ ܬJLD:{`I˄Mٙ)H9( P0(h_QˤHf+# I̴k<U7.$s172J762[p7}hf36pXՕ2Us4a8*t?Ny@|23#|aU^`()0`3/E.@)(;> m.aQ3qE4:b:2bpi}(YY{rZ\]ΠMga&b0?2fvghijklmnopq&9rn 0,\gv\X-hȅy.Xa}E*Oo]=V臆۵.& Nhp:Rހ葾Ou$&0vHdX閦iqbXx͚ƈ~/i6lRx/}أ?ꫮOYj3f֌0פ"0P ӵn%dxPFk*kQrxEX~NȖɦʶ&m^ q>m(mц^e 20ݶ`"ц Bx+fƌ)HHm.pdR81A}pJ!^Bn*DB8n^mP!mhn>+`ө]9E10Hg|gKPV  z0b-ج A|ZJ4R$ Ҁp ]:W`,0P@. . }ht}v @n0=`:s`0ȴb850 \Dp5F؇rPr1ZN E0\ c$7? 1@H>?O| p O xH9Ȟ86`H4/944>kNo+@ LA \lyc"5l5cb3 3?}Ӈz 8+8? wswwD2k0bp2y#X5rO8bZ?3_vLoWj^C@vj׶x1 Fpq7= `"ogl7k8{~7/[lsXN}|@>oHGcݳ=$qⳕpչ܈+Mü: Xw?@gÉ́;SN/X8H|!7{S}z<{'%JTENĒ*@qY֊Ex!LR`;A@DGjX”vg@ZYh<))$'/ 7ZxU/bW%?DhA&GU@EzKAj~aRnI0Z]"jATӶFq:ڷs;Ǔ/=稧 Q k|bdmN1@c %YDP6 䳐>#%?'{( :D H)Ԑ+{N ̱7bӷ쳇Z+ ѷ !|6A_:s)0ڒ;ǔRNq0J՘P5n ֛CVw4>ܠ4{F\C c!^ @~ht)GػI {,Q p/8L0SapZcR;!woz9衋,z>J%E'dW(x7\n$攆7༮s)%!@kJ-C=Q =y0~ 6d1|S + 6FBllAOP<Y# (`۪&E!%|t'yO#2ZyaG2x*k 7 6CS@pT#2|KvIjA/H >&?kΰ8f,dnt^"H:PNsdx‹]s.tjG@&F=E#U{9 `jf^tёp PHј(#N:;$[#M)ÎDJra*ƊsT2)'1(0}PDZ, F J 3)G9(c*/!5B?3"c-0|3*Jz&W(b`:")Ü.F̼N(ƉRbH Mo1DҰ~xS"F>@Bti 9 ! |# >w(# 4=)J Mtx0HQ]؃ `=‘L @`"Elm5Ace; ב WjD@"=exܸ+Q\-\W W1|(+ /tO EIjVFîmM_p_MT(@ӨOc,8+?ȣр?5E՝"7@h] KlTokpִ9v C.E,;+*>s8O#< gK#쁇 __pg5sm]xi.p:$rS-)DLvpH&?OVbw'}( .Bd'*Pu`}<# Y7zC7AntϚ J{`gƅ$_x0ˀbËbq~&b=F7%E3:"Tv2;WGWu ?G!"_V>PSesmC6xfL ,P m~7 /lQo6(o7wys/5: d>8#.qeGZ=0VC~9]"9c.Ӽ69s>9Ѓ.F?:ғ3N:cHjL qX )QnQ_ԑ.*BхcNY5a l+ w8hY2;qLҜT#w ۉS̃M՜ 5jyU?~ ss#lenŸ;!rE>у>ygW[2r n_\0 }  ?CiH0Ok7S}"|Aud>A nIO!\HTytMm6͟M^0de0CTQAC.h1:N^I =ED7K@#C9l9S1xeDv9 XV#88a$``Ee`K uZJE Mxu1!RD7MebU",-?p:P %"Ŕ=K7H,# B,"! ITc>6Vşpb'(Sv;4/ؚ0|+F4&Hц9ZmC>%VdC#>,?=)B*B"=n,JsC-pIDb/"Nv T mş~,&X==OIZ9ߘejj\^@DM9;W"R`;oN@k,WZZe"@rd!Ct0<jhWnzA^R$gmNpn''XoL)Y\D\N(#ڔJ‰b>@`9aF@g< mhi? ăCC& z5 ńUhq  <LKP jbkϖ0CjaV\$k6\DF@ ?\\A>ؠnx`5VHo*k!饖[Z0HN0Hni^xh:|p>mi ihGJ+~DMi<HƱ1TjNPjVT()Z(QCZ(IT0A[ 1Aa^ H)k= S=b?Hj|}ɏ؃uZȜPkLh@xҘӪvA i #HN}ʯ~Pl+5Ԙ-ժEˮFIJ„C8ΪnFC p,D*fJt}şHD-䬯Be7<غN@tTԫS8 H)L܍51D`L"n+/nC aT ꦭ붍͆ Ї 70&$R>d ŗŸ!h N.wg21Nxns0 YdVpII5L a@0PN XԎQNOTuI|>Pd02(R;jO GVq݄ {8 :O|,5N#0Pp-S @v?`PNe F&FD1tdd f(w _y lx:2؂1C2K {0%ԔR'Daiu )dh@; R%JT@"$.GH&=ۉM\ B4o*d%끄DDq3G|Rrs*{\"E t:IY6Ejp` J%D@/~A(bYޔ3/I;Q:bZ:M=?Ulav=5>ZTW*'-ABIBPcCMD[sm"aFKB/H0VVi:oDMYlNqWr ,.KtYl qÖq!DhUookP}כW]՗[,c &wtbYcuT =aV"U8vG1/akXC{Mmvf):9C,-_˱`CaV#FbVvtMDqU)PWBRM >L"vDUyÐYSZ0Z@8 ;[SE[{ff@8tE%Xou Di -B} l @H({ ]xȇPA82 Hsmr<@908j^" `I4H# vj|_BHDԜ9\] J[w=)W޵ݫY%  +$a+qt$@, ?60Sj:dF d QLu  j4 1 "gwp،:k#mZ{׫X6ըodRxԦ.̓SIZ F0A852DU,!“P%'6 1њiV*s$H:k)0} WN*PF-k3-f_,a,f*EF{x\`osa0}7X1d1:ԧu@\i@ G3r$XpsXYРܜJi꧕܁tWfP"%!$8]dajreБ&Lfz㟁Qt>p mp~KnoI=>J┪䋫4t3"xQXuWuvS,daxa2|<"֬3Q(JzY:Zp++i&v)?g9O9P *CsQm$yܵކ9A:[X7|`d"&Iƿu*/ jUe7@Ct>9n]W]S6o{ՙcqreD |v(ĵ|=To} GeIeΫ'';tqiD`wвΙJ~!4>Y`*Xaeizءi!ۋ2O ^*6zp(@5pQ z-8#@MDB3bQpY#H6aGޠZmp"^ 8aGv#P="c0|0/p H'p m IGPAD$P n 0 p ٰ 0p0p04B  p`d{za1`J1,Aך=)YB:ML9bt hAgmQ$@&12s1$v$`qꊪ0Qyy 1Qp6GqD<-$aX9b1<1‚1DQ+#I) j / QŨj@1B G#\DQ#5Z&2#49*p>3IyLm2&bv`Nh? N`1!(& @pĩ\c0b/2ރ5*X9T( ?+B5b$p@p(taš@C4aJ%R x'6 -OBH$!0iP??B+5>,~52+ز2b00a6"G (v(>4!X/_"4Ү%98C& 97D9 Q&I Kqs,!!O$+\$\' ¸@edTxFLtK!s'n[4aUveIs>>C3=`hX2p?Uʼn*8H܀>eThĔ0ES<?% !rHPsT>vB5ABA(tL[sF(`X:tS:TFTJ E3HE4TFmrFGԅ"Cug#6 \r8eBފLӪh:Ň!FfB!nF Zoumb͂mre1o)횑ݲZ$K'pB/aZ.;2šSR`Q~yҪnǏ DFѿ7/$EBeBnxPN]9|ABCRað8 ܭI3@<=mq|8iX7VJJ%$(xB7hH)H-87:I=Eؑ֩! cd ߀1p Xr] nW#u@Es-ո1(p=`l,d ;)y]L*hq #!ɀMBo.C~)Ye*(`HC_@!)0>&]g>I(CTu \Y]./^@ Ev"wHh2}HPZ`k|-!%RSZr/)2OSq":f4C E$]jMlff(4;եd'Dz Y byLA[56RsYDCa%)@=f',",Z3᭝6ef&KQq%$'/w/ryg>F]GGWc qMxf`hE_fHC$kG}fG1:q )-L\Z~xS E& x֠n׼2u'~(A)?a(YQt@RDENs S_s"TJl7ftX+AuF e`c8,F5e(Np̓t|d)$gGr/lYrgC̴qS֮V%*L:WA6bU1z-j=Gx-`pLG8@T`$E~Y gDE&)gULb(صо^ PD?@Q yޡ MLcT!cdnjF@x,D=ehDC4X('0|$9ͫz}ɣKjíbIwnu pZܹv7ὡZ?D!ma@#}DCRu,FsP:~@cȃpd! 2dH\m]X ng#w* ؠnKR}# Ebf vP#s;ulP ZASao>7QoGPu]$!y}'>NG^.;6z^24t ЭZD&vU\ܯ\0>0us\/@ 肗_v߶a>ȳ^#u!%Sހ> wq hX cҁp9'3wi C)0x=yrS^oP~?IH0 6` qpzS>V  t5`rahgX0Ax'O@Rhq(sHuhwy{ȇ}(Hh_q$(MXK@XdMI80 3P 'p @ h\q @UH,` Ps` !yf0X&P KKəLɂ%fl2Uy#I,@wINWIh'w1Xb ) sYwy0h =`F @zK9.;Y ًH929)0k+1 p  NB g@0 `dZxX @階p jf@~B`}"NLN0E@Nwyu?tID A?PKu3J?`hXj{Qg.$C0 % #s@s4ϰ~tMW}uEz9]WɨIΘ>YZ biɞU)) y 3 hd/b900 @1Z)$y j$P&JC pM@Iz? Zj/ zRp/%EIV^F  h s +@#-詘Z/ 4{36#;j3IEW0j* ()`P)#@p_)xi/@ )!jyjl !ڮ5:M pJF K::zHJK7C@X? P:{(ST]8"EA5E{_cZX8N9R$Q".c:.۳(UiK]tѻYN"Z6˽jChF/H[9 @g (ص-@z+x a&Ƕvu˗)&9"k8:`?040kHj1LL?P; PY- '"z1d^Tc1KNb%ƛN%_?+b۽:[KɊjgD58>{K> y @"p j%p, `*ڿ\J 8`ȶ# !0&y 0jd&p+LA;):u2|N5wЩP%"Ce;ceIj\A^P 4 l̩(قk9;q^gܲ<̐sLǚvP$z)>w p۫ã.@4O"g?ɌC ,7qhy,CpCj+PNjwa9*!Wg & y09\v=,8̅_4o3ISZfCT4{pL? xylso ג ܲQ" PǺЉMq (p - %@by*#0 M-<`%P% Aɞ+q`1+,0`B?0M]Y.ŝ*V p+5$vfŕ.uie,˫ݩfxSg~("`m) gTkщ| [TN" ,,iwp oI +@:! ʯvқ+7[*DpB< 0NDY|^ktۙ . >dSKK(lW 57OP߇בZIK pˌV[C WSbT_Vn?p?C'P@Bʲp@03r?/{8=x/O?(6~qS W/T0k+J 8p"S+T%8BVΟə/G BDROϔcA9Y6uM8V!<74#XA dؐPT 0@C$@$BupcF&HJ "g#LӧOɘA fKB Рj1΁)EaŎ%[YiզL`їW NV*U-j}I[]ᮮFd't 8 %L3kQ-&}#@ Pz a @za.W5PBc)D+o|T&Ҿ9EaU0?}U!H(U3*G\R_  Њ@O$pa0*ذ% xa4xps\2whFCVo܈cF!" `ռCU䓡|e,gH41*Ŕu g%O _$YXC8 ` >(S$5 ƚf!1JA@ 0%|F =w"?924Q@JcRa$ XayNUC=HGQ 8%5H"S9br?\PUlϖ8&3Q axfQG3^%[ L}oZ g^ |'~":DR2&B"F()^A>~q t<9Zq6ʱ'pleĨ#,g)l&ڃ0 \jR'YRD ZY9 \B~`SA\L剈E>2L[#nl|qB(!`gN<͇d@  @8bT h;@WOЍ5g4 /udno^Ҝ GpN ˲ LOU#+\ ^c~E cangWWgk,*1=HF ,x5P͢eeZ)at,r'#p6|o|>Acd AhM7Y%stCak :D&vi=Nbl<1 {Eo\^B[ \YU"5 =K"sGЙ&2 ǎn`x/v~nE4 vc _h}2d6Rn~'/&]I/ӏ^YN ξ^) P }@d6F䮏a[J7uZG fwa\w I=h)SZG8rmw§=z@ =*Q% a4TxЀy:S +Yy={ (PaI1,>," } 4D mY`y=^BAPf A;`ei%{ kF;TSA[sJAlA[!`a=%\B b/@M5[xX(Z[- C18YɇPCH4N*C/4B5AG0Cys330C@ 0-чp{ @C~ ž fZ )TDBDd?DODP|YB2 ES dq.s]G")LG+EF{tt5kF-dyLǑɡtÜɞdJPKIDJk F Fƙ o HU"JɖǪLJq4˨J6F|KlJ|JDZ|$HJʬTw>c1ät#,D LLG|˼u$ʐ[̆< ̿HФLJLLՔHGGtʗḶ̸I͒0M,ʮdLTL4N\lLTKbyݜʂKL[z\LJl^NdNǔ5HLOhMxz,4/ǸTOjΌOdOt bLѼB^NTQtOt  5Q:N e¶M-K'uKe#MҗQTM6R-L P,%R0S0-RODI3m5Q4 &NdNG?MJuRP|}ȾMTPOUT CՏJVU7N}UZU[U\U]U^U_U` VaEaMVec0œ kca pu[Vm14W`ؾ({heSl.ȳVs{gV|Mcv8 pPD>,}Wصxpop&3Eijhx.MYu7) p1^`1X=X Y;ɓYbBB SAnBgIA [9RЕqq9!~X4!06M[M@幫ك8[pj+Z3ˆ%뙛i9(+ԩۻiɌf۵}]u 8꺮1%p9Z+ dY"26CW!h8c! ZA% jـ]_ڭUh*X58/ )1=^-y~;P2)x-T`]s=eVanYYd-â{2\-(bx;-قjͣ^({7B:b⊗H+tZ(`x! %ߕ PN^{IX_8H+ E#"(ج 2۪^4dN/,>nۉPnpece\c3U9HdH1K+=5=)=7'rZb'#qkd0DpEd_8/h 6#ɇ;2\}8*\Y 5(fnyZ@>Ӽ^:;6Yf*8[:{<0ہ|_g} Wݳm@ zƕ+։yhh#*\5B?o t}~ioiGo8i@}i>jNj^jnj~jZmT( 񘥤jjTG>EjVԘU>\2k Y蘪 mQdkf= ӹklY%P~Vꠋ$H~UOu%T@mZ}x'(QN1`YnJlnUT%P<|R8t+?C\9J-M~nE)'kU& J Y!lN@nNY\/X68>&RmXp3co~˦YNx@%uI>DK^N0<M~o:>]gz0S q1:GMpƕ>n7>!h+^'׆q#+Cn&ZF"sU@t&tDOtE_tFotGtH;@FK  Q6tFO ZX8KQWOFAHP'mE0t0R` = pv5hX<luV.(Z0ruZ[w wsJ0TȀ`NhX$ 0(S{ `=p=PRWLem@uw/w(Z8ogW=x׌Hv`Sv7=CWh&@I@Py Ѓ>pv=(j3^*7u C((xgCQ8t3ALj0oz@ST/=(PzczWY`'h#pȯWwu?Y@YOȗ|?rRYHhYrG;D(S8PXx'vC0eJ8 ('p&`|' p~g' `whzw~ ~  @`-mзoYIչ(A(q"Ŋ/b̨q#ǎ? )r$ɒ&OL&M!5c:3b͚gԓ4m5ђPZ vҚ§zѩSLBTeCʶlYXzg]I/Ұ t0 d'LHl?57Y"`X:*GOXdOX7 V,?]x ^0M|I0+tSF.}:֯cϮ]; 7 Q 3hQzy~GTfB V3"A/r.WBD_ rJ($6|rD/D5?tEe1y焌`0/q` M0!M $F}DY a?Y:Q0 ӐvsYw♧"@h}uKV4 a^+_aįNB,@f?:dgV-ZjpjAX.t Xc h O>l@w㝷{o$>|Ѡ Dt?~0(׽ұ}%TӒ_o_!g_嚡h_a) fd9K? B4@CF ђR/OQMKRږH%^)& P* <ݾtH Q}p@ WQ\bAW CH9;Ub υe( *" |J3@1 @ 2lD1A$PJšメeE; Q3<ȥ)Pj)["rsLQCЦZpF71񃀵 ;TBD% Q(C E*Pfp B"- aT4J:].= r+T. QIw4!EfIDF N#_aexܐSAMlD@Awr'9i @S2U2'QY b ^ >G6@*$"}g )@(g&N"Z2MDn(W F ,&4p3ϒ&!b=C7h [=@؇>t7xΫb5ZݪG@@J[ T ַ5r  BTT%bvs,a kvpKj@=@2xp*b6,gMౝ-iKkӢ6]-k[66#\t^U7K UD@2 /@΍n>yg07P}ߨ;Pb*>yIp+ _WD^C7o g RK mAyUΔ>^M!և!#Um2gr4˹0b<׹n\]:oz+,@o07<ܒݻw!gU<=Ah| p y#ʖ:`O ! >\C:DW ڌvW 0E)Ce_t=qyEğ@lȘ}oE1hZ}٘ȅi]^>ܐ郞ts4@Y/>Ѓu=AC0H=E:ց@Wxy_29!~E \}t,ƨؑ`m^zm`ҙ%  BY  `X+̜ =5M魞M1&ޠ[hݼ[<_֡"|@ݨrYY!Ù@a2fJc}= ' A@]ٞ # 4 "F= .>(J >Ta)FB=ߢ9-Daex@$B߻ 陝 p( d!S!1] n4k@6 !@@ ?B>{9$)Y8  ~Y @53|XP #@"!ݣX($NaW8r xEy-ro0~@M\Ԙ\3>#EcNrfk5t?!a;ht#v1U8T `ShC`WZC %C?"Z,ҝ,\Ꝺ?l*zܕD:H5"GX¥v(uLE+efjkj-)]tkdVK|+\u.pLbĸ*g+2Y(ZkּM⫧keĻګ,ĺZ,g+y)zZsu,fY!X,^l̒SƲr,ɪJ ,쑡Ҿ+4r5#ւ5k҆Z^f5,ӚvUlM,Қ}n->ֆJ)-4R-­F+ޭ܆mݶmnzlJ-.+u.Zjn m&.ղB>.ԦؒUnFn f-ʂn>o..f ojlN.Ȃ.*o^&.:/FYr/fv3Ж￐ lv1 /vu/\/o;0[%v 0u4cpDpspK@!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,f H*\ #4@%^ĘǏ CȃO\ɲ˗0cʜIFV˧/P&IȒ)rnliU:y*Ȫ *uճhӂ :T۷pWEc4r? ʇW*ӗj)+zK5|̵1+rp..  @-2\*}9ˌݾza- #q6ZƬiIN0ꁮa˦7^?7U[ "Xr⩀/ya+Ҳ\lC!4 s?T0^DlSw Xs>&epH}WtUtf'I茯yH>:Pri뭸TM7F+ۗ8O1Ad 10HJ=QiÏ>h0`DB6<уnkcN;fM>+>l [=aM&tGh ` ı%H4Krۊ)կ;L{,uD@>@; 'w?V`ҶnSl;VM<\sQQD"wJ_1eP$wۭ 2$%NlS#.윬ӣk8m_;6Di `2A깭l>m9ܵ[`Rd>0m̳7>s Hx.T+2BD@,(Ky< AA>17 =eEN]uG1;NCv7)L {̺w<1TAЀ{woC "~9@ ??0 $B7 ݠb|,Ck<恰H AH<(MK< 8F$y:\l2+D>^.gmEjY)4jJS-o!#Ly ROWS-X,-jXWq~E)d\Cmbb qXp(@+ wd,Tbd3ׄ=eJй$FR Aj p Ѐ*1a%[QLi1re,d xoq,ʹ?&KFLT/h 2l̺DaZE B@0Z^v<2ag}X|xLT>23,d DȽ+ѣw(w\T<]КZdJ 6JȨ1ka܃@ vR-4`` c5(?ppuX PQDD7@1"H&JVU/"2\dwC&&iVn}ڵdչW`5p}x (Aΐd/6B&99qDDin}Dc97b~pkNL,ʣ,*ÇIC+Wz>ߵ c}Fi(FGe5(syOf3_DCxudQD?o6a_:qw55}J$ݯGan5O?/ OZo7vT HQ|Gl RPU ҷ*#(")uQ4lDL@ z{%my~&(o)W1+0أ Df` p3"0ngY фc"O'!Qa\~ܐgX)lh GB O2+88)>8@8 X` v 6o2 30Ge HmU%zF>Hwx6ؐ.0 1Xe5`Ex} W^'x0C)c1,v# X 1 L:.zv 4]`y`= HI~q1wIo3E4YQ0]K)u"Y$Iorz/ .B95Y8 ~s0$4СcG ,=T)w&a( !kcW Ys(9lh[sZ/iY֩Uwܙ( ԝ9W虞8 F&)n9y!]_:Zz ڠ%F-AZVO"q١2*qA$jQ9mBq}yHh |)n:1,&l5QDťfyH-&MZ\QU U1(٣1c!A)c3 wE4!0o8,/F 1 Ʀ/z:qpO_p{w 3Zy*QA]%Z9(UAdc*I\*^*g)0Xb7#`;F !  GBS sm(xI #Z qK:j& ~0 $eІ$ Ѱ Z*Csj<_p yz&䚩Dºng Ӯ+2l*'T,K'(@83Z#S(%kV'18XT's7א;+cbthx3q,L3VCC xcH{-A9d/6.15.&/R/5R*/30%5!0|8N77PA- cA&W#7i-v=Xq2iAkk9m ɲJ!-tpϗ4@.D&L.t5Y/c bДqqº1Gr2[rvb0f+&?: 8 Ƃv,5#ߢc3"99ig[1#h@|䆷hdHъGzthd;<K<4 PGϲ^>U9 Dcxߣ `DP>>DE,ETTZ{=oe s`@Y[EA( c»!t_!Co#?CU<}${@CTCD Dc0DJND?5MJ FtP_lo6@z- 'l\ 'o &eC>S x4CÓH#H/H @l gbrL\o"Tt-T kq0B-e2VQPQբQ{< Qq҄ 'h9db[.M1N EcSN4i|Ԕ ? d58A nt 4QuQ"og--' 3kR"A 0 {5ND_&% C Ƹ',QTGQet6#V*zוUB ns'A/F,@"mV`V#ha]& qP@`!g*eYTV\E (vZZZз05`fN[6XAFث#c:JR 5:]ma]V]-YL%{Ju`Sk%BNbP+|8F̽2ΤnҬN0(bIt F'Q({cA%Kc7drv} 3+MXf4Q܋0)0 'w|j~(p|2pK"/o)' ObA#T{ղvKkemVodk| 0fRӗHf?  Њ^9=) Ĩ[ FIG`!)(`8b$0lMD=-jСJz4zũM"5SYZ+WOJe:^2M` -I@8)Ӵ@⚳ IcֽwFseW~yY4m/FsV.b#˘ ]ML S΁d E @Vs ,Ad8N@!$6Pңgl]K(jZPp QMHe瞊ZG:vX Aփ]Za5qX6ckXe\W9"(el9[ DEl7Urvm1Lϙ蝛>W|Kuxm`ɄL fT<>7?+8hعH\JZ^ yirʰW/Nh]c*y؞ۡY=̅h Ijd`ո{M3Wa'XpM _OaiP؛׮Ke-y kx? }P`1a/;Wa {@3 |xm ָ$t-JQiuSVA\^I]\ǜbۈ}:P ,.[V xiJ((x\iUڅ5Pg]7)e\\1#:%3MBe`Wh]Q(RuQ4Q{` ~` G 0|!C{YOևn a . ]BPaaڙ|p:!^"()*+,-./c0vi265fc!">4.bٜ{5p8V@.!b<`A}Bc%D1*IPK1:L&H20$:J )B}EЁ$zeȣi@X"9\fYDG4JpDiO}q"5S~*$l_~8䲕{|eIJ86$7)& 0CCRN}Mb҇5cXfpVԩDh`In*i%]vIFrSH\J+yq'q[Rq0&hЄxbACa9Ӆ;#6Y(#)|92 `qK[fW6DG10gDkc^>h23ox(xƣ)Tꘪkk).Қ+~D0/s&F-.BEtcj œ/ 6ljrCȮ(Zm(/eA\Q/--wHt 3.@.c*蚮 R09Yl)zn+B'«-A-p@+f ƫ/ P1ڮ˧ODm7ԊΪ:+WB`쎈-X*zP.ؗ-xn MR*e.:02a@ (Mxg8x1J[{r,A9 7XE`2ٌ8@.2)9ECN"4Ӝ?F7{XIV#5^5`)t~{ t{ A`rC8()*rĴ-H00su[inSt6q::( (eVtA{yg:\ow7SQ>!h8Dޙ)}ҽx%¯އ/(K:ab':`Xý.=8:}HznH׃ +8J <ཀྵܼ jHxz8 ;k(ELz8;zXYt< /3Az {7+H lDEJ8=Q6vd3 <=H{+[ӹA;>;)Dn\-DLD4KX)>OZ ,\D8@spFxL =9@, "OHO8hP8 G6MAvv@rw3 :Ab`E¿#C7$? b@0#U.$TO x`\3@v;DP<0Z w ȨPzS#uBwq~].A_HƑ% Z>9IE.g $ cJa2jb>rcf2|y*-6^%PCkױS7Cf4Pl8ʗ3o7ʁ] Q kw8O.N}{*}pR'd ǼJ: xe+T B _T d=X,x!hP+T>6 @yU|U!ap(efB* a'Vt&ByA 0CIDQQ(Qh~PAK1aO~Tha9`\yyB=S)(p}x!t? HrRF#B+*z!cWCǞXO)(g $EXQ#!E J;q U!/Kqq>܃; {O6n"2Q\FBXH&tQB ;I|YW{:I"99.C w|}uB7|'‰; <_UH0\&uTV5UFHs |_tȺsGD*EG-ZF@%csC@h m1$]$Q&A Yo #;ta 3ql2bp̘m:?z Daaj\^=uԝAW ;U# o w<.4I=^-PyKq_Nn{C%L 2 1exN""|\! Q)@e r4q霄.I$:ǁXVoHD607ߍHSA i,{# ļd$wR0.y *ԡ >,zBXAE :61Ic| ),}Ht a"d3"?,.$r&7g`Dc@QQ|Ȩl~!HJ*$4WdhBDȖ6)uaH"G8r \ak$ /2aT,(y/F5 /4ho!M>.r`Өr0-G3}D$241 }ne'B@9/D@&͏5ih,e<Ɉ{(C# $sL=M,_=bץDB|nHgm&JJkMp9W>Tm-s酋VkeS\A+ _QB{0(!6q"H@/@GV.ЄB>sЫ:dxKl+ iCh&8U'`=JU~E A`h-nGXLH1lщ91ݺ Fa%Z*W}# ,|HRAØ "H#쁇e$I~z~h_pH񝯙tJa<8B1G j-B[f;f=ɤzEOw?#n [b.H< R 4E( 9&DLp6TDhv`XևtE+oW@`P G"5ʲ%7eB*^}@t|!@;Lӹ>^BBBqLe vpiW _:>bb {[VgsU'Ox4c-YG  skO w-a+F5\38^f>`eSi8cYۺ6ٳjzܞw4s9)\q&6.V Cob>q]~#8#.S83s8C.򑓼&?|*6y oԪwi0}>n8BrwRh@ `.g9; #|vr3vMc o&X&Pl'ߵ{:iy_&MQJVH7xD#C9l8 l XAЉ l\^6F,͠>0MA@\/l>R" 9s) !{04؆:-Z\9!@(?O;COHN_XӤޅEH!QED x1P*=B; E"̙90af6:r)W!) a L"0 F".!X$VQ0P+TYoLXȌW qD-RDJ۝ȍ)"#fBU#Na.Z+>Z#mψa.C 9N M!C'B>'H#P&78#q7xEU=\A.[V@T-D9HǞYviX EXB>"B~^K#7!PL2TV<\N)Ie"dH !/<>#CjR97=T-@b )Q&HZB= Cg1_@*%EF$\& {C%C"A$hf=A oJ *'PLiiHP :DOj)X UY`Qͦd!n\X EZ R(l8j@͐PO{1_ ~iD? P\]=(_B!Y|p%^j M{Ru\D[Ojd (aEATޠ]^y`CUc\ dci=*]: ,;Z*A8|)9 R4R鏮L )bs 4* Hx HH͉3'*ɚ6<2 vءAP aHs=Pb!CLEҰȫaD HzDI>̉'ȼ*άA_\ 规ʑ+ApʯnJ7Z,UBaŪk+ИǬ  i}kwTA(@MPb NM|@C| b`ֿؘ ÌRк =̕M@ =((U(JLqj Cj`h $`K= pK(ۈjMDȞm؀Z`t _XL|4NРO!䃇nmf$ n .ھR`=D9ڔ@XVvE+#EMiAeYU:O9= &aF-.Pa ǔQV @CdPoXNŻ*0Lh߹(T*c:"H5R X(":Di6 F@"ýe޿h`>bV^͸?2-qHGh-C>lA9;%SCYu"eF!mj%Wk;$~ԋZnؓ S\Eя!%H<>'`)M\=@XX!ڟ%=܋D&7Mo~yԁ.VJ)G۸|Rw 钇ysxFX+gnZg"*8BY+%h|'ˠ4@O `Uk"PH @h1 Iѓ"` p4VI7*j1p *+ pIOB *I*y9 O7v4f"àsg˭VC_5j2@f8 nRL!+wW/ )fO7W VhΡKkj׭MYum۷qֽwo]<0 S@@0`t5GE}p5xpD w`H\8IK+h;|'<>C辂 1xP;x}oG8Vl‚$(?p@ܹ!;H 8qNE!$aJ lV>0@+dH0@̎6nޤ!L846;CMTڀF%BD}cGM9EOQje_naȅwK;}h{L9NMD%I%V(b0#2͕*V%/*^{5#GZZ];)0'__u-VZ3l{CT 6٧ @x(~Tl T zLJV}!4Қ63e:<8[^O֮wei ; Z衇~A XS@b(O֖8f;/=(C(r!r T$[^&tP{U @Z +A( 2p^m$w0GH̓3ۆ (ؔQkW{?˯%<ߖǏgC:]gy ԝWB.w㨘6)b #b"ns@󶮃@JV .X`eN cXq ̪?ᨤx"2 g[R9Nq)„=~0*˺!0OB̏AcYal+iD(dQD?y/5ɞff^z_ԣH-ۘ>]#A0E$w xG8r\\`xa+ MH# \LbVbIR (("$BP`r /p[f3uA4"= (EI4M\,`G94PO*#@jM]R䔥4Љ:r5h0O8g4ٜ@yd ]ӓTiPh(E<<{|/HA Q *!%HBUU GtG,9#ԑ|$z؁S PюШP#;0G;VmuSդfqT=!$b %P?Q !U+[5)ŴtUlY:ukD+VJP-UՐN?P!n챚,'Dj}@7F0YTVՔ# PU. dT965 }M|a;M0R/@XSDD4qNWal3q(8 >:60 YXere)OU򕱜e-o]f1e6ќf5J*Y06\`7wsYGFjo%s\Mz<`iSh4MhUC  q3{|@:a.yJduz7h݆aЀV[:he%LìO4vF.P 0:b[ӃDjymzַA|dC34oW`Dvm=e jjUR5 ML#Ŵw7y'ze Ӻ/ȨaF@m1)#;_P8U\c0 yaܪ$S0Ao>4c$uKJsG6E74/ﶡd^5x$ۿ엤 Q4<ˑ, }uwx~Y1`H-'ZfC/>["g<xД9ڰ|#A }<ì$Ȇ 9lb _5>b+ʈ^D ) 6RR~W dG";VJ 3g| %`UG>Hń|OOWX.X);ϰ/RFO L/5pb∂P r4`@MƢRai.- ~Yd$0<IrgZlRJ+R'6WD"@B`'Jb toM,p /<{ yL|hxDAAmbZA$Z.^t%`"*A$,s0.e//2(f/3N ,!L nOd.kan.nr2Z0B:s(nbIF//hpH$jhN$:}s:Ӥ$lvb(ނ. 971qO!P#ԮbADc\$7A!C'4ggtni*C.P)Hx䄧 2Aǂ1,8R6GQAޠQ6nBBSET G۸΄>w"EENu:΄Q4@cZcBJ|@DLuF&+#V@BOHXWdW+ER rXgS.AF f30"ZtHœPI%VAT\^*_:EpR2 t154fxeJdvt ^AmT㠂(@y(fNkƒ $RYXT`aQNv]|%a!Ca"b=_`OUHKaE_ZuMN_ 2\cFBjL7fenvH)va+4@^[C'4&6< \4B=!BkZ%\eAlm vW&_ UgX,{GNKKRtMhFLdbӃqE )PW"2FsF !bV'q Q%"`i`Rffc --f vjF#$.KY/0VCg[#uYuGHv>R8Уrs!s43&o(euu.P2[adxF f B4=UBGoYZaR5gPkV8s^w>h/R]r&NT4Z4 `J4Ԃ&mfb6~6Rk "V(a&‚~bCMQ7h˜EJI} *J"8ܳ `Hgnlxc12H@n!' z„,S¯5EM"kS *RP`$!y*Hʮ+h>ek<гo!Y* {]0|,a 0@@A rȊ "ީ)JzˮRa\\֪[p8׀MAPjpҪ`ʸyl:|~\^*)HYyƙō+䯄kn:˰Rl A(^ŀ\$\B?K ^ɽ*~;f1֐K Lo$MN(6. \fRʡч,|s8]<} ? Z€bN`0 8yG]Ӆ+I ~x]Ku/O+LjÀdʪEu}J]7%Ƞ̺}=}ٽ=}M@@yc  J߇}b:=%~ l$!f7Thb<~9R!LQ@`w}JuB@4@ Z7^"m,#,hȃ'r=5 Xh`I`hs>eAF!FPb)Ftk*@!*D7T`-W@0`7 D,(^ ,#o QBl v) DaF\da@hPa` a aQ| e&Au~Oz@ DJb%9n>7?/ 1>_¦I` ɿX_w7P  <8pЩP|a V+ 4ФI(u*KуRHW#Z$( 5o0@B9)ѠJ"jX^TIAT)6"NN=RcQFx#E,h#+RUJ.$I *Sbgɲ Zg& -]"K3F }d)uF)DgH: j TB)5lCN40v9bo: )/~z@ H>h 7X9LCN~"C9>h"M>P <LI4 &RL䢉gHcLHR SHFkщ̀.$ m#  rs4*;qF&fdO[4%.k? ( I5 N vwro@V,Go8"@$d#= `' P "UbB+"l* y8b]i @xpD 6-.HA|7He-soҭ|ތo㩢 @UBF" &q&)=QҒLJ/o_FFѓZ|yP'BrmbQ܊U|؃/o=Az! Q;UqtaƯ?oo0(HhCL"0C #u p =DagCIr r!/ gc,2=':$a:$Gx,1-xeP|OS#V(roOF$p͢#hX2g[c7Ҧ,WX`儺&Y:B}8݃AO,#/X uӅR"OR ;(fc'ctT]PT $:*O~*8e@;G4scRP-p ` w@2:W0ʇ 3j xP Jڪ @ 3 #ek̚ݐ+C:j+Eը{:s;V=K:SF׊vGFacҙx]U:= DQ$(ȇEMX?:Ѩs;F+Ab:v  tɴ5ObQ|cGZT0AkW"+QKEJ ;55A `a\PyND!!xhdԳi7P`Ps$ EP0yIע>$Pņ)0ppBRuUDzV{K7:Q씋 * kb; @@wKZZt,p[pqUI*WCQ ۿ y"hkCK} \F+5`XKPkFY5[c") P SyO=PA6$:Pq9:{u՛uݛ[;`4Bb[BPb|p{B Ewp+~!PpuP}ǝnKXU;!`:):ql65!<̵`+ 튅*&bG1@uZA<@A6d/K3FVSW|m?jÙc9ʸ+C uw%&s,ucY{@&d Ű::^; Bp$p΄Zo,%?'9ʗ:nR@Z}"jbXsA tF\cZʄ hckHkD0;Vl6".-¾ֆm F;` À"DyYڡ @"1lKD`.Y,%kҸlj &%/v/.ܒ@Qa{]м*Dmʹ yydL` ֥. "6f6n }t'x.pj=" vͧqP%mIcFVu2B0)˖agu@&Lwsv&wsYʌd 3uru XcFLIu9jj  ?#-mP &ruqyXσn w{RRI%i}m i;J!M afh 'Ivu:Y(pϰXQcٙ[!v@ :>hܺ}@ְĎx(Md\|Y|̀RusG5[.i~b^1WNS\7~}Nn闎陮.GG2깕^qW 놮~y#N퓘zn~% wex3&x OxUG?ww -DTGyQ閭'Zn }= 3o6/>[ n=O;_w -]>ߪHON֯I?[~&SRBϋ[H1?>^+oU =owWL.x%g_{%foeUk~(< 'UG^G%?e?ՒiRjUlX?ǂrcбLB-KZnҤѥ+΍UNĉ/f7jV ,@壇V;Ҫ7L9r۳9giDKkҰkEW#Ѫ^|/ɕ/Wl28l$ǐ]k=`7]ZF!i~IIFi!^)o,G ghi٧T0`eb؋tkceg}3"!02xC,`xaBAHfm>쵠nbw;0C/:F@BN bP !oەW8&YFq=XC|8Bz a q&"dȻ^FrXX Dns;k4 9# DYdxrv1 f-ua%- }}2/áev(W8PNݸCDپcx4,cż",pƇK S F)j;x3*jFˬ$9C P,QaQT؟q[0YQz5KSW nRYU e)gXq , Q"}":ehYGY+|ѵp"\`o5.?W#+@cy&)?3z@S_woX8xf&X5XR8`DliF4Btԃ3qR&bs*RNf.&g[i=QgN 즏pD!xP |͇K!+` ZH-6sdS1&vLVgqg[ vpa=*yዞ#Q[R hl`In ma?Gewͳuwo\'x - .R t̛h)>8Rl0٪iLTn1<WyŷHhg<&^fbޖHoΉ4v[0綤YBMhܜf}UZe^ISs[ /5Iv>!hcSY/];=`(?QH|p[n8!Ҩ>CX{Rq#דvORmsڨ?۲ߞ;I#ۜ&8 LעG {)]<;ym5b*|;`!y ILs#%Z5<ң I-Ks?2/ѪA#\+@Ck'Id|h&>i౓K-Hb:b(\$ 뽸Ag;-8: =!*\}@)RӀ@G9j2j!-yjR!0<C8 IA4zLA7.C B<"&#iJd.™#Hڋ'5^D3A2L93B4l\4lP̒$EE3@<|ҮWEﺩf@@R;u2TGGL[{Z[m d}2N)|i 3ZxМ(@MQNA% uh&PI| Q7 >`O]+55 OQ8u&uΛxS1+R0R`Й(>I"ňmD 5eSM`7e8O<#O@ UQ38HO]DN8Z͛C =PXhShxBfVF4>VD%Rl]@Z}d ň?0A RJ)}Re5#e Hb:߇0 8W,_Zvb+_nh_Sw3=_f2@̕ @㢼&Hq g^0i(?H^O8C&NS]=56#O ZXZXT̀xAQRg!v! )&Pk׿ W/AX0`@[d s(Gkb#B)$l&xiٓU-W8ٰ%`q[}URPPY֝pP8uZ eZ藳>6Jexޮ !@[hF[tETP~^ΈO 8@ӚPE00FyM`2w0=mE0ّ]V858eՄM^0_X ZP_^Tdk5nv%`M!0f%@%5)fVW^uKEA#C4|P˴ :p59PJP0O в&PXs1sS]X@-ߋPijsC8pThP@Cql=tKMqKtOtPuQupI3uRO6Ee @y=n@uhB,9 68#@% ߂}p1Uvs<n[H.ĸFqy7#7|?f ЁnvjWu y~_W"n^z vG0"yfO'u_O#n}wpwxGH@!X8> KA@v%P{wdžITqX_Gq_{n7[u4]hWV#?YI/J-x}oҸy(2x8{2(0{'{G|/<6:(d_v #Pv?wWdhGstKy=!1|}|!~M+);{{@Xvۆ }~r(| y0W2 2 < 4oF XF:AH0tD$F@b  _ĊdI0 *t(ѢF"Mt)ӦNB*u*ժVb>0" o'`@$}*LD7}r |ب0;d>8(;D5}@8< 3.H&XfdP"HC\tA7Az˰#>i:@0ws:۝YϣO~=Ï- Z{,ZھPtGSNjŕ=ă Si8 JAE@# #Ak@I@? 7xTRA`rŤ+}ZEdO$gk&{0}_Z,6hB>^>@V9@(hL_B Xq ?p@i+"dZcpdPA7HЏk%!TD>)Jke)2D?ѺYbE=! ~B,dB]W_> dPt9အ<@ #xBxDX}K= \q,,p];<%p槁C-(o"-ldܺ4r\W^|DKXstbv2]dvꫳ޺ 5>QC*Cp+ûAT@g d.+^{0*`!tcl֦@e0PZ>U \E9wW^IsB%y"韴xBA0 I3BC4qt]?a:'H@2d$L,Տ8J,4g L%$ZHh8:ã ?n <<,[-S/h$%+i.tmE]A x M `!K2P\ v8-]HT.nQ.BĨn-Q|%-gB3Ҝ&5ikb3&7o3UF=\';MݑQx7!$'$=yDɧ; jЃ6\q% }QP }4cU'B;яNPD"@Dt!$B*ߵ((d())MkjmL3MNoӟ=p.юxr(Lmh Ö2@lpR}TmC^Ρ~R+!H|0D>"|<&>à"6= &dhDt0 jXtb$:ȁa&8)`^؁.xH#o=t"lk+]X7,:4!X !&O1aнCB:^4ŹXEh^:2G AodFBJc; t=KW2R_KX̵:rE98 dH@v+mkg@?+I%-PvҌtyAXN}Ip#z/a i;w6L4"h-7Kj{@V/l8r NAГHwpBF&2 "l 9.Fŵ Mh*7d+[Bkpv8ի^I$ V[D!wІ a̫QƓS~|# JGE;h \ ;ϵ> ]5h 1/Ylã꒟<_R>@1\=5/Gv@[>=ko>?O6e)TRoEnrh|P5?>{N>%3͍}PM'H߃~)(LR{4i_` V6`I`aS +l&pC9jaJ En9 J! 6EN` ``TT/ ACL JAJ1$ 50a[ƕ!՟y!t`aP43pq BĪb PQA"x бaN &'jbqa !(`"l :58x:ňŀHⰊP Hƨ /z vbD2!'!'ơ)aT3V:*rcQ#( _-@@l1 x@<4 3Ҡ6 @%.&#>vcD,ncx̩|lQ4nB`*d'da3j"II&(n4JN"Xdlc|@:JaFňẌ#fcJ$AALV4adK!CfCdd_,@̔%/J%(Dk"$TcK$6bU#4 &~M}!6dUed%PԢ%/:%mxHbAЈX zi_bfY6$c%?L!c2"Vd`d&A1[<rQ;C|$G6!I|Qa֦ɤ3aV&vm5$ao%=T皴gz§b'{g|O}a~Nb"h*2h:}^"Z:S=E[*Eمӄ5(*CdZTQbRLT.hn@CL(!iXِ(.fRKDRO؇Tx( ZQGCV( :WYQ @|)}阢'YY>X-92L]^c=8B<$S EX`: ]DI^ӘC0UDE50A"ja-Ցp `=H>Q]T%p5@iE& CBZqj &B.uy@?A:xi5=L'p9X4Xk Hp)Je p+v[%-.PahghzA~,[y`&_NB\+HƁaXi\1!z@-0öZ30ϊ=TC϶ u¡ yI?\ء3`i%W1Cvi)M,r&Yю%;4) @\Z|2Cp XTmQ@4n\\n $Y=%P:di2`%l.$mNm̚ |݇}e)V_é1-ՎBZ(8ke-6ZBI@ ,Jo]ԁFe 4 C'5(ɝZƮe tY\pWAlatoگp=H)  Z\mZꚭ[ǯ@*1P'J$&(Ǝ\9NLOV_}a$Hnv~y[ʀ#A VP'[c$tqE+\޸}v2*\&J5&UȬ [ʭ&lBб!hPo Be. I:r4pq!>d= =+oa:02=d1 0W3) lq<4-bBu7@87$ˮ&uzp>P @]!2ݥVH-2nQ<(AHA8\ x?C@*3Egt؉ta!Pa Ư+4psx ʳ*gAƳi:P~J8nipWPR;5A)>C.xOhVuW[5HGB]۵]u^{W]ߵ^v@@ RS_vc3\BU QbckZK1eٵh=ff7P|vUа7iBj6`kSŅYlm ;' )7|C 63SAXPQB 0Tj t Y՟ F6܃f#ܘ9\ 0yw@t5up7d0po+CB׸P9+Cgh5cE=SC CRP x*00W>E4a=(컒^J@WEx7߶A3eBlz$`wHmzYyiݳooZX9` yjoYԂ9C9KvX\=n^ ŬXDǮ.L0\\Z:@/f9<Ay Äpcœ;pʣo(E{?T6Bro xC,κCOLm^PK읶@Oxm%C{:D+^99>{Q{2x5,k|}/A3|78+(33{uP{p<#l=SٹZA 2{HHŋ3jxѡ>Rȱɓ(S\ɲ˗0S:|현EDIX+wNC?3$)0gĞ73dj@r"ׯ ٳh :$t\a.P?@UtV`޽:݅l +{+rYXpP\:D+ݥAm !5IXc&6|wP}۴УKgz%$Ya)ŭJrS$V\Wv~e b,&j4 '#L&!2Tw-e D'`2Y7݌48xc8(bXv8Nh)Ye1$J9 {w5r8ېSC&`S ̘\t+ϡpM3l(@#IpM=Sh㠄j OQM>Q!D@"Lu'hzSn@ L:CSG! B(8(Q4(LCUyz"ʪ>5t.xCL0J=R4vOi:M[]?kN;,9O=*Pѧ SD }rA"SnqȖ $]#O ~w1χunX,˯lځf+#x.Tp;g[`J+$$4X{D=pI?^{)1*!!ٙ;ئ9gy<@ 쁅A ^ IDzwetoqP09YVA\k=P}HC,BԣA QaߘrnUPoRJCob䴦1jg"(']K~ qȸɵHQ{ytGݒHЂBĎLH!1 D1h>RQ=J5HyX9.A0<@ #+G])4#q>>U(g-_ J!! # uHG>H +Ĕj 6IJDωC`;p-!>ǭ~3b5I?V 15!ތzJ A hadai^"A'V~VG_*XyE k rvM?⫝mȃ|*˸ *OPc 5} $Tp(IG5 aDT 0[ h2x Z7U"H WDhEn-LwT7TZ\ PҦ;cSS4 <c/- vB dGzC)'rR~Ao"G0>rLI fg~wUp 0'ɇD Ȅ.P=Ŗ"E4xlӯ>fvp<mp\8gI~A-b&6⫿aoQ v z4JpBb 0?ZpG}C .lW @^} m`x! GN$Pw 3?.H' hg~ 3 `k P _..8X zqp!aos^  /oaW> T~!}m,G}DCDcķ5 -|| r" PPF)!w.w5bPS*JH_@7Qp. d?H+"P xl2Zv:0g7e* k (/h=Ёed*&08炢(Q# Ţ c2PY!쨊qW(O#=`k^! a;bM#XLKQA*uAv 98Wav؎HSɂ}$(6ȈH#` ( QYPo #JDj`/A9P!p * r!b)lni!DP^p5G_z~Y5IyqhXHi$bX9Yyٚ99|=#U%J*i.FaqYQi+1%Yؔ9)HFEh1pŹ|Y ȜY<# q#i@T&! 񟎘_ԁ $əY&A)S@ٞ(&@O$a!S{w9z~ 4K碠ؠ4J( ;Zq"I*'UcVZ=X54u&YWLJ*΃B:ALL:N/bpI*U+3PA0C1cBQvpݐagd2FӊJsLZFE0"ᨇ:P -^q`GXVCNϰS+0@)*pp' 咦}LO:2-J0P (@ASM2ɪYhT +1c0! _٢wyʡGk3vtFڧɳP5:97376: VpSU?0]w1j8BwTkC9ʵF6>W -!V[\a;K۴: X5@ﳡK M{?ƺ[{NIOY Q"2OrO 39QmTc@ane 6Cb&H"{KSqE 6[JGRЂsw]T HR0BzN$oFD\+0 6S'r!PgAQ,Eڂ&ŻBB'ZiB'+6GEr2jzPvʺuDBj &R0Ru#ћwW@UY!Zen`PHQrutWWx[75Wi٥U7 PV-hbApert `[e ?^ol,U7 `R,&VWy,W&u=z$d[` RWPbUWbM|Z+DKˏ:<7L? ``fģ B+bx$AQem$7v]\aaE<\Vb.fƭaUˌ^Wm>S[e9@-30c^w<ePe apto' aڻS ъH*jGsc&CWp24 8<\Ü45wkiʦn=|3*'lkkZu6qu`',±+3{oLITIQEoDDPf ڤn=;V`HG#!3s ={K+SG@qڋoEpwwԬuH3Xb\}; N6puř]ݰ;w[z9}(r}߭$Cݽ`NwSzIސK^vRچтwyuݡ5Ӈdjü8õ+ `|p&tҶuؑI@\ ޕ|^f |h2dk?h\GÇ (z!$g"{ "2%qι˗{K a~~#Xu^~2#$C;݆oJӯ:~>Ӿ:< `JLvsX#R80)2i!)ΓPP)ٚ5h{RsX YRv#'k0P*^f(_:4|/x]'T0A:\K>7ܿn(i%1XGP&E`AfI<\o8舘Y]`Zijnpr?t_vxz_#qȹiiM3_*205-a9rK$)yD)3Q)iWTAa!,~/ Sų>od8;q۹|7(  z<\ ͍;aI!! -!DLӴ}aC0 *!C "aą)CKND]9^<"L.]`EBō67n>0$M*dnNKMr"]IŌ31֜1`yNnx1f4׆ 7rϣW3wye[]v'i =)6X+k5&DW g6lүpOs+Dɇ` Gq63˄nhHȳPA!`|WF!+UcKCIlZ Uu_G.*hRRgc^Z4A4jRVZ@T+mD2 LIQzvCHN^(8769+Lt|g:C*HF/ ֏T:vi$[;P6gr{J#`HZtrnIµBQB8ӃKE.fC窱0 Ы G98Lo!Z@QͯDA)z!G*ch5$MRD%3Z BfP,Uur)M~[`gR ݐk|DEle4{кGma.I{|\7"?'pKuR%OQB )#Gj0Qg$㫆hHLO EE6 u 2 C1| <}ʔh.B=S? LER{D-%QTA$P£c\;n6;i͌H$5),k$-5ISayp6Įz:.f8yȵ{i~"{ e~;{n{ Xky3kfpHy%.iyzENkS 4tȴ67a9@ݩnSP!`{h59ٍ-ul61Uk 2ѷ#WDp(S(ce`(AX+2S֡67*!RU~F!wXۧFP|RfƳ cmG rr@Yovgwm&+~쓇 Fy牼Hw᪭w=!̑ k"ẸEt?x!JB@ M9[y%a| +l ?ف(Y@y{6a@n8; xX i Ҭ iNh }X !(|X] }(PA%$b#Sxx#+zL`!D*&l˸|B}PX{?p|!%1$C"|=L3c RI=0DaЇr7̄I4 W؇`@CAl@_/Ȟ:gsECW D&dĖ({Zh@9R@]I 8TUDwE ,9l:|p DǙ`,Gv(: T[} C;ezl F t tX:/QK|؇qf F4(Bc(hpmȇ|Đ IlhɗyD!|HZGs|@뛈z!;~=k X\Q !)>8,z8V O ƉEѻE4p̀GyG30u$H9HE%Heɒ4aqtNF@P KG8 |9ipؐLGX9|٪ GA (<oP:㉠#qO44Ot!W!DLI}`D} Hdž 3܎PU.#Ѡ.Y{Pqu !%"5#ERS`&U07  3|!J0"P9@IhZX8'-7eS0PP C@ R3R? = h4˧xo8:cHNLB2O|15*ս(SZS0XSZ:]@XUX զPJ0Pr H8R8? @=`=P E P pNЈ֩UuݎT%O0:p2N~R3 V B_BYX`nEXUYEdBTEEAS}GFPxX h&omPUI?O=7Ѓ>0Z8 Q{OZZ}5]݈ZQXZ3X6xY| CW3CQUY0ae[YUвm큛1(>Z=Xu1\(SXM9 Q؃X]ۓH[=&eDxSYٝ]Z8Z?XuOUQX@S6݌@m=PXSgm:SH4F 3'h&`&p5"&XW ߙ]Y'8ew <8pSYHp{;xч \ P} ˃-XK5RY,]eSWpb$ ]?`mbb >E`] (ۅSY3PYY8S[]Ye?cؐU:K_S8a55SStEJ._n1J΀Rą>`'h=*TvN`'XT6\`e& ebE&7aTMLFiBћ| ԙڃ z KbUbbxzWgy$T~#TgY m݆v}\M=cQX^8㷥EBXxSQP 7=uE0Am%ԏ[?M2Xه8e&e&0'pQ_# _0 ­mҙ TYp\Gs Ċ@Zu63r!Ps0=Y~&bcbP514}#fÀO~mb3vx6]ˎׇ5U脀i}=%^޼Enm8m:6PfXną=Se6&e  j"ٚ1]53Z*\5AZsk$y)pB!JԬ@tcXwF6]v5r)=|Lmb:c6b-~mq5{6@@r6h]Рm:m6}n[UC\e AV^=lgUZ](aVͪ$?hEv  @`_8'o0pXɅY=XP@ O{I*S p9񦫲')EɆnq0uWcGf}gY5jOWGavL&E.tX[H~Hm_wGPLbHY_#Xo'.Gt h`o.qx Xi|%b P{)ـD8H\%kuhv-|363ϵ>3Acs\4I+4M;4QK=5U[}5Yk5]{5 Гdiڈvc 7^1ywbH Lp߁zw;BOl_nm;y'+97}xT2"҅OpwrlT Fe[/􀦎S>NEoDx>T;P@:$rI}n2pęQ0 V)QU[GJ6d#0*@l62L73z 3#Qԙ |?^s˜@ }=@Mj*>FuhD'iZN0+hH|0!ĤNvH?Q^(L#TI0pX MpAt0fn0rTӇ35ф4AbfD&a&xFE^SD#9Tu>E :N#hܣ3"ֵ:?tIXcU+[z5hj5Q8ȇ0a008d']i܃0F%ŷ`oyBn一pٚƸe+ʘh|kPEtxA-WJtz# b*4#"Q$ESd~ @ zaԉk< x:d`P6(F38jOet#]M&qNꄨzHBF96Mk5D[YB0f8{$D=~ dA*Xx1 AY1IJ0Lٞ~q?\S s(#0[,}܈6vd|2Alw1eƝzC< ~2P *iZ\caC@(LiJ;ZWy2ilp2 A q)a(0>xԃ =`_by[A8߇''7 A 2m` pA@hzhdFv5wU֘xs>+ k!.bak`SOkj&#ask0i`qaRslλ%O~'#pus؈p%.p%<{Njd]%}<ޱXIߥK $_m[mݝ[ELIFQ I*0\h\ -Zy%q=La ;`ZNʑ.DX0B=DD @N4=Uw>TA afaD !u֭޺C hlE ܀ߤ a؄NpȅC0`aX |~yXMBQyZi(B?oep؛IAaن9 !O`%:'RƛC |*Z1x|s7p]4T5:AI$c@,1_!.>@7é6Ś("GIVPcm5Ҏ6?nEw JcUyؤ .>2Yduav]I>ZabH҃d>!Y 9fxbFjd&({ =$0'CV`' @Qd&(Ƙ+n(dM~ۜeO$qps/AV|9ʍ&#@[[C\qp+!4@h֟_qBhf.Jn_eMd`?4ZylÀSViC bh_4^uٕP2U1$əI9đ>ĉZpo[IWNn& Mƌ2D-m4(LR>=@ë![e6ZɝO:L=@s9uZ v|2 h!Pb%YRD(H^(sC4=EՒ4CP<ْxI0~Ebg |(yؑJSI*?H:lL #glY XRl;KRnNͶ(')t^ , i )Li͝j(&L4ͤ X^fd*il*r,d,ͩ:MML4*jPΫ*++&.+6>+FN+N'^.*JNn+ iX|Q+l"jkh] ٫АDj++ū"쿮K*l,>/z\y[~lƦ 9TqtRt:'rL~jJ\>ՋlV,^l&i-햾n,].-FglN_iĂJZ !u)Nl~Г,mւm VvmȬ6Jmކmsmm&ҭ6L~z,v.tb.^JRM"Uln&./V"~.ҩ.ɒキ6n暇_>oN*Vj-mv &,zbʺ~֯®Rʭ i,C,./>g+ۂ ٯoْ!0-iI.zJ0{ޯآ0L0 Ro װ p 0v11'/17?аZ/Rqjq'R1*i^HF ;?MqטC0VOA=KRF!W P̘Ð%!o%q(CZ9IYP h"B d4z/p*gTj0RMxJ1Ɛ2.2\4n4g6/sB,? S騎$6h]ܦS;s5$Z^m+ܮ %"ZA!CL@@"pMYǼǔ 19y(4{4KunK6|70n𷙋Pkc9 kB1E"`o(o{ow崻Kһn6-3mj.!B;dbdn7nj Fth#o7'I a22@[[.'ZFmʦF`NVzAtemE*,Լwr/p૶˲;~ڦvvט70i zSI^Mux?R'<4mHLa-iIXF^th*IirzC=ϯvG 8p& ~ǫ& #n[n{eOoS?QU xgy4 #C1&?@8`A&TaC!FHP@EOXYA"X1dɒ#ITH/aƔ9CQ~gOo o :L%JOm.:jթAjkW_;lYgѦUm[oƕ;n]wջ^. <H"O0[V̬owŃ*n<9uױS~v:H=OiUZ1sg׿-{ݭ9J辉 .@h:$| 1?s.Whzѧ`G'}y 9ulc igeuL$֠/>ѩ./ǜ/3Ѵ̻2ٴRFi!&V\č A`/v< tr$}@ܡ'M8q49 (J|T)LSc,YݭT-L[ruNUS+#(G z>z+vh7^YdpɄnp >JY')W{:im7ε =y=-Qs|cljekm%VtXߝ<]:-mJo|8{y~\6yGVPVPyX*ՙPzcjE++7qܸ;gCBr ˀ"m_P2TT.6@Ї>1`^`;mmrk6Ąo u_"E1Q[#EȎmt{0G=,HA4!HEg%0n"<,iD ] WLP @&~9: H8b'(܂S! BE" Jb 4NA 3 zh"`D "rUwL_*C4A.G^rJ&%-l)\:dc5X@AJ t! h)@gJn07ArR̊=`An' e.,gcJrMDgpN,wɁX@ τN\@ԠCEh|` idÜ&C`>p٨@ Є&`$#I@=Ѓ\!k@HyƟnMt^ TS6L\pVmL(T*M(DH˃ ^Sd$\jh H W= !+pGȪoi;S ʉYf1"Uwiq"xy˧z8?iIYH)?J Abtx) E0o!`<0SXx "\@׊T MpWšP 8Fbp$Pob>Pk#b9,P!HD^(|j*B+RɌm K=Vv,48 3F5i跗}a`hZ,3P@\ ,&7T ۊ 4a@ru$b;5m!@j=Wm&{ #!A)`ϚM r,AnkKr_Kib"An  #6ZMl Ho` om1Ƨupz/^ ~ʳ4&("Jk,..Xhc6XE~^P~0毬  ,".h Ȓ ,> F J%j  p lPޡD7 !ХWMup|( y X*6PblDЪ$.&T" pB"j JB0i\!>FJ`2J *4"D% *~(O n`$Μ@dFJАADqjX lyEX^(Pz|,rH2OOfrb(4c 4r!CJ𻜪"2NN+\+ MfNLaN' PdSL28sI mJ.|4(rK`*OٴmDY 8R-IRSE /"3u'mB$N$ m)\0sBkI@,DE ns†;ւ/Nט*` fl .` \l $%Hm *T0ܥY (;aGv(HF ;h/#7W?ci|/?: FP!N$`A'®ZTNNQh6X`zK&zB0kBDj - 5Rs"5SB_]  ^Ab^We:ȵn va`u^ "h`hh!Ė 6v"vj-VGX(6\oD!|h@uAo@Ao-EFJD,哆ć r*& "Ε"@Ƞh < Z @uewv[`u[WXu` ` ]]]|] rc}( Wyjn,~b4W E~ }_Ha"plp!"~  ap-gW@`xl`!ȶ  ʀb5">vu 6fjnmcm wWx"a ׊yY,eX N`w x`!5^A(8kgp@xX@l #gwVY ,Xh"k =$϶i0 ]x dvicY}@ ^zcc7+^1Q-A6aK L@a k8GHvĦ_s&Y!.quZɀiw02 80֖[i]8rmz$:!3bY G:YuD` f˦uvR(ac^ uSW 9Kx:y0:9ui,O5 z bdOBz} :F bnq[&A:gR_ g az й_*%}Z -2;heڼ˛  yUm zs{}bDxc~"\lvkXG~9SD :\e{p'v5@ I͋uE> bi<ٛ 8S99Ubs w x4s͡|%gE平~g;>xs \{\;+xuKo\v w7x9 ^!Z>7zyz×Sz }a&\m#h_*DQBc=M$o/akI,LeU؅V(iCp*/b^խ=}ٽG5/ܣ.չ!A|"WNAܻB?*A ,>5! '>>K`҉j0ef7ݬ@B]sEMĸ~hG K#PHdԆFlDB$b4 %'_zKy G !X"OdHF~gm~mMq PDHtۦRBR2G`P P~q^t@/ Pa~,oXIq!.=9y$^Gʲ" e,!k~c$"ˆCk&ӳ ]*_R!@ "v"ƾԸ %.. bYfGbb`w%,e,'H_,ot@}OD#NXE;z2ȑ$K<2ʕ,[| 3̙4kڼ Ɖ1$꜆;DM1(E8/h 솎iCJNJ iQ@zBhX]WLj/NuƉ8Ō;~ 9u6L(r!Wh$Wp ww`P *SD–M[\˛ik&R16I`kVaH|QNg}5 :BpSZVlFrr/A|٦zy&b*"MH%.1rO8dI 3> ?!O=h/DJ\^A>4bZ%0SV SX4'%uF-Igvމ'c/fD#=_hcT=v4p+GsT9D4@LBͤ!It@)Ck/PqpQ*!! $gKlƺy#ر> mN;S 0bO1P nK.(#4 oKoދoo pLp\)p? qK&6q_wģcx3Xr3+S XdJ&ߴ> tH2M:29sMQMu(+H/3L@d""}3y 6e @lAD6Dx Be vW]Zx*08qH6͙-g^ș9y exi ù| r84H6дa`|L5 FrM=gXz|#u H0*Od PPw7`=49 p-D>I\aʧ;V}뫠f3"V-ng x7pOLAko| e d @Bez r){G<$Dgj7ep'pa?vHiGzFAkr)RtcgB.>HmX-i +9v%d31 "}ORdt! }5Ar=-o\r/ ` s,1d*slh(9~Gj 5YBIgjS24s͌V+[E=I6O$EpJ%,.0Ϟ!@T zqμ'8HzVSIpV.q(J(E|5Y UQ>E,IJ'*ҍƴ= ԀR3TRT$/+)L- 'TS:rd; W)m0( HC!PF@lc SRB)%:@b]B,@}@:NhKL W ,C ޡ|8#&@>QWl5r|УQ#qۺw~* 3Hʩ_m.X!B|!B=xcE.)"xT g pCEcH9Ј|(ECR# MppivMo;8w*oDZ@+j"k *G#JH 2V?\.sZlyF` << QrVF}U`Ո451Ʒ@5ݕy:YnRfx9?lϔAɬ,”-rOH dT̓P31PdHvU? xmf:gL& q؂,^`,!@rI-3|C,b K]Sd Փh-Q")  gj`r$1S*ENZ&{NjkA*s3Dz̸231 `t &,h ;ec6|KV9p(}У._kCTwo;~(pQ))"+8A.( UXXh7x~f퐁 XX`hXŅq@zz؇2[s[b..v;ST COvao1!`dȊC^0`RqsW3oSuT(H+"%P|&3k tt'5lUtܴTH׌<ՍߘAhPS|P=PSHWo(G"A$''qThKhO"uPtQXQ*1wUm,45/ Vd  ӱp.8'VqgvF[1xF'PeZF[\u[ VcIWGGGD%,L~ o'](`v(@eeT0fc0_ Q\&n6y]^%Uab/ 2Fee_ 9)y/yA{9>Ledjp 2"fpk6gQiRp@ h5wlvPf( W7`ePh_1az` )zUMa jeʹN'Qpp |Pq Wk qŷk @_"!#WoJfk±k`Т^H~, J2;LCfMU` Y M)E3'`E.r qfawW.:s@tQ?JHKIʉK~gPoP BT'| y@ygsy7wDrXUZQuЧG erp7pmT~/g 3EJzz)aujq<;A|f}iK Qwp@ xLqo%|קRojLjQJʠZɬZiu19e ;ʰ##L B1: "QW %&X 5x9lh #냠Gz+Z\ڗ8^ů3j5 Qt.eQZxd$+B`ZdQV*x"}X(pHU"B Ù~8ѷw;LJ-{y IB%c۸+Kk`ڸk0jRidB2Yv`Nb3IN )D5!@fdZߑk5Ym@P{8P( I&PwQUk\"eSf`৬y `ӠZT vx#.bҫR $AB)5vyɮ5"Tu^U)%) Rkry`Lifp)B f\6[ /3|ju·&)b WN[eAz? ^0aFBGA5W|1hYVWbž\ \#|Kı.cڵ$  `fd +Vŷb1f~Fj:&&lȧ,cXŧ"$0qIefQpv`,g8@pl'a_)>K5h[Qe[g Յ榰n Phhu!Qk˯hF&vG||IΨ( i%W`%rg ڶ(AWAvLx}pohκf^Pk@e1.>!f(aAC+MzУ`!j nVYS4S"S%9ôpZm,Sf8Jk 'mKs;a/. ]<{eqI9)` vƃ#!h90i@]p%Pـ^  cBx.X`X2(a)+\NGȈ˖h;XeXJ*PeXYk$gi .0$k>>UQRv ZsqxY$qv$X*rx*# ksfΎ \o9/- #)+-//@80o#_@,La6Ę+QKY?7LQOT䕐[6['\Kb/`ې=ULK O?Y-v؍,Q{<LdLa#RU+woL: l/=zX@Wz5%Q\\CY2ŷ%WE iP#$a MxBP+da ]BP3a mxCƓC QJ9$f%IpxE,f1F:bJ؛/ȇ3/PqeVtхiQsȈFބ.("P4{ NGGD&2h(L y"8*Rd  yeDَ]$(B8iK0jw; ?1 txh8eST>ڥ{a_lc"LH(e9-xF9O/x(tbG0 }8MRp(\&ܠK^X.x/4-=ȅ2X ATpDCQG.9 `n1:BxD<#<$"hcaMPQd X({[<ڊA-_)U.B(]J (KҠ$b d" $;U58֩T Q (#-qz[h\̾O 1tгG_ZB @VJ#HӕJd` @ C ST+x$#@ H+V [IHvS)#Sy2C ҐޑT +wMRPZ&IKsj/@&A%gB)$!p|^PUiI'۪JW9 t"xwGŪUgGE0 XwY;W,^!@Q$Ne^ՙs#'Z3X1QXL,9Z'EcSÄ0(km´"IFG!)%4 TGx{}l<)V n[㺆 5vc؄/UjoP lsI(ھ$ ,i~#'[V{=8lqپ2tE{vWg;2Ԉ]Q̓ (}̾ oQeNd8_ mqmKgʀMz9L.Yu_S,ݏAv]kgwv]Xo{w}vX2'6~]&/:#^Ux<]'yMV~zM4oW2Gg}"EOy>FW[,X/$.؇{FO>?Dݣɟ~H*Z_>} FtOL _}Hke(3k2c?ڳ?L!??<>?@6t?K@ T+ + L??k/Z>6\ lA Z~3 #=?dm$:AKAsA! -6 A B*"$#?%,sB@(<d*qsVpN3ߓPFGc@\1>:\oV2 q1eyd1y8XDvge>ŏ/rO=1:|ŕmR>yKpޏpݕ~\h'ȵ:y(j)>i1k=XгU]ąwyr8qv:C\& vQ'W^$*#Fm8ivYŭ^2Ԧ3lsş^J$K: HEڬ a:%W8r?!yCo8it[NdL*/JN~F=FxN=F$I`!I$ಟ8:%zFS=9)tϊI>Ujޮ o𰷐pz^ȩ\oz<| `$9UH~YFz$Ko-#.5OCcfϏaQvbZ (4cyH܅`b=P }wJAϬ#`)$Y +rS}(q}a,3Ǿ:9õ'Mm'wOC I)[\~A$Uñ@` ള}N,}z& %L²qg;0fQTBB+#y]ATb Zt$%U6RTI&}8MXچ)Y~CWBCDܕƒՊ6cO=jJ4ZD&""\ IR$Fyg%hD  gLJ[Z"> G}$Ot膤 *ԓM՗e퓤 149#P\5AiWdԳNf;ЎMj[ζn{MrNvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘwЌlkX֨،ԈX8׸嘍ip8⨍(h舆Ȇ!! nvbn@nvbn-desktop: ~/exp/thefuck,h H*\Ȱ  #Jl(3x1 *p㧃F(>ݚQŭXb}8-Z,O4T: *8+CǠH(F~Xw I A?fhbDagRL-84:*ѬT0 RB9H*0  ђuٱ @ ۂ>)RĘ4Ф &^L=]ѐP5kBNԬv HJ-v%&wt.s\@_hhYL}@ b,1AYf'0XbpHLt"r)! Ԣ4`%E8L4o #A-oUiS%x DUБDBqɷ_ wL8Kgaш%)K,P-^(ˁ/@H%|B t^b _1 )b?&| 'VVDEPV?D0N01kb**p.d@gl4uyۉ8 pvp,v.0M@)p 7Q@/l y ^2W6P f.A5pB1Ft0DK ?` Tp=Lj7h\+D@|~t.~m%ˢ-PHYf鹐x`/( cl@ p@lZFC?SAE%eQ&;1M:d{^5gqtl"'™ۦխ[K/]gWZ(ˢĔ@% 6DU)g6=}PhV\3 . 'PV`tiQ(TRZ*T+:5dĒ fZ>! ! nvbn@nvbn-desktop: ~/exp/thefuck,f}8p *DP!AhP@-beQFˇ4ʗLS|xl4XHѓ=0ăP*WgС3y`΍VSf"իsƔg)v4+qc@!(! nvbn@nvbn-desktop: ~/exp/thefuck,f VH*$p#uի3AZrmO΀$@pYB TuZ2i!S EάtNH !! nvbn@nvbn-desktop: ~/exp/thefuck,!! nvbn@nvbn-desktop: ~/exp/thefuck,-f H*\ȰÇ#JHŋ 0CIɓ7HpA@ 0M5Sd9PL7<9`IʴӑE  K`xjܹuAAZQ#ڶ4UVyVx`f2\{\i xRt2̙xa{r*42UbՋh?]?,}$kP7+QuH^6ibŝ'q/+UR]0O,0wӫÈ%#7إjD~g`C]8Ҏ>L M>SZq( HՇ:&ӆ>4HF@"h0KUxaX?#5hAc5&)cN#c3#$(>20AϘWmT$Me72':dHЙi!͉pa샧aC?~ j((E?IV#j>:96[ZJ ԡcUyI b'%"P"#(.se+x.@ahI48,b09p =h7ZC#0@#0U^I+P /L@#D,M>x< <nSG*IX׬90^~VA4G ;H<>G6Ao|rO4=W̜O2];| Q̝qq DžՓ˿Q@E/n7zmxtFmK:\ђ>ٶ: (zIRXPHb%0 %@cAaT+7gl9hilZJ9l 㒽;ǧ|#Dna'>) s+rW? 9{]г>lJj[|ޥh7"?y\7A7BIX YM |BX@a3*P&D5%.tVǟHųր1f;! v`t} DX P:_Juc8;(ቌb@ p&YF7m#,}@B xTI'0DёWs*a`}LA' `J &X|r#)8mf*AVb@( P) wh#?",$0L@T%+QƇq1b]YtȀ1U< ,za),I#I t0 =U:)h ݪ ,Y&>v#HuF } J q*(37"J`)Tie 'U8aKJT5hW2J"}R9TX7JZ5~" ~HLiE?!P)&ӧu(A-OˀNv ;sO}]WxrЌ@@L%Ij@[RUqJx4)} %GXCJ`1I qílmmk`ݴu|S[ 8>'ѝ.u ?" T%!e7pE98 d wSm/:c@s^`J^. ˱y2 [tH@ !7 &!8kͬe8,ej Ać (]"pz8)= p%,]e b%c<hxy + h]Y+F,>K Xu!q Z)E/L4B "ţgq=OE0,L9tH/ sя:!rA{űxaEN9> vY8!b.?E QWGX }N ^A_T´-9?wzW{owS ʐ7C~{ڬft;@zfܯrMTUo Qi*i:9`$\LJNnTEzRՕ#~A}tY(|Q$!tJ'`>@}FZ}WBzkz)ޗ9`2LvvG-vDZdcUPrw 'u"QE&Ɓ&Xu,Y-6Q^w  xY6@l1AYXƑwH!4؄ UGWȄZHȅZ(4R?ə'M$&Q!WN"c%n'|Rn{Wk',a5bz&P"wPR)?xK;iʜuG)ecu)Sfx>~{{"&@#@Nrx $2Ҡ )(ZˡIWB43Qq h5o4np%#c/ 7Ss5[@[n}ң*/6G4@7 RȠ2Yr5d)2 I*Qg8B.8B/V9?}tC7cZSsi'd%妙E10q-n7nBtR#8Pwkf9PmGZ2SqZ9C`;Jaj4qss*C6?S /I41Mq#2$s#JJ\:`0}*28C$7ԏ?$2,z u(t,dPk* =ExKBrR]8$] g|)opTri GՏ19ePIyjHP ]`NnTo{ o tE'wPP% KiOqeȝsF;\%6!K@ۛp{0a RtGW{kE^u^M4FF̡ëWv˽P[2;e:+3!IHRJKīGRu/+2D3tw+S;XERZT)p@SY<*QX`U 02 Wp<%Ag-+b P+>SG+,v%pgtwZ3)EeXUԈ,f!UZEF]X cn(bfUR- j{E"(oDZ!J|d%9P@R|%X3Lպ):6hXQk#uL¨bf[V_f¤(XF]M[fu_ yh@Q2L ؈SթN]p*[`h&UR%ɜz`bLw)wmIa_,cL_ "a`'$(v+XyLڬH;%2[Vb;^piYg0K2gu6Ae g_O6]ݠ1AO' 0.2@uvDc OGk ]A1 г56w|H+u~Xg0+]Uq6ۘ< d:"ٝ}:Q͖9c-kJ,, [@Tl&WMY(ٌ$0]p7!(rM( ACtteKf;=!TFߨ-@KA}kug$27 H l05.o*P|ϳ2G3+:u`^'q bDq▥g'jt184;`uuٶm8wp+pӠiBWK jQtN.g s\rgqr@t-hWΐ waȏ)5f3jn1~34N .nꦖVBChrɸ']6)&GyI"S¢@!t{`I0{&{ zB'(#0 la!t_6k7v#d1  yX ަO  +:BQu" !#PG"OAUWc2Uxhu T op?_$;ϟ?'·(kbh;CdK3!X 3 wP _ Pz9O@?_8!&K%2lpO@ G >QDRĘQF-Rؑ#Of`LqX  'c^(PD j*[=r %/ lfi^.pvfn{,e\-#2,qqK xlCdKO&;&',4=pC>4XȴXZ8kӎ2/Ghx/2X%2K쌉hRPh"B2SPY! 2@B ~j 6P!މ,1 oqB9T# QH6Li5@N=bEDD%W3ԕ8!tjIRD1Qr3ɡS`S0+"1s"SJ'`&"7- 6 (px AP4>\Hd}1 Z'>!juǎ Sp8 pdf}RY&z&NkǭjEHkF ͦo%`SY%daK%BgWtJF[$Ԓl1 SL4|sTNa!@**]>^ p(]px=g&JA3cJ44|фoȱr b~x!nF9}D|y@?ŋL܈ \2>䀔?x&|QCԤ6 Vm+iP CH1HHT UUbqnX.,80v?`  `(*9à̄ MJѺ'YF+ZL=I0w @_Pel@xG@ !] ˜ 69~L=vp@*UgPA3jfyKʘ  x;@ LhFT^?&0ExiWڄ2Ӑ\,b| x46@ @ qx/ *s\EwhLJVxs:54Ӻ& ?p6#YMDsܮ X_As !@P C @hAg+.J+?+v҇\,cf" Zj}ċ*$FPwN0`RَBxwI & V,AfP*B 1IRzR~zԬu aUJYɳVPPm+تMb-䦀՚`,(`Ѱ"`@LSYId{$G] 3D T%(.!;ANʸ HL @knHP0lCy hs+f uKRM4:"ƥVv#00T@+? \i@*DQ7"@so͏*!ҽE-"^qETE<"v[')m4]7jokE>9}i/*@ )|>nª|xq N8Y9#,P[BKXvr )L,+a$;ը. %Nn7%Ov4 2݊+aoF>MBuH ?]"!/2kPמ8`}AT"'7t3ZnzsnME'#"BƹIJZ `wVf|"ZG{HhEN "X?;D(a-0i;!$ڋd1C vv(@(|؇qDqm}lpthx8 |ȇ뉂FA a*!|>໸IJ{4EQ'bcB9ۑZK!_ s qC@i@G ,D?@A0Kf3 X`-iXDلhȇ7(DC4SDMTDt@$KE>PH!Í"@8S}.DRDVdfDE{Egi`lƔlmnopq$r4sDtTudvPkTě^,r|&JGw3Hq30XBh`H(*8) )) YCǍL y?[DH1񙈔ȹ8E@=|9[*r *+u0M* h3AA1/JD] ^->Sz`&N^wa#_9&҅{@l%8ÂN%3̤0s`*m@&dAf5cP{ƈƼ 2jm=9X UGTKQi$dWR9 +}[H]]D/"" ]?Fpb(bm(Xab/nBK>1`l )8`Zyd\GmEMդه=Aqh~d0\{Q_JF9rp>OX+IDL;e P#NDP@{ W%,N {p`πNg[V@9d!6%Wfh`A7p^Ѕ$^l> n@j+g[Ư&W90}k 芖PfEPu܌ȁ؁l^hFF`[%+[> 1`[.^_e3t:eh$'6n j&[el}8&n1bXڸB ϛ^%mnHi\N_kE:^3mn$P8Ip49 hW5 GnX܇xmեW؇_pBX]oAsqc9`H[[͇}`Ju(ԡĈ-<]xiq()^ZF&骋 뺻h)/ܖ[/R9np+ )K<1[|1k1{1!<2%|[Ȣ21_7Dc 34D1B|4Ie7cN0LGH>h3+;<.]0!Xm t (6G0":QT"_ /N v3F@ЋL}9@.tc5/o^8bw9k< `>S>s5؎t;77{8 !:u܌5< M>>M"Lo#8]O@D6?=}C?׻DApx2mvC<` &dhBf+]C~VݎR @#Vh=*luHE> {A2 {ft<@ l&:8X=`a_&X83W>9]Pa;%F3ڷA_*x]: !SϜQ|f g O!Z ,w(wI hE9, {Pw8^#xV!(3PiRS^37GM `bB( &~0#XJ,pp;\-%qۇN8C3]P PXR\5SRRȌlU@< gXUn*l&g R!t?8 t`BV84!28LgjXѫ BBJ vNmg z\R`:SUD9v!@z\y{ԡl8P\e(Z2b)9J]s[o*2BTäd2l(|X'' RXS a ػ [DwyX*>p]PW!Ne\:+DDA/7rcHy B]A9T&6*9G P=g /HY@2ˇxT.&W\[Uo2e#X0`a`` Y|4VB4qE!J~X]CL@$z̈́(<gwJסOC6G1@eaji4l r^ަ6e*\[&ݶӤ}sȬѾP}kNidHkٵ7NYWd7Nv@BpPصGR .#?8Ti1V8̟)]'\,x-a|TQ+8rAb7ę#= NB yX;S R9oD՜R*0^JP$+ ^6ƱAY{%&k|?\-w>ozq=hC.;'5jZp V/ۗ=XD8}Q| BѠdHbR` PV.6YOI ^q!lG*Xe/NPG[`gŋ4t2DUܟ % ¹ ֠ Ja h@(@ ҈G,@@ `HB,G--' t„A*H͈E"Bၘ@)@b0^A>FxU4 Ѐ,^ Lʂ(Lb%IpbD @%B(E +E+ÏB"F("#* !Ђ(,@H"%nD!Ђ,,Ҁ 'f#A B.^)B|4A cJ$ģ.FA0BbG]3&M4n5"F$PH8 Pg#?^ B)ң=cJء)@FZD @dA\HB0=L%-AGr#7I $RP\b67z'`b5 !|j B))"@@![B \)<%!4 =2JJO4@=ڣd6M=.0A`:@ b<]dM^cHQdȑUTh_PaN4l$DlcPB, &z\PBBq~fT~?@U v %-,Wrn Y*! )[ze{@B)?!~LgV|&e:]Qڣ4N h`cNfp.rjŃdQ-ּ;$5Y:LA,P(E5aQ\d5v PEhqM"vRe7@ |,-0HM$*d *dTYZe(0)B^f+Ba4D`.t?<@`V?8@Ndv[A DTTJb$K"jvfvŗ L9 AR\WV@pevrl#S~BVfI&F?,tc x!v^ř$~eH @&+28g O?4`bE&J`ΫI^*6@vLnjS::C94ث`*ȂlcÒ 6k7:wU&$6bvvZc]"eձH$(lk‡ # eg"*+dLL(6dRfTB,L^ ~)y-(Avdf66E6'5N&kUD9$.ĥ!I-.@Fd'@;D.3:A+9 X?e$p+6dĺ-d!.$+j#@ ,@Qj!v',8Da ,(@@ WR%%AY',A @Ye )f?.@~2x&++\d DdZ.hak*g )?,@n:D9`mG8Zo@ T\,D @D; %&w%W&i7)P#g*<!}ҧIeh gY%eK'\8@"c(> "L!DҲ "X-@B) C1ܠRBv##B (dO/'P |qQX$񜾧BYΩ !+A`kZ0 G2AbfRbKhe~&O0A`)pLA&P"Z Mn>1#x6)$a+J[@#b֋>$B_4L}g(@DG-Dc4Joq<"h MKK4OO4P܌V g_Ps(B<,=_NA$]' t>pUc U[D$CxV ixD[Y AgDDt@[OɸրtÊJ@ ^c B<)G>P`Oa3DW7nDD:u6 xԐ|o/hg*]_dj k;̪6ObOX`y qa3̬AZ+B-vGw<6nu>GB@KU|TT?A|eD$CmRn<YB>j@=w>>8|@ @nPB'oCAf2./ 6W7=Os< ^|z ˷L͓Wv:; x|t@[0It ӫK{5 x8]8`׫ IfB<Ի{x}Qz}18SX7w{fao q7̫z8ļ W/@>!O>+7@1@@A:!G F/ A1P?%CeK/aƔ9fM7qԹgBU^=!Mtwe$HY l 8PKJ'0V'>8^["^P{# Q@2 $^e @?dD458`>Y+gC2:T2` 3:Ǐd`YpcG f8:yJ=G>zuױ3̫o>}F C!5P6s"Hd+PTv jHG/ .KH!B$!8,à(F:L Nb; ! Xsh67nd$8j*'-+R-jهU^;hRΘ *?~+"0xIS8"cµ^ ?L@>L2O[+0ǰQAԶ`{0LJȇ05 #:ޚshnr8a:nJ9=kVm /"A{ ! y3-TI`P> D"m"K.qA|}`)T2Bp2L!0E[539` @ˆ eJj6"I#L -ڏrJ)꫱Kx0oW9Mk-jsopڴaʫnE:领@J~B+njСh1Nv x34'` >&(iknq߁^/O^o*s^驯y!H!G9Fܲ ş @p۠Խgգ='IA*$~7i I@ρ1-eQK VED6y M^$ u aqCmpb8Y(z:Y]xC()HIuE)Zhj(юK>a@=41^ },#0A6R`T/Fz~|C*x?:'Nޡ {ȇ o莉BcE SrqSt+S`H& 8Hˆ{, 1 w#؄/PExs }p_j %3OH ;>ܡ1DP@O{#JδX@YpUsB KNa LS//ckQ \`hVUD( qXF(;iH3G<*Z8C*(TVtCoxզ +:@rst!d 0%<(0!(N>~Y!W@O= @1plZK$|m>FvZbS fDBԺˈ6l)ʯ~lk^+. .D-#E_F8{/nEY}{ڃV؃D9YHF{ZMޡ@ RlXUޑ-"m<Ԓn%z{u܃!;{6 iOԍ@ " 5~J`-Ad ^Fjأqp0ZRQZY=٤e'-4ve=nh$Vy/[b"y1ja(&vM 2ucze%ȝ`c"Wɯ%4*#Ov4"'ὑ喺А0Ñ / 8wdx3q n4d&<4HBpEo`]*@w0v],*9ik-<+fG#BG†( G8=Tp;è S5u-!Ϫ ;F~|@39'8? NԮVPӶWC~;-݀=5[,]y`0rxc۲y -s|4芹#&hl7_$to]ve7D~v}VM{}t=dqMJhӻBx@X;P«/owQw ]G5uhB/S_Lsr"W u `f0#*qd< *2aSB2`yH8=d_a=M `HQaf2/oOeTXQ,Ϙj}kv/?_jh+}KQ86% cB8de cD/2ODHP$OwP+&o@y`a U1&>0`cDR!6 0EbE. cX c><$9o$NC }PZʶP 01@f GS vOE"6#1 W 7ڂ$Ͱ]0J$]CB6c> KFeBPW`h0^P 1'  ;EN='2HSOf0S|04T%0p+ E1#66^0cftD"t J`U0QoX+ Mqq1ٱ1qg|0bq ZH "F@`\t 2A#ih4(;K B!mL8N#er1;#@$Y[t'!g2(oVi$舑$;iFA`'Mm] ͠^`%$##+!%:I*]'/r. % h-L(! (R(q ai8Ұ &ɘGoD-܀n`&m4!`+!2!dK6q!,4INsa5s5_B:.zi0B<bL A I" ־ 1+(WB" FСc4J*Hr@' ")θb+a|PL.N҅HrJ҅B1%"#u4T(]&a-R3$jJ L /1#F2KA@C@ק, j!AeR+ ,B=H:/'1Ik$,;qԣ82GJ A.­ JLKE1Fg.? G-t@U!VŽt|`ȀK;^У GB74#-B/1#Rӥ8Է>JG ΨUHQVrUURN1FF݁Lt"?5H"TtQyXn"TJC"\v hCX,Zu.Jm\ P4]5 W1IJ!P>aRN"]XCF!hUE$%T['"0r,H $c mX;tr%J05+̬#\-33 +VS^~!|~a6AbQgᇼӈ`jAikQ~h/'"~ӌ 085@ 7IGn\f1Fu;N#P``! V`6]%ĔJ@a!%Q%H*@ᰲB'L7  8]Hwxۓp:P`y7zW6A6`'w{L*w|ɷ||7}WW'g}w:W:燮 R>p~~ u$r(H8HRdX.!O=X'<[dTS'7xzܨFP+h LbB*%;~aҍ -B*fpwSӳB HsƳ1n5̮|["/푰_/sC(2*qxT}}[ӑq=@A45(d3@DS#`+ArSi+7ev@QN:7;o]{nի‹%@E,{v:)ir+MH2[ $cKNve=[NaVрM QCbtP%$C<7t!^FdJ.ٚ)x'% &B䓌&!^Y@#f>L]ʉT=x 7x$R6Sy-1=aBN|>e; P2䉗ؙK&Ѣ"PAt1`E4t-.;VN0PnT?u(A"kâĢ~(^m*I#H4A,42QȷAAAYK=)ut@"HTO0tN>1Az 8Q(m>C9L/)\$D.S>U@}M\# M0 ,=l۶bMvf'/3Mvn wr=~kӍwzw~ZKNxx/x?yONy_yo8f!禟ۀȃG _Q7OB(A-g Pr/xs[`|HK3gi+e%nA iOHKߏNR=R Dn)ylo=(I"<, ~˟?^DDJiby -hgT@8Ȁ*3m(;;4Cxa7Z ucZ#z'(LCI}tƘU*Q:!>)AYJs\ +`ZΔшdV KģDN`;}}Q{(Cإ/a3xESU|Md +:QTƕ7]7`^ PW~UA0#Q??,\_/R(ޖ\*P@Z0lt jK3ցs?t܏W(rE˿J{dWde0pFrIc2Z9:CA|0*Lk ޹%p9+ Ql&Ck'#xH,Yx.Fƅݦ")Q',p`jEW`h0 y>˪G41X#(BNbP`m+ϼWٔZ*\ҫj_gV3bii5QҒ;ڨ Ә`]J.Pu,M Ԧ^:@iA$\kOYt{zo4X"HwEQ%GND; SۉNŰ (X]p9f2Rh`K4Y&)[NH X,{4?s!RP F.t,*p'Q2%'+VkmȚgɆw.pjF0#s@p|-5G.G4HPD'~(#~⏘u Tq5 ZL55pn 4iu`IyyrsP!5ʣ}sjptIW=jQßFGO Q*SJUjW9C;Z oB v:v%TPC:X:t 0&p @ iu=` 6q 6&P ~"QzéiVp a*@4P$vz&0 zJ ~#Z Z28  !=6'P :7{]/ z3=B] 1:|CI- wJg̢O짲e{TM 40SQ<|ǜ,1 |A`M L @[ɔLP 2ъ: ;m}`gl± ` %F[!8^,7pT:M )P ͵P*a \+Ʊ 4`P/P(0ȧ uK< ܍ᬥ$L W= ]p%R ޥ<  {Q%L%{$A 1#  cT Ș$!+ {l )|n 2QdнW[̬ U03f< J2a%[旿P L0 +ٙL;=8rkq9Q k&) "+il.R0dI* j yڪ}ܼ  ^\K.z* 3pc+ 8(v tk=@:ZDJPp>DLpϾFKN<[2^#:}:Q/2+30B.zD:(P kJn; l^6(pT* I* P *fZfqh_'PAy|6(}z)ԳOo_@$4z{_sDouzz-ģ8T?zyv JAT'y7i?wi?wFnw&5o6޿oC/44!(y7Jts'* `~$XP?&Tp?%N48"C n$x-$YI)UdK1elY0%G9f̨΃1ڰ(О@wnQH9*UYn+KONٳêNI2)QѳA<Ԫڴnһc;,aĉ/f,Mh^n叡}QnHH֍eϦ]Jj.K7FG,U[vi}OmZ#طo=t_rsW'3Ұ?$N[_N=wp,vK<#ޛl< o:O2ZqD9&o,C#DP;D.7 S rHzGЎdM໮CVIߠA&1 *-F"sL2c++Ls& tM8L4NڔsO>*sA ODUtQQF#t!!puthon, HG *\ȰB J( EH:iAR#Ë'"482 O\0%K.Ol (SÙ,!dQ=}* yС2KZ|Y.Y&)KLO #\# ~YnO1(g l^DF|"a~ n[TUn;Tgץ6hVgOXaXjc$LR͙.%GmK6Ŋ /{8qyHaKլhAQ"VR?d:}T9mN2 ÎٌT+awg'fbuaNup%p%[6Ƞ6b98M|ZL6L$1!ƖxNxX!:)D5$;{3!=PbPȡԗcfH& &x憇Yv:ѱ#VG ? y&@qyܱ#WaR|euDZ>𣞔Ʌ> CV=-gT`2:&Z멂corAUB\&k1."l5D[k'Pfm=8#g חP4RhV.y|ieW-l"V](BJR˫>QTA#Iji)Xpy)\LsKeIcz쬋p]-L>)* +Wtvu Q1[)LJ՛/6ˬj G!ܶ(b5'9bX.HL5kܘ#N~RK''u3+v$Sv(1-.a)[f<{[S8хQI NSO 6ѥGhWHl4Au B\lR^%} ݻa7Sޯ@n/n:2Lo*"sJ/̠̀7  &xA z ! !puthon,!!puthon,-f H*\  #Jl(@ĉ3(@ .pGƓrËlI͛8sܩsX3dV,Z852 PeXR<)Ӡ?z63O _x;W&td̲] L0J,k,AƂ#f=%ЄdZEA\ X! P%*h,X #$NsyS@ Z(u*Tꂣ `G 4zL@[!|4eU[ O|md.0{!Z~Ya!Z(`1 ce|0 D) T%v (@)0ЯrZz)aE@%r&E8LiRU-?40!蚙,EPL,Q}!W0W?$>+9 D6#=Bv= w@(8:SO42A`QW@:pVjl dr~HS1$jv_΀eP/Oْ +H5X,* +@x =@ yY$ldEN8!@D.[@nf[$LntiO#, 'ސc80Mt"C7L@4v$4.vI4ȑ, Tq./GP/?HoNWJ $4Ik?E\4̉fȂ%R*?p(hp@Gi L`@ĝbo g"BeS(04a sM04iU@Yڵ `?,P `@!$^X4+D a Bw!* OY 0 ^4=;(3*[# XC;ybd72<R"?08{.UMJ\$eRR"?- (#*LJZA&XOu0L2 `Q^ 0?3Cx!&d9~Pz9Afd!0'5l&rV#r#ɠI&@ ] T;&9@H/T걓@ Lg!1i>(*LcSk\ k# YL*Щ.4)3Z!T XPb0 e2͡QfH@|St@4 )2½ @!?NBB=D)kBR@"8Dz@4lKɝ6*OZ!`7Sy+ֽb A}Č3Cl`JKh`&@B8DXFxH*e1GvR/a"(M]rq { Q1# !-bHWehchw5rWARw4os1džx.0 5ʦ'W*׈ Q u0[wzqxls1T( AЊA۷_脽HY+s0.dha a$WZmHre: l щ(u$R["10x/X}"HGZW"+Y*hlAH06e@ HX&F%5cq!H2wc Sa/6ђRg-w&+ygq^hzwpa,yGҘR.$1Y0@|0 ÈA1CxS tb1v#0ϐ22.S#' ÷ʠt`{3avyd50a@Z@〄213$P71kɖBPF -SU-c0 8jSÐ3rPW ېֹg2I09u@q0|P40Lu 2OfEwu0eyk1PuVZɖI0{&' R$ב['4gB֞eB;p;ܠ; ;٘Y0<`<:< O@wrC `=أ==ѐt`RE H7SsI:qX; T5G=#r=',^ZƨcsDkh/7` PY [uL;Pݙ 1'#@suJk>| (եH0 `>P1=qIƆ]CܫdaI|P Z](+AD*mdx׃ mS;ɣpr@vn%uCC P~ =Yl6Ξ-j^[ezWw {{ 4$`x Ip011·'}դ#P '-Р[V9}# 2D `2{-#}.0I2vƽb$p>c2Z9YG :vhxr^:rWz@},ա>.ScÖex`j݃kfgjZ8l Kr4y[(޳sЍ/#J|h(H3G8l#o _l-]&ݚ4)9F2IouOo~0XuA_CWb?d_fhjlnW_QosO@q_Sy|{_-?/uڢq`iMʅo,/?Dߏ52Y}Xu?Obwy9 ?ϰaxg|<}]3G%Ϳgc[;zU_O@ DPB QD'Q㿊/jQaH ^I$#ReH-Y.h̛%_4O0E,RM>UTNivd83դZ_sbc‚H*q`# d~e$KjЋVD,]٣c$d !G"2`LUu8xo|`DPTBr74aO9nd^sϺ=hK M`"PXrCsҎ;zA0ٚ%1OGS;TVC%B a*P:@I>[(@] w=`JdW=2rX%n T܃j\!蕣,0,Bї4nzfN(}Y9& rYKu&ǿGsᲃfkݨqH {mlro0hܺl0 @ˎXmeE\>ӨspbE5"sG\L02~P&6sw.D>!SO} B@ Ȥ(Ph8@68/~(UCX A+ @qΦF9fȇ.,$rQBӓ+r]"G"];RzFK<9(.J7}# aDޭuGyկ_k0M\=0eSF` 76!0І>(͜>1(46)`萂,Eeu ^{ryV$z9)\\p)vX*x6ٌ|KWx{$ya{ 3yus?zЅ>tȔw)7OW|#FJzWǺٝg_yש^U!X( og ?G;?Prd\Ա[)F< N%?yBiKX_>00xBG.6|/5 _TtfJ){)펣DaaIL pi8[G5@{WK]lYS*]:tFP-g8LGiBTjk3Xo{D@nxBçC;h<pKzB[8!-[=}2sB3ځipj*ࡇ`ȄM3ħA+d s12L@@xjh?qnK 89:;<=>?@A$8t8N1;G$lQ6(DJAO` ZYE\ HES@fE 1uTHԟ0JEhUdO IQ8ֈ8R}=tqLPG U LjPV5 Z \.p#!N J`ˣ="L\Sy-jRv4!30.(L5P!$+!'tPr DUX@ ϴ JMwX$4ͺ1YbQ=SR]u YE|Ieآ R[| VimTLO/m#pW7]vڃ0@[HÄJ=ÁXP3QM! "j]]TNX]KmU`X0SMDpY8YJZUY4IMuz`O& R'p)3W-( 0WqmK.5I05:V}^^6H^ug=WFڞaXIRE_UOXFTv5pIYȔ &QӼQ NT NP(XE"E(_lD6ْR_| VI F: taZ]t0YӶ9ʄ8PR|WP$Yi v&BP5MJIʝ fUAIepbMbʟ48"]NRL5Qag]L'x!hLOg6/E 1N5EU!*!sAA_ cW[.鑎xt%GHTDeFI8euOHQi~GPIŌ@8./Md)&Nc@ډN h h& ( (1] #`'XtO)a DŽdN\>^l5q5TC6\թ*):Ph6;  ,l8FPn_5lR> `RXʺDj9 ;DTPPEVFfF~6FV|nPy0r @u>T0nB"؈B #ofY*>."!7H} Y#Gz v x:xpl͊# o@Ph+0g&H8h 6}p%q 2򾤅@2p#..pqf+ !GWpo[$$(rÝ1`؀^*,K>GP}@oseHXVnkvf[_rz~8Ӈ=h]^<%c@xdgWxx CxW4 +~@Po7}j>~ P@%1lؐ5> Rh"ƌ7r#Ȑ"G,i$ʍ,+W {07ڶa`A)c ^E}_Vt+>}de&Ɓ@g @\AEv-"1UWX)p!pe>3ȽԐ pE MUɳOUPBV%Y$:CpVba9$׀"T5(E*|sGep-рC)b^VfPPθ)z)@M>O">t,;RE#+3/I ?6afW wiyV|hC٩} `^s] B fd5 ЁQ6YhFt@/[:0 ;GCܣ8]D@"DeN W(Z/O:9 ܊*4DV 4|eI޳l''}طvW W 0ԠԤFV`DhH ٚE@^3BDB7}=<8+==kk M+K>9WBgIE 5i!1Ԡ7s:{s;QӅȲSToj9<.TT~<+<;-0%)5K + w]DkcB0#a!ް"%XD&Bn'y 8VUbØ)R!QAx1kTG#d8GQ~ݚڙS;r ؆&K a},#0A6nDI D7! X#`#$C#'aY<E\cOZ UhPTL5#6H`H&, ZqexA Fx#/.D/@C:BxDAPW@5$RQ! n3`U:!YZ  )hL KM.S,3{N1n V@#eʐ %+K8)h%K V_@]LT0( L/#BI}cHKqiIV9jxСQka ki*^łU1X0ƌmcRT" =!V1DjY[]D#%@`9BJ&;P.1^Q#sQlgЯ۽ XnMwm,hMQ8ưߎ @ E8CMKPQNCРp`Y< FXd7р8xEDx*:KF|Lay.å[]:35M,>lQf7v#IHSm?;0e#-F<]~;8n#hl;3~y/S<3s?<"^nWQ"}.cbMǻ!1w'/jt$WEX}*^7>Mr[ E6܌@{Ӥ֥wg߾}톿#Q@"BǙ0Aӈ|K\8{xӐ\dKFd 4ȅd Y`  !ݟ_X4C:mS}EE [,@X*f˵ZTKiȉ] TP` $U58E݀` Z$GbMV :Mٙ$ a#B08aa[`~ !` fW#z# `حi"2y(- @]aMCbab..bba#EbY%Z^2n" [l`48Wl#`(~d8`9/vm]0DcC]<3=[@@``H Af ,: *I~Er!wEd%^$#M;n$P>܌_I>! ]T˸@+bMLDޤqVbaP_R%~H^:^e4aH.$LYCz%F6bM X*%fNe2fddA&Il\ff%hJO g~fij&kk&lƦl& #mfZ"bmonv(8on&'tepVBОH]UC<ƐTTq6D!)'y0vA}QGiIPx2z~iVD|構|V~(R>6|P&W'1Ճ.u#>03l@?Mp?CDQBǡJ9 ?NȇS0 wq 1. Eғ #Ñ&B1T>:d[4-?y8QE"؃(1Jy'XB>,.PAX\[;<>p(ki6A W} VD|Ηdņ'CZ *PY3E;D>z)*ԧMS]%U7QMBŸ*;\ \<]Ls1"b ]Y^B3\mdQyMVZg^gZ,l F EmpX2eAhg ,^AV)C^kjY;lXYQ8YWUҵ`^0>8NlBꄱS{\T-=' -iYgeX^^ҞyY,B,z ,F`qfZE =SLԁ Y  7n*']Z^$-XVUdZւ%QiYK 1<@dE{ܫyUǎ k7CL:yP+o*EI C=ùUvY8=B&¥ɩ&DC"Zeo#J2dBp C-ekB5 Cp) Aq\TԜ4]V-LL>8?Êij.Δk!Qpd+ɽ\F @*\ۧaLS#xଢ଼#\=؁142(5$F 2"ǝ&D>f&$ ݎ$o2'w'2(( @ hHm2+[j+ϲOe,6 v2-Oi$_r4d=L/wr0[r .3.'k lUT)8\@Q,)i!3d@(hm(F)$  ӭ}> Xˀ(Q퐎8X~x.\aNU-険=(è7YHA 򅃙)\!C9'dG<T¦vꧾ*N@ tIMGtBtyjx<+Y@- Ykf@t[URU% X,Gau `+++kC\*W,TT3 j>\cAmYꪮnxKvl͏3$|14+5jHxt=qd xCXnEH.*W8~fg;YȰA(97$5Lg.EVCm  '8p}fHW9 ?v~^8pRwsӒ&UŒjyEB=ppAP]6O4HCqq6w:::::^ L{pw2onw\h?9k+xqF`2S+엕?;H wSO{'^s#b5/< @'d7d4iD5r,/E,גS.4i_ l tSԄ?X#8lÿgXS{*(ѓz(0R>ô?؝C1:A e9:|hiΙC5|Ծ3@}u5E>1 xѤ]P4vhTäZ?x,wgζDŽ| 5تE89"pOci&쩝~5GZĮĩ;qqޣPD6txZ@ ucQxz+@PuN? ЪY@8bE1fԸcGA9dI'K/WXd̀`@f^ y3 ӠZHYsh/ PkSVp0,˫!hz@T 34H`R<0hvE4zS|ٷV,`^pgowqv"x/PwA "<aa`M@tSԃ}x].Z{CeHМp pz\lerx U];G׬zZB0.ĝ>X& {O= aVZj9w$Xb%ES Pr0"]֔TPxKA5L6bPVT/h!Ψ*`I(*PHP{8l[vXRqWYDV2] dˮ̈d;evm0F*K_Nd2ɵyqs\MryJ A#ib@ vMG   h&+k; kAŮf0i*V±E ڣlz|),nj0KI0jm*AR AdRfЏqAn*vVjZ*V )-KEo˻gx˷ebTLK -"b{J%!K!Qv *A ^%X!"h% NKT6H.wjK".{jGtC}R [gzGJ<Ex&,0y*`y^"~Ƈ~P1/I H#uR'uT5\[[7PO~T\Օ~yfo]u^^^5_u_yZw㉀$OHBBؠ 6Ȕ5>f#Rhd#Fc3$$B!lt#@@A@_Lx@^r>ajE"xesPa @{Oae%V8{@tq)*x} |1@ b7 *`cv8`'|8v%l7e@~; F@4/%t u7w[cec@!$!ej 6BziJdA. ِzg`f!"V`|L[XWؖ{%L O`!8v;(٘`&8vJ|tV~"iQ`&> $o`z4^*z؃w 7yWyAؔ x:7! 2Ji?<cE@R$w8/{ٗMu_bJfY!7en`!e `= @4|]bƈx1؋ *@*}9vs9֨&qY0d "w7- { wyz6zr+A$;zyz;`<C0$7zB{a)6Iqä)&lA2a ~ ~&8+C`[vrN$lݤ@~wO),7*[@ȀE)ң8-; @`{{ %q a;Zr9)K9-We1Z]wS`a+inu@Jl{X{{z*)e%[][I{"Wz@~scP൞KO̭iKU ЌZ[HW7r+R;v@y_H"j;c{\Er z6oj|_-W_tG|lN1Zන¨ ų&b0[ vīs\@ B|Nʦ%V3hKid彯˽\z |r9s]c`)aιK @, k +F`ݻxxJ`i_k sm&t}yv $# _ڸ/=X|* `(|> w ˆ(/f(8UE\YLt}> `"U ͟} jC !y;䜓/Aو M}=`=ZrS ؋{s\8ݘyv}xhwA ~f_gK&=y}ZLQ򹐸\w>tdjM@ "5SVf p"y<&kgW WQtm 7![|g )ӯ %"X;1z#9vb"߸!j1Os@HN_:x !Q y2ȑ$K<2ʕ,[| 3̙4@3J4 @PT:?h+TL?BӂZ5֭\z=y3,ί4Y:mL@-Y'J : ¹| 8pW6<(P52=R"Ga*ս;{ :MdM1լ[~ ;ٴk۾;ݼ{]Eo4}9}t< %@!2l(/Vj$g΄صϬ o8$} HU+^SV]NJ&ucbt^AH<`W>dKx5E@ńC$(a>S N 6xՃ_8cI/sj) f:=ex}t7||Arh g(?T i]1 L GG 鑟 0rnGtDt4賏2A?/l=l0>+ B$d?SN>Qck;VM&l#immT5D $`O#EXKO PD`mL4_u$tS.a[o\@C2H&xJɂꃣˡ;r!x$H<lqVTc *ѯ3h+N бUi#qs^Ă;` zVqT>hM>x80eX/CO0dKi- O# '\A=uB#"^젋=oN.DOO2HcϷdO6t@48,b09pz> Hloλ{~y#sc80MF~%3` =E\߶ɮ" !!8q#b=]W̅s!@-1#afnC#Wl[# b9A7U(0k܁ kD;*QD]Ψ AJ/f |a,ULB*8a1DHIF Uz fW@5ƄPj lZDF(iɁZd(E9"LH>2Q*>ݕ43@(?]QL i'Cwa)\G}J$D$9uK0~NX! 1JBxD;S!'A7yRTr@"aS)@h>qLLFF!?\ғçTPHUS7B ܨ 7i;ЃdthDdTeQ8#lO!G.92y#@w0B#+$U+qb)#z}ǬhU+Q5 %+a*P8Ҝ(<Y8@]D7!6%!p!f 4D Eىu4[<0;ꖉMh?̗=p&cWPY>g4 W&a: A hZ*2gqmW %xos x Ax3.B#W-qn#qMd|&%dO;XX;@"_TJS.!=g# Q;탑pv^쐪b?4\ú_=~ : 6?EC=;p<6 mמ;Z u#syspXSC [c=s gptdTCo3J9 p;;*x+"A)<1PS'#PDSS9<5>#*ֈ&"L$hg[GA4DtDW^qTD J4z!Q??::dYUzh wbC8DhqXTESBgdDW:;G2C b%e/Dc8CgZ!e< `i)bBOx!ahAJ?(ɡ%kTo@\Hce34UDV¨BaHxBGvKh0HM2vSBNUK'TFfrZ&p׋b`%+RFPa w%iQQ6b(ªk83@|VrM@LA@ !&-: SQ`Eob|+eCwP`KbѤ359rж.x5&N TZ$ga .- S|bXtUF3``NcbVVkUy%bs%[ROZcѲ;_wߪy*Yu7!UW&ASFA趈 P\/ج U !Z##7\(U EAȵ5[K4hCⷤF"ENtĶܫVl)K_ 1/ "/'pp^^k"Wpd%vbо~F`Z+ۻ9˳zTQ!\ty 2 C^kLK&5 06ĩRV@۵;cFwvjubx(W!ȅk Sp0z!?RAJ4I>IsA^B>DB"4Cm[8J4kpC qu^Tܭ$p @j4dlҢCZ77mԙAQCReCp n&)ok1D 5`k|ZWLqyʤ|o 740ˆpF\ŁliC`T 6[ll7mMtV #(t#У`VJ DO Gg#Z'-;=vɋ"3ALWn;`y"2Jp.md@n@`>Djtm!"m>%5iҰf  qX=q A | ֟0a9[MNC6rS l#AV QKi^eɍ|̗pwX3We-x0wBg-{Gxu=ly6˺< cwAA4| xxs6a@ w#Kb|a7#; a %7Qn<3YV 7|+D ٶww@qƿM M8قby&bB(- '`y[A'!_b∨F>H5~gA16.A~)f툎3ҵؑ,XЍ#a%pa>z)a@\؉s^kbǸo503pi[-Q)ᄚq[3>bZސS_@ @i𷡒]1“p;iQZ0C2 gb-*4NbQԛ|&y3uyP|K}1S^uoŻqdr>J"H0mߚ-?&Q"`6C\rd )ĉ[N)X=u6^-'Tb]mL =Lڻ+M( 19 /oP>1DPdʺ"~'v"gt:T(#Po2Ӂ= ᚩ]:CqDC#v2c&Oz!l !Xx #Ehe4̚g*8r%ykFh%FWЮw ҳ FRb\ 4ʝ2327㔢m$AH?w VYJ[4ޘarPl-#˩M,iEf6!TRR;ӠE\sTTZR&#T~5 #8)0ԑFR@iG}9^ X<ӏqD `xZ^=WVȹ WV`=y1zGf5V^z <9r{Qg">AGzR~@B̴ܱV>bp< .r_/0l} OM;:F]d XϜh=C7ޠ.<0*J~ټH@Hbj G&z$jm]ޙLp*[/Saُ5L%Q#t[> Hs3>J(,{З8>PBNMv&KtHxx*1]pL2,ф&^Hd6GZ |}}=~ _#Mv[i~_Q;vlAf@x&x#3ЅxaC .}0%a=\)t# ,ٝP x$}/YH7HN D<$L 5q;j㸡>nL0Cx*(} qD {bk  :@"ԡz7]\ŽC34:I$b&pW3.: @G8V29<=z^5ϒ ޒ7ևC,g:q4pDa$ U#@khEbV 1$>ht6sPrJ>1YۯjcՃM=nMmPdw t ]r ~-/5Z <3'qМx=ؠg_. q7 vu0[3NGdyC ?2y_{ցn -]Rz q N@?LFwa?nhd]k?\ ~ӡ.0]{{C^N!!puthon,f H*' xX3HQǏ9ɐ$ȓ&?0ɗ0cf(M/cǂ +f|N賠f<);5*UQ ׏g3XUBK\N% kظU>}4dB)8BWUJ+P<0B0D.5CE(2lƏ+RнՌYaZ H9Ho.,Qb!7!;(uôXE:\xX2ׂnq!{o͆|ɆHg)^a}S.'aoAٶP#2  :`AjXF^a#zqBFlUQ Rhu'PM`2F$hXN6HweAL@ Ԃ;JT$^! tyre0N> %)=BpHjy W`>!QFrehZM>L˭HlAVJBc2m6>LB(0ښpns@f;9YM!fw 0=3r>ļ D.ղON Pڔj3;um8@EZQ#( ':L?c/09p꽢q(+G3L.C}dM>+ </hVO.,8Gw#+8 YRBE)!>tu28Ͷpo;)'+E@#, .a[0v~=/׹;{Q!ԑޜG=#L%؃F&@$4㖺uÃBˆ{( #@]C1B5Mld3Ҷ&8C8?(EC HJ,>9jJZrя:xI"Jc PAv!oB-Q)2il3ψ4\(>yO (8QEsJ^'yCBA6vU+ɖ3ˑ.tZQ-!D>N9v U!w-#ꎡjuJ5[S_ئxp=80UU4ܢ>S }c{C q.}r\GZ =3Ė%Rѣf!Rܴ)y-,*>]Gg)@ vz,aY&%Rjρkn< i8.D~$EZT!9 tME~Q!^p *5t3<z>9Q(fo] v@@&vcҠKFX# +;r$ z":/vko7T*wT&|A @5OsM86BĝMhCq9w>YtaYb;|DX b;7 ]y{+Q;AC jǐF0'cT G8R0qGdNs#| *}&h zޠQ}0!WPhp*J*Z5( M3?FOi[:ChCU*l7fv6!1  Ǥ[#0a:(w 1QN.}B2m P~% 1-R+0yTo"-%z*3/%E12_0KZc 4Rvf~R 82ȁW#'3b1㗃Q`93 `?sb'6Qb6% ! x(%xua-?p8pC%'0802~x_sNxx8S، q-*Yxbۘ8Xx蘎긎؎ xVXqҍhVя=1mX)b"QXO HYȐɌĈ)h$5'鑾P(I!i-y7ِV(4i;9Zq ȓA H5 єȓTY%(1IɒP)&d2x*ɔak&"%$9cmouq3e![g9uZ3\GҖ\9dZi,zh\$RY%Y zYmx)g2^C٘TZ9ٔ)앗ZW›] 4xiY[։ɗ Ȝ/pɘ9ɜdY!yǝ4)_ٞY%ɝyjyW %I鞭ib!)(ٟIYəxyٹ& kқ9YٜƩ'Jf&J,ʡ i:dAJi90yV6^Jُ :ᙡyDzZYZƥT)>Obyvzԩ})p*\:Ze*:* Z]~?9:c_jz%rʩZb記Z4&(ZڎêoȚLX:y: * jzڭ:Zz蚮J쪮hJ_گz&~ (VV׊8R0_h tp R K,UNa 3 ` [E+* tZHhwYfF"b WrD %}4 VX?6` W0 L.c`1c.3t-Z !4",`H,N&-A u+}Q :"$@A2ΰ0L[kG;)_tnTA>3 p@A0AB?6;(S=`9sC+;s6:C%p fW 8K6jrrFK@T0J_қJեFwP@LtyWm|B+mM'X"n2 TLDF͋Rߛ+C7Ojd nREJBpWe%V0b`LW u &hWq\;Q4P28LKv\qÕDl@V^)|Y)L?6N4P q9\R\( QPQgTlhdVdU|jX`Zd 1eU:F dlƒ8K. ʴ4x>D$) {p?JqDfWl5gȷ ) n m|ȱ^ Iu:' @z a@3U@[;fp5,JF|0ʗ{ pyVl` G YWw6uUW bdwoȜhИ2+N& ;CC+'0#Xb5FPȅlkC`ӂ/xSӀXB-. pCJm'՜KR͎ ;Z\^`b=d]H殀f֚!۪g@iJp׼ NuOs_lrM0G]{Zn}#ֈXDEtz: * hR4fآا-xڍy#@G%8S c9?9݄͢Q9Q+RVc8F!kbzFm) b]m*i'gOO!.`SO?{hzՊz]yJb-u>e n歡A (&`IQ[J8sڤw;#yJu lk nO١9.ڳyZ}F88뭔u u_NP.M>ֆXWʪs-)pqXe=z~6k^9L憞芾|@~ 0b]X5N# 0@ PO#( PH3 z j|A`vثN%@41@ &PN I.d UQ8 ARFp `ahnBW5aKݮ `DA~Q %n(U1na M1.=z zw(/F>%?\#1R/` q@oa = Q}zpQ#/UjXOg@gnO g`(Ppƈp  !iO =@QD-^ĘQ#BL41bbYLʢ [&] K E3&J^4D-J1OTS4:Ք)Tm=e*կYfaDS2 4Q >d'x8g^]ҀBM4@޻? $Q+E~I ˑ֊EG9 A j1(Q7G\r5W:䉆hD8IC09C R'ey) ,55x bL, `SBy*0 kXbg )&Ht& qjˉ* :`Xƒ4>džVx'&d [7fd3L1$3Lh̯4+O(f;<"\`ړj*^J? LpN aAoà u'ˣ >Z‚'jd Ui ["Xz0!>cυt֊9,X;Htq$\s%S 0`u-0̲6Eqh“;ȧXP -ɤOSt/+-I٪`L%t DpZTM8,$U05WdXZ`Y8@V lr֤c\癟х:j~n䝨3?|fb!};3+tӪj,=T C=(#'"̓&j#%31!_ Ҕ 2>* NlAG*/Y' xyj^ ="em Hdh&AC$Qh8 Xor⯪ aX̂R-X~*@,T. i.rTD"VQq j.DP2}* "a@@=H!Z"p~F% (`8Cja @8D"60?WDYQK-Š" -n$dhCY eyaBd*`&tV̋(s2 [Fg!V yC) |xtQ`{С„iLe:S(zPV>SE$DJըGELHG%#1WjVz.5"@SsE((Uխo6Dwk^Wկl`;XuSEK9-ldHEc P0! P10x!>A-6# G8dYL.ۅ"lr&|c )$@ A7׸!63D]A BE\K]?@Qw "EnCeoBh+ c u߇v"MD;.$UHk2`\!~ A)DĶH讂;7!Ek[ Grh_p(BN< SMD9+fkc`-"wU~󜑼 ȇ> 6XSQ;7,.I ]ڣail@ᢃ@8hz4w@@dhqT2:S鵯q}N[ZD^#;ì{b8qik;2vk[$6 >4@tcm%&tGzd||GhߦvB*t.h<8J>ꆧvjT Cb^EDe٩󖛄^{ם!~k8a3!} :@``=16>9k_@bG9zH# P<X6ؗm1X$ba/8&N3~mfo$^ƶCqn]!v?BPNƣS9v=x}8,҇=h&s !^|G/z(чK@P9t5h90Խ2d#0C4l>7FI,r#%/>E2u p˾(3obKaR0+,,.K0={?.k<H3}(`2 ȷE)x400 yH:2=<Xh9a5`9#HDTDДkSxkkCBíUr{B BNB!s/-Ń{* @Ю+D|h7dD?0pA}@=14Dq= Xuݳ. D2t\Ǟ>9Dpq%H뱰[C7$ kp;Z?ZB[\G(! )iDrǩxp.`k$(#Y܇q@= q• y># 3M42P01z ;( ?⺱1H37T4 ? 23(BLH\tj9v[|8wX4aII^ӫal8~CL"@Im3M9xGtA 3cM\MJG${8s:6p:EJ@<2 ĵ2x;/9|76#ŬS) t˭4;Syc?W? +$2óȿmD)-PE22RR$UR<+{(CsE"0Q*U0qSp+K-|,= xR=K .9]@Tt!*AEDUEeFuGTHJݪz#R s?/UxN*[<<@9YR*kUKTk9$=s T:\ͳJȇ\҈U%]ՋZe+dZEi# i2K)EbjVWUfqVYVxՃ8u΍Wsѹc8Gh0v[] ۆ:d15Tۇe8ȆOnȇz `wӀC (zC~XC !UXR3.N};+ Ū{WZ IȇdȁUȼe]bЁԘ|ȍpX/][xL:$N9NKNTm݋Qx͋0W &kZF{sfu^a:T8vVze`FCFeV:9{Z] ̻p/6؋Ip7i%:bnCoHf"`%Wi-r```iz5Oac\㽤W~VY) q( ϏHM&ۋ6Ň4ZO ;T@5v{Y@(hH (~4ed5j>b^Zja}.jQˆ+R悆 xWmnWҖ٦ڶN_߆a0W.?ê];.F&lA4֞FA>s1o+/؆MьFΫH^4s6*=c ͵ 2hPE$b eKWѶ wqH[z9d/ .CιKǞ cJzLqG~criQHW81 3FJ]SH,J|G2p;&W.f 1GQK3(2&A<.lYui27th3s/\Ь$ Ked^td=Pw[F=38=G*zq|t [\ 3nQDoKGD>؋WX>GJ\T0opko`Ͻ݃㵩5G+wk$ o+P9Pvc+   ZG8^ q.zKx'7c(U dNUO^q!P0OtU_=Ѕ.~8IyXufh9VȖEziKGm1AnryX̮m؇ p}PYM3p()}x Ӗ1VOt%Gz4`=_ |} \Xdx@WG訏 'Gb_BHsxG"}?[}{C\u7}7Xx@ ՘`{4C\Ȅh:P?^ 1_u[[U1~%, e.*0̋.{" B6r#Ȑ"G,i$ʔ*Wl%̘!\8P!+]AqN[,*rx @D7c 'EA-f!llH$#܅\iHu@ʣY\ݎTRV,]QXx嬯̚7s3* YO aNjo_LZ*.M@΁l  떯_vy{|4pnK80G;^w;7)#uٻ_}6 x 5w`F%070nTٴTNDH>U ((Pm?S\oaz%@[L79qu4z&"COԘ>a  ͖]*&m&DD Q-s^5aQ!o .DM3l Тa7Ɵm]UѥϟD @ :Uizqj[*@ 3puP5Hb '*,!G+ Q*ꇇ 7|M1[Q* L)vmMmG'IX?l{(%J5CqT*/["!uNZ|1 GeQ L&BVjM"P =d42H"D)$3>=K|3"20,Q!Qk2F#5nra2 ˏ#CK&1'1~iBt̚U.HOD1?Ќ\ M>89uPO,* ގc 8Qp9Tmԣ9G>n;(O O8rpP ocO>->?8Dq?( x2| #( R 3 rp(A &# zb`lcK<}#  6&zt$Z$II?nY"i`ʱL54e˄(P7e@D"L>&{`!ԌDgz !Q]CEF,An04! qr"Jb0#*Q_l@-!U! i^R`7!3e9o5Ctf'WPO(1D#yPK"9цkC!*LZ :Q s~ )F!FG\"*]% #|tS\b81S8/.V}lJ>b ЈJ)}62QtDipɜ$CUMCa4egM[*ޒMch$VD5D<,`e?)+_Jg'E.G!@QR)ֻ^f^*Xu.oہ_MCkhf2/6͞0?-Qη>5 GTծ~5c-YӺֶp[b s=ALq qñN0i#^6+*ЄzX8r2}n"q$p*NizI;܄am۝|}qÄȅ9 r$?ŇJ9" Ẇ4`' Pܼ\h=бڑ$QU \zG96XWKwQ(cDZB@d(}>eYgHFi 5dhe$O1ґPGʢ>0ZoLb%,q |>%82m}T,.&7ֽ2kȾ{ l MDcxh@rꁷ!|*$` |;u4jƷ$@~槧@cHO"π;$=_=]iAPc`@Q(@لZl)xşuq-AX@H3Tme𖦝UbP5,Ke@LFD罐G@6HҵE H!cB98ING}@@p\Ao8 | @OA^Շ wĀtѠށ~Au<[@  L:,SG\b=hbzpa$~CQb%nmy_ ӱJBdI hFQ!- ExBB "4 _gňnduLC=tAT<GC:ng db酞\‘TI /~c.:PMWamYꖂQFXBHI@E|pId "=l}EE@ OCOCP~Dcxd)Gܥ(%Sf˿G$ z $̭@*1C PEAX m bP %ˊ\W$ȐT$M !DeKuC8p_GGܓp! xl} LUN:0TJlĆK G Y%]N L0hediS>LDnm‘1<(cTAlm/i#I> O,>< mha.%)Z̕)ڙ))Ʃ))})Pg<aL̜\yFSIAD 0ε!*:Pyuʝ3bJX$HĝfPEM x؋jǁD ,BGjKX*DAIXHfcu&i*ܧĴ&^X6ZI8HTO?̒J79i>C8]]=?.R8,L =iP2c_X!%_ N.Q)y#`FLʅ+Qՙq+_@+Zo6_o.SL9me8mAECTTC}$(_oJ-1y9A}pmJ@K"# tWvѦ }% z5!K⡐>t6|JR븙A*N$\aqGvGQGV/--:qF%\ VCcNX##F+8L%bNpak(gݧCI+gP扑P>T '"IB}%RѤg\a4݀glFblFv҇nrLwӾ-6 x3s~B |gy/7pX|(g4q6)C.se'7!κSo'1wԶ45)TS=X$Z#AW?ǿ?׿[(g(@7`A&T"4@lT89dI'QT%Bbh(fDhъ 8e'U(5iy@ [,Q @V5VH#i9>@'O($R'KP`S42<:&9*'` ' π"  8 Չ>! 2XBq X  "uǜ6"k)Vȱl6Zz@zѧ: 2uA5Qgm um7 +XbA2# @*:$#ceӒ`II.Qΰ.ṂQS<%O:Q9RM9y & uB6mQ'(ūtlYRRfIHW^A'LM6Hf-@E&nz&9 |D|x57owOlQ4 W`3WVi !B^9pFHA qX߳\EFJ9CiAC`X@yJhMf&g'lU^*5B p.0CL:SN]@ _sXL\Wԇ$?fA@+! V@@V8jM3ȱQtf9*QP– shf%r |^PTCB'Rtdutw h*25Xi&@*&R`mp~ME" KA\5%0*s !Ͱ.G xk`#{X(A R5e R+q@ D x,!Tp"P R xi CF$+أ d ,e=СόV9sAIIQz\ hd/{QK"*usشA(L A)`QEp2 9Ӥ$') M@%Fp'Fp@WT;·NثIZ{:\- 9&[x[ b-jC0iJAڅ@@k\j`\"rhZ 'Qz- <rP;% 33̈́ɰ $xPPO%ǜZ"j@MN@5#}Tߣ"0G ?G,`+wvj |$pH}cB8^ ,j5E# s,97@Ap'@Q2&Ml0}%,t11@1*rFPaN: R4;d|Qw PKyVG=`Y+*LOT @8E}G@CX54@=4b&IcȄ/@b[8IS6ŝ^L'$_eh%R!{ rG7OLM P Р{ŝbedġ 9bY" w,u-i?h*ՄKŕ܃>ȧW=$bѪG0BmC¦MJoK3§!O+ Σn)5IxQ!Qr|Bp wr=ISP`F SP+ѹϡu#Աuo]v.%Hb!"Vvk!F7˞,5$]L E/d8E2פ$w-|wňg2_W$Ċ~<" `w 6hIjZrR8'A(I2$eSKѸhB|(mE rЛw,oCXQ_Ow2?Qt!B6e/,KQ NfEn`j/2Я Oj">^o9FRP$\^МFj ! ObOM0PÏJ)i%C@-aXĥX`ѶAa0aA*@ʅ%@m`~VFYeZ5]e ѐ[X$GL` Ԓ1\Ey*I0 \Ba AC^QNah(Pi e ^` p 0H  nY1H U X!^ @oa4nF!A A8t!! ``t`p&T&oqbp1`,-&n&@jpHq 9lpB<&&ol$J&u(B+bR$Bt`ȁdHR5#*2Ϧ$"R"r 2rЌe.Ralknbe,M CpH! .^ (!-geBG6< hyTE5j r#7$idYB o 4dB! MD;BS&T5%A>is:jO0.ӕlY&L&0emy.IK).,5)<3?(x, y9 tN PWt;Cd^&B_v!GW75w! .<4 6Hw=I8!TOsEsc!0Bށ5at(ƆHbs5_WZA"RiӕQF8&tKoX|p"m7* ;x#XvWNd 퇛zXoabMdo|Xa^poJai"c3r /!-@0!r /o\YqtmIBVGW>Jե\ .-b[86}6F߆T)o( P[onܰ!``ྶAy-8]X^%hn[X.sC!v]n AnaY&vy\Y!(VA5oa,o9HUC'X30Ԭy%~]Bۢc9_ɣ-%IQ#NL},L`hĥhBo9j =,unpz:zcn 6? d?UWSl?b/a29!M-#5r(}Ro.=Qޮ %^2BH)mfnr!(Fo/=V(O&fၑ  2\ ҽ![2>#VA9t@d 8SƎ}p0 0{KORT(]2!\)f';oX筘p:b<h Sa]"!#5 r@dN#H;^[4HT5-CITaC畩A/vN>~Rs+ATs=Nt"8Kjh@)5]wNkv Srr_! d`! @")v+:H&7b=! 4( Ŭ¿I`iߔI]2 `fLt3RMDpcB3`? 5Z1 BޕwH@U9  "d-d!cJ} 7ܹt+ 'BOWBTx@PwM]W@V,z('Ht ml<0꜆Ө6rV '.+ ὐ9p(2f 40gD"@>s޽XIs\BZo}T-SmVQ'IXg 'yrXŰH4?PQD%`  ܗeu9TX:e@)Idt%P vUBSA!a`x#Om070Mf!T` VД_l&j8JfO)t$`*x`Q(nMA=w=glK>Y&/ǁ=O>p`PVa@k柚k>ŅIjtgGSń'VI)K&,ȹ㖑+b&7ʔcX̞$ӳ@>ed<$_{KgݡH=CPY| 1`E>Bn `$rO 1^e&o!BHBj^2  G]UK{$@S|4(| *KPW>22QqCl{wFT BDB1Sx#A@. FxƨE0a&oԄ.A0E&8цf*b@Fc{* ] A"#5E@@6.X7K% &2epbPH},# 8@"ԡz!&S̢b4?oHOBQjU=@h=1,9.F>i^F5BUu%~9Qt,THbsTJWQ^Cq4}# d=D5ÐavlE&pR!KmGv ` -V5 tT(Lpy4s蒻 S1E-Z>թM%qE[ԪvCz޲o 1koO.Ge/(/-NqO(SDL9[JwԝkyXxa` BXƅ5McDGr~JY &A"x[F{-U{[ >n|'\³0Bst-yp)|/'ƭH! x4o8.k1 yD.$+yLn (KyT\NW@UL2\A\M8$RA!dd|T3I{x Bu($\(4\&r. PS>@uۗA+oAcHߺڼG `{Q <V ^~(.8V=e`h7! 8͐>#RdPBm%B|]Q`۸Ȥ B2,TG=~!/FxU;uA^&a{7r:"xZjsQO9MnS{QH^ڥ@G9+ {\$#"@kv}#LV0=Ci$ `f$Crd#jmʊ~o (Q\S #,$j]9VB&S+ [5k^ 3z0$_Έ !LT/ ,VdivF` FE#IH6#`TWvLd";Sl/d(Qӥ_]ǸD^S;9pA"c0g-wX?}@D048q5ݗ~~AsxB019ǑAX3 / a}g5`CxNE4D>;C8Ӄ4QFtF>6x00?Ն|y4b1_SX`LGb OԀ kXT qT[ dBoLU_AY^&Kb+xq4Iez2aZ AZaT1qQrEf -$hraP^xqYP% ňaZ(?4xbKE]+6UurIkE^L߸h}\b{Z` 6]MB 8$ȏg(H)e)Hd(]yd I8 B|ZyaɄfie h$Y&ي4x"ɑGsy3(\"㒁6Z9fĦAiBS՘b1)3ρHSjDYҨVIa\C^)h`9K C[)d>P)U7Yoi+y/GYdw㘕:I`֒E)0I?lSl>f|DC%H5yLyOyXٚX9Z隊A'!iE[雿əD xygy G2a :YjINɁ9߹SٳЛɝYyYOɞ"铌 d9a=jSәRٗM)閶YyIy y )C zIYYYi)ʄyڙ٠6yH ;F:WL.K y ҡT yI]zYAJx/#j^R z{OJb*|ٚy:y:8*Yu٣ZBj}ʨ5*9QڨZ٩PZ"u* fi98Yl:ɨ*:z9Z:v+ڟ>ʧjʜyGڬ9ʬʐj9YZT:4@DʞɭԪP;%**~ *f]lJ [eU~> x)䉱v[e*#˒Ky]g,<˯>|@˗)ڮQiG0 !!puthon,f8*\ȰÇ#JHŋ3jdGCnIɓ(SeH0Elx`NpnleA^5BYpڐ4|*T&eVa(юF6TPlذX=9BW W]NnN2xmچ-~۔`+ 7< tƝS9E񮴩2+ʼn0nZݶizٌ ysdL<\WN b i[FDu"ub[z6}#LY$dwE#qg99 Ђ SW^|C65GUX9t^Vu5|g0xSYU8CC s9m@816"Ո%CmG|6݆&@ 99>r @@%"P!@bI4+X &R䳌&|!ԑ~F!K>p,@R nNO2Hs}#)8,0iSl>(h`*Js%`r&Jތ5vmlR&K9 39sXJ5͔ա"C؂N >r"!a(\s" [$Xsgw~e[33xV +[[eUL|(o qy\ SPJst3З#uls6gq-}bdexpM9 d=|lbKu(I=sBaD$ ;W<|G > _iP9]n^sA`%>vqoq;^Ñ+r^6Ep&q4< |*LQhc%c9AXU8Hn蠈z d PYEG:5Ft0sN1 M,$A+DgJui'|Ȃ6 ]Efrσ=MjjȢ ZF(0@ăRAT܃@@)aAdfr 吧9FBg4` NDؐwrBx\l;l!'-2g  iA3(b0AZ~nST<C B7UУ0Af+Ėw A7Qq6`tQhOd|Ta77I2 4h+ڠ:̤AXMpT iI;H @S 9<"6XPB!CKD%-aMJYcɆi >=Uk_P+`07mԣ!,y"{Hu(_?aexa<:bpGOsh*v:%_PqZR@ӆfsQ `DE5bgphM+!ũsEN;.(Q(Z%zPIGz עgцIvmF[ENk0\L oOeXmnJ"”b~h䈟6yG }y(j֨x_5lߴ{uS oG;n4|7ߜ'ko/m>8qӽ_߾/|l1Yy饠͹dA8pq NSwx "N~)XaW)v袌 u-smg9Ojb}}fz%VΖӠFurzb]ybW&|k iiz iњZZ;{*%.x'鰹pw9k6DaY֮y.~Un &JK6&^k/i l98js}cAJ t@-~xM欷 .J,EW~y,|A^z/^d2>XwЍ1CD嘯P 3݋W/GX,O>H.h>!D"xaH:X!Š~m@0FDx@HġPp:W:L@!$>vCz?g C|;A X$ ǻ?884(L"Є4aθ\Q4"D4\]B:"= F 1覀Exa 9tbB,Anρ0p1~ *`Ĩlqp;Ѐ@d 1InB^  !)!`0m4!!aָC L‡9@+a}`7">|3g3TU#BJglͨ@;ѡs|?ȉq? |v#*;qxXols ܯ@.ȇ0.Ic / Yڄ@ ZǚJKr  *Ѓ;\8 *.K 2JtS@'~WoX0 */f-czA'ДKBL`Y)>7te, w]ZnC,`>?.|e\N1뙯\z+H[/? 3׾??S?GS`ؗ7#Cxuz@7/ /s 7Ke41Ev Sgz r:"!fvxh`uEҐtˀlwx&xD,WHnLnC؄PR8TXVxX5 6oo@o^xs~2f%Pe[ 3p)p @ qpKw( 0VO'P <a~c}X$p fXws_rX5.@4P# 0a @2 gv U18 X`F)P  XzPzU| c&wAr2o@ 8H P @'h؉ 1pAp M0sPznmV'@,S{(%0X. 0'h!/` x9a6I R|(IigHgPg( _ɋ$0 R 0qip{xqp =iɘ uxp <@<PNLN0sP P)N9L@`CCzpTCRuA vR O:֌WF`yoI a`h) c3wv{h|)Ii B  `i p 0$P PAyN YN`DiiL09sСMIqpa EcJJvSߓ7tgwxwWSy 2 /x 8p2eؗtI#@ @)TryzxaABɌpY= /K+N:PS'E`KoN`(ّmX3ă\ Aعc'PQEQA@j*`m*؋Iti H He h98*EiZkSSLE`iaGzNXt'` A(15[7˚IXe Y u٦lʖh釁W9/z ~:ڝЬi i0[7 AI3Б.6ea}q0}CK'DAB KP) @eJ( ح(I@K 4[k!ࠎغ#!yC)AKP? ;1`FiuKKZ7б 0˫PUEO P˸,4jPn{HdP^ʊ`ؗ [3@h|H5 z PX+XPܨ!#k4:?𪪉T '`4:5aY+:{W>`8e99Pq 7+ _) 婓˿BK Y>g@9ܭDZq` 7 頧 *yBɘ=& 8JeHB1|IDP-ἲ9:afڨ%Y7e Gv9  ։Y09#d΄zXPYZP`Lh@@(i4#pr$@V(i Y& 4(P:fq3#JPR=v\{fa۱RQ Wf 1&Q S <D@ ''n>p|mg!`1M# rZ]尫4qٙ}%i=ݾ--ai7ϰK =;!`=qb,Dh C#p>i=8. 3Dj3v 'B+tNSP:D@=,- ("@d e`ӝLnc%H^PdPe qmGh|G0d3'.zMIc`ub+} ;T#m0?Q<xsݍ8|ugAX u?ʹ;>&d*[0Y~ .kC"`[oM.Haz]Fz `^]mvx{n%;3>`0e=WޒPhe8_p] `>P͇Peq1.}? ז#N(g=aWChO``a8 @G]E`t}KKj|_%b>6j#>oN`A>ṾGz'Ezw>H He -(-Qc O >c ْ]E|@fy9Up?$j*h́m$}Qn s d @KoO<!%D <#>"PF#1pFW%I#]SL5męSN; WE@ {4-ߕ#+gaI>> }apO lWGOʋxAM:d΀q< ]@|(c2 #./Y&#4=9G 4t8A;D0P =:uJ*oStխ_3}=O2GoʁC QZ()(z,Ʌﭸ2 LP)32,8$ 12@pc50(5@ ][-E0%מ{񮓌堻 %ȹ임2J)jهU󎎦^}ZdN%Ld* JJ*}G .Q>0 .l(<@*D2} PL B$|0#p\@ (@I[hR#@Df5MМ)%K]69*6Zi zЈig.2O̩fBv49O%3~ PrA|}Äxp !] VK)L@̀ #  !>FM X!g%0b؊шr,Srz|(lM12`IY'i:jQFʙ:.:VŦfmߖw i .jFۥz:p An~..̍|D[(dr48<Wgu_hevo=www>x'~.>yg>s]#H!G^ 4]󷲏Ѥsy߯)pDѹ{_JqFx4Y?6CPf=, I2P/-i("Ad&&,:Ѕ`+FpB^Obt }B"ގi ܠ#szhG>AH88 A9}K$ȆC6! b5bCxɆFC Y7Zd@~]8IH2CڇIѓ;b 0|$C۪piL#2 {#|)A.9 &8 lp^-B#*sS!D.!Bp&3$SP>g;v;08i Ǚ&lSG $̓ʵGt>F #,{r#57W.,ACe5w/6sGGzҕt7Oz>u/AK^u{pP Ksh ԣKlu YPI>& iٶ}8MhP!v?@"z!.zA>؉0%aTk 3*(C*Cܺ9  9&9 ԃ!Lk*в'Ȁ2ľ (> 4@tJ=(tڙA/|ѰtcRjë6|Dd۾㾏H 癔N>P2c[BC$ST|),Gl> M|Ș TQ= hsBU4F{cTƶӧetF,gijklmnF)y("*҈pܞo*;145Qh8Q 8S#MہpSV h{53\%эh-1s9D{% HmMOm Q8sV4]SW`IbQ ӔSju ~< 1Ob; J@% e2ב(U 4җ VtU.0`G+V~̯LLStӁ:ՇFFGZY 8TS0 Xӈ@X#5`05T#Rdxh9ќ S8HE٥ЕuwTXy8M|<ʫ!Z2ژ@k"Ͷ~ӈyw~8ln7l+m(Jh0B}q;h[tEi5^"GhML(P=\}05>}NmFfCo9o尪oN* ~t$ms (ʑ :T=Ҡ(l/([shRW`ߑڄǶޛ~HK}q_ `¼~MDs qn #qi ~ "=x瞘Vqid ZXۻoH.rX1{(m _ Q* br90 1",epka(ހ-K&j}ȓzTV#掷`< $Z|Ϟ^@{T/죞Fb0I)@#A@MMG&~@2:'YDN<2yYM58!4SLr0FdMz\8 :,}Hdmңce'w4wB>W|G&$ɬ́o.M|`.Ev 'dwLe7v)t B "N/ e"۞pz(εe?E2V)!TRNɆr (lh?iHV.9si)px`Ti-Y4L0hѸ[SҀyt({I ђy=rRwr*U`8lڈzb鑡ȏs@5V !]zzurlg-}'Mhg@0+11h:(XraT"011Ժqh=x8D<]4H1'I r2l9P 4rN3<Ac.DhF"d!]dC+ѣfVk٠Epv=dK^s4?wR4ȓQ> TFz):*{>@H.HOD!R"SG~XEJ0J(@\%2#*4$8QLl>r`O=ˢ6c`>SŻZ?-ȃjљ <+\vF*4kd+` ZO :2%|¡2-21 3|3933A =4E}4I+4M;4QK=5U[}5`lY=6ٟ"J3&ۧpF*F«{ מ1e+.t1F6W xԃ[f]Qo>~ ?Csvxj/~;AO ZoH{]{OD{g&gP,a><}WbY.A: -:pE Ű Վ-!@I` Q5 qOb` X  bADp!V=@#N<+<58X=ɍ:)hz)Hd"? "G. 7\&<.#l$f` }j mX@(C-DPIE2A ТĒ&s88A)EcC²2"h|(NP$"r0#v"A@iH T7CDB\p&aOy8h% ,MngPd=̆80 BJ(IӾPli†1܆FnEv'NIFb'ZZA D!VC+MElEЮiJQ Ru#Hb֪T"iGӷ҂|k\j856Vsk {~[vžc0/E(Wu>6fF sG([0 e},# %>F$$H_%E؇0& Pǫ ` :íTk#'LAD=o ]WGYyGFRq>L$ YĒ@fD3CKT D^J$ IO2<3z!CB>#$ -…B<%䃥-B<U!=IK\p?C9ZJiFAmE: O<Փz2ܘ@O|X;%RFA ɇ !`n e]MQ \k8S@\ !dU2|EUTUauU\YH5Ek qeH<dk eaZ<˸8֬ G!H;A> Heɸ|*"+RDSbIp?@yUEfDeD\bE?U=yQE2Ԛ3RG B@cd@>#E=b:cqs4԰@X4?D<PGOd5chM˵u l؈r F!\|dM|&t>LQeU6WEfzfBs|yZU&y'Ԉ8D|~'' Ip', glA\hՠ' 8g--'lg@)B(dL "h(aTA 2 (P,Bڏ Lʂ(hghY,[Apf @#*@(ƎB(d@hA),,h-lPx)hf-f(ᩥZ橄@4Lhg(@&P!p@>DR*g\J(n ,0jj`@)iE An4ȏ*r+7񄣚(Ƃ B'$륞R)G\j^'`(,!\j)( |U)ɞB `)ʡ%lBDb@X@l d!#  C5 Jѩmj޻JH+¾b)AJnik, H <, .Z엺,hn+ ʚ컙ʦ,, l¶@:48 @..xkي#>\3a@hB=-Q-wm vVniE+*n h,Bx4 *@@ @@ El)nhȖiPLAlφ?xA@01@H@ B@+Q(AjFB=Baʌ;U@<E ۯgp+D0A|Cl~"+AJ+ @ h.-( B( & )|r(&O(@ A D.( hm 7\zxx A0˶j#URA UƐ.P9UBR@rkF,@2£r ,k%c*(.³ EA/ @,Qkn+/ !2d붚2*@'C+ Ĩ+-TN1ZA\ PHBH4%5s+bXQL $Gq]fIhd Ee%p~_s@>*r%KD'W\72.@ ( -(n] NdZ)u be@0 FP P@.4w'A4fHvY@SE U؂#Sy#HY1C䁐iR|r^* Pht5z@ pF8P( @ǂ(Ѐ @ .^R* )x) ̖o&@  A2rvg/?Hc 1h6@hg).g rBRn+X0=|PB<ŎIXC7i|ndEpA&gA3(V,Z84FkEϗR)w@'k̞#,(B0U9ٮIo]%l% &mC (F4R "ofdc=Ö8wDR&syOa)rxwfi##[,hĺ" th')s+ 9Ț,*[!BHs h:A BO31׮2Z6_0r@CdiMC8  f~{ 9 W4(c*LX_~,'i $2(*wĝw#ʆB hSH( L f`B}*F*(tx aV+ΜU+#Wh<<#W<܃k C~ {ewH`Su4Tc`O3 ?vtrύfgFDL@pg?j1 @A!F|x] B\D3zH9 EG $ʤJ7qԹgO?d;0ȫ"@"uՉa iSS}L[z &6 D|ԑ2<v5E24M|3f*k"0-i6}?޺v 85 D" qc s˕} lfb op'F̝Q5a xg9ߊo{\ ΀OVpy"_=m0 +/ 2A`[ 1th(0\ib$d4&<'M6(ĞNtGN|HEbb]A!tr$}po1@21j9+h2c2cɂpXar :|2ML Ĝ7⌇N;F'$%ؒDi1)K{ R#<TQ=r#ztQ\s*7E"}$0`eh]$t@P+,Z-q-W _P ڊ;^EBtn$w (V _!V!X RHq)؏jMh!\m>+#Nb[ٸb׊왽`BA(jc)~Qh7+V0iY57G}gXfZXyU!%,g ^јat%:8`0F(6f$zxȽVyfX駎͍\ Vb. @a."ixTΕ|Opgak gү%Aj|V9=K#Ro-& x \a hTX=iM{&?;ߡvv?Pj`cuQk2,.+D0щP" iBYR()D5?t.#;Cf:ѡP+D<@]Da>|`D=Pe66Y %^}Xbn:#GD@uc:D pT 0y>$6 D='uB! B# pC!?G MiFGjҔf])"6}K9Ғ5Hb| O DMц5zH!BCD2"`zFAm/޴ZJc 9We*v|stfIj\-$tplcwmTBvcCX܌ vE QYU?tcz+͙ @Cl\Y O%)DG02 ]F$$fk+i#n흟 Np#!|LK:J&{ȋt)H?YR^]t!&"=Byf /~д;l6!"a w(5 um^Hz?J$) @<_٧$) ̯' d- `@ad"AB' "ja,!,m&DB bJ#@tNHlBzX,AO%6}[ml#'heB=!*-ޢ"?H@A9a9$g1B2 ẸB`7Bc4ja/`.M#0/V(oNv7jbL!Wb3 +-jf a.R":Bw!~AL. &>-AP9"<Ț3xC4b, >fc00l $v^Bob`B?G>DA63 0&NQ|aSzIXHI[>%TXĒ&M:vDN" OD*F~ #U JE0$!` |XXR!YG4JaB.I$JRE`DF*&`2"]C2LTz,ZakЎ6R5jA&'$HWGULND%)=\(%-S+h簌B!HZ RB\2PaTc K p` .Z@a@ 'Bq6cd Ԕ!d`fmlEc~2bm&2S)M1:6b _b5a 'x7"p^I #j&&h$jaE:ǯ6ChJ*AmfqT#̮9g&! B1Xl "6 fszp>kDg$&*R%4(Xvflv6HwiZs6p$k< eh9qJW&' "x. rcA망nOEZa6Cx3ޫ[ۦµXl^{FAAXF{USvH f+Zg *"zF3| `hifKokZ*U*6F  ,Jlbm-T L_C➀ NLiT)/t)E@ .AP biSD`*ĨST24t8;AS 'ƚi vA(eWί\ig! R4he籪Ꚕ:J:!N\ufGA@?Oj}&^/;`nf`>鶂j|gXTw]6êB&z~}5 zր؄w;׮FWo$2vevk*K'x ~ɖ!BAp@WEȬUʓk,׫p7ddXVA-4뿈@`*X 5u|kGvx}kZ KE2*KS&zǂ!XƶFF&$ؿhdk)o#tOwAŋbňf*:8h! Q9} v ##3aڈΌy6d+a: 1`01ޕ}͖kf޶lD^mLS!K,Hp@V0~kaV"x!`͞jDw6(ax c9\+ N4݂ry. -D^Z'‡!t*Tur FAΦ~Vi,VuZE' E{z݈zw0j>bNR=NPb椚LaA7F%]az)]<,{9=A;E{IM'En@DQ;e;#Eon&Sݡ7b.kax¶%;"f"iZ8lt*t@aY2S('tEN4;۽& d9u&]R$ 'qah&:Ch6"6T WZf" |$C2Т?$|쑡`C,ū.T\ajPu$+R?w][qA0{,II{:aEI`U3rPP\%2Y!DB aFaa0QP$t(I_#,%Y[r }n! P.U܀v-=lIvJtgRǫx9D &BEiU۞u=[b w̠I jg-ֻI=!vTnەfTaZ uf/}"x|}-o>cУXU11;D]XaaH[ۻA" rbV_7{!Bg՝5S`<>8EGjNIa>mOia TcHwDY>i`\jv;jv *A7i$QpCY΋)Lx^!iW~S]OAqhg\y:_!>[T~a $L,UIJXTm“o3Y+,_9~<~%R"zF3aPyF5R+U!AƝ!b WXk_ks8!UgT'W[IFs1ῳZy\(< <0… 04|qƍ9Vƌ 2eB*[|!L2UxL̐#%H9 dy4|١Pp$RV ݹhĊPK`NHvԓQϢu1JE嵬Za.$ȩrՅ[_IW LTCZ+涌y;pe][ -\+n o^̤IN]vprwE_M4kx7?naclcFGz\qԵbf%h]KW_FaeX%|!2#賏9oV>SO,ֈ=x8[O ͉,$??0l/#/lO=N#L&d>2t#'P96fؑ$C$`?#ą \ $F"I5D d`IP fSmLjUDz(]S] I摌P XlZӛf ;k֞q9 rQ :4BVfM>r SȾ=h‰/H>h.rO##p`0 ;N.~ $$4ym#8,b09p$36\Xc̭r4Qr>(?wѫq>x4pZs|W=" s4nfI;,}y{ցEV| n[ T9w8鄂5aH?u40MҳB3DvW SD \15w0[+"5Tp7ň  1{ D1a+=TwU>< pCY$@uH@+ jաn˚<kH,$ZŚVag-ZN(}g QPا?A:܂;`BC*pHuFW850D9C3,bu!ld!7rDTwA!a5+o9 %j~ Zj`"H@r.-Q%bJP1 ҙ3QLxA<8B VCwhwewybAEUj@B@q!qifbC= 6X5K>j\; < 9[&|}) JA EJp̢iJMʤD<‘ *PN zoJ*H$ExR(3t("E퐄(D4q*SWc2SDvG5 U$HQqX~ZYnBF~B3 uYd<$`7pL1 qcHY-RЗ&6 Mj)V؇Xv! bjl9CBKKLy[2 Bl3InG!JNXb}ₕA!1ᛮ|=dreř[hr~W\o@"+q(IV ^ld^Q |`QN_dFj zpVBꆀR8PюUAB,2`Y`v6EA[!R2DCAOPzD"эzcWE4k#08uO UWEsl7ny'6VBjwzx5@.9[a~>d&i䁸_<=7|$GF^|,o˱b d؅o|<3{/Dя7!}A':/^Gxթqk=N÷>|&(?u]׮Z eozJ"HW}n{ 4v'Cn漏ߐ߾v7w7~y GnkYӧk֛gVu/Ht/rqrV~ɻٺcr=͟v% 5IkM?WD_VyGvAgnq}7unf^nW~P8xggz}P'}ݗfx8WŅzx! 1v^o7noqGwI1$2OX|~7}Pvf0~O?}51t,h_vzUCvczdžC؅zGX{gyU8w{8oуxbȈU膎hvH!8(w9ȉH'|!!puthon,f H*\ȰÇ#JL!! nvbn@nvbn-desktop: ~/exp/thefuck, H`NZ\ȰCJ*|HqD 2ᑏ1, $#E1NS1̛8*Y&IΟKrN)x$ VdGgT$TѢG,Dvs^]PL%'._ngSd^{cTr\%0\iQw߇I=c a b;w%Cdeb%뚔H0S& 1i_Ob|2R , t #N=|6C7\“HHĊj".(>uVsIfV׌O6[f48#W8 X&a\962P Q1 R*1 i$]>yv\p>퓐Fr%Xfzv~`JPK$TG8|{yiAUS;dRbOa)8P$?B2>zI:DOV oDBC';3IxKfbTeP)&&HOCGV䪀#_䡪i;!eVbtG9# yvT JoIX\Ts +E)eAI|YP;`;s.H%Lx~n5L[te}ь>8Wzb];w62$6.aE+W2FW?[303?duD'lym9Khe'աHh|yz䣏3h6_drN_mWMtK>ʀG:s>iu]g,( bGfUCL*lA{ВQ"B򲻄tNW HPYp[ysAI %U;'X!|˓pZ NInOH m7/I)*@Q' :I7YhbT|L_uA z+=+!ոmO @u$"Ƒ+$)^#9 TNBGܲ A )}"i"d$Ts9FRؙnPf2J#ot񌤺IhL"Jb3&i ҿL$8fZ$4!! nvbn@nvbn-desktop: ~/exp/thefuck,h H*\Ȱ  #Jl(3x1 *p㧃F(>ݚQŭXb}8-Z,O4T: *8+CǠH(F~Xw I ?fhbDagRL-84:*ѬT0 RB9H* 0Juٱ @ ۂ>)R4Ф &^L=]ѠpBo#JHJ]j%&wt.s\ 0ythYLY"AYG'0XbY,t"r)! Ԣ4`%E89?9${H_oK8[oT6S%x DTБDBq!sx-$Z0EYgaf%)K,$EKʂ @ gu * @x),6cB DB) DAT:QѓTF:р~JZ8o*@jC&A_qCJ% m@wv, )Nm*v.0M@)` 7?/d y ާ2W6P f-~5pB1VtT,0DK ?` Tp=Dj7@Qm?Dng1(4?[][Ƣh eYz.$^( Jp!²=P,L8QF~EWMI@S.N 02BpUBq\rz`<ќq4?սʢ 1e( (DWMg"S(܉V>[AW1?tSbKHC)<[qzl`'mZ X@zIWgMP[gA)8 gUAqA"0$ m 3NH0HrIg_r(&=A!pKD]G !d(&`x%0f(Z+!#墰 U>*bq X%0uX%Am d0G,PNH(3.0+<vHNRLsYAp(mkԶC@`7|6BNX"Z#:VNK p0D`eV* * h&RW#p# : #?E7)Ё DDtDHh7a X"?bl)A"ؗ@EPw@P.˂5 <$)W@88I0KԛFު7+Ȫi! P##OS2)#p:Jժb0 5XTԪ9JֲfbjՓ@5kDFxjEڐy' !! nvbn@nvbn-desktop: ~/exp/thefuck,!K! nvbn@nvbn-desktop: ~/exp/thefuck,f w H*\ȰÇ#JL! ! nvbn@nvbn-desktop: ~/exp/thefuck,f8׮\h0!… pp iӐbW~eC,i IV3@H`Ǔ' 8XdOX7(1gڴ@^}4Չ\cf)YM Z8! ! nvbn@nvbn-desktop: ~/exp/thefuck,fx8p *DP!A#8*ĘQ#GX+&+r@*YdJ"9`%HZڄ9M7m1sgE}YQ@!{4mV)Dӧ^ ?z؉ !! nvbn@nvbn-desktop: ~/exp/thefuck,fx8p *DP!AhP@-b%SHko߲ _ \6"nB*p ysn\C q xeڤH.ӷ/\ h#Y!! nvbn@nvbn-desktop: ~/exp/thefuck,f8p *DP@2SG~ >HE^O3r #賏9o솝x.TpFB6⤔V l 4 YyOMT`jb$yƜgjX <``'SAЊ59Ϩ ̱W`ڌJ+HJ <覫nOQFbzltp(PUTH]A\¥ N>+ صQ 9J@r2_@P#8gvQSĪV!@!J+ \j-<b[Ç"xVZp>|A( S49RMdq07szp=Z 03 / ߃%e@h 2K!K#q6 { G[PBwM`MCuA >$-t`,t N7Z6m$ mJFtNc.B 5v|A$V@ʾCN 3$wH"ڐY)1 x/ =t " I&>cUh $'E [?KG.26405 h\lA_eyK@DHB"HS!-|#Eàg)":@*&4(H; mm;Iz!= *!hT nbC^:fw]>8H< B6k7Zk4VG\Oy`L2f:Ќ4IjE#!pLH(fF\ J.#^>Q;D\KJӔZ5@OƔQŨW1hƑ˸yy< Mp|\ UR(E*6d%$' 9h3 bqjb%Zu `"* `4tFTm, miY;rMaJm-CF:XM<ۛ •sox_bvŭ_iƀ'xQs hk #n9OU-iap.{6n_8$8#]U "wnAX/aZ8$&~ˉ x/> ;`S=~'Q(.+^51&36pL:% HLځ*Wb2 ~BK"v>q`-bJȴ=RTfDXdD!A)xj(zɭZҘ \/ҍ+ h0̂ iYBXX=G`! h,BXODB[8R"ↈР,ҪiXyKdMH;@H XhpOώ6GYBC xDO= zP b;4#Oxh*@ "E&rm* L46 w} ]c&;/5MxZa۱|D<[ /3L0}ڢX@ p[ڽ)@0Eâ1!Nl@h;( ?hiN&8]-A4wf#@="P`AgˢT:ըHM6 Fhx' mw@zqpq 0$l4yGr H P!vCVNHR{dj{7{P{a/ 0qPv~NWϷ|N Ѓ?~MW}6ǃG}㇃pkzux'PRׁ0!W3vWT 3Sw7`=x5'qm"( 6p 0&x& 4`ЖiPv-` 0Mv !O)wjtzo<8w |wtZ1}i7~7~0|KM `r{Ys}`:VaT+[cJ 20 7Fx؃F' uu! @TG 'g(؄m6 )oyjLN L?0@sKp"b1}?Ep?HJf h>}isCCutb0^ĎP`Y|?.PaHxvuiq ) zvQ 0W&{h gV@}`=xh}(G҇v,m wp=dI)fbE πT)@M}և'Wz|HY yya!Z){ f {\nOxnc;K`7i0'hڗ虗qvy39]Aliw'#?;Tqu\ϰ@Yq4@) zU7ilئhF%`70 "Z 0 nؤ9{%0- +sEAv֡͸U'ɈM')`GyWe| jI@q`IqV@uvY~i3؄z,( y pGǨ` > |)%[[KSC& oN~5qݠ A @] ;vk['dhdpG1P: B&ꉽa߅p 'b [ƻA%"PKU45Q@"`"{**Hqn>a^; E ˻[&9+P\w,3_6. qpSI gqQRe IP6tJ Z|)liS@S<"@\PL Wɑ$"PLePՉM* 2 p>{8K!M ti<\L %M &[uVYS B 3 a )*c\@@$r6Pqlg gϟ\ L` }\J\N 9|̲l  Nƺ|;@ĺ?PP(-M$,]Sc'!"+dޠ"RO% _;: 0U= ?>#p p1 y0QN9Ca4epPJ,PKٿH @svy lNZŵͼC-E}<J-@WP `N=i$"Rq lB| ݝdޒ<7 @ %3qX>usMO-}(-ˮ> B&L\#(P !T=a۸O 5aM c]-0WR]$'c1TNЎףl@Ш&菞EP$!HN040"?pP^> Nbb>d>wDm I#9 an/ ^N@MYuqg0( 5C@֎֍v]eP~MʒޕM2O7>LO,ޛ/Vߛ ~Qı1]ٝ}\>$Rn1@!  OP@F8cE_݇^ݑ;s~ uۻ+Sw9oMOI#54i7LS.S-mK.ӭKF`s kdX:MŹ0' <p|Giaupt eQ ^N. ?UʍAoUdȂMX,Sɓ/GN^Q`=UxVq|[c/e^͌)|CPB >QD-^ĘQF=~ң"M#yRJ-]SL5męSN=}TPE0`TRM>uIRCY@۱ IR1 IOFsŋWBX]EH(9 ^$Y޹IV׬,ݩCyƺp~ta~CAa}@c @ZIVԢhF5QvԣiHEZDtԤ'i8YҪA/C81(J<V'iPz@ldAOKժ1=8 MdsLAcjZ@:9e T*@y5kZ Q+` 5Je0vSIV2]khW5iH)k* jE$eidkX` ZsYGRTE^1X`ujPVCbdf!DlcˀYP nTK5~ӛn~GaF]Km/k[`b`@ lQJ~E @fe{wXf}d *6 (/k爅*fce[׼moK ;msgvmd%A=X+-[9å=%fc.O<Y*~usmYʂ E* oY5'Ɛ?75f&u la!&φv=mjWvm!e2"YAtos{F.U$XBF.,"fgTSY`jܥͿF ;r8 y| ,HJ4H3D~@S")qìPBsCG!&`c ol >1;7`"BTT~ A`4M%)=CpxL7hC-:rhvg>Dn ฎE9 (:l}=L1 D>ش]P$ZRFDTlQQ'$e  qLW 1-Y¥!c]nR=3g!/ Ӱ?kPx$X{g?a`9V :HѬh}؇xԬ)8HZ؏[Y]) <tIA"ܷ7q!Ce.@!;9(T8C1wܩi3S/*P@ڳ˛2>/yH8 Yr{JW`\D1 8 , ICՉ Z,Xj89@'HԊAtPgeAPC ZKYIq+D-µPDwțxmX*Pa'G-VA{]AHͶ!;0@J )Wt?y ϙ0OԽ[XIMkX$V!31C|fxP^u\Gj%U :H޹}q(8>( Ɓlq4@v/QǞŖyTWPW4.pX@ܸEQzXV bx[0xX|E AZRx8 UپxL"IQ"&ڄ' kRl۶b(K+9X.J\6hd[}% % -U͑st%}܇ ]X _̘#:h D |9;hOR]Uuߓߚߎj߂A_K\r3"楑Xq+@(`!P7ϭ"l`n{d  ʸ|)` PfJ]#ϫ5m='҇Dk=\pi:~\[HD{ƌyQ ` BJq| Uf. #e^c+ xRx Px}`TQ%B ;A~Cxuz0K)wۖb؄ps\/iK&Ap9:#)c;=>]#Mx<ϕǓS1=tӇ33U}f*(+ўc>@Y2DMIy8> O(ڻT;a{b@=-VAZ%Mnn%;*k}nY~z(K\ ~Lc۽!GܛI ,µV8=TmVZ01’@$Nxg[! wF5F1:AApr Ytڒ` 6ڇ0 7RHϠbEP؁FFڇ`o$Iq|x`)DW˜MM%XXz:Z TǝH>n: hMZ TL-DX}c*P[ۇ*wعgTՌFMn|R\?v O7Ggw_Ȭ$kW@hC$)Ða*n"q_L{{? 8aE+b-FYmL1w O7Uu50爩Hq)Z\r$Ǭ xw>%;@' #"kL^"B6Cn&Ld}9TDTA)3VkAY=a g&TÇ 'Rh"ƌ7r#Ȑ"G_Sp=AuB)gP}gfMBO" `ClE6HlMtۈw")" d n5'sM9b 0tDd#`%wVit=|}u~ )P_*#) d@Dַe V$`@ \Ge6 s("--:(J Q2D3(!TRU!WА蓏>S橊6SKQ`\3+jlU%@% aT{݂5Q#묍v OyJr1&.jTad|dlO5l&nE=^!` 2ח5u)!`UH9q[ X א!GQ LEsOQ27#(K&р^'D)x'T'@!(&ܜsPG% ЮeT PS{&E:=%9n3n%́<`mJQHWaSI:a:H&xzz(le|c1h03@"z!%SHhAxh6 g9 |cBS '9oQ| p;nBF7ұv#a+u(ATBhlB(<$$#)IR$&3Mr$(C)QrJ;@H5ƨ|e(5W2u < W4SDx@²lR-7-ΐMz3!#EӘe6[ұBAKaDfyNRʌ y&oܚ{I2z4pZ%qю=G=@2F A|"3!\G[~0#/(Nt(Fvo -]UH:> ӡ#3,Zе0A*#@-$/B^ex">*X&8 5B]QLWj @I=r1DXux> 8W ì-9=TPi]bҘjmc%":@5Qx?s "\?0\$n(H|ҤF=B} qv+AK]:.\8u1q=KÒ #7U; * iIxB,AF@ig+<Ieg LP\ޚS}ڲ) ~,\Pngضm i2Ejunz&?Q!=nt8.s_Rq< _O{a>`] T}t!iWx@g<Ƀ}E2w9Н_'Z/??gId|ϽEY r7'2[!$ LE--'_G  o B(ĘE"x \^G(@ ҇ , @,v ҂,r!D*dx9D pD(@%B(p@Ah FA  a%D$-d@iZ"`E.[R 0 B `abOB(a5A`o$aG@"oF J%v!!-E-#b b &j"o)/D (Ao"$-|c, AbƂ+U'"9#"-|,B-C |=  ")B >))CHDN$,U"B B@8A0A4 $&.@0&:4`"OޤUPJ$Lb@'rd6#lSIY@VmՐ>KI(Oq77cF!c#0$2 b9Ƃ#!A c.:ޢ Gn%d)eNdAheJKLhU']^؄\E>V[ 7Ƨ|b,"0^ 0A@^[ @ >x 3 @%Zk\$JlK,Ad&& q)RJT@n׆!TP:MG+pA=Eh#t~AhisItIW{'sB(,@ "<~'TxIB?@&hC'`(@ B‚:>@`Pbo.MFJ&e`" eC)3o I:EF(R5Š lX&Z+k*jܑƀ7 ^*&-%Bi ! f^B %V1BB:.b PC2D@L(D.c6)F,5̀(DFJądt)HgQM!JBm:͚[C(@$bi h΂,| 0 ,ٲcjEr)x܎JjM D(+&: i%3?42>DDRsAz!}}P >ӦLƫrI @F"hm d@  F&=n`C 2!,%z/,D(o @ mAa2&k.6 F ,\l @ )K.X>J)›zAwDdP=LA>7X*<:m˺@$A,c g`2* $J/h:eBi!l憎&?f,UFqJnfRʪm2Nq&Znff`FA\F]Ed4O~ ya<@ 3 ),]d  *j=ƣA' 1K (h8$(,hB4l,vqZk2q"¤,n*ì!!4f(AMPF .PE$/eYs% 1B1c@' 4pl>?4og1†EziB. C4H 8B*`f(Hx~,"q\iHt 'MдN4OO"+@J5MsoHP5$ bҸfĎ Glu4i|a%Ԓu߬-7 *[Kuaǀb]S5E be>N!y`d>B_K,^ >`AA@< H C9Ha_kw5e/mngSn870< e,$6CiHjCu<m?1wDR3TCp;7oc+ [s_4!u /CȨYMIEYJV /\0HQiPÅT6l X= sTMz+u q,TUGWrWMͅ6ȗ͸TQZYBԉ{vy'DĜ IE 7T@x l8 V^D7pԄX d@UzlZvUCd ^+T?`RqaCbB:E!CB>' CBjqk@lg\Uz֕> 8M >ŴZnhNNҡgu@-hc EyN:^l=@yZƴ24$^E[+GYwƠwEvO:edlE<[>A;TA_\ME +ׇq ք #(;ޗ5H { Iք+ Azp)vl 7Wz@tUJǟYh*-|uY TWhB`APWl,`u JMh'7!aGGFŕ*"Cr$+CTA*Xp 8U7;\A>C>|uȼٝ.uuvλW<>A4_`эy+KYsS`k嬉;A\Gt+-XwCd@@ɓє~n+iW ԃ&C (w( @We?+!TO w`\+ iJ߯:r3 :н*`E?7miP'I0I`X3kCM$T K J@H:w~pj*Gghѣ40-Hf]7W&ͼ`rVho"(Jqb kw74y)ɔ^1ǖ=vm۷q}+".scă36 ww3XP$+Љ o{Z+ʩaNl0'l׀?i8Q5D   K,  Jʹ@ (/ Ğ:jH2 LfPZo+RK+Y7 ɇ*Ub 2#QҤH'"|`(Agʟn01b)d:'Eb蘻π>t` g/6V*Z:er [G^oѫg%6`.bD& `\2ᤍ dݰP% ]c7Dǜ:MG}‰"& &"xvF VD` ,jzjy:-R{iʩIKk_G;KAӫ^>W`0NJ?}#>1z؃WHg(JA>*3 M<Ç "}Cz} y3 NeFi3D%bjx%(f)(EF1QMlϽEƙ(K sظ lXG=ڋј>K"H%"IINM&IKn'AJQ4)QJU;tK{&[ɗ#-oIR \NLmc\GI TpCË!AzحqҦKU3мG7uM.qyme0ʓ. `lam*Ti6J#EjbĄnxm:˙v#;SUe h:DPm2m2S`P$gjOHT(BЄ.1=>6`HM:,&E9 S6'tikK'Sڼ@Ro`t4K2ƍ}!B|km5e BCÈ{AN,74%`*mc`E>*ZkcYZ51vMȼöY"kěu ;TwX÷_ :\P]m 0^mc˜H}SQ:DC 97(ېB} qrNs!U-a;߽}KAuh@lf4?A(N(Azگ_;`=&bz$ :!\Z bΌ#^r~wp6hayҖ\68:"DqUC(*{2]#aA䢡9 !ղ'u&YĜEC9 &z`\z0]5h޾AzVp pCnE9Eώ]1=^ *E"Ez{ex;sM vMp"d{=`[Ød6w['HKZ`Tg][z5r0J7NyNV-(&0DE:գ  >S!D jBq0'U+QCqbªpͨ^qVfܪ^sQ!4IA3Q7F NX cL[`B\q]w/"@+y&ʒ$"RpYr>)9)掫=8@TDLO #m0B"QD",+'F'С[f>:d|#"L<@@=B `V@jQ:IvB65Z.1:/rFb$x2vdIlP og9/H$'F A =dQ8 k ㌪9fpZ#gt8`5@D !vG" B w6RP&"!zΪ-1F$*/F&>DjZq5OC#Rl&h 0P#W*Bi%Xl4IlOac|h+%#G\J 13!ZQ #nD1%[Lʫ \# 4c"=`]=nYX0tD9 "FfFx]#iYk[')AZrI$JD }) ɒ]l@Ij  -p(F\^CQ'#+~(%DJ!R" P5Tb= p]\V6f,"&%bP,4B%4X|2,%%rOZ%)7n FbB" H U0m:h! 8]-qB2,z \n]DBSB>%N*nX5$e `"í0SJ=.11UR6 2 `3nJ3 EJp"q~4 i.O8N/g&Aa&^~ H AwF̅`>Cx`zyޥ}$H&GLr;A(}!!Jw+$*y0_urKc(Lw&u5{vy v0w@sbH`y^/y ,J$|%@n'A[UUzpx[u*d7m"2TwA![ hU$tR)ngarrJT7\/cg4+UR< h?)hԁZjg`Js 0IikCI! :+`+ 66tVaDRv! jsɔkp9s=sQgAtMtQ7uUwuYu]ua7v6m͉vJvywgWpb)lWa4cAJ)Z$xw6PA|7{iS~pB>1٨>'|oqtN?qvM*KZ<6Xs{w0 yVsb&~u =C-LҾ ~ `zթ~b:mr.^pZv9㗕#DR@m*!At g khM"谎j-c_8،ԒmӨM<-5/xMda0.ڰJ قladƌkn~~h j.'n?~~bJ'C]Z5XQ(j<@}S  Fn H&Au9@:e?MVt(V Ag>,/p?y5oCJ{+\+~3Wߠ<B@ P0… Tx0"B L"E Id+{ʾDHx3 :wÄ++ GQ!*܁Q`,I`ۗ.i F V,lp׆W#n&;'֊E0lʕ-^+Y hVxU ؃okᘲmw/54 ř5fyq-7mܽa/q8q5nLH)@M_:68Jr/X(_nZ ;Wj}n蘦Wi@zbr VlTW\1TZ;t@e_YA=~8YAbeehWAbJ0b6*pF&[Mq 97%oN*ZCG B*w@@5A {CK u.Cp &t-Q D#E`i.YlUx=aU 3ڇUҢ8#[DȰrdO>U9Tr)sRB&;rU I,qD6Ϙ%lb@SGZ9CD41BvV' u Bw.Rt77YP ZL;9A8*kqB7ƐbK{$d&S2b"̘_ SIH' lnh;;JQ'X^T7$9 3j9@)3#sSO0l 42D'@/%pAHQ+6H@@2pM9"K&C䓌&$nh! 7%(xk+x>؞B z-bA~x}>;um~=WJc}~H^k~s>>_  =dba=@_8$yl`I@ P֒DlC`7dglP樃y5$_#C xzEa>(oD1T@αQkRiIXZ1j`UD*r HJZޱ$)HF1k'?))G27,e$.SU'$ITnrfTr˜.y L+Ғl$e`*Ӗd( hJsԬ5iW 7 ps,9ωts[$X*$M( 1d1%=׉ЄB A'n1,>qHšn``P@ 8*2 L9 %(FJA!Ԑ0_ِ # -Q#GЀ ,hH(2j%<5z* XT!#4"(T -u9A)`!Rj)}pS.*ĕGmlQ  LHAGUj¢ @ Vj ] \ ӄ y ұ1@AN`mj:>z[N;s  uVF8YYQ, !*ҲOLջ@xWl6*@LP S VZp)l- /JS&`uռFM>hi ~bAS/Rg0AE? AB@ >AUQ|@P%!,:c8)@ǧj'6>KU'` (;Am YTAl{47 8fiEלr @`^9&>dH*XF|WÇ 45g`J6jeaaZg$F|Bd hL:qV/1;< !%| S50+c=ց H|['8A `Ѐ\Ylg@^@'!hK1<~/ZHz UlyN+٫v8N}UT4',r,Oټ4F8P@ Yg@֋봋N0S]N"h@pm& K,#@kƉ(5KV ]puwS}2 X 3vNJ/'<5w`PyUA7e݃ ff/  @/FA\ H c@E ;. X]N`E`?}vkPyVǭs|}`=0oAo߅_ qyJv`w`dqQqcW]bFahT(y r,&|8GUq|pR1m{|#h5WS|nm }`1yifqQj7n60_kI o`62yA=3# 7@ !p+󔹹P5%jV@Qt*GpP/ z6o]4bA',([#[?F!c~` W|@G`K'޶'p6nn`hv{BwK=>gPDQC1A`@օD)#j>@ 5IWuM#0 Ţ{_$9M*֔z{ք_ViId@U?:1xyMR)Kʥ]N޷`RcJejgikʦaMLpJuJrڦwJ[ft[bg[KyzyVGwꥈT^zKd*UG#| )jLP :PIz]ʩgHZJZJyʪIʨZhZ>5ZoEHW\GΪGJ-" %ʛ*ڭ>bH:%ޚ"Ѻ& z̊%䭳??4yJJMLN3%o1#:cU`z:{˲˺ Kzȴ [TK%> [oʒ 6ɰ4J겺( y? Xʰt5ɴ?MI+x=k T8 KˑH>z$"R Ȫ]KJK,R_ 7EC4fqku[KJ[^NK^* ʔz4kO;Tkl{k:!!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,1 HAJiAAI:AqSوarDbĎ8,WcHQL_jX@%͝*]ʴA%1r PURM>:>3*a'F$$!U?ΦM!,s\RE^eE6 ֞*1=R \$՘%^{4-7vt(wq雘$Ө+S͗ =q@aEoG}j*!YEr~Α [;L/5jv\ aI0=fc? 4y!j|EBArLR]ZJ[5wPxbp&|0M68ՠ@)"}EX>e)ybY_8'N1OXI>lVXe5|:ќMm1 !aƌ\L`OITFSiCoI9jU=f)\BL.3Tyƅ>_U?X Rt|YXfcTKtb8odad&cV^WCSIswc{kV3¥9?qQIƬ~xNI&s,E]&DZɲva)FyRDH$Gf mDoP#zWM9D +lWbV![TkmF>|9cF/tff\pV-;xq|Rzh5gKxrJcG>+f>:n'ЭCPU՞*. f^RG$0\H =PRuZFx; ?ZZp XyX_%DCJb븛b:X.AAz}^oevYiN.mlWKoqXq nB_5dmmJVR-%_Y1Cstf).4NE14W,h wDD6aB B+% +^.^JUڨcʈ]^1iwhUUx MƎ|$EL6 =*)U*!_ ~Xdd-DSiw3g#+<8[xPXv=zRuw-KtG/` 8Ro5өy(-Aʐ[W=\6} DN7@ :<#%#1/IhhsTA51N#ܶ>m{<@)41|8CA\As zx\xN?HF Uƌ9^&УW\> TFH0@-A 5RFiD!@#H%}F׈0b>a@emNy4@><"X8„ ,(F]摗YGƐ"qelZG<`k K&? tM>x"` mO(VNl?G 8$=d@G '  pXTuH>J_ p|6|TqPw >R,WS (lz:wH#AuKz #U/[Iuq> 24 Ho`62wp@-F@+(3=B 4(-mfk>|k"~tҸ@c䠟*XfkU A? Nr4`4G ?6E)pS<)ZXS\\ell \"8_*uA'xq\3|q>`hƟt 8VMNw&q؇NwRhH(:M 4BXү jь@9!GGF{Tb$1Tt$#QD#,3TCZfek j Hqa:(n#Q_ezY|`72G mf ZO]zv&(T>}mBZ;}?2ohȓ+_>Z 92Zi+%!L'_H-ԥ %ThoȗqUu @%L;qE N|585=Ҁf](bK$&蘋`Q省:%AB,PhwG5H@+\@cs3ԊPF)I-VbG'$ 58!GSyB .HZlQ\-$l 7LgB"Wlgw ,2ÏLɀ p),PC#2G)B -|rA䥀C$ ezD!dY&)D zUb>M 4 uE&~,,ց nbJЕ7@%" PB)XlQh-A5K&AEm?XAВ@(>8E"(t+O  ,D4#4衇k 9RS\FE' qcJD6O D: _7;=h EA",GMLҼِgh\,4 "pQ" Yـ3Np@>E22)4! px#9VY S{dڥ`Fs|H', 6`) D4`b5f<)06g3()!` 0E>`+(4a vebHy  L9%@IDr +c+ Tp !EJ= xX|e*_!M8Gke:0"ӦYTAqI e&4*9> \tQYK⅂ PUs_j @%wi؁(r Eb߃@[Hz ?*P Y@HJX^`ojquD X(!1Y,iCÝ".a5yMSӦG ʙ} x˅P,ͮxeC7"`I6=_B] h3g]3_"L!^ 6Ϙ &!H5/s`*o)hK fqA͉ z3(B !#@](AW*X] <.xrbWX,b>)A0 S@Q@ |6mq@CfTAP c@6#@`--xXT !U'jTV%@ B(HFPxM@j3Z]D0 &rG lb':c  T$V +Bl  +α瓮VCDoMQx#b`6<ÿ!6<^'­ݐ2x.@{9#Ț RAE v8vjq 2gh57gZHL|OPs@!^"a&?D+-oL{ ާl=C$@]kf~" qp65p _ P r @_*oDWLA$X2zHwuWjH0H md}`?{ 8A/p/>@&}88^:g]V`9x7y!39M':V0  5qbCgWx81^h؆npr8t(5^)Cy"*vu"'}0`rb#hpJ oHcg$>pxYs@|(8{8H'R%^=s"$ !.QJhu  5P,r + Aɨ`7G XZ1P: 粊ҊPǀ31Zȇ1 ;"̘dd ` >?( +#1@"oV'@ 0CxQH0C o1ؐ`q 0A7 qPr@X#- +Me@ M)x)"@(Y)*68x>`xH`F9)B% (aHQ% L9 B`V)lj`•xJPYP&gYYRxP:عS {P.ђ @e] pq"Y1FpKj)P!bQ>pF`F9$V2,gi  a5`Na2Ǹ04*nנP^y PYe0`e'9szʠ x#G!i1F"J# Gititو#` H 3zb+mш` Pq*Bʜ@8;+<1Y jJ;BhbBP:|HYvddqٳ :a!\Qa9Ui  kNb pa(8J5|LV/-Rp&(-@qZM4 BE+2 ۴絛J`ˌS ?]/RckkS`˻ѕp@`ЫB,BҬƚ dj }"P"AK"]??x`!۴N'Ai; S苿.@ 쀜 Y &Jةnk dǝx(Q˸+ ˾`/a5i jm# `@F Y1 K 9HŢ鉩!J+"j$ّLp. p0]qSD pr D2Q/7o0[> 59FvjʂYWHqRљ٢ɝWw* oJI(&)#5!3=&( ƹ/"1U}$)~ahX 潼@( 7&d = >r(lb#RA^*p7&M Gn1b~2\氞",n^7upqr2BlZ A .$ Q`Z[)P;!2c lo!R+s W,d>+Rr7׀< MQJ͠2E: 䰢]t@RlBgA:,r53nԪ(Rk G|ڡ aʐ,^ ^;p 05ЂW-'u]̞11 b:J_pZ&>/"n.P !پm~JG @0 Aq/S>0  A!.h/b/ظ!@@ DPB >F "QF9~cH%MDRJ lFrW,L#y|YPEE1ME:Ro y5R]~VXe͞EVZmݾW\uSh^}Lrd֮Xasҽ=x8 ͌=Ҁ+U!@Ze煴CƝ[l܆|-€n͝U|憵@2d@p-OL՗'េ/|2*(2[=^@( A>N1[JtMI4S|-;+(L(;(;tIH-RZ LMw5) E V)cЃ(<E R3/ŵlWo)I 2U O0,P'%3Rm&n8`$@bI@XDDn_kU`OW=8QOO5V?~G^F|fi݌v:jxj:kk;l&l^ ZZ}9HVl u(HХ"r>hevfg'?dkm;ċR`/Fȴ8@'UN7٠IbE'+M2uwv`&z~fa iڑjH&}`l)! ̩# JzΡGs7=Doz;HwMw)`WioGRDh#p,3iIVp!DF0 DzA@5yܡ0Q(|lx$T aAԂk#*ttTD(B6vCG=n%*So"@R)(`4~a' `@ 4TҞL*_9r 0r9 %5 *4t(E1z RUᏬ()MOzR }\%L@Na:~tUe*( Q"- Z; ܃@JRP+j![ !R _R%1@*vHbֶI*A uA|Q7 G; 9r׶ vC'E;+.d?܎L 97ć˔bB50L"Kd %:2ݑ!L- qCMlBrEV8@=~ ] X&<<yL}`'yG af"RrB$bb=|1MZż2@J}c|ytzPM7eajۦv}vp@hpwZ x׻l>&\{;l0ׅGxp7,A ʈ_LW"UryZ0u("-2 |ޢ(x8*p{)2()e: )Ax)p23XY@ P Ѭ͚6B,('V*ɲϊr(̚B8PC#$˃xp{C< !) :@̀h4*-]>H) (DT>$B\9Jy9;L˓qCA.;'_B*Y( Ht'x13/V1`#^:EJtDWdXcZDFN+SMs@{hLx!tmH2N4*CK4 8r#tZTEsmF(:h5A71 2z†p*}?n U`7w;dj#;,d| XtE#ʣ AʥldʧʨʩʪށȐ(ʫJ3@W( 81;@K})Yl t(jOc6خL!L@W9hW؇_؄GP9iB&D KP) bD\`G} /bpiЇr'lB+ܡMͅ*b˰XNHpLJN{(mhL sDNL  ]RrHɤmS<Ӈgpk|0;$ZD+D s2!t H ?0̇;@_J  </)‰Ko "=OG!"!뱢,"<0w0"Zh0t | &$}h$#&⪸ K"}+$Փ?2J: mk""+<: Rd8Eͽ=FB"Oҕȿ9%Cx%&)PC*V Cf 6r'xjH]4Ź%Y')@r($@U`(4Z Y241(Z}gLU )z\(xhDb{P0?88WbB,G*jZSrDM !:m먂C=Jk5e̩mM)UAq 35l|BkS ;WE4:X5HUt.)̬,4Dxzp9ىq[.jڷL2b#144=uZ DLjt :*׉H 3yŔHO\Z U/L2dp`DE]y}0K2e[rȁ"C). D?)xJ4\ m1(0_0!"D-ze+r`e0Pme1p:(=E5c,sgV"nuOem0s]fܱ% 4NK!á82,z!{-3-58*4*2nՀ4x} ڳ9bK^vSFKĜ3VPE0V.bXڍ(*{`j~3+=ӄ#38>2~T$N!]p78}5Fz8d`aa K4:yI顇v+i1 dJ ɛ5LT)S\QK S{~¶ O.e#`och >F jҴlZ(Kmopq&XV r&@?WzKLguf# Ӑo 5L:Nw^QMXհ({N_>9LBJ5M_ɜ2ˤ+{FhXyP hzJ^N gXkgX06$Ԝhm1+M Zňøj&1^zu.~hD:S<lxIQOe14Q-)u9=L Ymʝ H!&04o JN S@&&zB͎7SE΅,jR$Էݦ[=)uĊE*7cWZƿF؇,-SI>?uj=np4mgI[urE| K/QRZ!Fpe:A?Ej0rTN˰B 1 VfU0T!F}Ʈn:H??"}lhj$܂`ZcU_hҀuzC4 2ySMY7L6BĉܾXMpH8_E 7m}gml,:2>Kٽ."+z?%#OQ BB'`s9+'Y-?u>,/mâ[oJ!I9:"3̡ ` v]tl9@ɿLԍ͕ur ]% ![H01{]E|P#N9"3AY`n(5c yGx`psh꺒lmwp/۾=Z{˜PF׆P76JzI܆AT\çTI3Мleǎ8OⷢWvu:tv}<# Rk7GW?!8vƋ+nhu&2 #zLE 鵨T k<'MAOPhi$]2$(p‡Rh"ƌ7r#Ȑ"G,QbF`E΂ɘ"jVJs<gƇt-j(ҤJD`X-_p.߿zu&`7-JO7@ $R]F<OgGO@'Dj}ڡ0mO& GZ@e0|A"D+3m9)*x@B+S|r/&i2̋.{"X$`i_0/tQ=h/H>h=x8A|^|IC9bf||D>ur#1xC| `>8,0ސڅ <FŜCȭ4UZy%UgLTٽD35T7, `-x+4 9`: ߀ ]sECVKo:eA1!LP]j,!Tv-agVeu ܠ4U 3=[@\* \p*u}sDm@ Q5ؐ *I:;p@aC50.%(%U{DH%%tǃDߣa,'>;t<͋9A``"K@9ClD@+9D4~B7n yO>SC TH b<V ( y r!@SƀqbYMp='И'a 1ARN.C fqu(l@0pE&tcұ<@"sCðԣFkaU+WA 480@G8 H#0ATDИ,rn +S*RhT$)y}# LSm J#2cvX2)iFtL0rx@&8V:V*©u|'<)yҳ'>}6OyF9± WPB> Cbht['ʈ nA Z DQŷrϋ@AdRQNA % ѥ&4F0 Zt 1TG* Qt#RjI TN9%4b1HP#02$'()B zPԵd肪T2" 0^=RZp (jU AZbP:Օ<=Virvp'*lfxDwOaSt"1>q܃EpB&8!8l^T`ɳ;-3<(B-0I ?HZ@zB}yЦ )^rѣ4>H)1pғG&v׿EDa`YY-# sE,fpxi`StrK9&/ d3q{S$/ B.# N@d'x&L޲0g3;r &@[%(Y9BT=!9FkMB &"xȃ H#R@w-.ڎP#.6qe,|5ӛET0RR`E-L0 D* @)0*R˴q= Ȏ5vH"^.DK6݄9`@ tA 0 g6@0:@\\ [# p3pa%Sg%~5l(8sN%>NkHC3 mӅAO $Q:.kcJxɫ=T XJN0 ׉rW`Kd?(<V>@gB Ѓv}HE/tKP<|OW\|Fh4L@HsqCLu֦XVAŞ(Umt ]ICYMX_nQ|W548At^ghb9[]{V^0q};AutSJATAA@&@筁UD؈=eڇu"p@HB,TAɕH^A܁Z KT‚C@K=-$ D !T_lܹ]X}C_AhĢD(cMp A.D~$- KhANb!$ AdN#7=a^qhm.т@ ЀB@ʝB%j"L xD9)i\A]YyU~b@\ E]Pa4@<V$MDASB,A8;O14(X;#8}E`@,(؂]U @ Bg@ XeVX٥g B@}܄] 8Œi$SVWbAXL ٵ$MY1,]D]P&MՂ>@Cz|C YF-Q&0 \p:b%<%v(ł%'ڊgI^d(`y~' %} S @n@#؊(v0K$hRi& #> APyDj&#C`DA:eE=1U! & tV %KB!vigUnEDumUymn ZdH(@%'\Y]%)Rϕ;-f*X(@-iG}LсQ ^H㕨Ğ**ir@=ǼZIOG0N,&*>YUzF&E4tjMf6*E%_)F@ x1rj<#!HDn r#FB<1VhEE( +tM&BbTɤ=̱"C^l_x F=660 dvXE"mE\ˮem (<YnMCih`#iD @$b">^ ڎS`n9Ry]:PmNYS[.X@;Jzs Ѯ']n8rm\ح6 ?(nΤn ɕ,B3`HGkD;&pBy,9v.0p>sȌHЄw>Gy zho3*oi04@EL)ypcrP(bP,܀دG֛TLmxyzYe/p4PLCqk%0YZ+E  #ËI uB>h//T%d J TX`* D dO@ǨPt7hOF\GYJ<Y?@+=fGMe OO2)W)7 ?uQpC3X,7YRD!dA\%߁4ʣD-Dux u6͂uw*t Ĵj IQ!騌ؠV@!K C,XpvNEkg/+I`Ba>ŚrETEK߁"0|6*A+(C f>trcNÁh #NKNh9>iی}C 2`8`qP7\Px)87B 1b,u,4LOZ(+AH7O r BPK?º 8g#ewt\=A舎davSў7#>TA!G"9D2Wj=HAEs`Y+B(2+:8rPUB|37?_*1̗"+=x s rKDQ㢈 7P6yӞy,VDPBDTuo`2pC [u+d30 Vy;?o]OdHgE<&q[g9CIv P&p ;+0. wL 0Ͱ5ZkrHgxt';o{ ܃>(ٱ  -8zh U<s<,?|[Į+)ѺPvpwY:^;v.T>2hRjETx@zk@+!ҝ_p/" ԆJ-ԃ_< ŌRk| n # 9}q!o/V L>d Fc(G/C >n(;[[x()ҚlR-yʾ7Gs<&ss,7\ O?DDZfH\>?t m??ǿ)2N͆Å@ ,;@8P&gPaC!#`@D1;@ cG*z9dI "g!" {p0hPIHBpzF4! >sv"Y$A6k1B >FS|9#G&|؇^cRW!x40\f$jeDA}]] < V~e&)եLb&8Yb *v(#CȺG03ڥAڛ/)IBi(@X6V+ [eo|P`M (s.cC-8hw⸍d\6f0ҏ?JB`/n{h<K?g|h o C wK0 #\ԮD@Ixʁ&$*l;o(N 3"1Gp!4 : u#1nFFF%mBpD|  ig?{2Ȅm,jT`lbb})eUQSӲjZa (}рhͩ(t|)B6Pl,|iG} >^A' Mm(`t"N4Mik!Ww@Q` WzXYl" yi7jƶ;0;-*Sy#Ʉ_w=G:D%gV'>wb<|$|x{HG~~yDaLE/v%'C'LޖcD{^VEqAg,z8E&nzrq; X{hhq',xTgEY<7 9gڽ_/Dap`4ė X`iR ?QFQF\yebJ%ja&[ -dtE@׺qsi3RpzLaG@BW#=["U=Dx`$΂əv˭6?1vFdCF;0- qت,LN(gT 1[zEk GE&h0 Dj)Q # H-"@h${Z<@kh1I@+t%hVP F#JZZk0 }[{lMBYGeG31-Teg eyID>a>j1X  % :A5J#AlBEzPIp #+(|#(|V++Gd|9` `B1'ȐJp!ZUYF͘ɧAM`[%j0R`hșJtcDR:Q (bV VZ -2; 2 Q 0) WZ1X@SEBuGA70`ZM:!ؓ=q :=ԂwY&'2hhniPԢE *=: 6/qحATjpQA)^ZL$ $M) [k8!h]_v@xA<䃐eC*:62s!XVm6f^XzLaʇmc1e1!X ڧz=@Q`-B@ï@ >/Yo?[*(h)CƧ8KN{ 4 +7uN(j x8s7L%+kjHg@FEzY+W!ҮH|4rH:&K$#F<,8&b3Ũ(ArcÊ2QQ)6[D6#rk 2;eRՍ2PD[)A[GL{B2ْdY¡1>#瀶LXx-^q8LTC6 >8`` @b;)7/sg(<B{ a Ż_/dM.P $R6 hUc4&>}"ZWtphp[u~ȟG4BmF>ѯc 6_z֯z[Ώ4A U䱶w;8 QeBOq)Q)cqqU|{y~w@xֻ^3x "39/ʇ~q'"ǐ 㼤}h{a^y*Mw$`,¢@! r!8/hPaD qbTʫjebN8Ea,*~%QEALcTP귮Qc `p!\X! zX;(4S$ KcbȦ&T! Co]tpZ gr  K%%ab l7Xo#7aBB0@: L$ eKb(3b~!v%~F]1Q N`+(#|r 6! JBM 3 C!0qu1aaK.t.JL\¡ #xQ:Q q-Na&% [2 r %2 MD r!!!!2"%r")"-"12#5r#9=) ;$Q2%3Q6֢-m Z_!kR*~BBd"b"n"N%()[,C6 !tj)rt +64%brn!:'2- *VDF.YdPxm;QJ$wHBE+WF~o-31Ѻ#RDށ""l1@OD1=3'``^FR&&Shd9&iQRU6kI&+:Bh$ʘF `^Cf[F5fTmt4:Oa6p(+',tdK7 Fd(pt{|n0&"%p{<{MswZ&r:A;r /10&3= ʜaCC2/bL ,H 2! 4 BtHOBbH3D`kצV.`>o Jj c0đb K ԱvM,c$sw H~}Wd{ F|W.} y5;۞2d:"!h}{6aWMRR5>X3K&O]Qf0-hFBFQR"e(%$j%TZ/`ZeNg:ea^fNeeJOZ셡:*Tg]e.N"_]P$P䭣 Y Y@RP959L>/~&(-8m̀1*R@Vg!!Q .0A}gAaR|̇1wn?&oA;S5@3A{h+:Y'Mu'Q1tRgunOr"% =8qbbr,#nr4@MA!]CCA1ƕe9oyǖkoRXep:0+*Џ,@a ℐ@n` P@쒸Zaqn hhH(qBC6))P鑑ΚzK"P\+Y 㶬B5)裭=Za ;{p1}x$Q۳ ALQ$DZn l!J- MMATx (XmLC|l/{%+:IJ["̺{wT_/*pL JyۧcK8mZSyS{k@  _TB( B?4DU7ِZ֫Q6DUd5!b"|.$ :<ػ㴭UBؗ ͽ c|!r|h5nyy_a9\-7{:C{D$RRa(bZ,xr5 -hv%؀p<#fܘ:cJXPk;gr")=cU"(7Kp qs1Y/Lqڿ֩bX24lJaޜ&۩yPd$2v! aѤ es*8&!h5YZxͅ{!a꠰a9 IlM8,ū6JV<ˁWIR;XN8W}lAZ/H]"9E #:-P!f"6h"l,\!iw]IXo#eIBc X]P`4 |qQK%B5"O"n ARMn[DF&H=fE&-ATPc_jW,oݵ]+~" 7x}7a{pU?"yӒeW~K=B <0… :|1ćN;zX1cȏ$K\hAU8P 04HΝ$ V C1d@M`ПJL %0zG,Ă7|4ӄwf QJ1bT- u Iˉ]fb3)B)AI.yLjP)=}X0NA%Zbf 4F0DGSJE&'n eL&r t'؉3 ""kn} n=t!;)9PDL0ф0@J2M 4dJ:1/`+@ :pZE(GlaX5G+'۔oLdJ Ō앻& z+g+ &, &@F-. Բ, -Pg4R)n[Pmrʹ) $ '/;р.K K K`LE*mzEGs XcLp ; '$xL3¿*dTvsh@s @ԚXQ  \& @3\4MzJ 9 zBwɁ~6_@P0M斐9& rs *#xN(*?%_(B.7!|p$P H'"6\*KP݄Rd: DٛD Ӝ܄bjuRQ'|YHԜ Yck^TZ@| (H`? "JQ@ 5?M`*E?ؤZ UWZxaPҾBJ+@`.\* 2e)qXZ`DscDUTì@,6JÌcԺ($.8FQjj\ GP)(=/'$pUtB"e  @Id ÜBFY*P%=!Et2 @s }"M0I8G ?2M!Pa~@.s&69%a𠕻+=*@"F]Yt =DF1YÖS? x#3yirH@05 ""Nfzekj@JQ@;zAҠLr\0z-@Γ"` ?W}0Dm} &,S?*9'Vl.*sa8б3XB+G"8eHyhsQ(/36Pӊx-V6cR;CV,>kJē(4"Mĕ GI|-9# ((Sł8`PBBK`9&(SD\˜$& r0'f<́f$G24 nNG02 ]!014H%mhAkzc]iO`YH.bd~z.LIGmSBo2vҤ_v(f%5k@5[.<sSI"ڡ}8po(I (P&%WPP>/(k!G%O.(ӓ(~] |WJ }D/я+}%i)URә(ssF"@Ǣ~uD p a6·=&z}pe }A-`хԀch<Dy;0q F`ЁF*K d/=Pmv 9{9 Má#a d*`c ѯ^>6o^8ow/pdΠ xg7/fC1GT}w|w~R oA``lw` dw|`h{uXGux6# d|ed)a=({!9.7e V+ t@IArwF0w[UV8/zw5TuWy-Ui*Fi*x)ofu$Ht `@h#x@3hv!dP牽u 72Љ")()|dy&#qw>`U@h!dP%s12r˜FnOQ~GwHdy3Wp  ?~PMw7@ p@0RW} }ʃ|֋e#d eЋ7U'm2#d j ΐ ׅh׸Z8wH/TPw[d(A/T)V{tqwBq-p7)Ӂ @@@0vƀ!| X~E^,XY2Yr)@t/ԉ[rT>* wp֗g12Fp}4JpN#0W />`'WrssJٍ)yNNxs~'|RЏn2P 2pw7R|,%(8qng85oqJp6hVIFc񹔨D§Xh#u9W {YhRpȡ)dp,Pgl~1əSH&s:I`>@w䄀ǀ>䇟yɟ#xr`p fA&8XZR0RPx8|gzYP'Iw1>q߀Ǚ''sIPhEѧy9EWLQzZwb塚mx7gz0#8|(sq鉤hNȧtbytœ!AP<،%C?6[WHzՋ7J،y:#}KZ!wg d`aA0fu #<) 0 j{:pa=61sH)KF34}sјs7*U8wO4ʨYȞU]IwVWbɯh+*pwxPS Pє w@yiS1BY d7ZWѵWRpXЀ1P: yg ;  =#d|0 2'[{ % [˺aۺ+X;KQ x;{Rw k{w=Q{W~kʻyF۹wMWuիȻ ;ˀޫ|&;;87+nH:u QJk~PT{uؔGRl \M T'㸾۩<ֻxkQ[+g,lH~w32x{/AHq`D3jȱǏ CIɓ(S\ R,|X/ILB@4hx#ΣH*]ʴӧPv$*@Bi@Z {Z+ O]]˶۷p=PU? /F)e/ھr+^̸84-_3k̹gg] ;mj}!;B}63-zіޯmI@E>zB(~|6C\\΀eL/&i`Y9LcEܳCM)Cȱ &]xCx8UD=` XuewpJ=B셗$6D^ߒL6 M17 P@r@C#ACwقc`@*1O-s׸'@[$cQ8#c@(Vj^tQ%kh pIc! ;W(` D )ñ) >3,xC^9@`*WUԩ]|nuqB/sLa@07`   \{j.DcݶG2Zޞ X><($"@Q7'O @e7{8O[p D gN 9Tt|@DM6,-t?b9ImG 3 - @T6_CLxN'kG/pn?^ꬷN䣌&pC $N.^ 7;fT+4l+=pD ; chD0c\=@VqDal`q7!?i7ሂFu¨@!%1,R!R?8@aD>,$ƆӟH"rDjA0&zwE*ZN#ԁh` H2hL6pl f8G:I,LI>֍FĐn!$Qb2#$xAhD !Oc;Ȝr$e#3J d+'I@`nBYqdc Yrtd2Uyce3)ZZS*G.mB,#DSO4HgSAB)M{R (T^ph2a; Ї dEY΍> @D`Ѣx@-C;}T,Lcʗʨ)NLj.,ݩ@LC鐡N`z`O<N3"MA'=]@U< SS;Fҭ Lל>S~%`"cTS"2`dpaQ)` *-SY5yjH@] Pɫm9ޒu@ ʦ.@@ ڏ>M-dX\VM&Y9xvkWҲS4YXV4k[7$oq-\H-U󺥽HQĔ/> IUVs%&{_:e—qy_M̀[."OuE pr60 ul8gj1l^6ʆO3mn[R[Y%$nj,b22' cgtA"@k{Z''/L/nTaBvn2@uj%WIe.K[I^(SA Jmp)g){:nuaL7im4gz`" -D̙Lp?~,T3A|A,_Q;NŻjۂx6u㷾K6}eoG7}_@7MoYeη~^)uC(1@hr ;#fR0 qg")(NV+Zt3[]:HA{̼|H8w灤oὂw+V@^0O*_Jjg@z#ry"Ew:GW4nÊoW:>\8Ay䃑<360l;atp(Su1G0<ύj.i|g6/kD^H8IDs!"a- 䈣wWGRNh hD?;/d  aaL @{oE&m0;M @ 04~9,},x~c  ^@{ 2"H&Mj]|7d}1BCPta>w%j&_n 10&AaW]y"P } ']T)0FY9U5nR(|_2q4B&$ ^& &t(|g>Gm+W09,HA1g'aB.`IS &0RX""Kx%cvUSa," +$-j7,T#2- _k"b<*(/l|HoVFq+|PIb%0?&1фD2@ @\41Q4.XmX32%#0SSw|r1>@&XqR> Iu @l8o6h8BM39?I#:Lgw(`I{;57p`p1'/q57C46H4[|%EpR36350{BV 8錷|&#A+p 8@ #)' 6T2z(Д@Ey367Us1SOu(R'39q9SoA7Gg ٌ$aQ6eog"eB< s>>p39@ @P"؉5csv!\;D 9;9?S?===>` "U;; <" `Ivo&daA%5PAA@74~cH[03yqy"L1QBB5@Z>pٓ *t@Bt@3 DE p ?vEEІ[|5gu‰e'n<7n ד[Uq8^KKl|ڧ~:u%Ph AGE/q;v٨$#хRT[+𔩦zʉzL :'AlQګqw{7gwAx{{!QB˪㐁tw2G`xy1*1̺xIӗ°"-Ž%pX1M~  EGK%'* )X"cӂ{~~@(xȉ4 }GMۉu7UGGyrY(RxyB]ѼAsp0^r:dC1#: \g# 9=SӞY ><=^0\X BpPI:6m]4Y[qzlgz|{{4p7Rg T^@z r ` zQ8*w̮'xSrc~R-,8 S W 9 ngSY m!L8 C+15$C$b], `c! ~   b'GB"C%;jؚ qX@v(֫ &\&1>!PA +T3 &PQx3ݰc$p ΐ*86o=,JP(Qn)noB\Kp +xk:hI4Q pֹ Q3X"Xb2^Rn>ŀ&** P**3t8 p/Nf΍*N\tb.<6p2qSJEŻ/ spL;E~%@֘w% %{ͩx̛yg|cS p'(@2dr~;ѼN2wv}B0.C4U ASO~{@޺=^ f@O(^YӀ͔3&{]p_ݛ8{Ei@ p].7/EG@q5Ycb:]bS?6T+rh͔dc/tqIdȽ7@­ [Ejvh>}I'|8QDX@-UB^ǂB&股pQ"xgJ$P#ZR7eD? g]z; 8Rw4^ŚUV]~VXe͞EVZ^1V\uśW^}lVA- FXbƍ?ܖ0ȕ-_ƜYfΝ=ZhҥMFZj֭][lڋ ڀڽ}9P;< eFx{%Њέ?x]+̆4%! >sv"vLyp/K598W{g*X밋迫ai,%]xB=?QܑP пtN@J^̊U+o0n"D2ɰ`*1+VF$jƬNbH%3̫H$}1ɄnMj68 :Sp *!&z ?citGp" Ёi;:aNB Au dnG pD Sl#r. #rb(HhzRLk}Gta!SbZ0|@FIFwx@%L܈`#tr]:eeb7/UX*'/х p5&]-`}|RX~'d]gtNGqnp@[B"gj:kӘbK=n2YOMQ%)钀V ,Jf;&V ƈp={d4fT[托Eek:&5hRc&:uKsN,&k6JιU0bj}ƎvX(.Xx=@J KX/bgP) u3q|zq3'`-9_zF<B t auD`g5Llc%Bܣ  LFg,I@\lكJu:  p5@ q0`LHdPJhBI|!QBrK`EOX_3줊޶GlP:z$Q v9)@E>VdH 1;s8(؂V*gG H2cJVNI, 0 IFD0Q.hkuw 1dOFf6/rdz f D=3'!$9IX+9ϼ8Gt1DM_Z i,C@GF$,Es8#P&6+!7Aދ{\S{t%u Q/]@tS" BR RөO=u`gSWشUN$̪!꜅0!p]dvDLS)!Tbi'X? r)VKHbVVֲi:]ֳm1\4LTI,hU-@ 4,Zֶmnu[ַnp;\sV s׹E BmE{<`v]8iya>: A%&>]@x뎬 N&Wo9J%'chpAո). ZOvo(@BR v8qIId"&~IEt(Ȯz^(vmC@ ѐ}rHA 2 Mvbn"VS+A?~)Z֡jlBB;8n UЬ8XʍaY,A)3hew(A)_ F{4=ɞ~`+Rʛ4(z3`Ys7"(' 'N3Dq,bBqJh +K&i.*+P!eB +!r pfYBRt&STU yMЅx8-VZUD[]^_`a$F%j0/Rӊ=*Ȁ h,CIZX(0@q(S )PX=0R8F=H5ftFP3dLYv HrQ@MԊH.X0k:@J8P#Q稭#Pܤ(X 04Ѓ*HJ=P󸣌HZ3`I0Z(I(ZH( ɌdM0~)e(`GDp&`&h'(PÌ PM%L' \ P 4B$PJ=xN PP26:.:!؈}3H=H# WL}(B[+pوzH3Q×3fxS-rN6Jq4͈T:J o:J_8@Eq<Pl[3hDMuG PH{*,#-U&&XU[u# P#t ĀMMY SĊ>وpz("j3(1w3nS \p͢4W60쬨p˩A=˲O[SdH G8\ Gu,O@͢!ܬX،AG;ε(Քu' 0!dQ =PE e( <رзM&4L`/A#a#8yi*U@_N`ZryCą:%TۏaאT@=KyWrS5]MeR4\=T T8GPP0q~NCMG]{TP&#^MY}Q5uF~Q[P 6 ڬX4h (A BA{§ _bAmMn"+lbΡ6DPӼ (%GsKpONQ~WQv>FTcAPXCc˵{v U&f۽%]n-` ֨`8; #,P!*D9l0 OiV PLO 1"̵PS hd\ p'pTq~r>g@h !'"j XzH)7r$A;ȝqG,K]5(hMr0ꢑ:B lrW=^y(P, J) 'ms7!r@3{=O}yj,sXX^tL,  [׊ |^vX_CtLj/Y'uaSUou$v'uiN\^x03f ]7bfǖgxpigDl=l}x1?d$ &F%+_}2̆)}i*0%#Tr1mh hR"#4zPdBqxɌ_VQRD аQR2? AWa3oj0xs@xGv13_ROFrwxv0`v{ɗCK4_.{Tx2NНA#ߝ!yoIzQto ֣ OcVP3)&/|dt(ؖnVh4|qA'Ϳ:CI!( ZLbT^w ɇχƧ4bjW'՗'}P*xx*&)zRPl" \P=!+a!a+ޅqrCZp PX{V7b`EBĤ BLJ A`XMf$ZkVaP LgC6|X7㿑_#,&G)V^4j>{pаȒ WTH%7DoW,J` 9d<0V 8$N saE*wLS[ U%WJ3̈́ن0s"9EW#zu_~.5VQ^؇I mcDWR9i.CGр73P`mbH%A`(#!:יw*(:(zԣIU)#1n7W(G :LÐBᦪ2TM%kT }Uo(@CyCG8%, cBTC^aj[fqVGC[%iV~-[[H'P##>Q@+km!<2%,)0M8T!ej| T_|^!A.Q@[% +E^yvE-Ȍ5-nq(/:C_ Zuފib/hf2e)%-3]kRŀwG g@{8tb}\ɥ~:sz"@`ՑpkKDEvfoR n XN3+nTӁq 9A(P8;t(kavͶ'"_u,@L''dSQt6*` AtR8 H([dfI@4Jn\j3"Q.|! 5)iPU# MH#xp 2w#؄.,0zUA$p>yr MpLW }01B 1MpDX&h(mQmnAr 1#:Q#!18 R2$#7j8P#((4"BU @"D<8"AjG8r N y,zxRּ?&5 P>Q "p4|# f8@Zk Spr˅-'*[a2$VuA*]Pw1,f3,+:ڬPN.46ղ}-lc+Ҷ-ns򶷾-p+͞;p*9XH.v[8 dO`]E!A:a;խ5 E)F TyScF;/3e%AQs Ƚx㡾>y3]tj:P#0mmpNaҥI;$EY"9.]ع)`>Jp!"aI+1 MN 9ɐ ELJqJbnj ZH˓XF.ʨ/Jd `_*)D;y}|C̊]kP&J:A*p~K2u'[ɕi/z.,4в&JH\+*:)>!bPF!1zCЩ8'80G;,`$#!1sZvCpDlT! v:!喂]5b|0$9Jl;&!+&v8HßXFtTsDaȕO`]GXw⎥1?XŨr6U-*e ⋹s8,P0F mh!I'fdtc *]S}!=@ٜpbE]#790hLbLLJ >YD4A!GEC9 k㒡C 0j`p}n#^Ȅ ?9Qբs x{Zf("}!PqBGXd"FC^`]3C^CE>L1^5U=Dt+  -=@4^>,bѝpimD%DJ\ dKpqĵP Ehƈ?޵\T\%jGrQ0ܜKtuRGPD}YLR*D8E- L!LYϗ c]Gͤ!xUYF`܄אO0ExNRmCKK&2ObU v% "pЬnDȄ0*$g gd`vZEH A@74,dl~T'EO+GAq Da[ i8`2p~7Ov qzظeWfD'CA$D|nfd{DE$@9ju |CedIvG)C<'kRH_@Ok+p%z1Ot1)@%d*hRŨo@64h.h@ώAoʍ!-e|&! wv2=D+5/Q6dX w~5FJMk 1eQ Q0d<,YQ+)9/S&UǸjÐE>_M,<&lԔfGĨJDbD`+2h)M% D( <Ƞ$C7YhCO=$?YU= vA]հ"O-4ԽATaDhČ#l^k` S6/?C[,WyU=8:C1ټٚm>` ULݔ,U]v m,lmY#؃>@¨Tˮ[- ڌ74H%mLD%*n̗`N>L.VjeyeDbȠ0mBAyM"x2.]I>@ZɰIK/5UR je9Yl@*m8e) &&/0k@oO0W_0go0ob]D h a Ѯ\ @ @j M(wpDB1E'aw xѰu xLk Ce؃J C vpd(Mq WCpWr;T L*xy1LBIqd1SG(X8 oPҿq ǟeq9 SDGAGmq c2!Ejw]X3.|]l 9ht^u +,[Q /v,RUYr #)m2)CM#;?t7\]3 mu, s52Lu(-*4Zq<<= >ZAX97.qC2gǗʘ52튉IWloCGs=؊n&#:TFkǪ3mfdGJC2. *񚯽8A|]%FAAHEW6TvD ) C ܠLE˝CTE0"]ŖJUg0a1X#]U_u>7ĵMAQ?@oP6܎dftl]0X(ӢC/!p I@㴧|\Mr& =ԁ.mjŃ㙟.]^#~_BAN@2~V_~pg^Cy"$_->_/ i; ^CE=x9@yP_^-FC/x9S9>wਫ਼ vw J@ '^-}Kl8yvy*$ۚ۷ fDsauϬ4m*L,V!][0Fh-5 a%!\Yo:ɀptuziWPBD:I!"3R6!Ed b9aE+E':"VgJ]H %hajtaeqlb"Ř>X HfPϮP"z(R?HY!!Meru ˾ۉK'ËK&6 \Fgt!"KGJ ݊ ʠ4cc|mJeg}CܕDD[E|CG%.qHg;#}d:3lKBrB*yTeP˘ @oPtD/Z$E#@ Jģz~ ff?|hA/ͼ5twINI™X~*ȨRw$\" Ah倨glj'Dr\~Kdf%U3ma2珩{Z;|O\äg%2& '(C*$%jeX[Gϯq;Z>@T7p;: j1(t@ O='d+ P9 H@I$M8Gk|솎i^hQ(Mt#(5AyjO@ =9PBhYgѦUm[o Y(C`xpf%S!%#tv !м``E΂wQ~Tr߿WR w;Au%e@. Gm W݅ Lȸ4 D7b(Cȣ +3c(= t3ֱQ 8=+F5rB8RҮ2ºJpv!FrĢP '^ o˪Ł .*٣/kl.jj#M쮱* _kR)2( 鮘 HG >S`J‹ 2f28 N2)-/m EnO5LEsHS#!3Jx+1X5Mtq T,)b|Փі-M?GeI%IYҨP25I%}IthTc1Rg* J( ^MT]ʉ)<#!}p|D{@2CRd#5M,a&mqde4ᄛr:48|hH٧e_2хL<F.Y|p[J4J9kM22:f6ddHw FM|!bǘ 4 EuG\2CVˏN:rkjU*+&h<Sܢ(*s"Fi{d g^d$Qr_3PQz.n-&vg(8 u0 $dFu#$bG0Rfբ0$64 |CK0AW*ovu GmTq#PtSQH*?}q4藏%Y#A>0OhG9JHDvp #t $ A¢i㈂ Y" '$!Ы:\)>Bg5!&S {C B ' lE0OÐS+A= 41ْ*f:p7C1 n6+fQZ 8p4!9Oy,XcfvuPӤ&=Ovu3<@MDco `F3,PoC5{n%5IB<R+iӤ4U[hz~G P1".JJ%<@)NU- QUn<l5Lve5YњVmu[WΕu} `,+ ZRj@^CSXծucݧLV5G*8Oƚd=@K)(Y)2;ʦ[V3ZΖE[`ʖ(ϕX -X1M[($ERw,:rTn3SizfmkIy:ROf >R=/xVj+T+VV&d~h-%+%M%S]Ȇ +_S%@%*b;flcW)Q1ö<Y{i"` E!?>d#hb|0RhqZ](.s?*BI >6ǐ+C,Wvaݘ'<{b(6MH}b9d( t M:evh:Xĵ^RD%!E 1nr&5B@+ Qb2#[Bȇ00 "u9A5-f JБCN"Ȧrw8XD<d`O_=!|w1x.vE AS)  qO`(me3rU-5]uG%h7q'@`鷏|DIr}'@¬r3vFÇrc;Xn&.2#O2HZhȋ!o/2d b-J 鐎/w TZG4Hoj<A9F3 C5"0N,`R\( 3#0+V6p  #iMt\PK)q<#/#P]rC `7GFn"C#aCWYCIL+ +9^0,0c*dO/'$/@7HPBe#и*1J. rΆ2R0BadmdL҅/^d`cElGB$3%.`OX¯ S}O 4#ЅqB VU$XzS"E *r1oRԱ)ޠl&f8H(yaDA e `TXe""ol& (`gzFIRwe%djjEm,3k-#Ag4. g,*bΑh3iTC3Ҿ0&p(wƲ@R)7 )()uH"(0Ԫ̥8+z(w.E@('f(n֤:EȂ(y&%g$hЁ>!$8R"0(!F0H@pto&Cs ɧ)!HF ,6˴d4$V v3DE@n*+D&qDYEjEkDsfEmF Fi 6tuG4HtHHH4ItIII D@ǯб,@b:`(+B`K)EIM'D@ban!h!΀JG,haش,@L!R-@` NWpbHx`QB@2:U RL|-N4)-~UC.U㴫oFQhtNfDOa(FX V,P!k`-`tRTY ƢDJBZ@@` &t@SbU8PɑVTWC NVɪ4, Y%uPۢhA@xQ,.Yݴ^S53],]5a 0@&]z@ +Q EJ( vCZ[PC'qakUMan:bbbUYc+ʂY WVQL!R fqJL`,JVdBi(gRVqVrv dbXbT>aUt+s;΀rqc+Rb]wP`lTY@a `eOL!MUyVWso s g n{s3*s ~|o P#w {&XGUz#*pGx̌A7Z-0t)QVriV\g(6)rMr/3 v5s$auUc5tgXid@V wg@ .,6RWyKъyVL`=T"~{`w}. ~w {!v|%.Z7xY8hӀN @.h$@2Fa z76oqRCXoӔIVQF7@|?iubXwOYnl3J`dN@8vnaDW @ՉeyMzA]/B DF!f`AQE#Fu {z!6"fCH|*@0@b`V5p=5q1뫵XpY=X6big-%naA58 Y5  #"~0k` *T6gmf|n~kC=hp`W@.'FZZ!m;8CiRaZIy 0*o~OqאbH:sXk@dA(YviatCv YvaaRy ?QCۺᙍ~z~@Ml6|Q"巟qV"Y3p~V# A96"= 0d3#zqin6uZ44VFVc9Xթuz 7MK!y3 VQ~؛:. n{?#&y:Jhk-o fU6>{cơ #ڷKXUznK9\č\KjS|6Pz4! aX?ac)N3?!; JFԉx[E@/"53@o3N@o3~ٗ2~},P #@`2ָ͵ 9 &[3 h:&%X% WWJ?MN3ȵ)5ӓ #q=wdK]vsEa<#8X}J9>^UԪ9v MXEׯ)PEQ׊lXEaH>wEo[fyAAy QY+= `|F<e|kY 8|(.(tR !U#6_GbeFshV <0… 1TX0Ɔ1nqaȏ$KѤ(W| 3̙4kڼ sANyB"%N'JI`P҄(漈ԭNm5رd˚]jՄT?C0"PjDQ^VX*X34L8Ō;(N!ֱ3{ :ѤK>:լ[~ ;+;L+ػs۷P3`j$}Nw̐^5r$G c#1gmٿD>_GF]m]PDypwS$tQC 7xY Bt`tpx8Ƞ7whh<G?jf_xArTy`$R$'d%K>^mR w.Py)Mu*ӝ45obYdI|dn&I? 고r[؛"ʔgA$ɉcY4)Wš]*(0W0Tb=frywSE8k:㫘ZsX d!\ xPƹd|0{n0oQE*|8#r#v0Fs0¥B ngV4Ё]Tލ~_F )<.JާHPΌh&I3!<3˯J7;ۜ0y+a2 @sl-G 1OSO9Rd!e]"ԭycE3E$F`pHtAĝ`9; O93ir9= {ώ3'|FWn&գ 2r>XE˕$D=s/ȣO(>`8)grGZḼe u! A ח4Uūo~&N="U`M`;? F EBBB݉քYg| Oఉ,X|m' P!XvTb>껏ܒg*+`KT(.U1VEZK(9@ 軒>}0;"=`p Q$s5!zcu %*TL'ªX&+lt]-ްd=}jX^ݲt?ex)l%|I⒉(/-{ٰ9Ae iˊڂ8bLC4!,οj0@w@#yU@2 \E> xT=Fp"]$HIR4.;eɈ~WrL_^ba2SC`~Q!ЀhctzCq)읷 4ȥk}B ;AHA dh9X*`9\߼d'Iu!h> *idqZv*)F;߆/Dmf2ϛ H&;,OUV_dmx`-G廐*_j8<~ qц W fVWpԷbP#kؗizn/vAҟFAc mxA); +D~g6y p  ^0 Pc"Q ^ 'C{| 2mZ # 0e׀  Oȁp%Zʠ >Rٶ~ ^;pJ.8exix WpQP(anp"t`qD)yw)PT R ={q~ 1 xP{]B?x!' ! 0_J| `TL{ $(STn06,av z vB@yY*n#K,@EyPup uj5I9t2ESvpWX򰉧c 8$pqA +@zvِ+Ѣ*I9(‹b5SW@ E1it8zT 5|9pf^@,~ "{ٗpjp QvXAx{ 1@ /@0s_EFp:py 5yV ;#1 %I3w@]0PA`uVǛ У ^ @ pi7YYgowby镸8 8]DeZC 0p<pW pxЂ J- B,1p Q8yxahv!f ` x8)sԉђ5o',x-S&FV^Ձ_1 ҩ)Đw5N(0Qr=SAXr^fs%9"!ǘ(Y_UAiV% pEwp ];`6ɰ/q:1P Y4ة6Y=FZq5Y "'. 5i`ʪpr:S*Rb4 Oc؀|X6i&"ѭyeZ{ie ylS>VVxUe*X9ψ`J_(1`g(${ oҥQ`&:j8ABr@ A(((a nX_PдR:%rTcߊb]: sE >cKe : %ʓf%.y 1j{ELC{7аTWz;Y7*B;Y|g3y,;˫9Eʪ+ % T":Tngw-[[@caѨ5i ?:*`TDgumTl)p" Srq'Gu!5nW[H9!J @a8JyL|`kE eʈA(-78 cV pg, 1)0Zaj(P>%G2Z@lSħ括Z&p ES:q5jP g(\7RMyB_#@5`@&'e!kSLRSBք衜K~.o 琄ɮ70vVI)av̫]m |47|8P {@=؛Ґ Xw]ٜ -t\U:z.9\ȁq7yGVʫ @0: 0~i2̺ 65YD@ [Ɛ aE;X^;T^  Tң\ _ |$@ ڠm>00ـ^Y 7:ձ8 ^,6-m8F8H!G3}/fɩ(EٍQpܥ y)SZ5_9!q>΄|xx@,e{z-@mVvP\# @%,brf〭ZI^UDe] 6aJkj (T4(ܧ]0{c6)"^ Z瑱=mp]x0{ Ka+wz6(L36ŋB:Wlh'0 ЋKgअPNo' <1CۂD$.rN2@NoаCЊ5 CwG C0!DᄇKMOQ.SNvJNEg'V=8x&N_n%\Nds<#?%` t w K, xp 0389;SYUp3sJG-# ۋoN>.wqh q . 0 N҄8R^%$ai.!˩;i^K3B,2)Z?:/UPRbS O@8KC;E+)Loz(ѣDdqk*[AQFzȡ_p*ө0?'35HL,̧b*y!ͽ8Q-`9~@  fږrsH"مu^gswĠY?/ȱ G WP n'eFo ĈF`3Ï3O<8j1 pչ  J$5iK +r Ȧ)ֻpfƨn i*VY!z5,Wiծe[qΥ[]y ݐ+ p9/{❜͚U@3F ,9W^Oi 21+[ D7s)BGJU:bZ.ȢʖlYWA~۝yկg{~H$ Zȃc¾O<$ڣ0 <\bL\'Ȱ5N#d2n t3 F e@+y>"z0m<': \>,rK.;LƘ!~mtozW,sx!I,* x {(q +W+ <rXb5Xd '/@Lh Mpنm-jWI z(M%u-0}a~hk@ q 'M{C{օB%t{dnvf]V,֤Y%ct\gڮe3"|g)<:N&&{ܱhd ds~`\Ft`T[T܂ QGz(=<H|™ڸRG Gz`*4Np*&^kNɇtgvuchڨyK H7ڃ~x⋗+xxQDx~{dߪ.M_|w}]}~P$` 8<gw 1P҂.cPΠdPNBWC\P r~sZ^c0XAKrcLt)+`8D` shyA*D8qUL-$Fado1A4zi|Eɂh WA!tilq-=*H>J-Y5C&,FÕB^Aa¸\OINKWQx XTʵkȄ.6i268=kYL`_uƾ$_͏((q@I[ NآbPqt!; JgnQ"҇[Q;EUsd>O9=(VFZ2+({w갞XAAڥ#Il17Чn9Mq MIHԖ-h"}rn=+9D &TCcylR*'IգxD*񚧎x%ht-ik%*T=hjSW|T :Y $GCAPG>a6@@ @6A`KgD 6@D%HZ&`־6Iq GZV`ІfNp{HjK ptԡ(pD;܃ck,J0P#ix@nwˇ91 _4Km @ YPߤ飾A6WhGR`bm#&G70ϥ~+ނ U36YiAED]|?[ au-l[6<(-^9bbq;ΰm؇0~fk ǏY 7- E2:%ՠ6ǟoSĉ>`>7~F`ϺַCP}\!{ yp9%~ Cs/dRap$^[q\!#`ZU8/g_Ηv{(Ep};?P`+:j=2DҽE5n9~:GJ AQK P~X ("[!оШOBk%Bʈ+"Ua(y+*程K฾" | "8 A{+{T B!0 kVQ!1B z(JjxaG) $X! 0@lsYBh$6dC@2#z:(G1B(x=ncO:3B6c!-j9?깙Xx! @ 0E!h;J*AEh!M \ rW43N4D0ЫR$g+0h 7"J EbfF̰+%FeIJ b+ǂ(GBX>V>X,Hg|E0xTS"N,h0HH!h+P=P.ĊFL $ *4CI\,L8@Xm?cD 8GlAfJ˅IRd'4zLTSŠ,Lg$ L + >P͈0G;qʍT$sL͊J&l(0h}8lB čU ͠3Si:9 cđE:-8EF-Z,*r$̌1Rel͑ȃlj2L@{x0HJ¡`L#cF*O 8[O `܊s$ȑDaЅ(0M,*ŤɊK&,#uVكt(, BԊȆf>(}G 5ӢJ)e8lx P[`\I1)lP9^ N #Ѩś9oPTI  BL?A*@Ո`UhtPUhC㤡\d1[ S/R(-|Z U4?˵@ɢ) 4VпDCrJ=W&UmMԂhr@DUjE:* ѭtA٪SZ6h=}Org5l&{z}8nsԈq+L"P;c;͇`=+̙@\ZR0ZM53`?z`a  Ax֏H}lY9|ڪUڟ ZSx T; ҹpٍB9?r˄mLW۾+؏ Y8GXw %D0M3%5}ljHܪ )Wf9EۄU, K$j[}-ISӂ@ s\Rz/[-(ۇz Q3_Q(^ !_|,a_p#}X27"h{ɏOuHIߗěv(\JtPIմ@iؐ|߳I(;˩+ Fpz< E8"\XIx{h_|؇9D*_>?bĊ Ĵ*ݵ(p3< ,Fpi`E[/>֌B T.~`1"kcV]D%2h r8rPj>hodH]((iX jeW)1 \N.!Ke8q$8YVAGMX6% AWfj~) yh8؀ ET\a^ Mhfm8SЇp@-f~g !8!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,f-8*TC#.HË V"Č94#ȑ"K6FX pR20ΞaoX jECSEaE۴~q`PV}[RU))hu)m>tT$`TU "޽qj@9;XѼ|ɾ40Xye_/sdGG/O#ج]E}1v}OH(|d4Nf\G'}t !!/eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R,tf HA\ȰÇ#JHŋ3jȱǏ CII  L$DaI͛8sɳ'? reї < )eSPJJի6( DR,Dd@,a[pʝKݍjMrD+^̸cR0/(C" s:wV*j2  ´<\F4߿ J?^μ&GL37nمҦ<؞02>>e“jNVQA'( 35F }*h!P[u8p(4^u#u H04]e%BhbZeiS0Qabr5)dF]iMhІhn盕Eydg p =&BEfej衈r].DhWVj#I@RiP[veŝ\j-'i8X9ЉCgq\[ԟƮFk)M|ՖnIPƈ }zS~B'/kl-ZmڈKl.{, #VlkbwQ $ 2K߭e,0,4l8<,1;s ML@G-uItICa)|]!=pcDImNҤ"_- woM,]|#IN:{4PME;NA0h?l0E 4C2AsB6L )83M#?$>8NcC/<0O|Hѐ Ne?+?&ЮO=sc̿1H2G=uHq0G0p\dfo^؁.pȅ20rL24|:rhC;rCNx@t2ayG B8C84wEp%$% /,BT# /i>xG*ThX" (`z $KpVwHý%&1GRC ADFf` g 4F: ŕn~s$2xeA̕`^ d$D$^yV2" Bz-w!eEA(s!x[ |&(8E#*ܦ8T=(BV2lħF@>ydB:RrA0=SB-@5Y9`+$wx<c7=9J%lJGT HY%EY~ >sPjIݷLQ]=(:zXl_҄"A aN" (Xw"'{@B({^u) kJ$!_MXK젆C)OV2ζ +Hms %Ű+%ђ-\ Z5uKɚcGBK>PC h3R7<ny7cVd/o/JIX ,o22Wx0Aauc-}7܊s!O*L|㫜CPf y#؄/@W죎h+-U[E|s MH?&MBrM9w~k,9NWH76oZwK𐇈mw1wD;avVlP|; F>QI@$2'mٻH@ X"Kw"$h 8T / vft^tɥ:CP۰6Qt1YYg*:";УjS ;@mui xQ83?4{v3y+DCTDPBATr@ JkWHBTecD:asc*zԡ z*4 !E{4dCW4wyGFRFlԨbdBsDHx?j2i iE\JR7q DihTE@M&*)Kk<T U߇ŴM'p \wAقtL(QIŴP`ޔj3S*(ZO!ZȜ&PPR=Aw*PDʢ QLZg*iV: ; Pk!yQ@kkڪRقTQ-R&XO`LD lICR)S7eX`4YU@(wB@j7 @QVƘI [X=0WPWx~GTn+}ʷqUVmKSꅁ\e fT_(Xų3)]OvZI0[EPJ)plTiU\9/ŠA]PoG.p[KF~>FU e[eS1\ťF][8V[F faU(1s_Z#`*G] M&v M`{tA`Cէ5e}+iCaX_.cޫ\T?% 3`@fdNAd4O[o @  hXZ1Pgh~h Hh ِh q;m]к;A^\Ee~=TkffɠsuMn6tkF#32)R5)R˃u@_>iP˳>oS%0 Tm3ȥ0zߖ4FQpc#>̨XPEQXwvjkLF>^l3!u?ȼԜ\|2 +"; Cgyy镽I'A5%5lvDL2rΰK-!N\6_*dyHfhhr=,8Sx$Q0\=`*7>Ӳ y8|9w,-#]t]=11T8!LM,P2zwwc>4,S #uj<+YvRgғ|Xwc̈D:z@o@jԶu]g٣\2xϰ ۪E'[8}: ƇxTrY{F:p c\ZDKC/lB(dz|=$ |T(,$Jh"Xyg. Pf`rSz :"L,{a4h$y:C.'rHZd)a |wIKK ׇ|F K!~n]~VL*yCf FW eSjͳ*MGVwP;? q ]ה`NVƴe[P,PAŀ_q2{<%P}"U ݉`@8Qw_9X4jBYCTwfY@5M:)5LK'\UL0\L^~\PH.:k\ Z Jc^Xe#65 9aըsdea ~F6[ھ >bs b< ,F;N  ~:ZŧRa&;p 0 ^ -Aa;if1Tn 8y<e')оs%ĵ= MC%"Wu{|$ɛj.H|Ǯ@C s0o(4۔}6hܛo&qWO};%mڦO$#G c6Ԝ z_5w!F)^x[Y IM&KI=)B{k!*'/х  zф_* Qqr"7@5rX%BC|y$0@`/vdtGo͐,F,э+hC3M5dMX#*)@g*8"4f;""g.Ј#^AGB2,TG: Ӑ!tLC:zqF\"!Z ctemr6 ;V$* 5MU̔Mk6[mJEV{W0 0K;-bɍVp'gȎʬT3"s4Q5ܹ\1}!Jٍ@8f瞷:h&ڣd̢ ɧ؃9 ^hRL*:Tڪ)L] ܼTB<N> pe_na˭ :6퍪6uvgc.r/<12Υ i;:v!3LR@7.8q :lP9xF hb]o ]t=<^w}G?}y* :\RF%IZZAGtT4@0Fv]%8[ܡt?<}a7rR !:+">І7LH!Mp#~ 4  ȇ264QƑ8W uAh(?ЇDLtbH*7 Z%\pq^@R CT$ ^A_dbH|ga$%9Im L=!ifIDnRI#5vC @Xq4QeD5 ɳȤ6*V3#0T&5Ш\ԡ}H^ S# )#$)NvMF@wӞħxfH.#S>:P&Ԫ.}ҠhD%:QVԢhF5QvԣiHE3"=K04 @{2 ~!OtґԧA'n1 .E,hO#(-zPA"<C"F JTD~AV58q'xE32S4OI0YU&-K Q%{jMXbx p)(VN P#4&b=U[B6 `kl.LEnumA` OGX4!\J*S6NJF  MhhbЖ$=ЃdRJl՛a kiKn+ +J$AX¤ɤݏu]=^=4љA^^s]C͹?w=n33:'۞xg0`?`DP*ap\W5QS4v)ՎDYʦruC"9,l M`gF3 &` ?hg' vfN*@<׻!‹ $jهatYj2mlpQ4)S=]p;)cGgdĖŮgXZ-!=CVFHXv, l rGR>*]ɧȀKP {T=nf'|wv|;a Sqw?b?L8 sύtPhR4&>0Ihs$kqĂÍL bϰb*X l`|6$!ɵ(0)76?1}lt5bw R?Nd +Fs).G`U#xg0:+ 0:Z `<@AC@kг&xSx3/*zy-A(axraN!8(\r`A0 1.Q #1Z6>-m .A ,/BS?bpk*[s\'Ј 3«)<3>Į[0ii`H/@2! P hwAVD58>\`p23&/"6Z?P3^??x"S8H;T*ޑR;8@sP9Q@ x<'Ak<® hƍG D:+===DHQ|gq "W]EӺح#)4]#*/H**Q:(b̶ ?&S 7Czəix#9J{,w+C;ۈ*C <@Ҩ3& z1@ԃ)JC/zp+Z[E9܃ȋX4,^ۭ\,ĭbI,":p)KSp,T.t{0PrvS;T8J3J0!.'N|:&h6[ğ7BjH }!"![ $C" ʐ|XMhH7 &D]K12]4:"' 2 -0/"12?x -*%2P22TȦ4 J73$ P3hC]742D}>&SB胢p(K$Rp !PI5x48)8, .5I 095Ce7DЙh "2O@WPDM]Ъ8EM4KbZ=NuWՊ9Z[\]^]Q &ZQɘѬfhUd`Vg ls2V+Ѫn=d%ðra)W֢xo8y5pd+zkU4.eDpj!P=}}||($]شjeX`N!}XX݇0舯!Hؓu$%tX>5, xm=P!tVmؔZhHX/,`YV}P چ ]8XF а WؑDPٳЎRl [U_!yx556Xj}x Pͅ aӵ HȺRX YZh V5m(L3 PkH}Sr!ՇU3V])@PP^P8އM}A0W}$]_t R`ߢ=@8\\NO{\`]}ÉSzir5;<`{P!Vp SpM_~9B:xx)N>@#Any/%x!ZHbPn{|d9Z8*/P^*^b'x&v{♄>v?Gqz):~;Z }TȇaY-Y)#I3b1,"[0Y= o!g*[@(hƔL#ZkEP 8_iZ X"gy,6YGpI oa ;! tJY[ܓHeXpFoaՌ@kؓ>!:֩ҟ` Uxق J؇)HWp h̼`gkHL>fQ3J0nR2Q~~!+by@A}~H+*cxF+HkP&(j9U8 ~WMd­e.fy74}Q,MDjGq4yp:0A8F 9E lWHXz{ 9*0 >#q=:nb%L Nkn SL񤧉~6ܧ%m :`} !om)n=zވK}dRD:lNΞV{hL V`n^LczmvjiHA܁.&7#x6f!p#Ո䁽}[%8PHgw97Moщk$8-?&'`8Qr~S(]-!ŞVl,pȖ?ܦA논?.@ 0  y"!3*xLM*H![:{LTQ~#A,ڄC2xl#8rkp8.&"N0M\4Eb"cЍ_*?m"/>߉">Ϗ-\smjo:#oe#jDJ"& ߁iH4ݼW;wˉ}85=xoW/98\ahOJ5W "`Q ئnP:hW}*!'iQy4Mʍ}}dtݧ/Y[}_Gڈ"Oפi(䮏8"f ~ PE.EB[ _T\0iprxoH_ ,hP„2l!!>\%RĎEܚUh$ʔ*Wl%̘2gҬi3Dj5M@Y"1A چRRj*֬Zjׯbǒ-k,ڴjײm-ܸrҭk.޼zU{ɰ/ Qi߅ (ab0m &+R,@dN 2TYI ! iCArΚ ds7}W=LcVv,El~,PW/Y  Q=0dbc~׽/҆LC@-IeV a]J( ODأ9]-D$JC)1*wU)+@.LA}U$s+3T` 6d7wT&[?ʼnq%ӱD% 7`aݙYH>Ln0@B6L`Fص9fa 0 BA6>CO P3 O=uO?,\c>ls?Co,H{ , C4† M; wN}39A {F;;pIH>hM>x8@>u0G=u#"^KΡ#p=MHØD Z/_taYR8a 7Nꑋ2H(>400@ #q p==38Q#PCR=M:@)ꢊ(C&8PGI !r'> : *a.`GBcC͍ba,VH ?T~jii yc##QB~Fd6ԮH" Q!x (!M($C5Qx@H}&DsRa\aABY~L|9$]1&3`J &Gg l1 `Kaf4TuX]Ɛ+9jVHvEY8MzIXXfI rSzA+WfH`(= ^0C '#6:`˵!.d b2&4. PcijUH)iB%:T *g;4!D 5e X gթjf@㱚;0pWvm" n=Vv(2-EPRD@2UƊ5\SA+VЏiPLRR xd$ퟮ[7@JNC[+A 1LR'{=ľl{z qXQbȁ\`ѫ +NIapGTag)+[#KQ R  w[b핓1^rq#LsN$8k16pjj%d>^8I`|зJm:AvUI|wFn )&H$&\Yc,W6a bGϘp5v/N,vbRQ hJ#Hal؍oj똱j{eY\V;}$*v<vRevreAx!Jh:Ԡ@&[,IG($ø{}RDKQLbDh f ~ ڝ i~ujw*i a5֍b ŒF [ ص›r$ߊ,9n +6э~MI;rM\夶adKĤ ͇|s1p㌨D>u&{.F بaк !+IGa ` MBDг.iGdwF0'iࠂhC|[GȀA!|(+\l?<2}>~yFpM قd.M[y4Oٖͩ_ EKB@=4J!6!5 /4<씞@NƉ D C2 ۯ\QQ%CF9?_Vnـ :L=@rqMȼV-C{,Y5 6t.6L8DۅK@ j"vM{E$֍{@ nL+j!8PW2uC;CI *LK(v ˔UX+b" ĨW V{8t75 `1c":_$R%R)>c+VZA7F֚SuP|$AE䧠$H *vE$KC|Lm JLF)N҅>eL6=(MfRBSЙQJK)#%kd WQh^%_Mc_a&b&b.&c6c>&dFd&&AU(@L&gv_Fw-udh]; ϪMuxv@iRDi* zmZcX ,&pLBrU$Ib <&n^'vGYJp,81ƞX4sexvDme|g^LP`ኔgA`?X]E:9}dBNKul"OjC$h76kㄤ/0Ld?X1/><ҁbƄ'Gqo9D ҅"'*OψF}ZS`]vY>(@%)$Ht<֩bd單3eW!N<@W{%C@UV<8iֱ`S1l&o6=j9YheU)RZݩT(@ * @U]!*D"]YqUW&-FljFk`YjhVAHnkL@%؍>ȎK\*r*ڈ븂78k؋ȱT ͫ٫@cA\r+6,J܀KE} b)_.٤X}N% mRjTu[C\"E :,jXjn\+L:\޸Fx xɶ]%DAo>}̊IHlRVо"P-s5b B (b5 vCaBN n2^o-O*;c>ߖX $2V"z̃ݘẌ́j>D͍q-Ch? x( 88BT DA.R @tsWL`b@¼ =H XLy @#Df2 PN`j=8{8sH6/{'W 0DrDwp} ]پrdt$P%..P/aA {/L#PϐrB;( C s$ũA:Q1i}8/ mug5:CPH\HD >H!m5b? OC+X{EW D6bb 1vE2 FboC)siyUI@""Ct Fӧ 7V-չ`$A> 5lYO\6qS׍viޠ˼ZoQtMbTP%@𓺊Rq]w)Gw|n&H[ ktkѷCsL9h2|r 6̄\&0ZN(|9 ςؕx5SԞwϸ٘칏Hפ%PMۑ1ןGĤ5`&by#cGX7{D7}K9iȁzL F,BX KDmK,߳u{7 Ĺ99Z8p^W~d׍Mx\E < *^#/` 2n @˒cO+á_CX!nCTr`|\! 596>uQ{N(-8I.5^ʠyay0~3yF/Hrs}[:H ~(hSSWL%UB3#ZC+j"%-1â$p"@(`A&DX|EQpŻ8HN_:jc0 j1 s@X&FI0?xUO]>z*`ޝ.^75kvuxpcǏ!G末g/H yM#w|߱W}{Ǘ׿ P , > 0@ŴIl 07;+LQSm"$eR%Zd$F)sKSB%5L(#%S=,g+x`"iGsD(5lJFGL=E `: 1 PlI`9tٜ, I2N("%; =`>UH}~6 8 ܬ[˂ (k҃ qGCp\@R1@TL2A>1%TU hRl#;@=pC>6(oh`3gˢfrU`EٱYmIhH(2x0lC`QrDq=,8`4~Zx,2D &ʽ0SiZ >=?d Z=c HzCS@S6%[oXzhCN &$"uq'0P'e"r$  ϛp" ~W]~: xHpɹk%VRgen^Af=5/h鳗> Nx%eίeQ(,QSv73e $(~Qq*( .tCׄ% `  A..Qic+! r9 b`zCETMfs}C pp;j҂ l3QM^~r@SDAя|t'B*M-OݥDA"&@ KxГ$D+0ـ@**+W ¸%Ht$~  `d!^;(`v4Ӏ^CCXRL6k"'Ti] }blL#$Gtk8 @ h1 NQBd).v)X"mQ \0LFƺ k  NN-ᢏk@NBRv/*̬zwPAsD 4T @S؎1iZR1}3Yۓ15N]cF emP8ADJ_ ;@Z&̵HQHd@"0&x'Pt %n!Ȑ>O}tb: `hNx@F de`9T PP eb U fE&[ 8= ^E򅗠2(Q[QTlþ\(Xi09 'pV)sT w= <q%H N$@%Ueui39\L)^!C荥X6փ9R *lp ӯ(PʅnC5`,[T!pHh =QDnkbuA1Śшlm1FM4||Έ%'HR(tD2%PA>aO1@чD-#Frp馠|ͥ{^mG2gxC"YA_7ݤLH]*|h)px]oyo>!*rY(p0/{:ES BwwT05p0hp,ւMna| Lj|/w}O@u}X5.لP > c0~da+ZfX?>륀O¯F/ & A0rm"j@So"@@!0!#:`…3 j@gAR pE. R06"~B B 1eAwPb #B! 00" %P )^.,N.:@ cP!  PgvCpeC@(:)^AgHP(A’88(Dhp"ʀ @&<E@DˠA L.O/z:/M ) R;pB{ B6.81!Y*" !R$AaH!#LX$qԀ"Ƞ < 1&Q"dR<  '1&1_tb H| q :@:`,.O2|+'mz.u"@'! AA p^Q%^+! ^q @1"9ʠ B&2FQ ' ˀd2jk F(P5azPDq7+- e- :R32:1#2Pq!/0&P U4 (3r '8 \ eSP3qd0fs13c `?a5#,T_:"}7h='  @~-.0 ]0}:Y5^2@"0 N"P<%S :d_`+ #?2 @C k6%f` aH51y B թ)|@B A R8p1;HE53^Q/QBA stGx:x2r_\AL,P`1xڀeI"f3 F{b( <,WGcUZExz@v`aqtշguCǤ#.5a&٥X8Nqn2Z#a'`aLHxuc؎XA5`tA!G#,1P!6,`v a:oi !qwƒO 6aTA;/)2H  78 әa21B0.&]` vZZG8dZo:A=v g;zমa m'5BHp,nV5 dٺ_ o. 69QhQU ڒN6!!:!9 _ʬ{$+p]3 "EI*. '5wA2K yy B&R "wp@zw%t!֛ Ǣ V":Ut> [KԺ^ }}0xTZbAি$ 2>3K  8Y@ oŻ8 ;PFB^$)q#J-t.s=,!޴h0W4|i۝!7V,<Շ5+Ԕj߯:}D`XT-$ˮ=_ڽճ bQ#D%'V1WHr̚/hXUoZU*h\#2ףrbv :ċ?<6ۈS@!mW)9z ? ޱea|# u,@@o{جk @nU4UU QC Tv%EZ 3[Us#Sw7YaEUyur {GvG6YBRwERdrYF .U aQPD$1GfffjBQ3D( BBt7Kt%UJIzqC%"qgAh!>9 }0M$eBoZtB7Ƽ%2JE$tC`89ЖA#K,|'dsNr BO}JEII Q#dij(k?\nm݅k,i՚6)2Ox m.!/vJv%ؚ /pf H>8dQ^.DGV&䃇}z7]2";χ![H/Md>STh 72r2dIBFf!:ԛX eA%iqǰA>ԺkM1Ԣ4HOM40qSʹC9(.+t!y C6x&hMD^|:Þ2sEz4 /^pySGOsz.O~90h?Drz:Se&|'1Z>.F#e7L@<< Ї8r(I1\m`P "৏z^: P6K P(@\ 8XJJc}<@͕?L0 g8ϢL rMed*s4 vnϕp eAZ7܎;̠2Dgf2#!sA'oSeݜ[ 6YdB@  E/ь&GF? s2$-IOҔt,mK_ Әt4m[jz, şAꙜհ~ULBGܐø!EGk `ӋYr<mĠ:RM Lt{rqIH Z6"h̪ )(iI⠖/ϧXkhb- z'#0~'&0.!̸j081D> i@G.8 ;2NXSi[.f.xjT s-?{^ 6ӵ]-zK2\=mZ 'c9Ram?6k C$ԽRҦ ?*h DzCZ B!Xǣ]h'`DYFNp ,1H Q.D@!UAFV(.Ȭ@!kc"r?)^hdQ xplE$ɏ@JbHH.@!VΓ=O:1Oղe$ q҂wgJ$` 1,pRl݂H{4%;Y0 fQ$8 [Xzt& NΩ\j:;m-M[WDD xg8 B=g^ d& Q9؆OIR !!^f5R\ZR Oeg8Ů<Κ wpS. |ɒUٳsY!7&_G]5Z)1%F=P\aj"bxKu S^~wsSa/9 ,(PZvN.gSk;{bn݌?8+4!zPAZW2_}ͩ/^o{z{ XJ/ RrA;8 O[a{ X'rb}w qp2@wyRRtAo`tp'#{[QFvv&DŽF{^gׄ TBg;5^+aa  5P)3\Aqchf^'?s[w!q61 040 DLVlx{VVc(k{kK8h[/1$g\P` 0UWr4>! 0d=2C3gV1p8T?dp#761Dp.H.`=أ96{Io^v`UX~z{GvvAC S`)% Q# @d=wF1 $dgErgFs%Bu OC?CC?6xے_rrȄpqbx"wlfhN&)V .3*uTwutNHSiQT镶UV BĆR2XynL|kɖoVC]TX{ٕDȔ'uS1=ə[V )Ii `t-eiQP9A@)P.0M*+Gpd;TD/!mPBiPFS "st!+0!;/C hRWq;"+8 C  i7TBA=B8tg8j8*@V Y ې&~HP,IUi"VEkop,Kz˷h٧+uG+e/~Ԓ{f]{@ la`@p;X1p]$F("²IUnG-hg#@ֻ + fphK,"a18[wd3Rn[<)CX eCeٕ%&<#X4&M@ P0&2P( ٵbnARR p8@y$ U1'S"G9p0ͷM 0"5P5\P!aa΅ ,AB*`3Y)&01^ u0Sq! 'As;g íP$y4!*`Jx~d**ςӤN.A.A0ri2R.J-S _7':g$ E?ZB0^*b-0M./\0˙M&wfK-LOmAp ` wP*,AR!Ѓq (8Wt"o0uObB1(Rs0(z.'KKnp \M,Aڭ1RJr mW-HqmJtF% 030lZ#ݚ} 2 9%5)W-w22P=RhT]q۳ ]q}\ڝc׉CW|g+#` T]A* *n AbH1i&t#mО@v KsFXF81M^ޫڂQm& rZXm&l(aPr(ͧBǤ#!a.x0a;WXF0Փ{mh}:l &Zs%Wa@,4>哞m:lh-{.`1q\Lۂѧ~詮.wPa dq6'($C)TZ_1U@ n Csp rac28},BRy ͉;v+(~cQpn4^qnWq!F!{ ghJI> \ .c%ϓ 6pn⛳t~Nhq^˽-n啮2=,%tBra٫Ɏ} ( 1F-R*_;y+C3-ΕR,hP, ; cS@s\a6 a* M0tápxB]=BԵ EUj bq!^ݵ[: wɁwsƯz?2̔q#|}7o}7¬+[-hp\o/>1T1p8+?5W  #X`A L!(\8@P@{4"P4M{`0‚cK9'`6(h8P`dʕ^WEwq0ȞH􉔆oR: [~e"y?tנ y@5eEV. q@4mv # +.y  ~0JViK|U&2)x(kl ۆ]t1o@o사CjJpV٪ R;ZC*N{vǓjK;A֎bϽ ViZ<@(s@?},y!y:G}!&C*^ZBLH|񱥛H}BF:,hiQ#n'\(K}‰b|eo|iPR@is)-"R?\q5i+a}XѺʔ46I%L.mЬ'r},H|(kS9]*Xarg(LP\SD'U ^׎@G5?Y8-pB+HhM sgSwLIUJaTx@{PYM~I-RmZ+݇T+D=0DžoQus٠0L vYVfXKrjzkk::a̮6fF(LgPUvXw7/6I (q#|r+0e Bq2'j1gwV jt!{3?Ep"_8 }( A"pLT@M-.C ҏzeKjɏ1^K#A.t6%imW"S$9MSPiS]YTNj`tP5UJ I=SƔpi2UU]+Sb[T*UE-jAXY Romiba !q9Ia[u_e;JػҰZ+G{F`Si[Į&o%)״4cSשl\R2Pȇw)r7__M WQu[{ `ոMܕ3dӗ-/qZaU=q G9bX0N:q#ES!)3pWƵqPؖyT|T2ҷu}z.Cէې-mO\f yP-gʁ,rˍjO%23P,K JWώ]Grej>ɓ6rh ҁ}eiZkK9k&)c׈p zt~4_ `gwxTf#|Ӧv{ZKrUMh[[&,qsVpN3ߓPFGc@\1>:\oV2 q1eyd1y8XDvge>ŏ/rO=1:|ŕmR>yKpޏpݕ~\h'ȵ:y(j)>i1k=XгU]ąwyr8qv:C\& vQ'W^$*#Fm8ivYŭ^2Ԧ3lsş^J$K: HEڬ a:%W8r?!yCo8it[NdL*/JN~F=FxN=F$I`!I$ಟ8:%zFS=9)tϊI>Ujޮ o𰷐pz^ȩ\oz<| `$9UH~YFz$Ko-#.5OCcfϏaQvbZ (4cyH܅`b=P }wJAϬ#`)$Y +rS}(q}a,3Ǿ:9õ'Mm'wOC I)[\~A$Uñ@` ള}N,}z& %L²qg;0fQTBB+#y]ATb Zt$%U6RTI&}8MXچ)Y~CWBCDܕƒՊ6cO=jJ4ZD&""\ IR$Fyg%hD  gLJ[Z"> G}$Ot膤 *ԓM՗e퓤 149#P\5AiWdԳNf;ЎMj[ζn{MrNvMzη~NO;'N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNxϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘwЌlkX֨،ԈX8׸嘍ip8⨍(h舆Ȇ!! nvbn@nvbn-desktop: ~/exp/thefuck,h H*\Ȱ  #Jl(3x1 *p㧃F(>ݚQŭXb}8-Z,O4T: *8+CǠH(F~Xw I A?fhbDagRL-84:*ѬT0 RB9H*0  ђuٱ @ ۂ>)RĘ4Ф &^L=]ѐP5kBNԬv HJ-v%&wt.s\@_hhYL}@ b,1AYf'0XbpHLt"r)! Ԣ4`%E8L4o #A-oUiS%x DUБDBqɷ_ wL8Kgaш%)K,P-^(ˁ/@H%|B t^b _1 )b?&| 'VVDEPV?D0N01kb**p.d@gl4uyۉ8 pvp,v.0M@)p 7Q@/l y ^2W6P f.A5pB1Ft0DK ?` Tp=Lj7h\+D@|~t.~m%ˢ-PHYf鹐x`/( cl@ p@lZFC?SAE%eQ&;1M:d{^5gqtl"'™ۦխ[K/]gWZ(ˢĔ@% 6DU)g6=a N=eA 4<OgL`͛ӇN@X΄53L wޭ/ MdGNxg[@;h޾a@M>h&xS` bO##q&2x.рA8,09p4O2H :dM>tf ܐc8Tz0H%$@ ӸZ^, >{8 @%Ӧ.T =x=<0%f &袌2jBS \B6w<0)RE@4V s#L5T^rfs("%rǬv!'2jA2Vm96*ף E:zWz 1X R}s*U GUz (<'o{4PUI1%֖i[07<-rPv͔Gsgop˟i,WRCKfDB7q"GId:MQ?){kr66;[!G :{/yr]|~)r1\G pe)Ζ/?G ޚ5 !4aU,Rk_,rnU`d 0T Xwq ԮݧRUM8AXɔRh}S|1A4]f5Kb3 8:`yTV<ʑ ZJja)U|~ g`3 4};w*3uX K8 0fuli@:0ke1ـ ,2 u8@/PVJ6ZtoŇ0TCS+4QARySV[ 7di|8968Úsc6qtEPE(0 @܇T57cD624E2IC=9]☑ЦA"/?e6!3ԙdהVK@ GȰ;;p镽85)kl6; J2ZaHj#zY.<̳#=Sc==I^ޙxȢ;dCxrҏRiAT+4DMtA^%pfLuo9Q "XL+nFHӥ~,Ԩ'@dnh#{BBBoj4C*٢GI?tL)H ZD:#>"&sa]AN9F'rzjI@XZGqPIħ'Rr,wK2H]:N9+%L9Н!GtDc6 wSHGHDYH)TGwNS$JXqQR~0!Z77hZcGwEzȤLa0vNirThPChiS#b wޤ NDM&LfR LkZԤdЊZ$|#[(+z',.02;4[~qz-4Xq:ϬLc;|!iBYk$C P"CE̗J =ReJ;В8z빶5C9j]AiŜrf.m: $*aq* t 0 s|j:VgEmU QG\P(E?tv~>^~@T>(s>2H+dwg,TVN'.Mc{n`5w;jumQK >19{CNSbSwTyXNXKLNrY5c1 AiYc)+MnF#!P'86V@Scc @-`{%SFD„p3Ŋ C#|yb Xc^U;|aG!  r&X1B_NsOi%]/ē{VXW#p PV#%Hv"vt5`ŀ#RckzSrTSQ0lWpiTB-0*/nёkv&ujI9.-[3jVee1.:|ңK3ch@~ 4Qp.679{k9QN&[lӜX͆U418R YpIV~ԉ>AVf in@bIhe_gjkOdc34><0';|/f?d7 wjBQPsw@tl*$sa.tC_?ӗVEUFP] m][ AGc@{pMCS/4Rs|ov:NAp6DwS1,߷NO@ DPB >=e6q#g@-fuF*rh#2qj !SüY )."$%$-V3 F+?] T7DFf:@X2 EJC UH;1KKQG2!ZEGaM=#T2UpRhPB*0VN(P\}4yͳtd5`}\@#2dRvQ*dvaPSdjOejC=x4hJViA=ܰyϞ_:0c5Rv(aQ.mч'r/ش݅L9UP]Szx6Y@;n 0⼳e U҉V{S?$(Omvfe%x3RD@9P`O1%T_} 0dSZ$/'p]ߛ`ߝXbXe'2 |T dd :8̩Cv䍕H5)b#z BD~:s5Ё ؀4T&b|-Fu%jZ(Pvs30z?pPb۔ u FLQSbs[|C֍+$!޲kգ pdumolzx_F&8a0Hp,f5`R APn"(@(]jAQcj>tsZ_ ٴ (HB(M˄2(20T5XXȬ)涴+W/sx!FS O(Z+kI+!)8,̀ONyJbBܣ y X kǂPbj۪@b8e[&K2cr+2,c3P}Ӫ 2W8@ ؕ+oȀ7 0t:/n [R l}k_/! 4z0_}Yx&Pymf;Z6$ qu!'FeJU--b ֧MT.\pE=Cv4TU\J!3 ΀TAbk9na=! 4eb: `N 0 x"@Af3)HfTo;Jc =Gw=b#ihAPȋ6K4Q`͠iM8tH:SM, ",|nW >xMɈ ٳ޹:,MzIŖѵߵyA Nh-)Up#Q$> E)L{Q\,)OԤ,5OY:h,[V,>l֖>]R+`Mv ԭ/)dp LXs#8?x">乬AU:[!C`T5q lm@'`u': :pAl@Px# [X p.q٦@ pT(Pbz E鵙/ d;sl)= 8-qB,Y„0$r0,8*d\ʌ.‚(s#l;! ÇB{o8yj 9$)DQx0|a CBBZA0:9CFTƲ{=ʇЅ6pCGÅ >ăh00rcAEQw؇0?*3DF\E`@O,B8|Hf"ƺByC8Ddc,IDEK-vBԇ]y`$G+,W ̸Ņx E8|  lx)kHGrE\~4ƣkFwH`wy,`0 v؇}P 5xmÐIa~@$naȆr;PP ר a shvtD؆z[JqIX#}Ɉ @7« J*KP[̈Z Ghʧ"dpvX@0hpJ2=kF* }8˦x(@4̇IC>J0 KLh{`x1pxxFXb|^ Nr;M$:x|Nସ]GPEȕsKjI8EXFHrJX#@$B2Z@\F*$9|H @焤KX},̲K`,ȁixLhѤ:,\) h$Kh(GΥxb,Bȇ:HR /ȑ tI$MDaxyD(ÆW@8#4-` E0Ǹl@QjCӑ:o  P{Vʣjz1 `8EMӈTg Qҽ{j3UhS>" QR=Է{T}l @TV9[-Rծ}P\)V ["# 3U=8SS TݷQ%)P~/B\)NEϢ3 W,: S0;WwW܇| Rr, #?"\JG {TIȄCh̒8ذ]Z8nDU44,ТőUXX\Zלݵx :hBFFsIքp!E0@kK,H{F8X}HXP׸m,M* syCRa cPoxӰ+ >(VF Ed-TMTʥƊr ۸M\[ 1ƶ ɅBS"D Pڮ`]%ХVT]WƻŰ̵cp8:UJ}X\]=۠I[@kH|,'|;́מhA Ѕ(#>!_;(n؃8J []ٍ Ek~\˸\`t,[J}0DX GEm,Pܷ Sە E|m]x[,Wm,@v5½{`b& `XC*s( bnZʈ;( (bLJ@*Ə35!>]fKF)8W-*]`8xZSUF3Bcnl8!GG9ZP=LS†dFbp"SR `sUtbD+҇*4A@ $ H7X7_xĽЋ ( 'tWXKTڊ„WS$x0(m\&Z% ;z@|[+x[ XѮ( f ]xgVRmX h_ )Vd}(ZB9wXZ؇ KM iɵ:Ucxt p  {z>`Fz ?~뫾XMӭ,̵ F }Xd$ ݨ(Pxq`P=# ̳VlV!fH`*<Χ&nϘP\|ȆHShR)F޷V Lj`,gƐ؁EeHefo0an~H@apkn7GWg? DѸb?/1HsD, ++9  ?g0oAGrz585TlO*o^HJqOB G I(iu2O;']H}u %NuYxHw>ؐA6jwH N0MDچԌ5uI lR귈m* nJE  Stϼ= jо: {d̀(!JD#4rz5ONKI3ТG.m4ԪW꺤u]f,?7d;,(!TO wX@U,t(5gNx#A_.IZ+"Ҿ)j/ ~>(~IQo*wWO ҞkDWN!Cf0͋tcAmT$큶 Q T7SC>N$Ηu#n(EG]wM}M>a?C53QO ;WM= @tNF9 Tݐ%Y%J:)Z@rX ' qɁ]Ҏ>s9|)xf#@@mw(,T+ Ԩp8gUmIaojMľS(0k<9<Dj+aȦ}l<:+@mx@`;%Z?۱) ] %GE@ޙ'(/V(e*Y^w)QK=5ըe*@ eWISEO-C?J"%w /70 0 SEI|Mk\kٔt$U`;sv-x5ߌӑOĽ#&V@Go,g vn tw_͊Lz|0{$txSEw' :Dl'm 3<@ͫWn|w>Et(p5W;2){\D݂W t1 ^$EÇtcH %Б+5 TAL>!KTP!F ٧dR%n%3*O҅sK6/{o"8AD;V>%@HNb H'r4 8 ,C Ҙ Xb;g8,İ 3ԕ= -VǾ n6(PjCC`S^ 'U$(C9 `W ` m6#A71X]ju@d )Ac06V|CZn$!3[ὰgŘ~^!FN|]n)貊B5w|pYI\޹ 鉛'0p2"dwpXPMAN"|9J x98 J?`zMҀɘbc)Po,&p*$Є4!2G~v  9v)\p"&)4&);rT7OD>7 _Ʉ.U m/-y*ZFLfj" *tb㨹F>3>.vz=0 _ 1*@> &(.@'¾IHŬwBKrQ+ ^~`‽P&pA 1\ P'[:@CDz*yW/~˵ɈuuUK A*hU`hpO"KR=L`N &m)Q&L`ST8+ā XQ6QoOq4QY7Woth T)q+RMsӞC=x认LS קqPRڇ5#GɈ|־5k0`lP4+M  /l-o؝=l`H5k%íu;jæt9e{5Fs}KsSHzBOlX ꍀS9!"z75E~9=SOZߎ0:k\ f) :.zS9'|4ODv@G+ &;U5h4!?|~l#`_lC>9ݟ;,M$Oy[ʈ?=S[I?g0u4$ #\m+۠G[i+ >$^4o Q^o md&> !yHknp?!`d#lJdR-DX0`dK`F"F9.Dxdtd KÝ=d0plt`J$BҜ  W I`RNap|_רM GE+P0!Z^ɜoepMaTvH]4 !)@ ! MnBŌ^tX!JKb pή ћOC,̭nҨB ((T0aü4Qnpj䈠ik.""<*܈ &!("5V#ʥdcBOʥ"bP8R)`O(n#A T<]d-uY#A$ȹ$G,M 9փ,==xR4,ٜPZ!B9@G*äZ70q^6@*H\e^f \i]FDa&i&ٍp&h @M&m&^å x0m'qv#F/ǽ^q>'tFtN'uVg5kUrV ^襦 PqvJMzR On^)VC D>0ć9'h,o"'H=y4TM@ H,9?q>g/CuU=|:H~8yY1ƙ,OeY,bʘFaG ͥ9+k~ǛDnrDkJcG?#8~ߚ&ꍱIa)=,KJai5*)>[R(N܈şW0.P[s,>V>FK4t B  FabFDl)9TòԢ1]U\EVut-V YlcX1`TRC.DXFL}^MQhBXHD܆mUVhXL-fA\ub,nHr.R셦i.TSbF.S7 \)&FM}rnHT$AI5.GO7uE2EJI7r(&V D'h^1V>]J٤dRxx?k2'ExRܕ/T(#b-wYsn{r4n.>kZn=$Y)Xr-{*YHuˇtJ Οt険1w2kMBwN©G#DD@郋a،* :, mۏiXC]l%81x8G"ڏ o _b8@|(,@#{ P B)/()B77~)@y% }=@P=SHP},S @ф` V( F"4za0!EYP`XXLBZ;}9PIEgO?:hQG&UiSO8U&M@jB Yb=sRD(6X3L -Y 8[3Z]ەF :+ ɧLhdSz(42E3 BAN JЉ(k'L<THeT frU1:L(lR4m0ZbAֆt4H! HH!]it 46ٜ2~* Z }}<^K@Cϓ .##iD`wpAGgӑI.Q&J *e1LT㊨ RK\N/`XAZΊX !XQcj;fJ@l\' ` * '~ J3ӌSTXH I!C5 'D#P≃&OA]t 7"BTz>Z]eb%aC3f%B1ZN rHv2rY.`M_35{#&`O(`@ؠ"+xG$[ N[<`G987: n\&@OYX`,uw_ٮ`"] B .VBEFP9 \a*2 (DJ\Nx EDJ". $96-@@p'ܫqX:)0", -$lq!-"/36?4%ƃNupAАBha)ZBZ/b]̢;*%T P!!&3@Ay %f'h&r "J52N: nc€vA"4IXc=I"}#w # !A>me7zF dBF"] &AZ ka[),PbgLQ 8N}%b5q\SL(j ʨ(@N8*we 5yћ^u{_Η*nDEv`w `C-:"*8"<9+֣]G2l88ĝ?z_Hvbxa!0W]G$х`=0<׮q;`0uK-:Ё#X(HbPt0q(Iΰ?nCkf05YԢ]ff _ь;>4PЁ$L<ꉰKt# J"%;X=͕8B־@Ar_]yuȨ "o2|#^>h:|$`F𰇑p*c<+ v7nFL 6M{%a<0A7^ucW`b~Cw@R`{(d(Cͮ}'vĽie?܍D2 𫢧T.S0,culH qt-?A3#WcVx>7&ϗtw7p(#n|g8>#WD<9$d2v o{KEP|U ^! ;SFX[_[^OHr, X4Z,RNoBo mjA! JEF l6" "ւs&L 01尌$$עP~D(X 9rL a"RZA OQ1$ܮ+>@h /" D vPڧEB& -9,OT10fH;r.1B)+:PϴZZ@'#,@/Nc`>2(*|l@bZ++00< /6h [ QErŞ.Ӄkt"" !Ρ$)M̡X0CL^R1!"jP=3>m%J l);51N5I"::r"ǐ-|1##>19=^R"N`:ըs>,)Gs> kCuMLȄ#:4% rT~T? p.ҚtGt@/mBfHk#ybQ4r)@Pز4N dtN4OtOOOuG [@|.4PKPTQšL 9~$>U"(H%ҴTvQ=ŒUuv'F@Jf"R(K̡ (4ܔB-\~~DEb3".,~!p n@vRNOn5WG9~;.WSX%]61O)N"_ku"`@bY` pY#]5"@_]!4Ua'`t!`?BHWiBRr~B v aNB)!a9LZ! E(`a\I'`vQ?rafmvj!@*! b\ :Utvn`bn1&oAhvVwl1 lr6p5!`d=R V'Te{UR`b“b#_rOV i#Ru(@ku! 7QYu|BE6gwa_aOԗUG~U&"PFDAFW{A|MB}ws-`tE&CX K>lA(Y"̶C]"X"$,A֐A aIcaBJXd.L M<#MZy e9b2)ڂb AyㅅQ(`XaZ)DKiiW"M$'&&rxU#b8ts-M* H*!& !!r&`&!67q!nw&+̆oy:JH&AA J"@^9gyX`tV ۚ$"\erioӒjAlVNX! ܀my(6ʆ8 ؙUV@Y)`#9f"6W%b`!Qr eCd.8m+Ϣ hl&fuMwObh; H 6СQ & RgfIF.țxXW" OZbG?"mLN/"F .!AU`.6)Jz__[afO,~uFLz{?E[Y*VOf&R!! '6?Vះ"_WD]L}B'kd [⇫Jśywb0G!"_Anu)'/thJ!`})6{`yƑ(@7Wqy\Q*!dnWFĒh/"u@zX&;' JT#@AR޷54x&%W&³e}!84)(} !<¸ });'w 0`ws-iW֕\!׫c%#:'cs%ǧ/,^G7 J<[!˥=}s[~]i vwG"*ۚ6A\g7Jm5Kࠟ%]g~ba! "p?{sA$WiX+`0ƍ `Eˎ;*t4H>#si`TcǴs^rL P*Mqq=}OfĹ#?զA iW&YS}Z`X[Wz49BGl<}j|a >8Ō;~m *Wh[3(o\IL J&0l ?.Z6(q Lg7 Ȍl6A*bӌ#P;dyC? >&AO8QdD4\Q o #AFBԣ>Ù|5p9U7"`l0gb=BHR@:E#p6#>gr[8mL3NtDpE'Cdjfn a=Ye.|Ljq"F瞉UfH>rojaG 稝>lk'cvl |1 вb`rtӝVIH5԰$GO0xtu{Z @tX0++v#cNKv4 wP I;ne䴓9@| }J 9Nuz|+rS7tBݍ0^O(0LQ&S#L&F`9pMM`Ӈ ࡋ8I*^m"_?أ& 뚣槳ο?s -eu |술XBV*!2GWAchILЍb+̪R P F@Ps39A7A(Ota'-||92dQtM4F7=|5REFX42#E (`D4KC rR5 D|yNk: IfC O\Fgez!q7$B4JԃW#'#@P$K]*8V.ƊL["hK2nЖW /  -CLc^RCrT:Je]SN<&M)PQt0 IV4>¹CB#D<0G֋wYRόr)@o.*^r &-#xO9ZWViM_ RXF`FNVnYIӌ  b! KlZ68Q.*Ћpե\mE:ZnLy^*K *cJy!Bza G&)\liP=wTl\ 5\!]D[>aU^GlS)#j9ʔJUOP*XTT(ػv3i*Lfc-Gx3cƒ`a,|y1A^q +:[1΄ur*}WoQȉ+}^Aխ5.^k[55GA\We$.w_|`LEdDc%:\>D{ miJECCLQ5m`^2pc[< 7nj%- 8|0r,IQ b/͏oO0?YDt!@Bn ba&V B Xs~4BSo1h1P&E!  M<8-,8F$p7; 10:x@ )F&"w=7mW*by3@F,3 eX@8y1 jaH{) +ho8ux(H`  5HÀcph,~؈*!I0x)$ ]P3[q9,;!ps2Kc0 :kaa2V@XmL>_`3G { &A>5󍄱@ h)82 ︃l|s3h' p)-r{}B3 w`HэC\V'dH9i}B p瑤ys!"@3*? 7+3Z4bxi!$/937:y)^Y(S RpH;ŠD  m%nY"@DAv3it)x.P9 qH#YǖHQYi9( 3 e1waqNRw *BEyf3uː&  _!끘 n#_ћ0dn;b< Yxuy#B[a8yM)#2I1t氞Aɘum'&>#)h" =ѡt!*3 )'M8rH"s!*' , 2S>j"{9j!BHAP=j:ÂZVGE@O!ɢ cİ%("Prm oD f)o}S @pqO:=GB0dG! ^ n98T=+H  u8 xDX(@B 1z;ƦsH$ׁNp+fЫ9#^@NJ(A^ n,[]0 zv4= % (y297*NAP=0e$Ȫگ'aO_]N =RʭJd[JS`6>^{zJik 4H)5B\wC9̩ ~"pv;Gॊ!PVL|ƍSf żkxgXaп,8`PQ\lL霞đcwK\+G|P 7@0Lt`eqҫ2S%MvZfiS|v+A\) Kn,,(+mlP@՝T6ل|Ư ɕ=$ Q0Uw6[*-؆6 ,y~l*.Mۣ1($9`؛,Z׈ECpؐ 0Z[ASBpaôp1 !"k'~\@0 {Wvޕ-@L4+ wЩ G"| (ڻ y CHԫ/k(1 0$AaD)n[MEG1^MmD ;~݇&|ҬMT҅\+1e mB!0u@ZcہAAOP<JljVDCkkʀ#(Q G0ؐL15c D`~ocA+2Iq+rab ?~ 3V0ꐚ&Ť  8;+_b` `-:r~Y qvxI` ~>?l!i~6\',1 Nʎ[1+;AN_b8qCIv]֙D /"x!ru ,SoA B4I;6ujaUKܺ0P}ɬ = }4Xz Xy_&\aĉ/fcȑ%O\e̙5ogЎ3n<ŐUf F$|6sӞ 6ܻ}[xAK\99}mzq뺟>\/ܥyLJ/oOzP$ȋ믾{}ֺ^GzQN')~ @+ ?>79ziKŊ@ v)sI2aLpbHHB=[`~.b-B`#ц Ƈm@lF >kp#]('*kUAO|`3ٖ41bBÛ#21r:ھ9^A;E^# w5yW#G/Z $"WH?G3H WtBHȑ\ނTZEmHe-3C:ɒG,J@R$fdKU"S|IvbFSӤf5yMlfSf7MpS$g9͉@F r  `CZrN|Ӗ%-fb'8)BqТ@@cNP ' ,j>MzΘ4XBF0 Z,$&)-l* u1 %N 4d8AOFF4N(0"%֠,S}J, !h! ,K A Y|@%D]S B!UNE(Ȫ4  &QX=Ѓܰ U}ÒĬ8U+LCX:UX*S X8EV[tB0*g{/2dklhfVFgi,ziA[ ]N ]|X^ZY"(*L L௧om_DqI=J@P88r.rƙ,J (<3L P0ϳR#ʣJ WL<  XŒJ=17.1 pexpect pypandoc pytest-benchmark pytest-docker-pexpect thefuck-3.2/setup.cfg000066400000000000000000000000341261610017700146260ustar00rootroot00000000000000[bdist_wheel] universal = 1 thefuck-3.2/setup.py000077500000000000000000000026731261610017700145350ustar00rootroot00000000000000#!/usr/bin/env python from setuptools import setup, find_packages import sys import os if os.environ.get('CONVERT_README'): import pypandoc long_description = pypandoc.convert('README.md', 'rst') else: long_description = '' version = sys.version_info[:2] if version < (2, 7): print('thefuck requires Python version 2.7 or later' + ' ({}.{} detected).'.format(*version)) sys.exit(-1) elif (3, 0) < version < (3, 3): print('thefuck requires Python version 3.3 or later' + ' ({}.{} detected).'.format(*version)) sys.exit(-1) VERSION = '3.2' install_requires = ['psutil', 'colorama', 'six', 'decorator'] extras_require = {':python_version<"3.4"': ['pathlib']} setup(name='thefuck', version=VERSION, description="Magnificent app which corrects your previous console command", long_description=long_description, author='Vladimir Iakovlev', author_email='nvbn.rm@gmail.com', url='https://github.com/nvbn/thefuck', license='MIT', packages=find_packages(exclude=['ez_setup', 'examples', 'tests', 'release']), include_package_data=True, zip_safe=False, install_requires=install_requires, extras_require=extras_require, entry_points={'console_scripts': [ 'thefuck = thefuck.main:main', 'thefuck-alias = thefuck.main:print_alias', 'fuck = thefuck.main:how_to_configure_alias']}) thefuck-3.2/tests/000077500000000000000000000000001261610017700141525ustar00rootroot00000000000000thefuck-3.2/tests/__init__.py000066400000000000000000000000001261610017700162510ustar00rootroot00000000000000thefuck-3.2/tests/conftest.py000066400000000000000000000022721261610017700163540ustar00rootroot00000000000000from pathlib import Path import pytest from thefuck import conf def pytest_addoption(parser): """Adds `--run-without-docker` argument.""" group = parser.getgroup("thefuck") group.addoption('--enable-functional', action="store_true", default=False, help="Enable functional tests") @pytest.fixture def no_memoize(monkeypatch): monkeypatch.setattr('thefuck.utils.memoize.disabled', True) @pytest.fixture(autouse=True) def settings(request): def _reset_settings(): conf.settings.clear() conf.settings.update(conf.DEFAULT_SETTINGS) request.addfinalizer(_reset_settings) conf.settings.user_dir = Path('~/.thefuck') return conf.settings @pytest.fixture def no_colors(settings): settings.no_colors = True @pytest.fixture(autouse=True) def no_cache(monkeypatch): monkeypatch.setattr('thefuck.utils.cache.disabled', True) @pytest.fixture(autouse=True) def functional(request): if request.node.get_marker('functional') \ and not request.config.getoption('enable_functional'): pytest.skip('functional tests are disabled') @pytest.fixture def source_root(): return Path(__file__).parent.parent.resolve() thefuck-3.2/tests/functional/000077500000000000000000000000001261610017700163145ustar00rootroot00000000000000thefuck-3.2/tests/functional/__init__.py000066400000000000000000000000001261610017700204130ustar00rootroot00000000000000thefuck-3.2/tests/functional/plots.py000066400000000000000000000046401261610017700200330ustar00rootroot00000000000000def _set_confirmation(proc, require): proc.sendline(u'mkdir -p ~/.thefuck') proc.sendline( u'echo "require_confirmation = {}" > ~/.thefuck/settings.py'.format( require)) def with_confirmation(proc, TIMEOUT): """Ensures that command can be fixed when confirmation enabled.""" _set_confirmation(proc, True) proc.sendline(u'ehco test') proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'echo test']) assert proc.expect([TIMEOUT, u'enter']) assert proc.expect_exact([TIMEOUT, u'ctrl+c']) proc.send('\n') assert proc.expect([TIMEOUT, u'test']) def history_changed(proc, TIMEOUT, to): """Ensures that history changed.""" proc.send('\033[A') assert proc.expect([TIMEOUT, to]) def history_not_changed(proc, TIMEOUT): """Ensures that history not changed.""" proc.send('\033[A') assert proc.expect([TIMEOUT, u'fuck']) def select_command_with_arrows(proc, TIMEOUT): """Ensures that command can be selected with arrow keys.""" _set_confirmation(proc, True) proc.sendline(u'git h') assert proc.expect([TIMEOUT, u"git: 'h' is not a git command."]) proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'git show']) proc.send('\033[B') assert proc.expect([TIMEOUT, u'git push']) proc.send('\033[B') assert proc.expect([TIMEOUT, u'git help']) proc.send('\033[A') assert proc.expect([TIMEOUT, u'git push']) proc.send('\033[B') assert proc.expect([TIMEOUT, u'git help']) proc.send('\n') assert proc.expect([TIMEOUT, u'usage']) def refuse_with_confirmation(proc, TIMEOUT): """Ensures that fix can be refused when confirmation enabled.""" _set_confirmation(proc, True) proc.sendline(u'ehco test') proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'echo test']) assert proc.expect([TIMEOUT, u'enter']) assert proc.expect_exact([TIMEOUT, u'ctrl+c']) proc.send('\003') assert proc.expect([TIMEOUT, u'Aborted']) def without_confirmation(proc, TIMEOUT): """Ensures that command can be fixed when confirmation disabled.""" _set_confirmation(proc, False) proc.sendline(u'ehco test') proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'echo test']) assert proc.expect([TIMEOUT, u'test']) def how_to_configure(proc, TIMEOUT): proc.sendline(u'unalias fuck') proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u"alias isn't configured"]) thefuck-3.2/tests/functional/test_bash.py000066400000000000000000000044001261610017700206400ustar00rootroot00000000000000import pytest from tests.functional.plots import with_confirmation, without_confirmation, \ refuse_with_confirmation, history_changed, history_not_changed, \ select_command_with_arrows, how_to_configure containers = ((u'thefuck/ubuntu-python3-bash', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python3 python3-pip python3-dev git RUN pip3 install -U setuptools RUN ln -s /usr/bin/pip3 /usr/bin/pip''', u'bash'), (u'thefuck/ubuntu-python2-bash', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python python-pip python-dev git RUN pip2 install -U pip setuptools''', u'bash')) @pytest.fixture(params=containers) def proc(request, spawnu, run_without_docker): proc = spawnu(*request.param) if not run_without_docker: proc.sendline(u"pip install /src") proc.sendline(u"export PS1='$ '") proc.sendline(u'eval $(thefuck --alias)') proc.sendline(u'echo > $HISTFILE') return proc @pytest.mark.functional @pytest.mark.once_without_docker def test_with_confirmation(proc, TIMEOUT, run_without_docker): with_confirmation(proc, TIMEOUT) if not run_without_docker: history_changed(proc, TIMEOUT, u'echo test') @pytest.mark.functional @pytest.mark.once_without_docker def test_select_command_with_arrows(proc, TIMEOUT, run_without_docker): select_command_with_arrows(proc, TIMEOUT) if not run_without_docker: history_changed(proc, TIMEOUT, u'git help') @pytest.mark.functional @pytest.mark.once_without_docker def test_refuse_with_confirmation(proc, TIMEOUT, run_without_docker): refuse_with_confirmation(proc, TIMEOUT) if not run_without_docker: history_not_changed(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.once_without_docker def test_without_confirmation(proc, TIMEOUT, run_without_docker): without_confirmation(proc, TIMEOUT) if not run_without_docker: history_changed(proc, TIMEOUT, u'echo test') @pytest.mark.functional @pytest.mark.once_without_docker def test_how_to_configure_alias(proc, TIMEOUT): how_to_configure(proc, TIMEOUT) thefuck-3.2/tests/functional/test_fish.py000066400000000000000000000033231261610017700206570ustar00rootroot00000000000000import pytest from tests.functional.plots import with_confirmation, without_confirmation, \ refuse_with_confirmation, select_command_with_arrows containers = (('thefuck/ubuntu-python3-fish', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python3 python3-pip python3-dev fish git RUN pip3 install -U setuptools RUN ln -s /usr/bin/pip3 /usr/bin/pip RUN apt-get install -yy fish''', u'fish'), ('thefuck/ubuntu-python2-fish', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python python-pip python-dev git RUN pip2 install -U pip setuptools RUN apt-get install -yy fish''', u'fish')) @pytest.fixture(params=containers) def proc(request, spawnu): proc = spawnu(*request.param) proc.sendline(u"pip install /src") proc.sendline(u'thefuck --alias > ~/.config/fish/config.fish') proc.sendline(u'fish') return proc @pytest.mark.functional @pytest.mark.skip_without_docker def test_with_confirmation(proc, TIMEOUT): with_confirmation(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.skip_without_docker def test_select_command_with_arrows(proc, TIMEOUT): select_command_with_arrows(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.skip_without_docker def test_refuse_with_confirmation(proc, TIMEOUT): refuse_with_confirmation(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.skip_without_docker def test_without_confirmation(proc, TIMEOUT): without_confirmation(proc, TIMEOUT) # TODO: ensure that history changes. thefuck-3.2/tests/functional/test_install.py000066400000000000000000000015051261610017700213740ustar00rootroot00000000000000import pytest from thefuck.utils import get_installation_info envs = ((u'bash', 'thefuck/ubuntu-bash', u''' FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy bash '''), (u'bash', 'thefuck/generic-bash', u''' FROM fedora:latest RUN dnf install -yy python-devel sudo wget gcc ''')) @pytest.mark.functional @pytest.mark.skip_without_docker @pytest.mark.parametrize('shell, tag, dockerfile', envs) def test_installation(spawnu, shell, TIMEOUT, tag, dockerfile): proc = spawnu(tag, dockerfile, shell) proc.sendline(u'cat /src/install.sh | sh - && $0') proc.sendline(u'thefuck --version') version = get_installation_info().version assert proc.expect([TIMEOUT, u'thefuck {}'.format(version)], timeout=600) proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'No fucks given']) thefuck-3.2/tests/functional/test_performance.py000066400000000000000000000027621261610017700222350ustar00rootroot00000000000000import pytest import time dockerfile = u''' FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python3 python3-pip python3-dev git RUN pip3 install -U setuptools RUN ln -s /usr/bin/pip3 /usr/bin/pip RUN adduser --disabled-password --gecos '' test ENV SEED "{seed}" WORKDIR /src USER test RUN echo 'eval $(thefuck --alias)' > /home/test/.bashrc RUN echo > /home/test/.bash_history RUN git config --global user.email "you@example.com" RUN git config --global user.name "Your Name" USER root '''.format(seed=time.time()) def plot(proc, TIMEOUT): proc.sendline(u'cd /home/test/') proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'No fucks given']) proc.sendline(u'git init') proc.sendline(u'git add .') proc.sendline(u'git commit -a -m init') proc.sendline(u'git brnch') proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'git branch']) proc.send('\n') assert proc.expect([TIMEOUT, u'master']) proc.sendline(u'echo test') proc.sendline(u'echo tst') proc.sendline(u'fuck') assert proc.expect([TIMEOUT, u'echo test']) proc.send('\n') assert proc.expect([TIMEOUT, u'test']) @pytest.mark.functional @pytest.mark.skip_without_docker @pytest.mark.benchmark(min_rounds=10) def test_performance(spawnu, TIMEOUT, benchmark): proc = spawnu(u'thefuck/ubuntu-python3-bash-performance', dockerfile, u'bash') proc.sendline(u'pip install /src') proc.sendline(u'su test') assert benchmark(plot, proc, TIMEOUT) is None thefuck-3.2/tests/functional/test_tcsh.py000066400000000000000000000033571261610017700206760ustar00rootroot00000000000000import pytest from tests.functional.plots import with_confirmation, without_confirmation, \ refuse_with_confirmation, select_command_with_arrows containers = (('thefuck/ubuntu-python3-tcsh', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python3 python3-pip python3-dev git RUN pip3 install -U setuptools RUN ln -s /usr/bin/pip3 /usr/bin/pip RUN apt-get install -yy tcsh''', u'tcsh'), ('thefuck/ubuntu-python2-tcsh', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python python-pip python-dev git RUN pip2 install -U pip setuptools RUN apt-get install -yy tcsh''', u'tcsh')) @pytest.fixture(params=containers) def proc(request, spawnu, run_without_docker): proc = spawnu(*request.param) if not run_without_docker: proc.sendline(u'pip install /src') proc.sendline(u'tcsh') proc.sendline(u'eval `thefuck --alias`') return proc @pytest.mark.functional @pytest.mark.once_without_docker def test_with_confirmation(proc, TIMEOUT): with_confirmation(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.once_without_docker def test_select_command_with_arrows(proc, TIMEOUT): select_command_with_arrows(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.once_without_docker def test_refuse_with_confirmation(proc, TIMEOUT): refuse_with_confirmation(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.once_without_docker def test_without_confirmation(proc, TIMEOUT): without_confirmation(proc, TIMEOUT) # TODO: ensure that history changes. thefuck-3.2/tests/functional/test_zsh.py000066400000000000000000000044171261610017700205370ustar00rootroot00000000000000import pytest from tests.functional.plots import with_confirmation, without_confirmation, \ refuse_with_confirmation, history_changed, history_not_changed, \ select_command_with_arrows, how_to_configure containers = (('thefuck/ubuntu-python3-zsh', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python3 python3-pip python3-dev git RUN pip3 install -U setuptools RUN ln -s /usr/bin/pip3 /usr/bin/pip RUN apt-get install -yy zsh''', u'zsh'), ('thefuck/ubuntu-python2-zsh', u'''FROM ubuntu:latest RUN apt-get update RUN apt-get install -yy python python-pip python-dev git RUN pip2 install -U pip setuptools RUN apt-get install -yy zsh''', u'zsh')) @pytest.fixture(params=containers) def proc(request, spawnu, run_without_docker): proc = spawnu(*request.param) if not run_without_docker: proc.sendline(u'pip install /src') proc.sendline(u'eval $(thefuck --alias)') proc.sendline(u'export HISTFILE=~/.zsh_history') proc.sendline(u'echo > $HISTFILE') proc.sendline(u'export SAVEHIST=100') proc.sendline(u'export HISTSIZE=100') proc.sendline(u'setopt INC_APPEND_HISTORY') return proc @pytest.mark.functional @pytest.mark.once_without_docker def test_with_confirmation(proc, TIMEOUT): with_confirmation(proc, TIMEOUT) history_changed(proc, TIMEOUT, u'echo test') @pytest.mark.functional @pytest.mark.once_without_docker def test_select_command_with_arrows(proc, TIMEOUT): select_command_with_arrows(proc, TIMEOUT) history_changed(proc, TIMEOUT, u'git help') @pytest.mark.functional @pytest.mark.once_without_docker def test_refuse_with_confirmation(proc, TIMEOUT): refuse_with_confirmation(proc, TIMEOUT) history_not_changed(proc, TIMEOUT) @pytest.mark.functional @pytest.mark.once_without_docker def test_without_confirmation(proc, TIMEOUT): without_confirmation(proc, TIMEOUT) history_changed(proc, TIMEOUT, u'echo test') @pytest.mark.functional @pytest.mark.once_without_docker def test_how_to_configure_alias(proc, TIMEOUT): how_to_configure(proc, TIMEOUT) thefuck-3.2/tests/rules/000077500000000000000000000000001261610017700153045ustar00rootroot00000000000000thefuck-3.2/tests/rules/__init__.py000066400000000000000000000000001261610017700174030ustar00rootroot00000000000000thefuck-3.2/tests/rules/conftest.py000066400000000000000000000002301261610017700174760ustar00rootroot00000000000000import pytest @pytest.fixture(autouse=True) def generic_shell(monkeypatch): monkeypatch.setattr('thefuck.shells.and_', lambda *x: ' && '.join(x)) thefuck-3.2/tests/rules/test_apt_get.py000066400000000000000000000056501261610017700203460ustar00rootroot00000000000000import pytest from mock import Mock, patch from thefuck.rules import apt_get from thefuck.rules.apt_get import match, get_new_command from tests.utils import Command # python-commandnotfound is available in ubuntu 14.04+ @pytest.mark.skipif(not getattr(apt_get, 'enabled_by_default', True), reason='Skip if python-commandnotfound is not available') @pytest.mark.parametrize('command', [ Command(script='vim', stderr='vim: command not found')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, return_value', [ (Command(script='vim', stderr='vim: command not found'), [('vim', 'main'), ('vim-tiny', 'main')]), (Command(script='sudo vim', stderr='vim: command not found'), [('vim', 'main'), ('vim-tiny', 'main')])]) @patch('thefuck.rules.apt_get.CommandNotFound', create=True) @patch.multiple(apt_get, create=True, apt_get='apt_get') def test_match_mocked(cmdnf_mock, command, return_value): get_packages = Mock(return_value=return_value) cmdnf_mock.CommandNotFound.return_value = Mock(getPackages=get_packages) assert match(command) assert cmdnf_mock.CommandNotFound.called assert get_packages.called @pytest.mark.parametrize('command', [ Command(script='vim', stderr=''), Command()]) def test_not_match(command): assert not match(command) # python-commandnotfound is available in ubuntu 14.04+ @pytest.mark.skipif(not getattr(apt_get, 'enabled_by_default', True), reason='Skip if python-commandnotfound is not available') @pytest.mark.parametrize('command, new_command', [ (Command('vim'), 'sudo apt-get install vim && vim'), (Command('convert'), 'sudo apt-get install imagemagick && convert'), (Command('sudo vim'), 'sudo apt-get install vim && sudo vim'), (Command('sudo convert'), 'sudo apt-get install imagemagick && sudo convert')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command @pytest.mark.parametrize('command, new_command, return_value', [ (Command('vim'), 'sudo apt-get install vim && vim', [('vim', 'main'), ('vim-tiny', 'main')]), (Command('convert'), 'sudo apt-get install imagemagick && convert', [('imagemagick', 'main'), ('graphicsmagick-imagemagick-compat', 'universe')]), (Command('sudo vim'), 'sudo apt-get install vim && sudo vim', [('vim', 'main'), ('vim-tiny', 'main')]), (Command('sudo convert'), 'sudo apt-get install imagemagick && sudo convert', [('imagemagick', 'main'), ('graphicsmagick-imagemagick-compat', 'universe')])]) @patch('thefuck.rules.apt_get.CommandNotFound', create=True) @patch.multiple(apt_get, create=True, apt_get='apt_get') def test_get_new_command_mocked(cmdnf_mock, command, new_command, return_value): get_packages = Mock(return_value=return_value) cmdnf_mock.CommandNotFound.return_value = Mock(getPackages=get_packages) assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_apt_get_search.py000066400000000000000000000012241261610017700216640ustar00rootroot00000000000000import pytest from thefuck.rules.apt_get_search import get_new_command, match from tests.utils import Command def test_match(): assert match(Command('apt-get search foo')) @pytest.mark.parametrize('command', [ Command('apt-cache search foo'), Command('aptitude search foo'), Command('apt search foo'), Command('apt-get install foo'), Command('apt-get source foo'), Command('apt-get clean'), Command('apt-get remove'), Command('apt-get update') ]) def test_not_match(command): assert not match(command) def test_get_new_command(): assert get_new_command(Command('apt-get search foo')) == 'apt-cache search foo' thefuck-3.2/tests/rules/test_brew_install.py000066400000000000000000000030641261610017700214050ustar00rootroot00000000000000import pytest from thefuck.rules.brew_install import match, get_new_command from thefuck.rules.brew_install import _get_formulas from tests.utils import Command @pytest.fixture def brew_no_available_formula(): return '''Error: No available formula for elsticsearch ''' @pytest.fixture def brew_install_no_argument(): return '''This command requires a formula argument''' @pytest.fixture def brew_already_installed(): return '''Warning: git-2.3.5 already installed''' def _is_not_okay_to_test(): return 'elasticsearch' not in _get_formulas() @pytest.mark.skipif(_is_not_okay_to_test(), reason='No need to run if there\'s no formula') def test_match(brew_no_available_formula, brew_already_installed, brew_install_no_argument): assert match(Command('brew install elsticsearch', stderr=brew_no_available_formula)) assert not match(Command('brew install git', stderr=brew_already_installed)) assert not match(Command('brew install', stderr=brew_install_no_argument)) @pytest.mark.skipif(_is_not_okay_to_test(), reason='No need to run if there\'s no formula') def test_get_new_command(brew_no_available_formula): assert get_new_command(Command('brew install elsticsearch', stderr=brew_no_available_formula))\ == 'brew install elasticsearch' assert get_new_command(Command('brew install aa', stderr=brew_no_available_formula))\ != 'brew install aha' thefuck-3.2/tests/rules/test_brew_unknown_command.py000066400000000000000000000016021261610017700231300ustar00rootroot00000000000000import pytest from thefuck.rules.brew_unknown_command import match, get_new_command from thefuck.rules.brew_unknown_command import _brew_commands from tests.utils import Command @pytest.fixture def brew_unknown_cmd(): return '''Error: Unknown command: inst''' @pytest.fixture def brew_unknown_cmd2(): return '''Error: Unknown command: instaa''' def test_match(brew_unknown_cmd): assert match(Command('brew inst', stderr=brew_unknown_cmd)) for command in _brew_commands(): assert not match(Command('brew ' + command)) def test_get_new_command(brew_unknown_cmd, brew_unknown_cmd2): assert get_new_command(Command('brew inst', stderr=brew_unknown_cmd)) \ == ['brew list', 'brew install', 'brew uninstall'] cmds = get_new_command(Command('brew instaa', stderr=brew_unknown_cmd2)) assert 'brew install' in cmds assert 'brew uninstall' in cmds thefuck-3.2/tests/rules/test_brew_upgrade.py000066400000000000000000000006721261610017700213700ustar00rootroot00000000000000import pytest from thefuck.rules.brew_upgrade import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='brew upgrade')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('brew upgrade'), 'brew upgrade --all')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_cargo_no_command.py000066400000000000000000000010711261610017700222010ustar00rootroot00000000000000import pytest from thefuck.rules.cargo_no_command import match, get_new_command from tests.utils import Command no_such_subcommand = """No such subcommand Did you mean `build`? """ @pytest.mark.parametrize('command', [ Command(script='cargo buid', stderr=no_such_subcommand)]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('cargo buid', stderr=no_such_subcommand), 'cargo build')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_cd_mkdir.py000066400000000000000000000015521261610017700204740ustar00rootroot00000000000000import pytest from thefuck.rules.cd_mkdir import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='cd foo', stderr='cd: foo: No such file or directory'), Command(script='cd foo/bar/baz', stderr='cd: foo: No such file or directory'), Command(script='cd foo/bar/baz', stderr='cd: can\'t cd to foo/bar/baz')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='cd foo', stderr=''), Command()]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('cd foo'), 'mkdir -p foo && cd foo'), (Command('cd foo/bar/baz'), 'mkdir -p foo/bar/baz && cd foo/bar/baz')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_cd_parent.py000066400000000000000000000004611261610017700206550ustar00rootroot00000000000000from thefuck.rules.cd_parent import match, get_new_command from tests.utils import Command def test_match(): assert match(Command('cd..', stderr='cd..: command not found')) assert not match(Command()) def test_get_new_command(): assert get_new_command( Command('cd..')) == 'cd ..' thefuck-3.2/tests/rules/test_composer_not_command.py000066400000000000000000000035521261610017700231270ustar00rootroot00000000000000import pytest from thefuck.rules.composer_not_command import match, get_new_command from tests.utils import Command @pytest.fixture def composer_not_command(): # that weird spacing is part of the actual command output return ( '\n' '\n' ' \n' ' [InvalidArgumentException] \n' ' Command "udpate" is not defined. \n' ' Did you mean this? \n' ' update \n' ' \n' '\n' '\n' ) @pytest.fixture def composer_not_command_one_of_this(): # that weird spacing is part of the actual command output return ( '\n' '\n' ' \n' ' [InvalidArgumentException] \n' ' Command "pdate" is not defined. \n' ' Did you mean one of these? \n' ' selfupdate \n' ' self-update \n' ' update \n' ' \n' '\n' '\n' ) def test_match(composer_not_command, composer_not_command_one_of_this): assert match(Command('composer udpate', stderr=composer_not_command)) assert match(Command('composer pdate', stderr=composer_not_command_one_of_this)) assert not match(Command('ls update', stderr=composer_not_command)) def test_get_new_command(composer_not_command, composer_not_command_one_of_this): assert get_new_command(Command('composer udpate', stderr=composer_not_command)) \ == 'composer update' assert get_new_command( Command('composer pdate', stderr=composer_not_command_one_of_this)) \ == 'composer selfupdate' thefuck-3.2/tests/rules/test_cp_omitting_directory.py000066400000000000000000000012571261610017700233220ustar00rootroot00000000000000import pytest from thefuck.rules.cp_omitting_directory import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('script, stderr', [ ('cp dir', 'cp: dor: is a directory'), ('cp dir', "cp: omitting directory 'dir'")]) def test_match(script, stderr): assert match(Command(script, stderr=stderr)) @pytest.mark.parametrize('script, stderr', [ ('some dir', 'cp: dor: is a directory'), ('some dir', "cp: omitting directory 'dir'"), ('cp dir', '')]) def test_not_match(script, stderr): assert not match(Command(script, stderr=stderr)) def test_get_new_command(): assert get_new_command(Command(script='cp dir')) == 'cp -a dir' thefuck-3.2/tests/rules/test_dirty_untar.py000066400000000000000000000047221261610017700212660ustar00rootroot00000000000000import os import pytest import tarfile from thefuck.rules.dirty_untar import match, get_new_command, side_effect, \ tar_extensions from tests.utils import Command @pytest.fixture def tar_error(tmpdir): def fixture(filename): path = os.path.join(str(tmpdir), filename) def reset(path): os.mkdir('d') with tarfile.TarFile(path, 'w') as archive: for file in ('a', 'b', 'c', 'd/e'): with open(file, 'w') as f: f.write('*') archive.add(file) os.remove(file) with tarfile.TarFile(path, 'r') as archive: archive.extractall() os.chdir(str(tmpdir)) reset(path) assert set(os.listdir('.')) == {filename, 'a', 'b', 'c', 'd'} assert set(os.listdir('./d')) == {'e'} return fixture parametrize_extensions = pytest.mark.parametrize('ext', tar_extensions) # (filename as typed by the user, unquoted filename, quoted filename as per shells.quote) parametrize_filename = pytest.mark.parametrize('filename, unquoted, quoted', [ ('foo{}', 'foo{}', 'foo{}'), ('foo\ bar{}', 'foo bar{}', "'foo bar{}'"), ('"foo bar{}"', 'foo bar{}', "'foo bar{}'")]) parametrize_script = pytest.mark.parametrize('script, fixed', [ ('tar xvf {}', 'mkdir -p {dir} && tar xvf {filename} -C {dir}'), ('tar -xvf {}', 'mkdir -p {dir} && tar -xvf {filename} -C {dir}'), ('tar --extract -f {}', 'mkdir -p {dir} && tar --extract -f {filename} -C {dir}')]) @parametrize_extensions @parametrize_filename @parametrize_script def test_match(ext, tar_error, filename, unquoted, quoted, script, fixed): tar_error(unquoted.format(ext)) assert match(Command(script=script.format(filename.format(ext)))) @parametrize_extensions @parametrize_filename @parametrize_script def test_side_effect(ext, tar_error, filename, unquoted, quoted, script, fixed): tar_error(unquoted.format(ext)) side_effect(Command(script=script.format(filename.format(ext))), None) assert set(os.listdir('.')) == {unquoted.format(ext), 'd'} @parametrize_extensions @parametrize_filename @parametrize_script def test_get_new_command(ext, tar_error, filename, unquoted, quoted, script, fixed): tar_error(unquoted.format(ext)) assert (get_new_command(Command(script=script.format(filename.format(ext)))) == fixed.format(dir=quoted.format(''), filename=filename.format(ext))) thefuck-3.2/tests/rules/test_dirty_unzip.py000066400000000000000000000025721261610017700213030ustar00rootroot00000000000000import os import pytest import zipfile from thefuck.rules.dirty_unzip import match, get_new_command, side_effect from tests.utils import Command @pytest.fixture def zip_error(tmpdir): path = os.path.join(str(tmpdir), 'foo.zip') def reset(path): with zipfile.ZipFile(path, 'w') as archive: archive.writestr('a', '1') archive.writestr('b', '2') archive.writestr('c', '3') archive.writestr('d/e', '4') archive.extractall() os.chdir(str(tmpdir)) reset(path) assert set(os.listdir('.')) == {'foo.zip', 'a', 'b', 'c', 'd'} assert set(os.listdir('./d')) == {'e'} @pytest.mark.parametrize('script', [ 'unzip foo', 'unzip foo.zip']) def test_match(zip_error, script): assert match(Command(script=script)) @pytest.mark.parametrize('script', [ 'unzip foo', 'unzip foo.zip']) def test_side_effect(zip_error, script): side_effect(Command(script=script), None) assert set(os.listdir('.')) == {'foo.zip', 'd'} @pytest.mark.parametrize('script,fixed', [ ('unzip foo', 'unzip foo -d foo'), (R"unzip foo\ bar.zip", R"unzip foo\ bar.zip -d 'foo bar'"), (R"unzip 'foo bar.zip'", R"unzip 'foo bar.zip' -d 'foo bar'"), ('unzip foo.zip', 'unzip foo.zip -d foo')]) def test_get_new_command(zip_error, script, fixed): assert get_new_command(Command(script=script)) == fixed thefuck-3.2/tests/rules/test_django_south_ghost.py000066400000000000000000000045611261610017700226130ustar00rootroot00000000000000import pytest from thefuck.rules.django_south_ghost import match, get_new_command from tests.utils import Command @pytest.fixture def stderr(): return '''Traceback (most recent call last): File "/home/nvbn/work/.../bin/python", line 42, in exec(compile(__file__f.read(), __file__, "exec")) File "/home/nvbn/work/.../app/manage.py", line 34, in execute_from_command_line(sys.argv) File "/home/nvbn/work/.../lib/django/core/management/__init__.py", line 443, in execute_from_command_line utility.execute() File "/home/nvbn/work/.../lib/django/core/management/__init__.py", line 382, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/nvbn/work/.../lib/django/core/management/base.py", line 196, in run_from_argv self.execute(*args, **options.__dict__) File "/home/nvbn/work/.../lib/django/core/management/base.py", line 232, in execute output = self.handle(*args, **options) File "/home/nvbn/work/.../app/lib/south/management/commands/migrate.py", line 108, in handle ignore_ghosts = ignore_ghosts, File "/home/nvbn/work/.../app/lib/south/migration/__init__.py", line 193, in migrate_app applied_all = check_migration_histories(applied_all, delete_ghosts, ignore_ghosts) File "/home/nvbn/work/.../app/lib/south/migration/__init__.py", line 88, in check_migration_histories raise exceptions.GhostMigrations(ghosts) south.exceptions.GhostMigrations: ! These migrations are in the database but not on disk: ! I'm not trusting myself; either fix this yourself by fiddling ! with the south_migrationhistory table, or pass --delete-ghost-migrations ! to South to have it delete ALL of these records (this may not be good). ''' def test_match(stderr): assert match(Command('./manage.py migrate', stderr=stderr)) assert match(Command('python manage.py migrate', stderr=stderr)) assert not match(Command('./manage.py migrate')) assert not match(Command('app migrate', stderr=stderr)) assert not match(Command('./manage.py test', stderr=stderr)) def test_get_new_command(): assert get_new_command(Command('./manage.py migrate auth'))\ == './manage.py migrate auth --delete-ghost-migrations' thefuck-3.2/tests/rules/test_django_south_merge.py000066400000000000000000000040351261610017700225620ustar00rootroot00000000000000import pytest from thefuck.rules.django_south_merge import match, get_new_command from tests.utils import Command @pytest.fixture def stderr(): return '''Running migrations for app: ! Migration app:0003_auto... should not have been applied before app:0002_auto__add_field_query_due_date_ but was. Traceback (most recent call last): File "/home/nvbn/work/.../bin/python", line 42, in exec(compile(__file__f.read(), __file__, "exec")) File "/home/nvbn/work/.../app/manage.py", line 34, in execute_from_command_line(sys.argv) File "/home/nvbn/work/.../lib/django/core/management/__init__.py", line 443, in execute_from_command_line utility.execute() File "/home/nvbn/work/.../lib/django/core/management/__init__.py", line 382, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/nvbn/work/.../lib/django/core/management/base.py", line 196, in run_from_argv self.execute(*args, **options.__dict__) File "/home/nvbn/work/.../lib/django/core/management/base.py", line 232, in execute output = self.handle(*args, **options) File "/home/nvbn/work/.../app/lib/south/management/commands/migrate.py", line 108, in handle ignore_ghosts = ignore_ghosts, File "/home/nvbn/work/.../app/lib/south/migration/__init__.py", line 207, in migrate_app raise exceptions.InconsistentMigrationHistory(problems) south.exceptions.InconsistentMigrationHistory: Inconsistent migration history The following options are available: --merge: will just attempt the migration ignoring any potential dependency conflicts. ''' def test_match(stderr): assert match(Command('./manage.py migrate', stderr=stderr)) assert match(Command('python manage.py migrate', stderr=stderr)) assert not match(Command('./manage.py migrate')) assert not match(Command('app migrate', stderr=stderr)) assert not match(Command('./manage.py test', stderr=stderr)) def test_get_new_command(): assert get_new_command(Command('./manage.py migrate auth')) \ == './manage.py migrate auth --merge' thefuck-3.2/tests/rules/test_docker_not_command.py000066400000000000000000000140371261610017700225470ustar00rootroot00000000000000import pytest from io import BytesIO from tests.utils import Command from thefuck.rules.docker_not_command import get_new_command, match @pytest.fixture def docker_help(mocker): help = b'''Usage: docker [OPTIONS] COMMAND [arg...] A self-sufficient runtime for linux containers. Options: --api-cors-header= Set CORS headers in the remote API -b, --bridge= Attach containers to a network bridge --bip= Specify network bridge IP -D, --debug=false Enable debug mode -d, --daemon=false Enable daemon mode --default-gateway= Container default gateway IPv4 address --default-gateway-v6= Container default gateway IPv6 address --default-ulimit=[] Set default ulimits for containers --dns=[] DNS server to use --dns-search=[] DNS search domains to use -e, --exec-driver=native Exec driver to use --exec-opt=[] Set exec driver options --exec-root=/var/run/docker Root of the Docker execdriver --fixed-cidr= IPv4 subnet for fixed IPs --fixed-cidr-v6= IPv6 subnet for fixed IPs -G, --group=docker Group for the unix socket -g, --graph=/var/lib/docker Root of the Docker runtime -H, --host=[] Daemon socket(s) to connect to -h, --help=false Print usage --icc=true Enable inter-container communication --insecure-registry=[] Enable insecure registry communication --ip=0.0.0.0 Default IP when binding container ports --ip-forward=true Enable net.ipv4.ip_forward --ip-masq=true Enable IP masquerading --iptables=true Enable addition of iptables rules --ipv6=false Enable IPv6 networking -l, --log-level=info Set the logging level --label=[] Set key=value labels to the daemon --log-driver=json-file Default driver for container logs --log-opt=map[] Set log driver options --mtu=0 Set the containers network MTU -p, --pidfile=/var/run/docker.pid Path to use for daemon PID file --registry-mirror=[] Preferred Docker registry mirror -s, --storage-driver= Storage driver to use --selinux-enabled=false Enable selinux support --storage-opt=[] Set storage driver options --tls=false Use TLS; implied by --tlsverify --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA --tlscert=~/.docker/cert.pem Path to TLS certificate file --tlskey=~/.docker/key.pem Path to TLS key file --tlsverify=false Use TLS and verify the remote --userland-proxy=true Use userland proxy for loopback traffic -v, --version=false Print version information and quit Commands: attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders from a container's filesystem to the host path create Create a new container diff Inspect changes on a container's filesystem events Get real time events from the server exec Run a command in a running container export Stream the contents of a container as a tar archive history Show the history of an image images List images import Create a new filesystem image from the contents of a tarball info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive login Register or log in to a Docker registry server logout Log out from a Docker registry server logs Fetch the logs of a container pause Pause all processes within a container port Lookup the public-facing port that is NAT-ed to PRIVATE_PORT ps List containers pull Pull an image or a repository from a Docker registry server push Push an image or a repository to a Docker registry server rename Rename an existing container restart Restart a running container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save an image to a tar archive search Search for an image on the Docker Hub start Start a stopped container stats Display a stream of a containers' resource usage statistics stop Stop a running container tag Tag an image into a repository top Lookup the running processes of a container unpause Unpause a paused container version Show the Docker version information wait Block until a container stops, then print its exit code Run 'docker COMMAND --help' for more information on a command. ''' mock = mocker.patch('subprocess.Popen') mock.return_value.stdout = BytesIO(help) return mock def stderr(cmd): return "docker: '{}' is not a docker command.\n" \ "See 'docker --help'.".format(cmd) def test_match(): assert match(Command('docker pes', stderr=stderr('pes'))) @pytest.mark.parametrize('script, stderr', [ ('docker ps', ''), ('cat pes', stderr('pes'))]) def test_not_match(script, stderr): assert not match(Command(script, stderr=stderr)) @pytest.mark.usefixtures('docker_help') @pytest.mark.parametrize('wrong, fixed', [ ('pes', ['ps', 'push', 'pause']), ('tags', ['tag', 'stats', 'images'])]) def test_get_new_command(wrong, fixed): command = Command('docker {}'.format(wrong), stderr=stderr(wrong)) assert get_new_command(command) == ['docker {}'.format(x) for x in fixed] thefuck-3.2/tests/rules/test_dry.py000066400000000000000000000010301261610017700175050ustar00rootroot00000000000000import pytest from thefuck.rules.dry import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='cd cd foo'), Command(script='git git push origin/master')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('cd cd foo'), 'cd foo'), (Command('git git push origin/master'), 'git push origin/master')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_fix_alt_space.py000066400000000000000000000013321261610017700215150ustar00rootroot00000000000000# -*- encoding: utf-8 -*- from thefuck.rules.fix_alt_space import match, get_new_command from tests.utils import Command def test_match(): """The character before 'grep' is Alt+Space, which happens frequently on the Mac when typing the pipe character (Alt+7), and holding the Alt key pressed for longer than necessary. """ assert match(Command(u'ps -ef | grep foo', stderr=u'-bash:  grep: command not found')) assert not match(Command('ps -ef | grep foo')) assert not match(Command()) def test_get_new_command(): """ Replace the Alt+Space character by a simple space """ assert get_new_command(Command(u'ps -ef | grep foo'))\ == 'ps -ef | grep foo' thefuck-3.2/tests/rules/test_fix_file.py000066400000000000000000000145251261610017700205110ustar00rootroot00000000000000import pytest import os from thefuck.rules.fix_file import match, get_new_command from tests.utils import Command # (script, file, line, col (or None), stdout, stderr) tests = ( ('gcc a.c', 'a.c', 3, 1, '', """ a.c: In function 'main': a.c:3:1: error: expected expression before '}' token } ^ """), ('clang a.c', 'a.c', 3, 1, '', """ a.c:3:1: error: expected expression } ^ """), ('perl a.pl', 'a.pl', 3, None, '', """ syntax error at a.pl line 3, at EOF Execution of a.pl aborted due to compilation errors. """), ('perl a.pl', 'a.pl', 2, None, '', """ Search pattern not terminated at a.pl line 2. """), ('sh a.sh', 'a.sh', 2, None, '', """ a.sh: line 2: foo: command not found """), ('zsh a.sh', 'a.sh', 2, None, '', """ a.sh:2: command not found: foo """), ('bash a.sh', 'a.sh', 2, None, '', """ a.sh: line 2: foo: command not found """), ('rustc a.rs', 'a.rs', 2, 5, '', """ a.rs:2:5: 2:6 error: unexpected token: `+` a.rs:2 + ^ """), ('cargo build', 'src/lib.rs', 3, 5, '', """ Compiling test v0.1.0 (file:///tmp/fix-error/test) src/lib.rs:3:5: 3:6 error: unexpected token: `+` src/lib.rs:3 + ^ Could not compile `test`. To learn more, run the command again with --verbose. """), ('python a.py', 'a.py', 2, None, '', """ File "a.py", line 2 + ^ SyntaxError: invalid syntax """), ('python a.py', 'a.py', 8, None, '', """ Traceback (most recent call last): File "a.py", line 8, in match("foo") File "a.py", line 5, in match m = re.search(None, command) File "/usr/lib/python3.4/re.py", line 170, in search return _compile(pattern, flags).search(string) File "/usr/lib/python3.4/re.py", line 293, in _compile raise TypeError("first argument must be string or compiled pattern") TypeError: first argument must be string or compiled pattern """), ('ruby a.rb', 'a.rb', 3, None, '', """ a.rb:3: syntax error, unexpected keyword_end """), ('lua a.lua', 'a.lua', 2, None, '', """ lua: a.lua:2: unexpected symbol near '+' """), ('fish a.sh', '/tmp/fix-error/a.sh', 2, None, '', """ fish: Unknown command 'foo' /tmp/fix-error/a.sh (line 2): foo ^ """), ('./a', './a', 2, None, '', """ awk: ./a:2: BEGIN { print "Hello, world!" + } awk: ./a:2: ^ syntax error """), ('llc a.ll', 'a.ll', 1, 2, '', """ llc: a.ll:1:2: error: expected top-level entity + ^ """), ('go build a.go', 'a.go', 1, 2, '', """ can't load package: a.go:1:2: expected 'package', found '+' """), ('make', 'Makefile', 2, None, '', """ bidule make: bidule: Command not found Makefile:2: recipe for target 'target' failed make: *** [target] Error 127 """), ('git st', '/home/martin/.config/git/config', 1, None, '', """ fatal: bad config file line 1 in /home/martin/.config/git/config """), ('node fuck.js asdf qwer', '/Users/pablo/Workspace/barebones/fuck.js', '2', 5, '', """ /Users/pablo/Workspace/barebones/fuck.js:2 conole.log(arg); // this should read console.log(arg); ^ ReferenceError: conole is not defined at /Users/pablo/Workspace/barebones/fuck.js:2:5 at Array.forEach (native) at Object. (/Users/pablo/Workspace/barebones/fuck.js:1:85) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Function.Module.runMain (module.js:501:10) at startup (node.js:129:16) at node.js:814:3 """), ('pep8', './tests/rules/test_systemctl.py', 17, 80, """ ./tests/rules/test_systemctl.py:17:80: E501 line too long (93 > 79 characters) ./tests/rules/test_systemctl.py:18:80: E501 line too long (103 > 79 characters) ./tests/rules/test_whois.py:20:80: E501 line too long (89 > 79 characters) ./tests/rules/test_whois.py:22:80: E501 line too long (83 > 79 characters) """, ''), ('py.test', '/home/thefuck/tests/rules/test_fix_file.py', 218, None, """ monkeypatch = <_pytest.monkeypatch.monkeypatch object at 0x7fdb76a25b38> test = ('fish a.sh', '/tmp/fix-error/a.sh', 2, None, '', "\\nfish: Unknown command 'foo'\\n/tmp/fix-error/a.sh (line 2): foo\\n ^\\n") @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_get_new_command(monkeypatch, test): > mocker.patch('os.path.isfile', return_value=True) E NameError: name 'mocker' is not defined /home/thefuck/tests/rules/test_fix_file.py:218: NameError """, ''), ) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_match(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=True) monkeypatch.setenv('EDITOR', 'dummy_editor') assert match(Command(stdout=test[4], stderr=test[5])) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_no_editor(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=True) if 'EDITOR' in os.environ: monkeypatch.delenv('EDITOR') assert not match(Command(stdout=test[4], stderr=test[5])) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_not_file(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=False) monkeypatch.setenv('EDITOR', 'dummy_editor') assert not match(Command(stdout=test[4], stderr=test[5])) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_get_new_command(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=True) monkeypatch.setenv('EDITOR', 'dummy_editor') cmd = Command(script=test[0], stdout=test[4], stderr=test[5]) #assert (get_new_command(cmd, Settings({})) == # 'dummy_editor {} +{} && {}'.format(test[1], test[2], test[0])) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_get_new_command_with_settings(mocker, monkeypatch, test, settings): mocker.patch('os.path.isfile', return_value=True) monkeypatch.setenv('EDITOR', 'dummy_editor') cmd = Command(script=test[0], stdout=test[4], stderr=test[5]) settings.fixcolcmd = '{editor} {file} +{line}:{col}' if test[3]: assert (get_new_command(cmd) == 'dummy_editor {} +{}:{} && {}'.format(test[1], test[2], test[3], test[0])) else: assert (get_new_command(cmd) == 'dummy_editor {} +{} && {}'.format(test[1], test[2], test[0])) thefuck-3.2/tests/rules/test_git_add.py000066400000000000000000000026431261610017700203150ustar00rootroot00000000000000import pytest from thefuck.rules.git_add import match, get_new_command from tests.utils import Command @pytest.fixture def did_not_match(target, did_you_forget=True): error = ("error: pathspec '{}' did not match any " "file(s) known to git.".format(target)) if did_you_forget: error = ("{}\nDid you forget to 'git add'?'".format(error)) return error @pytest.mark.parametrize('command', [ Command(script='git submodule update unknown', stderr=did_not_match('unknown')), Command(script='git commit unknown', stderr=did_not_match('unknown'))]) # Older versions of Git def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='git submodule update known', stderr=('')), Command(script='git commit known', stderr=('')), Command(script='git commit unknown', # Newer versions of Git stderr=did_not_match('unknown', False))]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('git submodule update unknown', stderr=did_not_match('unknown')), 'git add -- unknown && git submodule update unknown'), (Command('git commit unknown', stderr=did_not_match('unknown')), # Old Git 'git add -- unknown && git commit unknown')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_git_branch_delete.py000066400000000000000000000011551261610017700223410ustar00rootroot00000000000000import pytest from thefuck.rules.git_branch_delete import match, get_new_command from tests.utils import Command @pytest.fixture def stderr(): return '''error: The branch 'branch' is not fully merged. If you are sure you want to delete it, run 'git branch -D branch'. ''' def test_match(stderr): assert match(Command('git branch -d branch', stderr=stderr)) assert not match(Command('git branch -d branch')) assert not match(Command('ls', stderr=stderr)) def test_get_new_command(stderr): assert get_new_command(Command('git branch -d branch', stderr=stderr))\ == "git branch -D branch" thefuck-3.2/tests/rules/test_git_branch_list.py000066400000000000000000000010311261610017700220430ustar00rootroot00000000000000from thefuck import shells from thefuck.rules.git_branch_list import match, get_new_command from tests.utils import Command def test_match(): assert match(Command('git branch list')) def test_not_match(): assert not match(Command()) assert not match(Command('git commit')) assert not match(Command('git branch')) assert not match(Command('git stash list')) def test_get_new_command(): assert (get_new_command(Command('git branch list')) == shells.and_('git branch --delete list', 'git branch')) thefuck-3.2/tests/rules/test_git_checkout.py000066400000000000000000000036061261610017700213720ustar00rootroot00000000000000import pytest from thefuck.rules.git_checkout import match, get_new_command from tests.utils import Command @pytest.fixture def did_not_match(target, did_you_forget=False): error = ("error: pathspec '{}' did not match any " "file(s) known to git.".format(target)) if did_you_forget: error = ("{}\nDid you forget to 'git add'?'".format(error)) return error @pytest.fixture def get_branches(mocker): return mocker.patch('thefuck.rules.git_checkout.get_branches') @pytest.mark.parametrize('command', [ Command(script='git checkout unknown', stderr=did_not_match('unknown')), Command(script='git commit unknown', stderr=did_not_match('unknown'))]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='git submodule update unknown', stderr=did_not_match('unknown', True)), Command(script='git checkout known', stderr=('')), Command(script='git commit known', stderr=(''))]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('branches, command, new_command', [ ([], Command(script='git checkout unknown', stderr=did_not_match('unknown')), 'git branch unknown && git checkout unknown'), ([], Command('git commit unknown', stderr=did_not_match('unknown')), 'git branch unknown && git commit unknown'), (['test-random-branch-123'], Command(script='git checkout tst-rdm-brnch-123', stderr=did_not_match('tst-rdm-brnch-123')), 'git checkout test-random-branch-123'), (['test-random-branch-123'], Command(script='git commit tst-rdm-brnch-123', stderr=did_not_match('tst-rdm-brnch-123')), 'git commit test-random-branch-123')]) def test_get_new_command(branches, command, new_command, get_branches): get_branches.return_value = branches assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_git_diff_staged.py000066400000000000000000000013751261610017700220250ustar00rootroot00000000000000import pytest from thefuck.rules.git_diff_staged import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='git diff foo'), Command(script='git diff')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='git diff --staged'), Command(script='git tag'), Command(script='git branch'), Command(script='git log')]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('git diff'), 'git diff --staged'), (Command('git diff foo'), 'git diff --staged foo')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_git_fix_stash.py000066400000000000000000000021471261610017700215540ustar00rootroot00000000000000import pytest from thefuck.rules.git_fix_stash import match, get_new_command from tests.utils import Command git_stash_err = ''' usage: git stash list [] or: git stash show [] or: git stash drop [-q|--quiet] [] or: git stash ( pop | apply ) [--index] [-q|--quiet] [] or: git stash branch [] or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] \t\t [-u|--include-untracked] [-a|--all] []] or: git stash clear ''' @pytest.mark.parametrize('wrong', [ 'git stash opp', 'git stash Some message', 'git stash saev Some message']) def test_match(wrong): assert match(Command(wrong, stderr=git_stash_err)) def test_not_match(): assert not match(Command("git", stderr=git_stash_err)) @pytest.mark.parametrize('wrong,fixed', [ ('git stash opp', 'git stash pop'), ('git stash Some message', 'git stash save Some message'), ('git stash saev Some message', 'git stash save Some message')]) def test_get_new_command(wrong, fixed): assert get_new_command(Command(wrong, stderr=git_stash_err)) == fixed thefuck-3.2/tests/rules/test_git_not_command.py000066400000000000000000000027071261610017700220640ustar00rootroot00000000000000import pytest from thefuck.rules.git_not_command import match, get_new_command from tests.utils import Command @pytest.fixture def git_not_command(): return """git: 'brnch' is not a git command. See 'git --help'. Did you mean this? branch """ @pytest.fixture def git_not_command_one_of_this(): return """git: 'st' is not a git command. See 'git --help'. Did you mean one of these? status reset stage stash stats """ @pytest.fixture def git_not_command_closest(): return '''git: 'tags' is not a git command. See 'git --help'. Did you mean one of these? \tstage \ttag ''' @pytest.fixture def git_command(): return "* master" def test_match(git_not_command, git_command, git_not_command_one_of_this): assert match(Command('git brnch', stderr=git_not_command)) assert match(Command('git st', stderr=git_not_command_one_of_this)) assert not match(Command('ls brnch', stderr=git_not_command)) assert not match(Command('git branch', stderr=git_command)) def test_get_new_command(git_not_command, git_not_command_one_of_this, git_not_command_closest): assert get_new_command(Command('git brnch', stderr=git_not_command)) \ == ['git branch'] assert get_new_command(Command('git st', stderr=git_not_command_one_of_this)) \ == ['git stats', 'git stash', 'git stage'] assert get_new_command(Command('git tags', stderr=git_not_command_closest)) \ == ['git tag', 'git stage'] thefuck-3.2/tests/rules/test_git_pull.py000066400000000000000000000014531261610017700205370ustar00rootroot00000000000000import pytest from thefuck.rules.git_pull import match, get_new_command from tests.utils import Command @pytest.fixture def stderr(): return '''There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details git pull If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=/ master ''' def test_match(stderr): assert match(Command('git pull', stderr=stderr)) assert not match(Command('git pull')) assert not match(Command('ls', stderr=stderr)) def test_get_new_command(stderr): assert get_new_command(Command('git pull', stderr=stderr)) \ == "git branch --set-upstream-to=origin/master master && git pull" thefuck-3.2/tests/rules/test_git_pull_clone.py000066400000000000000000000013171261610017700217160ustar00rootroot00000000000000import pytest from thefuck.rules.git_pull_clone import match, get_new_command from tests.utils import Command git_err = ''' fatal: Not a git repository (or any parent up to mount point /home) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). ''' @pytest.mark.parametrize('command', [ Command(script='git pull git@github.com:mcarton/thefuck.git', stderr=git_err)]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, output', [ (Command(script='git pull git@github.com:mcarton/thefuck.git', stderr=git_err), 'git clone git@github.com:mcarton/thefuck.git')]) def test_get_new_command(command, output): assert get_new_command(command) == output thefuck-3.2/tests/rules/test_git_push.py000066400000000000000000000012171261610017700205400ustar00rootroot00000000000000import pytest from thefuck.rules.git_push import match, get_new_command from tests.utils import Command @pytest.fixture def stderr(): return '''fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master ''' def test_match(stderr): assert match(Command('git push master', stderr=stderr)) assert not match(Command('git push master')) assert not match(Command('ls', stderr=stderr)) def test_get_new_command(stderr): assert get_new_command(Command('git push', stderr=stderr))\ == "git push --set-upstream origin master" thefuck-3.2/tests/rules/test_git_push_force.py000066400000000000000000000036031261610017700217170ustar00rootroot00000000000000import pytest from thefuck.rules.git_push_force import match, get_new_command from tests.utils import Command git_err = ''' To /tmp/foo ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to '/tmp/bar' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. ''' git_uptodate = 'Everything up-to-date' git_ok = ''' Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 282 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To /tmp/bar 514eed3..f269c79 master -> master ''' @pytest.mark.parametrize('command', [ Command(script='git push', stderr=git_err), Command(script='git push nvbn', stderr=git_err), Command(script='git push nvbn master', stderr=git_err)]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='git push', stderr=git_ok), Command(script='git push', stderr=git_uptodate), Command(script='git push nvbn', stderr=git_ok), Command(script='git push nvbn master', stderr=git_uptodate), Command(script='git push nvbn', stderr=git_ok), Command(script='git push nvbn master', stderr=git_uptodate)]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, output', [ (Command(script='git push', stderr=git_err), 'git push --force-with-lease'), (Command(script='git push nvbn', stderr=git_err), 'git push --force-with-lease nvbn'), (Command(script='git push nvbn master', stderr=git_err), 'git push --force-with-lease nvbn master')]) def test_get_new_command(command, output): assert get_new_command(command) == output thefuck-3.2/tests/rules/test_git_push_pull.py000066400000000000000000000036101261610017700215730ustar00rootroot00000000000000import pytest from thefuck.rules.git_push_pull import match, get_new_command from tests.utils import Command git_err = ''' To /tmp/foo ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to '/tmp/bar' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. ''' git_uptodate = 'Everything up-to-date' git_ok = ''' Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 282 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To /tmp/bar 514eed3..f269c79 master -> master ''' @pytest.mark.parametrize('command', [ Command(script='git push', stderr=git_err), Command(script='git push nvbn', stderr=git_err), Command(script='git push nvbn master', stderr=git_err)]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='git push', stderr=git_ok), Command(script='git push', stderr=git_uptodate), Command(script='git push nvbn', stderr=git_ok), Command(script='git push nvbn master', stderr=git_uptodate), Command(script='git push nvbn', stderr=git_ok), Command(script='git push nvbn master', stderr=git_uptodate)]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, output', [ (Command(script='git push', stderr=git_err), 'git pull && git push'), (Command(script='git push nvbn', stderr=git_err), 'git pull nvbn && git push nvbn'), (Command(script='git push nvbn master', stderr=git_err), 'git pull nvbn master && git push nvbn master')]) def test_get_new_command(command, output): assert get_new_command(command) == output thefuck-3.2/tests/rules/test_git_stash.py000066400000000000000000000023461261610017700207070ustar00rootroot00000000000000import pytest from thefuck.rules.git_stash import match, get_new_command from tests.utils import Command cherry_pick_error = ( 'error: Your local changes would be overwritten by cherry-pick.\n' 'hint: Commit your changes or stash them to proceed.\n' 'fatal: cherry-pick failed') rebase_error = ( 'Cannot rebase: Your index contains uncommitted changes.\n' 'Please commit or stash them.') @pytest.mark.parametrize('command', [ Command(script='git cherry-pick a1b2c3d', stderr=cherry_pick_error), Command(script='git rebase -i HEAD~7', stderr=rebase_error)]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='git cherry-pick a1b2c3d', stderr=('')), Command(script='git rebase -i HEAD~7', stderr=(''))]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command(script='git cherry-pick a1b2c3d', stderr=cherry_pick_error), 'git stash && git cherry-pick a1b2c3d'), (Command('git rebase -i HEAD~7', stderr=rebase_error), 'git stash && git rebase -i HEAD~7')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_git_two_dashes.py000066400000000000000000000033621261610017700217240ustar00rootroot00000000000000import pytest from thefuck.rules.git_two_dashes import match, get_new_command from tests.utils import Command @pytest.fixture def stderr(meant): return 'error: did you mean `%s` (with two dashes ?)' % meant @pytest.mark.parametrize('command', [ Command(script='git add -patch', stderr=stderr('--patch')), Command(script='git checkout -patch', stderr=stderr('--patch')), Command(script='git commit -amend', stderr=stderr('--amend')), Command(script='git push -tags', stderr=stderr('--tags')), Command(script='git rebase -continue', stderr=stderr('--continue'))]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='git add --patch'), Command(script='git checkout --patch'), Command(script='git commit --amend'), Command(script='git push --tags'), Command(script='git rebase --continue')]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, output', [ (Command(script='git add -patch', stderr=stderr('--patch')), 'git add --patch'), (Command(script='git checkout -patch', stderr=stderr('--patch')), 'git checkout --patch'), (Command(script='git checkout -patch', stderr=stderr('--patch')), 'git checkout --patch'), (Command(script='git init -bare', stderr=stderr('--bare')), 'git init --bare'), (Command(script='git commit -amend', stderr=stderr('--amend')), 'git commit --amend'), (Command(script='git push -tags', stderr=stderr('--tags')), 'git push --tags'), (Command(script='git rebase -continue', stderr=stderr('--continue')), 'git rebase --continue')]) def test_get_new_command(command, output): assert get_new_command(command) == output thefuck-3.2/tests/rules/test_go_run.py000066400000000000000000000007731261610017700202150ustar00rootroot00000000000000import pytest from thefuck.rules.go_run import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='go run foo'), Command(script='go run bar')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('go run foo'), 'go run foo.go'), (Command('go run bar'), 'go run bar.go')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_grep_recursive.py000066400000000000000000000005151261610017700217420ustar00rootroot00000000000000from thefuck.rules.grep_recursive import match, get_new_command from tests.utils import Command def test_match(): assert match(Command('grep blah .', stderr='grep: .: Is a directory')) assert not match(Command()) def test_get_new_command(): assert get_new_command( Command('grep blah .')) == 'grep -r blah .' thefuck-3.2/tests/rules/test_gulp_not_task.py000066400000000000000000000015241261610017700215700ustar00rootroot00000000000000import pytest from tests.utils import Command from thefuck.rules.gulp_not_task import match, get_new_command def stdout(task): return '''[00:41:11] Using gulpfile gulpfile.js [00:41:11] Task '{}' is not in your gulpfile [00:41:11] Please check the documentation for proper gulpfile formatting '''.format(task) def test_match(): assert match(Command('gulp srve', stdout('srve'))) @pytest.mark.parametrize('script, stdout', [ ('gulp serve', ''), ('cat srve', stdout('srve'))]) def test_not_march(script, stdout): assert not match(Command(script, stdout)) def test_get_new_command(mocker): mocker.patch('thefuck.rules.gulp_not_task.get_gulp_tasks', return_value=[ 'serve', 'build', 'default']) command = Command('gulp srve', stdout('srve')) assert get_new_command(command) == ['gulp serve', 'gulp default'] thefuck-3.2/tests/rules/test_has_exists_script.py000066400000000000000000000012571261610017700224600ustar00rootroot00000000000000from mock import patch from thefuck.rules.has_exists_script import match, get_new_command from ..utils import Command def test_match(): with patch('os.path.exists', return_value=True): assert match(Command(script='main', stderr='main: command not found')) assert match(Command(script='main --help', stderr='main: command not found')) assert not match(Command(script='main', stderr='')) with patch('os.path.exists', return_value=False): assert not match(Command(script='main', stderr='main: command not found')) def test_get_new_command(): assert get_new_command(Command(script='main --help')) == './main --help' thefuck-3.2/tests/rules/test_heroku_not_command.py000066400000000000000000000021151261610017700225670ustar00rootroot00000000000000import pytest from tests.utils import Command from thefuck.rules.heroku_not_command import match, get_new_command def suggest_stderr(cmd): return ''' ! `{}` is not a heroku command. ! Perhaps you meant `logs`, `pg`. ! See `heroku help` for a list of available commands.'''.format(cmd) no_suggest_stderr = ''' ! `aaaaa` is not a heroku command. ! See `heroku help` for a list of available commands.''' @pytest.mark.parametrize('cmd', ['log', 'pge']) def test_match(cmd): assert match( Command('heroku {}'.format(cmd), stderr=suggest_stderr(cmd))) @pytest.mark.parametrize('script, stderr', [ ('cat log', suggest_stderr('log')), ('heroku aaa', no_suggest_stderr)]) def test_not_match(script, stderr): assert not match(Command(script, stderr=stderr)) @pytest.mark.parametrize('cmd, result', [ ('log', ['heroku logs', 'heroku pg']), ('pge', ['heroku pg', 'heroku logs'])]) def test_get_new_command(cmd, result): command = Command('heroku {}'.format(cmd), stderr=suggest_stderr(cmd)) assert get_new_command(command) == result thefuck-3.2/tests/rules/test_history.py000066400000000000000000000024431261610017700204210ustar00rootroot00000000000000import pytest from thefuck.rules.history import match, get_new_command from tests.utils import Command @pytest.fixture def history(mocker): return mocker.patch('thefuck.rules.history.get_history', return_value=['le cat', 'fuck', 'ls cat', 'diff x', 'nocommand x']) @pytest.fixture def alias(mocker): return mocker.patch('thefuck.rules.history.thefuck_alias', return_value='fuck') @pytest.fixture def callables(mocker): return mocker.patch('thefuck.rules.history.get_all_executables', return_value=['diff', 'ls']) @pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') @pytest.mark.parametrize('script', ['ls cet', 'daff x']) def test_match(script): assert match(Command(script=script)) @pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') @pytest.mark.parametrize('script', ['apt-get', 'nocommand y']) def test_not_match(script): assert not match(Command(script=script)) @pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') @pytest.mark.parametrize('script, result', [ ('ls cet', 'ls cat'), ('daff x', 'diff x')]) def test_get_new_command(script, result): assert get_new_command(Command(script)) == result thefuck-3.2/tests/rules/test_java.py000066400000000000000000000007731261610017700176450ustar00rootroot00000000000000import pytest from thefuck.rules.java import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='java foo.java'), Command(script='java bar.java')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('java foo.java'), 'java foo'), (Command('java bar.java'), 'java bar')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_javac.py000066400000000000000000000007701261610017700200050ustar00rootroot00000000000000import pytest from thefuck.rules.javac import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='javac foo'), Command(script='javac bar')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('javac foo'), 'javac foo.java'), (Command('javac bar'), 'javac bar.java')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_lein_not_task.py000066400000000000000000000011131261610017700215420ustar00rootroot00000000000000import pytest from thefuck.rules.lein_not_task import match, get_new_command from tests.utils import Command @pytest.fixture def is_not_task(): return ''''rpl' is not a task. See 'lein help'. Did you mean this? repl jar ''' def test_match(is_not_task): assert match(Command(script='lein rpl', stderr=is_not_task)) assert not match(Command(script='ls', stderr=is_not_task)) def test_get_new_command(is_not_task): assert get_new_command(Command(script='lein rpl --help', stderr=is_not_task)) \ == ['lein repl --help', 'lein jar --help'] thefuck-3.2/tests/rules/test_ls_lah.py000066400000000000000000000010651261610017700201610ustar00rootroot00000000000000from thefuck.rules.ls_lah import match, get_new_command from tests.utils import Command def test_match(): assert match(Command(script='ls')) assert match(Command(script='ls file.py')) assert match(Command(script='ls /opt')) assert not match(Command(script='ls -lah /opt')) assert not match(Command(script='pacman -S binutils')) assert not match(Command(script='lsof')) def test_get_new_command(): assert get_new_command(Command(script='ls file.py')) == 'ls -lah file.py' assert get_new_command(Command(script='ls')) == 'ls -lah' thefuck-3.2/tests/rules/test_man.py000066400000000000000000000017711261610017700174760ustar00rootroot00000000000000import pytest from thefuck.rules.man import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command('man read'), Command('man 2 read'), Command('man 3 read'), Command('man -s2 read'), Command('man -s3 read'), Command('man -s 2 read'), Command('man -s 3 read')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command('man'), Command('man ')]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('man read'), ['man 3 read', 'man 2 read']), (Command('man 2 read'), 'man 3 read'), (Command('man 3 read'), 'man 2 read'), (Command('man -s2 read'), 'man -s3 read'), (Command('man -s3 read'), 'man -s2 read'), (Command('man -s 2 read'), 'man -s 3 read'), (Command('man -s 3 read'), 'man -s 2 read')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_man_no_space.py000066400000000000000000000005001261610017700213320ustar00rootroot00000000000000from thefuck.rules.man_no_space import match, get_new_command from tests.utils import Command def test_match(): assert match(Command('mandiff', stderr='mandiff: command not found')) assert not match(Command()) def test_get_new_command(): assert get_new_command( Command('mandiff')) == 'man diff' thefuck-3.2/tests/rules/test_mercurial.py000066400000000000000000000105371261610017700207060ustar00rootroot00000000000000import pytest from tests.utils import Command from thefuck.rules.mercurial import ( extract_possibilities, match, get_new_command ) @pytest.mark.parametrize('command', [ Command('hg base', stderr=( "hg: unknown command 'base'" '\n(did you mean one of blame, phase, rebase?)' )), Command('hg branchch', stderr=( "hg: unknown command 'branchch'" '\n(did you mean one of branch, branches?)' )), Command('hg vert', stderr=( "hg: unknown command 'vert'" '\n(did you mean one of revert?)' )), Command('hg lgo -r tip', stderr=( "hg: command 're' is ambiguous:" '\n(did you mean one of log?)' )), Command('hg rerere', stderr=( "hg: unknown command 'rerere'" '\n(did you mean one of revert?)' )), Command('hg re', stderr=( "hg: command 're' is ambiguous:" '\n rebase recover remove rename resolve revert' )), Command('hg re re', stderr=( "hg: command 're' is ambiguous:" '\n rebase recover remove rename resolve revert' )), ]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command('hg', stderr=( '\nMercurial Distributed SCM\n\nbasic commands:' )), Command('hg asdf', stderr=( "hg: unknown command 'asdf'" '\nMercurial Distributed SCM\n\nbasic commands:' )), Command('hg qwer', stderr=( "hg: unknown command 'qwer'" '\nMercurial Distributed SCM\n\nbasic commands:' )), Command('hg me', stderr=( "\nabort: no repository found in './thefuck' (.hg not found)!" )), Command('hg reb', stderr=( "\nabort: no repository found in './thefuck' (.hg not found)!" )), Command('hg co', stderr=( "\nabort: no repository found in './thefuck' (.hg not found)!" )), ]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, possibilities', [ (Command('hg base', stderr=( "hg: unknown command 'base'" '\n(did you mean one of blame, phase, rebase?)' )), ['blame', 'phase', 'rebase']), (Command('hg branchch', stderr=( "hg: unknown command 'branchch'" '\n(did you mean one of branch, branches?)' )), ['branch', 'branches']), (Command('hg vert', stderr=( "hg: unknown command 'vert'" '\n(did you mean one of revert?)' )), ['revert']), (Command('hg lgo -r tip', stderr=( "hg: command 're' is ambiguous:" '\n(did you mean one of log?)' )), ['log']), (Command('hg rerere', stderr=( "hg: unknown command 'rerere'" '\n(did you mean one of revert?)' )), ['revert']), (Command('hg re', stderr=( "hg: command 're' is ambiguous:" '\n rebase recover remove rename resolve revert' )), ['rebase', 'recover', 'remove', 'rename', 'resolve', 'revert']), (Command('hg re re', stderr=( "hg: command 're' is ambiguous:" '\n rebase recover remove rename resolve revert' )), ['rebase', 'recover', 'remove', 'rename', 'resolve', 'revert']), ]) def test_extract_possibilities(command, possibilities): assert extract_possibilities(command) == possibilities @pytest.mark.parametrize('command, new_command', [ (Command('hg base', stderr=( "hg: unknown command 'base'" '\n(did you mean one of blame, phase, rebase?)' )), 'hg rebase'), (Command('hg branchch', stderr=( "hg: unknown command 'branchch'" '\n(did you mean one of branch, branches?)' )), 'hg branch'), (Command('hg vert', stderr=( "hg: unknown command 'vert'" '\n(did you mean one of revert?)' )), 'hg revert'), (Command('hg lgo -r tip', stderr=( "hg: command 're' is ambiguous:" '\n(did you mean one of log?)' )), 'hg log -r tip'), (Command('hg rerere', stderr=( "hg: unknown command 'rerere'" '\n(did you mean one of revert?)' )), 'hg revert'), (Command('hg re', stderr=( "hg: command 're' is ambiguous:" '\n rebase recover remove rename resolve revert' )), 'hg rebase'), (Command('hg re re', stderr=( "hg: command 're' is ambiguous:" '\n rebase recover remove rename resolve revert' )), 'hg rebase re'), ]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_mkdir_p.py000066400000000000000000000022371261610017700203460ustar00rootroot00000000000000import pytest from thefuck.rules.mkdir_p import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command('mkdir foo/bar/baz', stderr='mkdir: foo/bar: No such file or directory'), Command('./bin/hdfs dfs -mkdir foo/bar/baz', stderr='mkdir: `foo/bar/baz\': No such file or directory'), Command('hdfs dfs -mkdir foo/bar/baz', stderr='mkdir: `foo/bar/baz\': No such file or directory') ]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command('mkdir foo/bar/baz'), Command('mkdir foo/bar/baz', stderr='foo bar baz'), Command('hdfs dfs -mkdir foo/bar/baz'), Command('./bin/hdfs dfs -mkdir foo/bar/baz'), Command()]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('mkdir foo/bar/baz'), 'mkdir -p foo/bar/baz'), (Command('hdfs dfs -mkdir foo/bar/baz'), 'hdfs dfs -mkdir -p foo/bar/baz'), (Command('./bin/hdfs dfs -mkdir foo/bar/baz'), './bin/hdfs dfs -mkdir -p foo/bar/baz')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_mvn_no_command.py000066400000000000000000000071001261610017700217050ustar00rootroot00000000000000import pytest from thefuck.rules.mvn_no_command import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='mvn', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='mvn clean', stdout=""" [INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building test 0.2 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test --- [INFO] Deleting /home/mlk/code/test/target [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.477s [INFO] Finished at: Wed Aug 26 13:05:47 BST 2015 [INFO] Final Memory: 6M/240M [INFO] ------------------------------------------------------------------------ """), Command(script='mvn --help'), Command(script='mvn -v') ]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command(script='mvn', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean package', 'mvn clean install']), (Command(script='mvn -N', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn -N clean package', 'mvn -N clean install'])]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_mvn_unknown_lifecycle_phase.py000066400000000000000000000070171261610017700245000ustar00rootroot00000000000000import pytest from thefuck.rules.mvn_unknown_lifecycle_phase import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='mvn cle', stdout='[ERROR] Unknown lifecycle phase "cle". You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='mvn clean', stdout=""" [INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building test 0.2 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test --- [INFO] Deleting /home/mlk/code/test/target [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.477s [INFO] Finished at: Wed Aug 26 13:05:47 BST 2015 [INFO] Final Memory: 6M/240M [INFO] ------------------------------------------------------------------------ """), Command(script='mvn --help'), Command(script='mvn -v') ]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command(script='mvn cle', stdout='[ERROR] Unknown lifecycle phase "cle". You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean', 'mvn compile']), (Command(script='mvn claen package', stdout='[ERROR] Unknown lifecycle phase "claen". You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean package'])]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_no_command.py000066400000000000000000000016721261610017700210350ustar00rootroot00000000000000import pytest from thefuck.rules.no_command import match, get_new_command from tests.utils import Command @pytest.fixture(autouse=True) def get_all_executables(mocker): mocker.patch('thefuck.rules.no_command.get_all_executables', return_value=['vim', 'apt-get', 'fsck']) @pytest.mark.usefixtures('no_memoize') def test_match(): assert match(Command(stderr='vom: not found', script='vom file.py')) assert match(Command(stderr='fucck: not found', script='fucck')) assert not match(Command(stderr='qweqwe: not found', script='qweqwe')) assert not match(Command(stderr='some text', script='vom file.py')) @pytest.mark.usefixtures('no_memoize') def test_get_new_command(): assert get_new_command( Command(stderr='vom: not found', script='vom file.py')) == ['vim file.py'] assert get_new_command( Command(stderr='fucck: not found', script='fucck')) == ['fsck'] thefuck-3.2/tests/rules/test_no_such_file.py000066400000000000000000000020741261610017700213550ustar00rootroot00000000000000import pytest from thefuck.rules.no_such_file import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='mv foo bar/foo', stderr="mv: cannot move 'foo' to 'bar/foo': No such file or directory"), Command(script='mv foo bar/', stderr="mv: cannot move 'foo' to 'bar/': No such file or directory"), ]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='mv foo bar/', stderr=""), Command(script='mv foo bar/foo', stderr="mv: permission denied"), ]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command(script='mv foo bar/foo', stderr="mv: cannot move 'foo' to 'bar/foo': No such file or directory"), 'mkdir -p bar && mv foo bar/foo'), (Command(script='mv foo bar/', stderr="mv: cannot move 'foo' to 'bar/': No such file or directory"), 'mkdir -p bar && mv foo bar/'), ]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_open.py000066400000000000000000000022361261610017700176610ustar00rootroot00000000000000import pytest from thefuck.rules.open import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='open foo.com'), Command(script='open foo.ly'), Command(script='open foo.org'), Command(script='open foo.net'), Command(script='open foo.se'), Command(script='open foo.io'), Command(script='xdg-open foo.com'), Command(script='gnome-open foo.com'), Command(script='kde-open foo.com')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('open foo.com'), 'open http://foo.com'), (Command('open foo.ly'), 'open http://foo.ly'), (Command('open foo.org'), 'open http://foo.org'), (Command('open foo.net'), 'open http://foo.net'), (Command('open foo.se'), 'open http://foo.se'), (Command('open foo.io'), 'open http://foo.io'), (Command('xdg-open foo.io'), 'xdg-open http://foo.io'), (Command('gnome-open foo.io'), 'gnome-open http://foo.io'), (Command('kde-open foo.io'), 'kde-open http://foo.io')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_pacman.py000066400000000000000000000071771261610017700201700ustar00rootroot00000000000000import pytest from mock import patch from thefuck.rules import pacman from thefuck.rules.pacman import match, get_new_command from tests.utils import Command pacman_cmd = getattr(pacman, 'pacman', 'pacman') PKGFILE_OUTPUT_SUDO = 'core/sudo 1.8.13-13/usr/bin/sudo' PKGFILE_OUTPUT_CONVERT = 'extra/imagemagick 6.9.1.0-1\t/usr/bin/convert' PKGFILE_OUTPUT_VIM = '''extra/gvim 7.4.712-1 \t/usr/bin/vim extra/gvim-python3 7.4.712-1\t/usr/bin/vim extra/vim 7.4.712-1 \t/usr/bin/vim extra/vim-minimal 7.4.712-1 \t/usr/bin/vim extra/vim-python3 7.4.712-1 \t/usr/bin/vim''' @pytest.mark.skipif(not getattr(pacman, 'enabled_by_default', True), reason='Skip if pacman is not available') @pytest.mark.parametrize('command', [ Command(script='vim', stderr='vim: command not found'), Command(script='sudo vim', stderr='sudo: vim: command not found')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, return_value', [ (Command(script='vim', stderr='vim: command not found'), PKGFILE_OUTPUT_VIM), (Command(script='sudo vim', stderr='sudo: vim: command not found'), PKGFILE_OUTPUT_VIM)]) @patch('thefuck.specific.archlinux.subprocess') @patch.multiple(pacman, create=True, pacman=pacman_cmd) def test_match_mocked(subp_mock, command, return_value): subp_mock.check_output.return_value = return_value assert match(command) @pytest.mark.parametrize('command', [ Command(script='vim', stderr=''), Command(), Command(script='sudo vim', stderr=''), Command()]) def test_not_match(command): assert not match(command) sudo_vim_possibilities = ['{} -S extra/gvim && sudo vim', '{} -S extra/gvim-python3 && sudo vim', '{} -S extra/vim && sudo vim', '{} -S extra/vim-minimal && sudo vim', '{} -S extra/vim-python3 && sudo vim'] sudo_vim_possibilities = [s.format(pacman_cmd) for s in sudo_vim_possibilities] vim_possibilities = ['{} -S extra/gvim && vim', '{} -S extra/gvim-python3 && vim', '{} -S extra/vim && vim', '{} -S extra/vim-minimal && vim', '{} -S extra/vim-python3 && vim'] vim_possibilities = [s.format(pacman_cmd) for s in vim_possibilities] @pytest.mark.skipif(not getattr(pacman, 'enabled_by_default', True), reason='Skip if pacman is not available') @pytest.mark.parametrize('command, new_command', [ (Command('vim'), vim_possibilities), (Command('sudo vim'), sudo_vim_possibilities), (Command('convert'), ['{} -S extra/imagemagick && convert'.format(pacman_cmd)]), (Command('sudo convert'), ['{} -S extra/imagemagick && sudo convert'.format(pacman_cmd)])]) def test_get_new_command(command, new_command, mocker): assert get_new_command(command) == new_command @pytest.mark.parametrize('command, new_command, return_value', [ (Command('vim'), vim_possibilities, PKGFILE_OUTPUT_VIM), (Command('sudo vim'), sudo_vim_possibilities, PKGFILE_OUTPUT_VIM), (Command('convert'), ['{} -S extra/imagemagick && convert'.format(pacman_cmd)], PKGFILE_OUTPUT_CONVERT), (Command('sudo'), ['{} -S core/sudo && sudo'.format(pacman_cmd)], PKGFILE_OUTPUT_SUDO), (Command('sudo convert'), ['{} -S extra/imagemagick && sudo convert'.format(pacman_cmd)], PKGFILE_OUTPUT_CONVERT)]) @patch('thefuck.specific.archlinux.subprocess') @patch.multiple(pacman, create=True, pacman=pacman_cmd) def test_get_new_command_mocked(subp_mock, command, new_command, return_value): subp_mock.check_output.return_value = return_value assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_pacman_not_found.py000066400000000000000000000047431261610017700222370ustar00rootroot00000000000000import pytest from mock import patch from thefuck.rules import pacman_not_found from thefuck.rules.pacman_not_found import match, get_new_command from tests.utils import Command PKGFILE_OUTPUT_LLC = '''extra/llvm 3.6.0-5 /usr/bin/llc extra/llvm35 3.5.2-13/usr/bin/llc''' @pytest.mark.skipif(not getattr(pacman_not_found, 'enabled_by_default', True), reason='Skip if pacman is not available') @pytest.mark.parametrize('command', [ Command(script='yaourt -S llc', stderr='error: target not found: llc'), Command(script='pacman llc', stderr='error: target not found: llc'), Command(script='sudo pacman llc', stderr='error: target not found: llc')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='yaourt -S llc', stderr='error: target not found: llc'), Command(script='pacman llc', stderr='error: target not found: llc'), Command(script='sudo pacman llc', stderr='error: target not found: llc')]) @patch('thefuck.specific.archlinux.subprocess') def test_match_mocked(subp_mock, command): subp_mock.check_output.return_value = PKGFILE_OUTPUT_LLC assert match(command) @pytest.mark.skipif(not getattr(pacman_not_found, 'enabled_by_default', True), reason='Skip if pacman is not available') @pytest.mark.parametrize('command, fixed', [ (Command(script='yaourt -S llc', stderr='error: target not found: llc'), ['yaourt -S extra/llvm', 'yaourt -S extra/llvm35']), (Command(script='pacman -S llc', stderr='error: target not found: llc'), ['pacman -S extra/llvm', 'pacman -S extra/llvm35']), (Command(script='sudo pacman -S llc', stderr='error: target not found: llc'), ['sudo pacman -S extra/llvm', 'sudo pacman -S extra/llvm35'])]) def test_get_new_command(command, fixed): assert get_new_command(command) == fixed @pytest.mark.parametrize('command, fixed', [ (Command(script='yaourt -S llc', stderr='error: target not found: llc'), ['yaourt -S extra/llvm', 'yaourt -S extra/llvm35']), (Command(script='pacman -S llc', stderr='error: target not found: llc'), ['pacman -S extra/llvm', 'pacman -S extra/llvm35']), (Command(script='sudo pacman -S llc', stderr='error: target not found: llc'), ['sudo pacman -S extra/llvm', 'sudo pacman -S extra/llvm35'])]) @patch('thefuck.specific.archlinux.subprocess') def test_get_new_command_mocked(subp_mock, command, fixed): subp_mock.check_output.return_value = PKGFILE_OUTPUT_LLC assert get_new_command(command) == fixed thefuck-3.2/tests/rules/test_pip_unknown_command.py000066400000000000000000000013621261610017700227640ustar00rootroot00000000000000import pytest from thefuck.rules.pip_unknown_command import match, get_new_command from tests.utils import Command @pytest.fixture def pip_unknown_cmd(): return '''ERROR: unknown command "instatl" - maybe you meant "install"''' @pytest.fixture def pip_unknown_cmd_without_recommend(): return '''ERROR: unknown command "i"''' def test_match(pip_unknown_cmd, pip_unknown_cmd_without_recommend): assert match(Command('pip instatl', stderr=pip_unknown_cmd)) assert not match(Command('pip i', stderr=pip_unknown_cmd_without_recommend)) def test_get_new_command(pip_unknown_cmd): assert get_new_command(Command('pip instatl', stderr=pip_unknown_cmd)) == 'pip install' thefuck-3.2/tests/rules/test_python_command.py000066400000000000000000000005201261610017700217310ustar00rootroot00000000000000from thefuck.rules.python_command import match, get_new_command from tests.utils import Command def test_match(): assert match(Command('temp.py', stderr='Permission denied')) assert not match(Command()) def test_get_new_command(): assert get_new_command(Command('./test_sudo.py'))\ == 'python ./test_sudo.py' thefuck-3.2/tests/rules/test_python_execute.py000066400000000000000000000010031261610017700217520ustar00rootroot00000000000000import pytest from thefuck.rules.python_execute import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='python foo'), Command(script='python bar')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command('python foo'), 'python foo.py'), (Command('python bar'), 'python bar.py')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_quotation_marks.py000066400000000000000000000013661261610017700221430ustar00rootroot00000000000000import pytest from thefuck.rules.quotation_marks import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script="git commit -m \'My Message\""), Command(script="git commit -am \"Mismatched Quotation Marks\'"), Command(script="echo \"hello\'")]) def test_match(command): assert match(command) @pytest.mark.parametrize('command, new_command', [ (Command("git commit -m \'My Message\""), "git commit -m \"My Message\""), (Command("git commit -am \"Mismatched Quotation Marks\'"), "git commit -am \"Mismatched Quotation Marks\""), (Command("echo \"hello\'"), "echo \"hello\"")]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_rm_dir.py000066400000000000000000000016321261610017700201730ustar00rootroot00000000000000import pytest from thefuck.rules.rm_dir import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command('rm foo', stderr='rm: foo: is a directory'), Command('rm foo', stderr='rm: foo: Is a directory'), Command('hdfs dfs -rm foo', stderr='rm: `foo`: Is a directory'), Command('./bin/hdfs dfs -rm foo', stderr='rm: `foo`: Is a directory') ]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command('rm foo'), Command('hdfs dfs -rm foo'), Command('./bin/hdfs dfs -rm foo'), Command()]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('rm foo'), 'rm -rf foo'), (Command('hdfs dfs -rm foo'), 'hdfs dfs -rm -r foo')]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_rm_root.py000066400000000000000000000011771261610017700204040ustar00rootroot00000000000000import pytest from thefuck.rules.rm_root import match, get_new_command from tests.utils import Command def test_match(): assert match(Command(script='rm -rf /', stderr='add --no-preserve-root')) @pytest.mark.parametrize('command', [ Command(script='ls', stderr='add --no-preserve-root'), Command(script='rm --no-preserve-root /', stderr='add --no-preserve-root'), Command(script='rm -rf /', stderr='')]) def test_not_match(command): assert not match(command) def test_get_new_command(): assert get_new_command(Command(script='rm -rf /')) \ == 'rm -rf / --no-preserve-root' thefuck-3.2/tests/rules/test_sed_unterminated_s.py000066400000000000000000000023051261610017700225710ustar00rootroot00000000000000import pytest from thefuck.rules.sed_unterminated_s import match, get_new_command from tests.utils import Command @pytest.fixture def sed_unterminated_s(): return "sed: -e expression #1, char 9: unterminated `s' command" def test_match(sed_unterminated_s): assert match(Command('sed -e s/foo/bar', stderr=sed_unterminated_s)) assert match(Command('sed -es/foo/bar', stderr=sed_unterminated_s)) assert match(Command('sed -e s/foo/bar -e s/baz/quz', stderr=sed_unterminated_s)) assert not match(Command('sed -e s/foo/bar')) assert not match(Command('sed -es/foo/bar')) assert not match(Command('sed -e s/foo/bar -e s/baz/quz')) def test_get_new_command(sed_unterminated_s): assert get_new_command(Command('sed -e s/foo/bar', stderr=sed_unterminated_s)) \ == 'sed -e s/foo/bar/' assert get_new_command(Command('sed -es/foo/bar', stderr=sed_unterminated_s)) \ == 'sed -es/foo/bar/' assert get_new_command(Command(r"sed -e 's/\/foo/bar'", stderr=sed_unterminated_s)) \ == r"sed -e 's/\/foo/bar/'" assert get_new_command(Command(r"sed -e s/foo/bar -es/baz/quz", stderr=sed_unterminated_s)) \ == r"sed -e s/foo/bar/ -es/baz/quz/" thefuck-3.2/tests/rules/test_sl_ls.py000066400000000000000000000004001261610017700200230ustar00rootroot00000000000000 from thefuck.rules.sl_ls import match, get_new_command from tests.utils import Command def test_match(): assert match(Command('sl')) assert not match(Command('ls')) def test_get_new_command(): assert get_new_command(Command('sl')) == 'ls' thefuck-3.2/tests/rules/test_ssh_known_host.py000066400000000000000000000045101261610017700217630ustar00rootroot00000000000000import os import pytest from mock import Mock from thefuck.rules.ssh_known_hosts import match, get_new_command,\ side_effect from tests.utils import Command @pytest.fixture def ssh_error(tmpdir): path = os.path.join(str(tmpdir), 'known_hosts') def reset(path): with open(path, 'w') as fh: lines = [ '123.234.567.890 asdjkasjdakjsd\n' '98.765.432.321 ejioweojwejrosj\n' '111.222.333.444 qwepoiwqepoiss\n' ] fh.writelines(lines) def known_hosts(path): with open(path, 'r') as fh: return fh.readlines() reset(path) errormsg = u"""@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is b6:cb:07:34:c0:a0:94:d3:0d:69:83:31:f4:c5:20:9b. Please contact your system administrator. Add correct host key in {0} to get rid of this message. Offending RSA key in {0}:2 RSA host key for {1} has changed and you have requested strict checking. Host key verification failed.""".format(path, '98.765.432.321') return errormsg, path, reset, known_hosts def test_match(ssh_error): errormsg, _, _, _ = ssh_error assert match(Command('ssh', stderr=errormsg)) assert match(Command('ssh', stderr=errormsg)) assert match(Command('scp something something', stderr=errormsg)) assert match(Command('scp something something', stderr=errormsg)) assert not match(Command(stderr=errormsg)) assert not match(Command('notssh', stderr=errormsg)) assert not match(Command('ssh')) def test_side_effect(ssh_error): errormsg, path, reset, known_hosts = ssh_error command = Command('ssh user@host', stderr=errormsg) side_effect(command, None) expected = ['123.234.567.890 asdjkasjdakjsd\n', '111.222.333.444 qwepoiwqepoiss\n'] assert known_hosts(path) == expected def test_get_new_command(ssh_error, monkeypatch): errormsg, _, _, _ = ssh_error assert get_new_command(Command('ssh user@host', stderr=errormsg)) == 'ssh user@host' thefuck-3.2/tests/rules/test_sudo.py000066400000000000000000000017021261610017700176670ustar00rootroot00000000000000import pytest from thefuck.rules.sudo import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('stderr, stdout', [ ('Permission denied', ''), ('permission denied', ''), ("npm ERR! Error: EACCES, unlink", ''), ('requested operation requires superuser privilege', ''), ('need to be root', ''), ('need root', ''), ('must be root', ''), ('You don\'t have access to the history DB.', ''), ('', "error: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/ipaddr.py'")]) def test_match(stderr, stdout): assert match(Command(stderr=stderr, stdout=stdout)) def test_not_match(): assert not match(Command()) @pytest.mark.parametrize('before, after', [ ('ls', 'sudo ls'), ('echo a > b', 'sudo sh -c "echo a > b"'), ('echo "a" >> b', 'sudo sh -c "echo \\"a\\" >> b"')]) def test_get_new_command(before, after): assert get_new_command(Command(before)) == after thefuck-3.2/tests/rules/test_switch_lang.py000066400000000000000000000017631261610017700212260ustar00rootroot00000000000000# -*- encoding: utf-8 -*- import pytest from thefuck.rules import switch_lang from tests.utils import Command @pytest.mark.parametrize('command', [ Command(stderr='command not found: фзе-пуе', script=u'фзе-пуе'), Command(stderr='command not found: λσ', script=u'λσ')]) def test_match(command): assert switch_lang.match(command) @pytest.mark.parametrize('command', [ Command(stderr='command not found: pat-get', script=u'pat-get'), Command(stderr='command not found: ls', script=u'ls'), Command(stderr='command not found: агсл', script=u'агсл'), Command(stderr='some info', script=u'фзе-пуе')]) def test_not_match(command): assert not switch_lang.match(command) @pytest.mark.parametrize('command, new_command', [ (Command(u'фзе-пуе штыефдд мшь'), 'apt-get install vim'), (Command(u'λσ -λα'), 'ls -la')]) def test_get_new_command(command, new_command): assert switch_lang.get_new_command(command) == new_command thefuck-3.2/tests/rules/test_systemctl.py000066400000000000000000000017111261610017700207440ustar00rootroot00000000000000import pytest from thefuck.rules.systemctl import match, get_new_command from tests.utils import Command def test_match(): assert match(Command('systemctl nginx start', stderr='Unknown operation \'nginx\'.')) assert match(Command('sudo systemctl nginx start', stderr='Unknown operation \'nginx\'.')) assert not match(Command('systemctl start nginx')) assert not match(Command('systemctl start nginx')) assert not match(Command('sudo systemctl nginx', stderr='Unknown operation \'nginx\'.')) assert not match(Command('systemctl nginx', stderr='Unknown operation \'nginx\'.')) assert not match(Command('systemctl start wtf', stderr='Failed to start wtf.service: Unit wtf.service failed to load: No such file or directory.')) def test_get_new_command(): assert get_new_command(Command('systemctl nginx start')) == "systemctl start nginx" assert get_new_command(Command('sudo systemctl nginx start')) == "sudo systemctl start nginx" thefuck-3.2/tests/rules/test_tmux.py000066400000000000000000000011251261610017700177110ustar00rootroot00000000000000import pytest from thefuck.rules.tmux import match, get_new_command from tests.utils import Command @pytest.fixture def tmux_ambiguous(): return "ambiguous command: list, could be: " \ "list-buffers, list-clients, list-commands, list-keys, " \ "list-panes, list-sessions, list-windows" def test_match(tmux_ambiguous): assert match(Command('tmux list', stderr=tmux_ambiguous)) def test_get_new_command(tmux_ambiguous): assert get_new_command(Command('tmux list', stderr=tmux_ambiguous))\ == ['tmux list-keys', 'tmux list-panes', 'tmux list-windows'] thefuck-3.2/tests/rules/test_touch.py000066400000000000000000000013501261610017700200360ustar00rootroot00000000000000import pytest from thefuck.rules.touch import match, get_new_command from tests.utils import Command @pytest.fixture def stderr(): return "touch: cannot touch '/a/b/c':" \ " No such file or directory" def test_match(stderr): command = Command( 'touch /a/b/c', stderr=stderr) assert match(command) @pytest.mark.parametrize('command', [ Command('touch /a/b/c'), Command('touch /a/b/c', stdout=stderr()), Command('ls /a/b/c', stderr=stderr())]) def test_not_match(command): assert not match(command) def test_get_new_command(stderr): command = Command('touch /a/b/c', stderr=stderr) fixed_command = get_new_command(command) assert fixed_command == 'mkdir -p /a/b && touch /a/b/c' thefuck-3.2/tests/rules/test_tsuru_login.py000066400000000000000000000022011261610017700212620ustar00rootroot00000000000000import pytest from thefuck.rules.tsuru_login import match, get_new_command from tests.utils import Command error_msg = ( "Error: you're not authenticated or your session has expired.", ("You're not authenticated or your session has expired. " "Please use \"login\" command for authentication."), ) @pytest.mark.parametrize('command', [ Command(script='tsuru app-shell', stderr=error_msg[0]), Command(script='tsuru app-log -f', stderr=error_msg[1]), ]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='tsuru'), Command(script='tsuru app-restart', stderr=('Error: unauthorized')), Command(script='tsuru app-log -f', stderr=('Error: unparseable data')), ]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('tsuru app-shell', stderr=error_msg[0]), 'tsuru login && tsuru app-shell'), (Command('tsuru app-log -f', stderr=error_msg[1]), 'tsuru login && tsuru app-log -f'), ]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_tsuru_not_command.py000066400000000000000000000053101261610017700224540ustar00rootroot00000000000000import pytest from tests.utils import Command from thefuck.rules.tsuru_not_command import match, get_new_command @pytest.mark.parametrize('command', [ Command('tsuru log', stderr=( 'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\tapp-log\n' '\tlogin\n' '\tlogout\n' )), Command('tsuru app-l', stderr=( 'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\tapp-list\n' '\tapp-log\n' )), Command('tsuru user-list', stderr=( 'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\tteam-user-list\n' )), Command('tsuru targetlist', stderr=( 'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\ttarget-list\n' )), ]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command('tsuru tchururu', stderr=( 'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' )), Command('tsuru version', stderr='tsuru version 0.16.0.'), Command('tsuru help', stderr=( 'tsuru version 0.16.0.\n' '\nUsage: tsuru command [args]\n' )), Command('tsuru platform-list', stderr=( '- java\n' '- logstashgiro\n' '- newnode\n' '- nodejs\n' '- php\n' '- python\n' '- python3\n' '- ruby\n' '- ruby20\n' '- static\n' )), Command('tsuru env-get', stderr='Error: App thefuck not found.'), ]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_commands', [ (Command('tsuru log', stderr=( 'tsuru: "log" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\tapp-log\n' '\tlogin\n' '\tlogout\n' )), ['tsuru login', 'tsuru logout', 'tsuru app-log']), (Command('tsuru app-l', stderr=( 'tsuru: "app-l" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\tapp-list\n' '\tapp-log\n' )), ['tsuru app-log', 'tsuru app-list']), (Command('tsuru user-list', stderr=( 'tsuru: "user-list" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\tteam-user-list\n' )), ['tsuru team-user-list']), (Command('tsuru targetlist', stderr=( 'tsuru: "targetlist" is not a tsuru command. See "tsuru help".\n' '\nDid you mean?\n' '\ttarget-list\n' )), ['tsuru target-list']), ]) def test_get_new_command(command, new_commands): assert get_new_command(command) == new_commands thefuck-3.2/tests/rules/test_unknown_command.py000066400000000000000000000032451261610017700221160ustar00rootroot00000000000000import pytest from thefuck.rules.unknown_command import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='./bin/hdfs dfs ls', stderr='ls: Unknown command\nDid you mean -ls? This command begins with a dash.'), Command(script='hdfs dfs ls', stderr='ls: Unknown command\nDid you mean -ls? This command begins with a dash.'), Command(script='hdfs dfs ls /foo/bar', stderr='ls: Unknown command\nDid you mean -ls? This command begins with a dash.')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='./bin/hdfs dfs -ls', stderr=''), Command(script='./bin/hdfs dfs -ls /foo/bar', stderr=''), Command(script='hdfs dfs -ls -R /foo/bar', stderr=''), Command()]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command('hdfs dfs ls', stderr='ls: Unknown command\nDid you mean -ls? This command begins with a dash.'), ['hdfs dfs -ls']), (Command('hdfs dfs rm /foo/bar', stderr='rm: Unknown command\nDid you mean -rm? This command begins with a dash.'), ['hdfs dfs -rm /foo/bar']), (Command('./bin/hdfs dfs ls -R /foo/bar', stderr='ls: Unknown command\nDid you mean -ls? This command begins with a dash.'), ['./bin/hdfs dfs -ls -R /foo/bar']), (Command('./bin/hdfs dfs -Dtest=fred ls -R /foo/bar', stderr='ls: Unknown command\nDid you mean -ls? This command begins with a dash.'), ['./bin/hdfs dfs -Dtest=fred -ls -R /foo/bar'])]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_vagrant_up.py000066400000000000000000000044121261610017700210640ustar00rootroot00000000000000import pytest from thefuck.rules.vagrant_up import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='vagrant ssh', stderr='VM must be running to open SSH connection. Run `vagrant up`\nto start the virtual machine.'), Command(script='vagrant ssh devbox', stderr='VM must be running to open SSH connection. Run `vagrant up`\nto start the virtual machine.'), Command(script='vagrant rdp', stderr='VM must be created before running this command. Run `vagrant up` first.'), Command(script='vagrant rdp devbox', stderr='VM must be created before running this command. Run `vagrant up` first.')]) def test_match(command): assert match(command) @pytest.mark.parametrize('command', [ Command(script='vagrant ssh', stderr=''), Command(script='vagrant ssh jeff', stderr='The machine with the name \'jeff\' was not found configured for this Vagrant environment.'), Command(script='vagrant ssh', stderr='A Vagrant environment or target machine is required to run this command. Run `vagrant init` to create a new Vagrant environment. Or, get an ID of a target machine from `vagrant global-status` to run this command on. A final option is to change to a directory with a Vagrantfile and to try again.'), Command()]) def test_not_match(command): assert not match(command) @pytest.mark.parametrize('command, new_command', [ (Command(script='vagrant ssh', stderr='VM must be running to open SSH connection. Run `vagrant up`\nto start the virtual machine.'), 'vagrant up && vagrant ssh'), (Command(script='vagrant ssh devbox', stderr='VM must be running to open SSH connection. Run `vagrant up`\nto start the virtual machine.'), ['vagrant up devbox && vagrant ssh devbox', 'vagrant up && vagrant ssh devbox']), (Command(script='vagrant rdp', stderr='VM must be created before running this command. Run `vagrant up` first.'), 'vagrant up && vagrant rdp'), (Command(script='vagrant rdp devbox', stderr='VM must be created before running this command. Run `vagrant up` first.'), ['vagrant up devbox && vagrant rdp devbox', 'vagrant up && vagrant rdp devbox'])]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/rules/test_whois.py000066400000000000000000000020041261610017700200420ustar00rootroot00000000000000import pytest from thefuck.rules.whois import match, get_new_command from tests.utils import Command @pytest.mark.parametrize('command', [ Command(script='whois https://en.wikipedia.org/wiki/Main_Page'), Command(script='whois https://en.wikipedia.org/'), Command(script='whois meta.unix.stackexchange.com')]) def test_match(command): assert match(command) def test_not_match(): assert not match(Command(script='whois')) # `whois com` actually makes sense @pytest.mark.parametrize('command, new_command', [ (Command('whois https://en.wikipedia.org/wiki/Main_Page'), 'whois en.wikipedia.org'), (Command('whois https://en.wikipedia.org/'), 'whois en.wikipedia.org'), (Command('whois meta.unix.stackexchange.com'), ['whois unix.stackexchange.com', 'whois stackexchange.com', 'whois com'])]) def test_get_new_command(command, new_command): assert get_new_command(command) == new_command thefuck-3.2/tests/specific/000077500000000000000000000000001261610017700157375ustar00rootroot00000000000000thefuck-3.2/tests/specific/__init__.py000066400000000000000000000000001261610017700200360ustar00rootroot00000000000000thefuck-3.2/tests/specific/test_git.py000066400000000000000000000017341261610017700201400ustar00rootroot00000000000000import pytest from thefuck.specific.git import git_support from tests.utils import Command @pytest.mark.parametrize('called, command, stderr', [ ('git co', 'git checkout', "19:22:36.299340 git.c:282 trace: alias expansion: co => 'checkout'"), ('git com file', 'git commit --verbose file', "19:23:25.470911 git.c:282 trace: alias expansion: com => 'commit' '--verbose'")]) def test_git_support(called, command, stderr): @git_support def fn(command): return command.script assert fn(Command(script=called, stderr=stderr)) == command @pytest.mark.parametrize('command, is_git', [ ('git pull', True), ('hub pull', True), ('git push --set-upstream origin foo', True), ('hub push --set-upstream origin foo', True), ('ls', False), ('cat git', False), ('cat hub', False)]) def test_git_support_match(command, is_git): @git_support def fn(command): return True assert fn(Command(script=command)) == is_git thefuck-3.2/tests/specific/test_sudo.py000066400000000000000000000012421261610017700203210ustar00rootroot00000000000000import pytest from mock import Mock from thefuck.specific.sudo import sudo_support from tests.utils import Command @pytest.mark.parametrize('return_value, command, called, result', [ ('ls -lah', 'sudo ls', 'ls', 'sudo ls -lah'), ('ls -lah', 'ls', 'ls', 'ls -lah'), (['ls -lah'], 'sudo ls', 'ls', ['sudo ls -lah']), (True, 'sudo ls', 'ls', True), (True, 'ls', 'ls', True), (False, 'sudo ls', 'ls', False), (False, 'ls', 'ls', False)]) def test_sudo_support(return_value, command, called, result): def fn(command): assert command == Command(called) return return_value assert sudo_support(fn)(Command(command)) == result thefuck-3.2/tests/test_conf.py000066400000000000000000000077261261610017700165240ustar00rootroot00000000000000import pytest import six from mock import Mock from thefuck import conf @pytest.fixture def load_source(mocker): return mocker.patch('thefuck.conf.load_source') @pytest.fixture def environ(monkeypatch): data = {} monkeypatch.setattr('thefuck.conf.os.environ', data) return data @pytest.mark.usefixture('environ') def test_settings_defaults(load_source, settings): load_source.return_value = object() settings.init() for key, val in conf.DEFAULT_SETTINGS.items(): assert getattr(settings, key) == val @pytest.mark.usefixture('environ') class TestSettingsFromFile(object): def test_from_file(self, load_source, settings): load_source.return_value = Mock(rules=['test'], wait_command=10, require_confirmation=True, no_colors=True, priority={'vim': 100}, exclude_rules=['git']) settings.init() assert settings.rules == ['test'] assert settings.wait_command == 10 assert settings.require_confirmation is True assert settings.no_colors is True assert settings.priority == {'vim': 100} assert settings.exclude_rules == ['git'] def test_from_file_with_DEFAULT(self, load_source, settings): load_source.return_value = Mock(rules=conf.DEFAULT_RULES + ['test'], wait_command=10, exclude_rules=[], require_confirmation=True, no_colors=True) settings.init() assert settings.rules == conf.DEFAULT_RULES + ['test'] @pytest.mark.usefixture('load_source') class TestSettingsFromEnv(object): def test_from_env(self, environ, settings): environ.update({'THEFUCK_RULES': 'bash:lisp', 'THEFUCK_EXCLUDE_RULES': 'git:vim', 'THEFUCK_WAIT_COMMAND': '55', 'THEFUCK_REQUIRE_CONFIRMATION': 'true', 'THEFUCK_NO_COLORS': 'false', 'THEFUCK_PRIORITY': 'bash=10:lisp=wrong:vim=15'}) settings.init() assert settings.rules == ['bash', 'lisp'] assert settings.exclude_rules == ['git', 'vim'] assert settings.wait_command == 55 assert settings.require_confirmation is True assert settings.no_colors is False assert settings.priority == {'bash': 10, 'vim': 15} def test_from_env_with_DEFAULT(self, environ, settings): environ.update({'THEFUCK_RULES': 'DEFAULT_RULES:bash:lisp'}) settings.init() assert settings.rules == conf.DEFAULT_RULES + ['bash', 'lisp'] class TestInitializeSettingsFile(object): def test_ignore_if_exists(self, settings): settings_path_mock = Mock(is_file=Mock(return_value=True), open=Mock()) settings.user_dir = Mock(joinpath=Mock(return_value=settings_path_mock)) settings._init_settings_file() assert settings_path_mock.is_file.call_count == 1 assert not settings_path_mock.open.called def test_create_if_doesnt_exists(self, settings): settings_file = six.StringIO() settings_path_mock = Mock( is_file=Mock(return_value=False), open=Mock(return_value=Mock( __exit__=lambda *args: None, __enter__=lambda *args: settings_file))) settings.user_dir = Mock(joinpath=Mock(return_value=settings_path_mock)) settings._init_settings_file() settings_file_contents = settings_file.getvalue() assert settings_path_mock.is_file.call_count == 1 assert settings_path_mock.open.call_count == 1 assert conf.SETTINGS_HEADER in settings_file_contents for setting in conf.DEFAULT_SETTINGS.items(): assert '# {} = {}\n'.format(*setting) in settings_file_contents settings_file.close() thefuck-3.2/tests/test_corrector.py000066400000000000000000000050031261610017700175630ustar00rootroot00000000000000import pytest from pathlib import PosixPath from thefuck import corrector, conf from tests.utils import Rule, Command, CorrectedCommand from thefuck.corrector import get_corrected_commands, organize_commands class TestGetRules(object): @pytest.fixture def glob(self, mocker): results = {} mocker.patch('pathlib.Path.glob', new_callable=lambda: lambda *_: results.pop('value', [])) return lambda value: results.update({'value': value}) @pytest.fixture(autouse=True) def load_source(self, monkeypatch): monkeypatch.setattr('thefuck.types.load_source', lambda x, _: Rule(x)) def _compare_names(self, rules, names): assert {r.name for r in rules} == set(names) @pytest.mark.parametrize('paths, conf_rules, exclude_rules, loaded_rules', [ (['git.py', 'bash.py'], conf.DEFAULT_RULES, [], ['git', 'bash']), (['git.py', 'bash.py'], ['git'], [], ['git']), (['git.py', 'bash.py'], conf.DEFAULT_RULES, ['git'], ['bash']), (['git.py', 'bash.py'], ['git'], ['git'], [])]) def test_get_rules(self, glob, settings, paths, conf_rules, exclude_rules, loaded_rules): glob([PosixPath(path) for path in paths]) settings.update(rules=conf_rules, priority={}, exclude_rules=exclude_rules) rules = corrector.get_rules() self._compare_names(rules, loaded_rules) def test_get_corrected_commands(mocker): command = Command('test', 'test', 'test') rules = [Rule(match=lambda _: False), Rule(match=lambda _: True, get_new_command=lambda x: x.script + '!', priority=100), Rule(match=lambda _: True, get_new_command=lambda x: [x.script + '@', x.script + ';'], priority=60)] mocker.patch('thefuck.corrector.get_rules', return_value=rules) assert [cmd.script for cmd in get_corrected_commands(command)] \ == ['test!', 'test@', 'test;'] def test_organize_commands(): """Ensures that the function removes duplicates and sorts commands.""" commands = [CorrectedCommand('ls'), CorrectedCommand('ls -la', priority=9000), CorrectedCommand('ls -lh', priority=100), CorrectedCommand('ls -lh', priority=9999)] assert list(organize_commands(iter(commands))) \ == [CorrectedCommand('ls'), CorrectedCommand('ls -lh', priority=100), CorrectedCommand('ls -la', priority=9000)] thefuck-3.2/tests/test_logs.py000066400000000000000000000007641261610017700165360ustar00rootroot00000000000000import pytest from mock import Mock from thefuck import logs def test_color(settings): settings.no_colors = False assert logs.color('red') == 'red' settings.no_colors = True assert logs.color('red') == '' @pytest.mark.usefixtures('no_colors') @pytest.mark.parametrize('debug, stderr', [ (True, 'DEBUG: test\n'), (False, '')]) def test_debug(capsys, settings, debug, stderr): settings.debug = debug logs.debug('test') assert capsys.readouterr() == ('', stderr) thefuck-3.2/tests/test_readme.py000066400000000000000000000006741261610017700170270ustar00rootroot00000000000000def test_readme(source_root): with source_root.joinpath('README.md').open() as f: readme = f.read() bundled = source_root.joinpath('thefuck') \ .joinpath('rules') \ .glob('*.py') for rule in bundled: if rule.stem != '__init__': assert rule.stem in readme,\ 'Missing rule "{}" in README.md'.format(rule.stem) thefuck-3.2/tests/test_shells.py000066400000000000000000000176161261610017700170700ustar00rootroot00000000000000import pytest from thefuck import shells @pytest.fixture def builtins_open(mocker): return mocker.patch('six.moves.builtins.open') @pytest.fixture def isfile(mocker): return mocker.patch('os.path.isfile', return_value=True) @pytest.fixture @pytest.mark.usefixtures('isfile') def history_lines(mocker): def aux(lines): mock = mocker.patch('io.open') mock.return_value.__enter__\ .return_value.__iter__.return_value = lines return aux class TestGeneric(object): @pytest.fixture def shell(self): return shells.Generic() def test_from_shell(self, shell): assert shell.from_shell('pwd') == 'pwd' def test_to_shell(self, shell): assert shell.to_shell('pwd') == 'pwd' def test_put_to_history(self, builtins_open, shell): assert shell.put_to_history('ls') is None assert builtins_open.call_count == 0 def test_and_(self, shell): assert shell.and_('ls', 'cd') == 'ls && cd' def test_get_aliases(self, shell): assert shell.get_aliases() == {} def test_app_alias(self, shell): assert 'alias fuck' in shell.app_alias('fuck') assert 'alias FUCK' in shell.app_alias('FUCK') assert 'thefuck' in shell.app_alias('fuck') assert 'TF_ALIAS' in shell.app_alias('fuck') def test_get_history(self, history_lines, shell): history_lines(['ls', 'rm']) # We don't know what to do in generic shell with history lines, # so just ignore them: assert list(shell.get_history()) == [] @pytest.mark.usefixtures('isfile') class TestBash(object): @pytest.fixture def shell(self): return shells.Bash() @pytest.fixture(autouse=True) def Popen(self, mocker): mock = mocker.patch('thefuck.shells.Popen') mock.return_value.stdout.read.return_value = ( b'alias fuck=\'eval $(thefuck $(fc -ln -1))\'\n' b'alias l=\'ls -CF\'\n' b'alias la=\'ls -A\'\n' b'alias ll=\'ls -alF\'') return mock @pytest.mark.parametrize('before, after', [ ('pwd', 'pwd'), ('fuck', 'eval $(thefuck $(fc -ln -1))'), ('awk', 'awk'), ('ll', 'ls -alF')]) def test_from_shell(self, before, after, shell): assert shell.from_shell(before) == after def test_to_shell(self, shell): assert shell.to_shell('pwd') == 'pwd' def test_put_to_history(self, builtins_open, shell): shell.put_to_history('ls') builtins_open.return_value.__enter__.return_value. \ write.assert_called_once_with('ls\n') def test_and_(self, shell): assert shell.and_('ls', 'cd') == 'ls && cd' def test_get_aliases(self, shell): assert shell.get_aliases() == {'fuck': 'eval $(thefuck $(fc -ln -1))', 'l': 'ls -CF', 'la': 'ls -A', 'll': 'ls -alF'} def test_app_alias(self, shell): assert 'alias fuck' in shell.app_alias('fuck') assert 'alias FUCK' in shell.app_alias('FUCK') assert 'thefuck' in shell.app_alias('fuck') assert 'TF_ALIAS' in shell.app_alias('fuck') def test_get_history(self, history_lines, shell): history_lines(['ls', 'rm']) assert list(shell.get_history()) == ['ls', 'rm'] @pytest.mark.usefixtures('isfile') class TestFish(object): @pytest.fixture def shell(self): return shells.Fish() @pytest.fixture(autouse=True) def Popen(self, mocker): mock = mocker.patch('thefuck.shells.Popen') mock.return_value.stdout.read.return_value = ( b'cd\nfish_config\nfuck\nfunced\nfuncsave\ngrep\nhistory\nll\nls\n' b'man\nmath\npopd\npushd\nruby') return mock @pytest.fixture def environ(self, monkeypatch): data = {'TF_OVERRIDDEN_ALIASES': 'cd, ls, man, open'} monkeypatch.setattr('thefuck.shells.os.environ', data) return data @pytest.mark.usefixture('environ') def test_get_overridden_aliases(self, shell, environ): assert shell._get_overridden_aliases() == ['cd', 'ls', 'man', 'open'] @pytest.mark.parametrize('before, after', [ ('cd', 'cd'), ('pwd', 'pwd'), ('fuck', 'fish -ic "fuck"'), ('find', 'find'), ('funced', 'fish -ic "funced"'), ('grep', 'grep'), ('awk', 'awk'), ('math "2 + 2"', r'fish -ic "math \"2 + 2\""'), ('man', 'man'), ('open', 'open'), ('vim', 'vim'), ('ll', 'fish -ic "ll"'), ('ls', 'ls')]) # Fish has no aliases but functions def test_from_shell(self, before, after, shell): assert shell.from_shell(before) == after def test_to_shell(self, shell): assert shell.to_shell('pwd') == 'pwd' def test_put_to_history(self, builtins_open, mocker, shell): mocker.patch('thefuck.shells.time', return_value=1430707243.3517463) shell.put_to_history('ls') builtins_open.return_value.__enter__.return_value. \ write.assert_called_once_with('- cmd: ls\n when: 1430707243\n') def test_and_(self, shell): assert shell.and_('foo', 'bar') == 'foo; and bar' def test_get_aliases(self, shell): assert shell.get_aliases() == {'fish_config': 'fish_config', 'fuck': 'fuck', 'funced': 'funced', 'funcsave': 'funcsave', 'history': 'history', 'll': 'll', 'math': 'math', 'popd': 'popd', 'pushd': 'pushd', 'ruby': 'ruby'} def test_app_alias(self, shell): assert 'function fuck' in shell.app_alias('fuck') assert 'function FUCK' in shell.app_alias('FUCK') assert 'thefuck' in shell.app_alias('fuck') assert 'TF_ALIAS' in shell.app_alias('fuck') @pytest.mark.usefixtures('isfile') class TestZsh(object): @pytest.fixture def shell(self): return shells.Zsh() @pytest.fixture(autouse=True) def Popen(self, mocker): mock = mocker.patch('thefuck.shells.Popen') mock.return_value.stdout.read.return_value = ( b'fuck=\'eval $(thefuck $(fc -ln -1 | tail -n 1))\'\n' b'l=\'ls -CF\'\n' b'la=\'ls -A\'\n' b'll=\'ls -alF\'') return mock @pytest.mark.parametrize('before, after', [ ('fuck', 'eval $(thefuck $(fc -ln -1 | tail -n 1))'), ('pwd', 'pwd'), ('ll', 'ls -alF')]) def test_from_shell(self, before, after, shell): assert shell.from_shell(before) == after def test_to_shell(self, shell): assert shell.to_shell('pwd') == 'pwd' def test_put_to_history(self, builtins_open, mocker, shell): mocker.patch('thefuck.shells.time', return_value=1430707243.3517463) shell.put_to_history('ls') builtins_open.return_value.__enter__.return_value. \ write.assert_called_once_with(': 1430707243:0;ls\n') def test_and_(self, shell): assert shell.and_('ls', 'cd') == 'ls && cd' def test_get_aliases(self, shell): assert shell.get_aliases() == { 'fuck': 'eval $(thefuck $(fc -ln -1 | tail -n 1))', 'l': 'ls -CF', 'la': 'ls -A', 'll': 'ls -alF'} def test_app_alias(self, shell): assert 'alias fuck' in shell.app_alias('fuck') assert 'alias FUCK' in shell.app_alias('FUCK') assert 'thefuck' in shell.app_alias('fuck') assert 'TF_ALIAS' in shell.app_alias('fuck') def test_get_history(self, history_lines, shell): history_lines([': 1432613911:0;ls', ': 1432613916:0;rm']) assert list(shell.get_history()) == ['ls', 'rm'] thefuck-3.2/tests/test_types.py000066400000000000000000000123001261610017700167230ustar00rootroot00000000000000from subprocess import PIPE from mock import Mock from pathlib import Path import pytest from tests.utils import CorrectedCommand, Rule, Command from thefuck import conf from thefuck.exceptions import EmptyCommand class TestCorrectedCommand(object): def test_equality(self): assert CorrectedCommand('ls', None, 100) == \ CorrectedCommand('ls', None, 200) assert CorrectedCommand('ls', None, 100) != \ CorrectedCommand('ls', lambda *_: _, 100) def test_hashable(self): assert {CorrectedCommand('ls', None, 100), CorrectedCommand('ls', None, 200)} == {CorrectedCommand('ls')} class TestRule(object): def test_from_path(self, mocker): match = object() get_new_command = object() load_source = mocker.patch( 'thefuck.types.load_source', return_value=Mock(match=match, get_new_command=get_new_command, enabled_by_default=True, priority=900, requires_output=True)) assert Rule.from_path(Path('/rules/bash.py')) \ == Rule('bash', match, get_new_command, priority=900) load_source.assert_called_once_with('bash', '/rules/bash.py') @pytest.mark.parametrize('rules, exclude_rules, rule, is_enabled', [ (conf.DEFAULT_RULES, [], Rule('git', enabled_by_default=True), True), (conf.DEFAULT_RULES, [], Rule('git', enabled_by_default=False), False), ([], [], Rule('git', enabled_by_default=False), False), ([], [], Rule('git', enabled_by_default=True), False), (conf.DEFAULT_RULES + ['git'], [], Rule('git', enabled_by_default=False), True), (['git'], [], Rule('git', enabled_by_default=False), True), (conf.DEFAULT_RULES, ['git'], Rule('git', enabled_by_default=True), False), (conf.DEFAULT_RULES, ['git'], Rule('git', enabled_by_default=False), False), ([], ['git'], Rule('git', enabled_by_default=True), False), ([], ['git'], Rule('git', enabled_by_default=False), False)]) def test_is_enabled(self, settings, rules, exclude_rules, rule, is_enabled): settings.update(rules=rules, exclude_rules=exclude_rules) assert rule.is_enabled == is_enabled def test_isnt_match(self): assert not Rule('', lambda _: False).is_match( Command('ls')) def test_is_match(self): rule = Rule('', lambda x: x.script == 'cd ..') assert rule.is_match(Command('cd ..')) @pytest.mark.usefixtures('no_colors') def test_isnt_match_when_rule_failed(self, capsys): rule = Rule('test', Mock(side_effect=OSError('Denied')), requires_output=False) assert not rule.is_match(Command('ls')) assert capsys.readouterr()[1].split('\n')[0] == '[WARN] Rule test:' def test_get_corrected_commands_with_rule_returns_list(self): rule = Rule(get_new_command=lambda x: [x.script + '!', x.script + '@'], priority=100) assert list(rule.get_corrected_commands(Command(script='test'))) \ == [CorrectedCommand(script='test!', priority=100), CorrectedCommand(script='test@', priority=200)] def test_get_corrected_commands_with_rule_returns_command(self): rule = Rule(get_new_command=lambda x: x.script + '!', priority=100) assert list(rule.get_corrected_commands(Command(script='test'))) \ == [CorrectedCommand(script='test!', priority=100)] class TestCommand(object): @pytest.fixture(autouse=True) def Popen(self, monkeypatch): Popen = Mock() Popen.return_value.stdout.read.return_value = b'stdout' Popen.return_value.stderr.read.return_value = b'stderr' monkeypatch.setattr('thefuck.types.Popen', Popen) return Popen @pytest.fixture(autouse=True) def prepare(self, monkeypatch): monkeypatch.setattr('thefuck.types.os.environ', {}) monkeypatch.setattr('thefuck.types.Command._wait_output', staticmethod(lambda *_: True)) @pytest.fixture(autouse=True) def generic_shell(self, monkeypatch): monkeypatch.setattr('thefuck.shells.from_shell', lambda x: x) monkeypatch.setattr('thefuck.shells.to_shell', lambda x: x) def test_from_script_calls(self, Popen, settings): settings.env = {} assert Command.from_raw_script( ['apt-get', 'search', 'vim']) == Command( 'apt-get search vim', 'stdout', 'stderr') Popen.assert_called_once_with('apt-get search vim', shell=True, stdout=PIPE, stderr=PIPE, env={}) @pytest.mark.parametrize('script, result', [ ([''], None), (['', ''], None), (['ls', '-la'], 'ls -la'), (['ls'], 'ls')]) def test_from_script(self, script, result): if result: assert Command.from_raw_script(script).script == result else: with pytest.raises(EmptyCommand): Command.from_raw_script(script) thefuck-3.2/tests/test_ui.py000066400000000000000000000071751261610017700162120ustar00rootroot00000000000000# -*- encoding: utf-8 -*- import pytest from itertools import islice from thefuck import ui from thefuck.types import CorrectedCommand @pytest.fixture def patch_getch(monkeypatch): def patch(vals): def getch(): for val in vals: if val == KeyboardInterrupt: raise val else: yield val getch_gen = getch() monkeypatch.setattr('thefuck.ui.getch', lambda: next(getch_gen)) return patch def test_read_actions(patch_getch): patch_getch([ # Enter: '\n', # Enter: '\r', # Ignored: 'x', 'y', # Up: '\x1b', '[', 'A', # Down: '\x1b', '[', 'B', # Ctrl+C: KeyboardInterrupt], ) assert list(islice(ui.read_actions(), 5)) \ == [ui.SELECT, ui.SELECT, ui.PREVIOUS, ui.NEXT, ui.ABORT] def test_command_selector(): selector = ui.CommandSelector(iter([1, 2, 3])) assert selector.value == 1 selector.next() assert selector.value == 2 selector.next() assert selector.value == 3 selector.next() assert selector.value == 1 selector.previous() assert selector.value == 3 @pytest.mark.usefixtures('no_colors') class TestSelectCommand(object): @pytest.fixture def commands_with_side_effect(self): return [CorrectedCommand('ls', lambda *_: None, 100), CorrectedCommand('cd', lambda *_: None, 100)] @pytest.fixture def commands(self): return [CorrectedCommand('ls', None, 100), CorrectedCommand('cd', None, 100)] def test_without_commands(self, capsys): assert ui.select_command(iter([])) is None assert capsys.readouterr() == ('', 'No fucks given\n') def test_without_confirmation(self, capsys, commands, settings): settings.require_confirmation = False assert ui.select_command(iter(commands)) == commands[0] assert capsys.readouterr() == ('', 'ls\n') def test_without_confirmation_with_side_effects( self, capsys, commands_with_side_effect, settings): settings.require_confirmation = False assert ui.select_command(iter(commands_with_side_effect)) \ == commands_with_side_effect[0] assert capsys.readouterr() == ('', 'ls (+side effect)\n') def test_with_confirmation(self, capsys, patch_getch, commands): patch_getch(['\n']) assert ui.select_command(iter(commands)) == commands[0] assert capsys.readouterr() == ('', u'\x1b[1K\rls [enter/↑/↓/ctrl+c]\n') def test_with_confirmation_abort(self, capsys, patch_getch, commands): patch_getch([KeyboardInterrupt]) assert ui.select_command(iter(commands)) is None assert capsys.readouterr() == ('', u'\x1b[1K\rls [enter/↑/↓/ctrl+c]\nAborted\n') def test_with_confirmation_with_side_effct(self, capsys, patch_getch, commands_with_side_effect): patch_getch(['\n']) assert ui.select_command(iter(commands_with_side_effect))\ == commands_with_side_effect[0] assert capsys.readouterr() == ('', u'\x1b[1K\rls (+side effect) [enter/↑/↓/ctrl+c]\n') def test_with_confirmation_select_second(self, capsys, patch_getch, commands): patch_getch(['\x1b', '[', 'B', '\n']) assert ui.select_command(iter(commands)) == commands[1] assert capsys.readouterr() == ( '', u'\x1b[1K\rls [enter/↑/↓/ctrl+c]\x1b[1K\rcd [enter/↑/↓/ctrl+c]\n') thefuck-3.2/tests/test_utils.py000066400000000000000000000155251261610017700167330ustar00rootroot00000000000000import pytest from mock import Mock import six from thefuck.utils import default_settings, \ memoize, get_closest, get_all_executables, replace_argument, \ get_all_matched_commands, is_app, for_app, cache, compatibility_call from tests.utils import Command @pytest.mark.parametrize('override, old, new', [ ({'key': 'val'}, {}, {'key': 'val'}), ({'key': 'new-val'}, {'key': 'val'}, {'key': 'val'}), ({'key': 'new-val', 'unset': 'unset'}, {'key': 'val'}, {'key': 'val', 'unset': 'unset'})]) def test_default_settings(settings, override, old, new): settings.clear() settings.update(old) fn = lambda _: _ default_settings(override)(fn)(None) assert settings == new def test_memoize(): fn = Mock(__name__='fn') memoized = memoize(fn) memoized() memoized() fn.assert_called_once_with() @pytest.mark.usefixtures('no_memoize') def test_no_memoize(): fn = Mock(__name__='fn') memoized = memoize(fn) memoized() memoized() assert fn.call_count == 2 class TestGetClosest(object): def test_when_can_match(self): assert 'branch' == get_closest('brnch', ['branch', 'status']) def test_when_cant_match(self): assert 'status' == get_closest('st', ['status', 'reset']) def test_without_fallback(self): assert get_closest('st', ['status', 'reset'], fallback_to_first=False) is None @pytest.fixture def get_aliases(mocker): mocker.patch('thefuck.shells.get_aliases', return_value=['vim', 'apt-get', 'fsck', 'fuck']) @pytest.mark.usefixtures('no_memoize', 'get_aliases') def test_get_all_executables(): all_callables = get_all_executables() assert 'vim' in all_callables assert 'fsck' in all_callables assert 'fuck' not in all_callables @pytest.mark.parametrize('args, result', [ (('apt-get instol vim', 'instol', 'install'), 'apt-get install vim'), (('git brnch', 'brnch', 'branch'), 'git branch')]) def test_replace_argument(args, result): assert replace_argument(*args) == result @pytest.mark.parametrize('stderr, result', [ (("git: 'cone' is not a git command. See 'git --help'.\n" '\n' 'Did you mean one of these?\n' '\tclone'), ['clone']), (("git: 're' is not a git command. See 'git --help'.\n" '\n' 'Did you mean one of these?\n' '\trebase\n' '\treset\n' '\tgrep\n' '\trm'), ['rebase', 'reset', 'grep', 'rm']), (('tsuru: "target" is not a tsuru command. See "tsuru help".\n' '\n' 'Did you mean one of these?\n' '\tservice-add\n' '\tservice-bind\n' '\tservice-doc\n' '\tservice-info\n' '\tservice-list\n' '\tservice-remove\n' '\tservice-status\n' '\tservice-unbind'), ['service-add', 'service-bind', 'service-doc', 'service-info', 'service-list', 'service-remove', 'service-status', 'service-unbind'])]) def test_get_all_matched_commands(stderr, result): assert list(get_all_matched_commands(stderr)) == result @pytest.mark.usefixtures('no_memoize') @pytest.mark.parametrize('script, names, result', [ ('git diff', ['git', 'hub'], True), ('hub diff', ['git', 'hub'], True), ('hg diff', ['git', 'hub'], False)]) def test_is_app(script, names, result): assert is_app(Command(script), *names) == result @pytest.mark.usefixtures('no_memoize') @pytest.mark.parametrize('script, names, result', [ ('git diff', ['git', 'hub'], True), ('hub diff', ['git', 'hub'], True), ('hg diff', ['git', 'hub'], False)]) def test_for_app(script, names, result): @for_app(*names) def match(command): return True assert match(Command(script)) == result class TestCache(object): @pytest.fixture(autouse=True) def enable_cache(self, monkeypatch): monkeypatch.setattr('thefuck.utils.cache.disabled', False) @pytest.fixture def shelve(self, mocker): value = {} class _Shelve(object): def __init__(self, path): pass def __setitem__(self, k, v): value[k] = v def __getitem__(self, k): return value[k] def get(self, k, v=None): return value.get(k, v) def close(self): return mocker.patch('thefuck.utils.shelve.open', new_callable=lambda: _Shelve) return value @pytest.fixture(autouse=True) def mtime(self, mocker): mocker.patch('thefuck.utils.os.path.getmtime', return_value=0) @pytest.fixture def fn(self): @cache('~/.bashrc') def fn(): return 'test' return fn @pytest.fixture def key(self): if six.PY3: return 'tests.test_utils..fn ' else: return 'tests.test_utils. position: alias = sys.argv[position] print(shells.app_alias(alias)) def how_to_configure_alias(): """Shows useful information about how-to configure alias. It'll be only visible when user type fuck and when alias isn't configured. """ colorama.init() settings.init() logs.how_to_configure_alias(shells.how_to_configure()) def main(): parser = ArgumentParser(prog='thefuck') version = get_installation_info().version parser.add_argument( '-v', '--version', action='version', version='The Fuck {} using Python {}'.format( version, sys.version.split()[0])) parser.add_argument('-a', '--alias', action='store_true', help='[custom-alias-name] prints alias for current shell') parser.add_argument('command', nargs='*', help='command that should be fixed') known_args = parser.parse_args(sys.argv[1:2]) if known_args.alias: print_alias(False) elif known_args.command: fix_command() else: parser.print_usage() thefuck-3.2/thefuck/rules/000077500000000000000000000000001261610017700155735ustar00rootroot00000000000000thefuck-3.2/thefuck/rules/__init__.py000066400000000000000000000000001261610017700176720ustar00rootroot00000000000000thefuck-3.2/thefuck/rules/apt_get.py000066400000000000000000000014001261610017700175630ustar00rootroot00000000000000from thefuck import shells from thefuck.utils import memoize try: import CommandNotFound except ImportError: enabled_by_default = False @memoize def get_package(command): try: c = CommandNotFound.CommandNotFound() cmd = command.split(' ') pkgs = c.getPackages(cmd[0] if cmd[0] != 'sudo' else cmd[1]) name, _ = pkgs[0] return name except IndexError: # IndexError is thrown when no matching package is found return None def match(command): return 'not found' in command.stderr and get_package(command.script) def get_new_command(command): name = get_package(command.script) formatme = shells.and_('sudo apt-get install {}', '{}') return formatme.format(name, command.script) thefuck-3.2/thefuck/rules/apt_get_search.py000066400000000000000000000003511261610017700211140ustar00rootroot00000000000000import re from thefuck.utils import for_app @for_app('apt-get') def match(command): return command.script.startswith('apt-get search') def get_new_command(command): return re.sub(r'^apt-get', 'apt-cache', command.script) thefuck-3.2/thefuck/rules/brew_install.py000066400000000000000000000024531261610017700206360ustar00rootroot00000000000000import os import re from thefuck.utils import get_closest, replace_argument, which from thefuck.specific.brew import get_brew_path_prefix enabled_by_default = bool(which('brew')) def _get_formulas(): # Formulas are based on each local system's status try: brew_path_prefix = get_brew_path_prefix() brew_formula_path = brew_path_prefix + '/Library/Formula' for file_name in os.listdir(brew_formula_path): if file_name.endswith('.rb'): yield file_name[:-3] except: pass def _get_similar_formula(formula_name): return get_closest(formula_name, _get_formulas(), 1, 0.85) def match(command): is_proper_command = ('brew install' in command.script and 'No available formula' in command.stderr) if is_proper_command: formula = re.findall(r'Error: No available formula for ([a-z]+)', command.stderr)[0] return bool(_get_similar_formula(formula)) return False def get_new_command(command): not_exist_formula = re.findall(r'Error: No available formula for ([a-z]+)', command.stderr)[0] exist_formula = _get_similar_formula(not_exist_formula) return replace_argument(command.script, not_exist_formula, exist_formula) thefuck-3.2/thefuck/rules/brew_unknown_command.py000066400000000000000000000053071261610017700223660ustar00rootroot00000000000000import os import re from thefuck.utils import get_closest, replace_command from thefuck.specific.brew import get_brew_path_prefix BREW_CMD_PATH = '/Library/Homebrew/cmd' TAP_PATH = '/Library/Taps' TAP_CMD_PATH = '/%s/%s/cmd' def _get_brew_commands(brew_path_prefix): """To get brew default commands on local environment""" brew_cmd_path = brew_path_prefix + BREW_CMD_PATH return [name[:-3] for name in os.listdir(brew_cmd_path) if name.endswith('.rb')] def _get_brew_tap_specific_commands(brew_path_prefix): """To get tap's specific commands https://github.com/Homebrew/homebrew/blob/master/Library/brew.rb#L115""" commands = [] brew_taps_path = brew_path_prefix + TAP_PATH for user in _get_directory_names_only(brew_taps_path): taps = _get_directory_names_only(brew_taps_path + '/%s' % user) # Brew Taps's naming rule # https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/brew-tap.md#naming-conventions-and-limitations taps = (tap for tap in taps if tap.startswith('homebrew-')) for tap in taps: tap_cmd_path = brew_taps_path + TAP_CMD_PATH % (user, tap) if os.path.isdir(tap_cmd_path): commands += (name.replace('brew-', '').replace('.rb', '') for name in os.listdir(tap_cmd_path) if _is_brew_tap_cmd_naming(name)) return commands def _is_brew_tap_cmd_naming(name): return name.startswith('brew-') and name.endswith('.rb') def _get_directory_names_only(path): return [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))] def _brew_commands(): brew_path_prefix = get_brew_path_prefix() if brew_path_prefix: try: return _get_brew_commands(brew_path_prefix) \ + _get_brew_tap_specific_commands(brew_path_prefix) except OSError: pass # Failback commands for testing (Based on Homebrew 0.9.5) return ['info', 'home', 'options', 'install', 'uninstall', 'search', 'list', 'update', 'upgrade', 'pin', 'unpin', 'doctor', 'create', 'edit'] def match(command): is_proper_command = ('brew' in command.script and 'Unknown command' in command.stderr) if is_proper_command: broken_cmd = re.findall(r'Error: Unknown command: ([a-z]+)', command.stderr)[0] return bool(get_closest(broken_cmd, _brew_commands())) return False def get_new_command(command): broken_cmd = re.findall(r'Error: Unknown command: ([a-z]+)', command.stderr)[0] return replace_command(command, broken_cmd, _brew_commands()) thefuck-3.2/thefuck/rules/brew_upgrade.py000066400000000000000000000005511261610017700206140ustar00rootroot00000000000000# Appends --all to the brew upgrade command # # Example: # > brew upgrade # Warning: brew upgrade with no arguments will change behaviour soon! # It currently upgrades all formula but this will soon change to require '--all'. def match(command): return command.script == 'brew upgrade' def get_new_command(command): return command.script + ' --all' thefuck-3.2/thefuck/rules/cargo.py000066400000000000000000000001621261610017700172370ustar00rootroot00000000000000def match(command): return command.script == 'cargo' def get_new_command(command): return 'cargo build' thefuck-3.2/thefuck/rules/cargo_no_command.py000066400000000000000000000006311261610017700214320ustar00rootroot00000000000000import re from thefuck.utils import replace_argument, for_app @for_app('cargo', at_least=1) def match(command): return ('No such subcommand' in command.stderr and 'Did you mean' in command.stderr) def get_new_command(command): broken = command.script_parts[1] fix = re.findall(r'Did you mean `([^`]*)`', command.stderr)[0] return replace_argument(command.script, broken, fix) thefuck-3.2/thefuck/rules/cd_correction.py000066400000000000000000000032161261610017700207640ustar00rootroot00000000000000"""Attempts to spellcheck and correct failed cd commands""" import os from difflib import get_close_matches from thefuck.specific.sudo import sudo_support from thefuck.rules import cd_mkdir from thefuck.utils import for_app __author__ = "mmussomele" MAX_ALLOWED_DIFF = 0.6 def _get_sub_dirs(parent): """Returns a list of the child directories of the given parent directory""" return [child for child in os.listdir(parent) if os.path.isdir(os.path.join(parent, child))] @sudo_support @for_app('cd') def match(command): """Match function copied from cd_mkdir.py""" return (command.script.startswith('cd ') and ('no such file or directory' in command.stderr.lower() or 'cd: can\'t cd to' in command.stderr.lower())) @sudo_support def get_new_command(command): """ Attempt to rebuild the path string by spellchecking the directories. If it fails (i.e. no directories are a close enough match), then it defaults to the rules of cd_mkdir. Change sensitivity by changing MAX_ALLOWED_DIFF. Default value is 0.6 """ dest = command.script_parts[1].split(os.sep) if dest[-1] == '': dest = dest[:-1] cwd = os.getcwd() for directory in dest: if directory == ".": continue elif directory == "..": cwd = os.path.split(cwd)[0] continue best_matches = get_close_matches(directory, _get_sub_dirs(cwd), cutoff=MAX_ALLOWED_DIFF) if best_matches: cwd = os.path.join(cwd, best_matches[0]) else: return cd_mkdir.get_new_command(command) return 'cd "{0}"'.format(cwd) enabled_by_default = True thefuck-3.2/thefuck/rules/cd_mkdir.py000066400000000000000000000006771261610017700177330ustar00rootroot00000000000000import re from thefuck import shells from thefuck.utils import for_app from thefuck.specific.sudo import sudo_support @sudo_support @for_app('cd') def match(command): return (('no such file or directory' in command.stderr.lower() or 'cd: can\'t cd to' in command.stderr.lower())) @sudo_support def get_new_command(command): repl = shells.and_('mkdir -p \\1', 'cd \\1') return re.sub(r'^cd (.*)', repl, command.script) thefuck-3.2/thefuck/rules/cd_parent.py000066400000000000000000000005011261610017700201000ustar00rootroot00000000000000# Adds the missing space between the cd command and the target directory # when trying to cd to the parent directory. # # Does not really save chars, but is fun :D # # Example: # > cd.. # cd..: command not found def match(command): return command.script == 'cd..' def get_new_command(command): return 'cd ..' thefuck-3.2/thefuck/rules/composer_not_command.py000066400000000000000000000011701261610017700223510ustar00rootroot00000000000000import re from thefuck.utils import replace_argument, for_app @for_app('composer') def match(command): return (('did you mean this?' in command.stderr.lower() or 'did you mean one of these?' in command.stderr.lower())) def get_new_command(command): broken_cmd = re.findall(r"Command \"([^']*)\" is not defined", command.stderr)[0] new_cmd = re.findall(r'Did you mean this\?[^\n]*\n\s*([^\n]*)', command.stderr) if not new_cmd: new_cmd = re.findall(r'Did you mean one of these\?[^\n]*\n\s*([^\n]*)', command.stderr) return replace_argument(command.script, broken_cmd, new_cmd[0].strip()) thefuck-3.2/thefuck/rules/cp_omitting_directory.py000066400000000000000000000005331261610017700225460ustar00rootroot00000000000000import re from thefuck.specific.sudo import sudo_support from thefuck.utils import for_app @sudo_support @for_app('cp') def match(command): stderr = command.stderr.lower() return 'omitting directory' in stderr or 'is a directory' in stderr @sudo_support def get_new_command(command): return re.sub(r'^cp', 'cp -a', command.script) thefuck-3.2/thefuck/rules/cpp11.py000066400000000000000000000005221261610017700170700ustar00rootroot00000000000000from thefuck.utils import for_app @for_app('g++', 'clang++') def match(command): return ('This file requires compiler and library support for the ' 'ISO C++ 2011 standard.' in command.stderr or '-Wc++11-extensions' in command.stderr) def get_new_command(command): return command.script + ' -std=c++11' thefuck-3.2/thefuck/rules/dirty_untar.py000066400000000000000000000024651261610017700205200ustar00rootroot00000000000000import tarfile import os from thefuck import shells from thefuck.utils import for_app tar_extensions = ('.tar', '.tar.Z', '.tar.bz2', '.tar.gz', '.tar.lz', '.tar.lzma', '.tar.xz', '.taz', '.tb2', '.tbz', '.tbz2', '.tgz', '.tlz', '.txz', '.tz') def _is_tar_extract(cmd): if '--extract' in cmd: return True cmd = cmd.split() return len(cmd) > 1 and 'x' in cmd[1] def _tar_file(cmd): for c in cmd: for ext in tar_extensions: if c.endswith(ext): return (c, c[0:len(c) - len(ext)]) @for_app('tar') def match(command): return ('-C' not in command.script and _is_tar_extract(command.script) and _tar_file(command.script_parts) is not None) def get_new_command(command): dir = shells.quote(_tar_file(command.script_parts)[1]) return shells.and_('mkdir -p {dir}', '{cmd} -C {dir}') \ .format(dir=dir, cmd=command.script) def side_effect(old_cmd, command): with tarfile.TarFile(_tar_file(old_cmd.script_parts)[0]) as archive: for file in archive.getnames(): try: os.remove(file) except OSError: # does not try to remove directories as we cannot know if they # already existed before pass thefuck-3.2/thefuck/rules/dirty_unzip.py000066400000000000000000000023321261610017700205250ustar00rootroot00000000000000import os import zipfile from thefuck.utils import for_app from thefuck.shells import quote def _is_bad_zip(file): with zipfile.ZipFile(file, 'r') as archive: return len(archive.namelist()) > 1 def _zip_file(command): # unzip works that way: # unzip [-flags] file[.zip] [file(s) ...] [-x file(s) ...] # ^ ^ files to unzip from the archive # archive to unzip for c in command.script_parts[1:]: if not c.startswith('-'): if c.endswith('.zip'): return c else: return '{}.zip'.format(c) @for_app('unzip') def match(command): return ('-d' not in command.script and _is_bad_zip(_zip_file(command))) def get_new_command(command): return '{} -d {}'.format(command.script, quote(_zip_file(command)[:-4])) def side_effect(old_cmd, command): with zipfile.ZipFile(_zip_file(old_cmd), 'r') as archive: for file in archive.namelist(): try: os.remove(file) except OSError: # does not try to remove directories as we cannot know if they # already existed before pass requires_output = False thefuck-3.2/thefuck/rules/django_south_ghost.py000066400000000000000000000004231261610017700220340ustar00rootroot00000000000000def match(command): return 'manage.py' in command.script and \ 'migrate' in command.script \ and 'or pass --delete-ghost-migrations' in command.stderr def get_new_command(command): return u'{} --delete-ghost-migrations'.format(command.script) thefuck-3.2/thefuck/rules/django_south_merge.py000066400000000000000000000004101261610017700220030ustar00rootroot00000000000000def match(command): return 'manage.py' in command.script and \ 'migrate' in command.script \ and '--merge: will just attempt the migration' in command.stderr def get_new_command(command): return u'{} --merge'.format(command.script) thefuck-3.2/thefuck/rules/docker_not_command.py000066400000000000000000000016101261610017700217700ustar00rootroot00000000000000from itertools import dropwhile, takewhile, islice import re import subprocess from thefuck.utils import replace_command, for_app from thefuck.specific.sudo import sudo_support @sudo_support @for_app('docker') def match(command): return 'is not a docker command' in command.stderr def get_docker_commands(): proc = subprocess.Popen('docker', stdout=subprocess.PIPE) lines = [line.decode('utf-8') for line in proc.stdout.readlines()] lines = dropwhile(lambda line: not line.startswith('Commands:'), lines) lines = islice(lines, 1, None) lines = list(takewhile(lambda line: line != '\n', lines)) return [line.strip().split(' ')[0] for line in lines] @sudo_support def get_new_command(command): wrong_command = re.findall( r"docker: '(\w+)' is not a docker command.", command.stderr)[0] return replace_command(command, wrong_command, get_docker_commands()) thefuck-3.2/thefuck/rules/dry.py000066400000000000000000000006561261610017700167520ustar00rootroot00000000000000def match(command): split_command = command.script_parts return (split_command and len(split_command) >= 2 and split_command[0] == split_command[1]) def get_new_command(command): return ' '.join(command.script_parts[1:]) # it should be rare enough to actually have to type twice the same word, so # this rule can have a higher priority to come before things like "cd cd foo" priority = 900 thefuck-3.2/thefuck/rules/fix_alt_space.py000066400000000000000000000004671261610017700207550ustar00rootroot00000000000000# -*- encoding: utf-8 -*- import re from thefuck.specific.sudo import sudo_support @sudo_support def match(command): return ('command not found' in command.stderr.lower() and u' ' in command.script) @sudo_support def get_new_command(command): return re.sub(u' ', ' ', command.script) thefuck-3.2/thefuck/rules/fix_file.py000066400000000000000000000047031261610017700177360ustar00rootroot00000000000000import re import os from thefuck.utils import memoize, default_settings from thefuck.conf import settings from thefuck import shells # order is important: only the first match is considered patterns = ( # js, node: '^ at {file}:{line}:{col}', # cargo: '^ {file}:{line}:{col}', # python, thefuck: '^ File "{file}", line {line}', # awk: '^awk: {file}:{line}:', # git '^fatal: bad config file line {line} in {file}', # llc: '^llc: {file}:{line}:{col}:', # lua: '^lua: {file}:{line}:', # fish: '^{file} \\(line {line}\\):', # bash, sh, ssh: '^{file}: line {line}: ', # cargo, clang, gcc, go, pep8, rustc: '^{file}:{line}:{col}', # ghc, make, ruby, zsh: '^{file}:{line}:', # perl: 'at {file} line {line}', ) # for the sake of readability do not use named groups above def _make_pattern(pattern): pattern = pattern.replace('{file}', '(?P[^:\n]+)') \ .replace('{line}', '(?P[0-9]+)') \ .replace('{col}', '(?P[0-9]+)') return re.compile(pattern, re.MULTILINE) patterns = [_make_pattern(p).search for p in patterns] @memoize def _search(stderr): for pattern in patterns: m = pattern(stderr) if m and os.path.isfile(m.group('file')): return m def match(command): if 'EDITOR' not in os.environ: return False return _search(command.stderr) or _search(command.stdout) @default_settings({'fixlinecmd': '{editor} {file} +{line}', 'fixcolcmd': None}) def get_new_command(command): m = _search(command.stderr) or _search(command.stdout) # Note: there does not seem to be a standard for columns, so they are just # ignored by default if settings.fixcolcmd and 'col' in m.groupdict(): editor_call = settings.fixcolcmd.format(editor=os.environ['EDITOR'], file=m.group('file'), line=m.group('line'), col=m.group('col')) else: editor_call = settings.fixlinecmd.format(editor=os.environ['EDITOR'], file=m.group('file'), line=m.group('line')) return shells.and_(editor_call, command.script) thefuck-3.2/thefuck/rules/git_add.py000066400000000000000000000010561261610017700175420ustar00rootroot00000000000000import re from thefuck import shells from thefuck.specific.git import git_support @git_support def match(command): return ('did not match any file(s) known to git.' in command.stderr and "Did you forget to 'git add'?" in command.stderr) @git_support def get_new_command(command): missing_file = re.findall( r"error: pathspec '([^']*)' " r"did not match any file\(s\) known to git.", command.stderr)[0] formatme = shells.and_('git add -- {}', '{}') return formatme.format(missing_file, command.script) thefuck-3.2/thefuck/rules/git_branch_delete.py000066400000000000000000000005251261610017700215710ustar00rootroot00000000000000from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): return ('branch -d' in command.script and 'If you are sure you want to delete it' in command.stderr) @git_support def get_new_command(command): return replace_argument(command.script, '-d', '-D') thefuck-3.2/thefuck/rules/git_branch_list.py000066400000000000000000000005661261610017700213070ustar00rootroot00000000000000from thefuck import shells from thefuck.specific.git import git_support @git_support def match(command): # catches "git branch list" in place of "git branch" return (command.script_parts and command.script_parts[1:] == 'branch list'.split()) @git_support def get_new_command(command): return shells.and_('git branch --delete list', 'git branch') thefuck-3.2/thefuck/rules/git_checkout.py000066400000000000000000000023311261610017700206140ustar00rootroot00000000000000import re import subprocess from thefuck import shells, utils from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): return ('did not match any file(s) known to git.' in command.stderr and "Did you forget to 'git add'?" not in command.stderr) def get_branches(): proc = subprocess.Popen( ['git', 'branch', '-a', '--no-color', '--no-column'], stdout=subprocess.PIPE) for line in proc.stdout.readlines(): line = line.decode('utf-8') if line.startswith('*'): line = line.split(' ')[1] if '/' in line: line = line.split('/')[-1] yield line.strip() @git_support def get_new_command(command): missing_file = re.findall( r"error: pathspec '([^']*)' " r"did not match any file\(s\) known to git.", command.stderr)[0] closest_branch = utils.get_closest(missing_file, get_branches(), fallback_to_first=False) if closest_branch: return replace_argument(command.script, missing_file, closest_branch) else: return shells.and_('git branch {}', '{}').format( missing_file, command.script) thefuck-3.2/thefuck/rules/git_diff_staged.py000066400000000000000000000005041261610017700212460ustar00rootroot00000000000000from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): return ('diff' in command.script and '--staged' not in command.script) @git_support def get_new_command(command): return replace_argument(command.script, 'diff', 'diff --staged') thefuck-3.2/thefuck/rules/git_fix_stash.py000066400000000000000000000016041261610017700210010ustar00rootroot00000000000000from thefuck import utils from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): if command.script_parts and len(command.script_parts) > 1: return (command.script_parts[1] == 'stash' and 'usage:' in command.stderr) else: return False # git's output here is too complicated to be parsed (see the test file) stash_commands = ( 'apply', 'branch', 'clear', 'drop', 'list', 'pop', 'save', 'show') @git_support def get_new_command(command): stash_cmd = command.script_parts[2] fixed = utils.get_closest(stash_cmd, stash_commands, fallback_to_first=False) if fixed is not None: return replace_argument(command.script, stash_cmd, fixed) else: cmd = command.script_parts[:] cmd.insert(2, 'save') return ' '.join(cmd) thefuck-3.2/thefuck/rules/git_not_command.py000066400000000000000000000010511261610017700213030ustar00rootroot00000000000000import re from thefuck.utils import get_all_matched_commands, replace_command from thefuck.specific.git import git_support @git_support def match(command): return (" is not a git command. See 'git --help'." in command.stderr and 'Did you mean' in command.stderr) @git_support def get_new_command(command): broken_cmd = re.findall(r"git: '([^']*)' is not a git command", command.stderr)[0] matched = get_all_matched_commands(command.stderr) return replace_command(command, broken_cmd, matched) thefuck-3.2/thefuck/rules/git_pull.py000066400000000000000000000007421261610017700177670ustar00rootroot00000000000000from thefuck import shells from thefuck.specific.git import git_support @git_support def match(command): return ('pull' in command.script and 'set-upstream' in command.stderr) @git_support def get_new_command(command): line = command.stderr.split('\n')[-3].strip() branch = line.split(' ')[-1] set_upstream = line.replace('', 'origin')\ .replace('', branch) return shells.and_(set_upstream, command.script) thefuck-3.2/thefuck/rules/git_pull_clone.py000066400000000000000000000006211261610017700211430ustar00rootroot00000000000000from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): return ('fatal: Not a git repository' in command.stderr and "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)." in command.stderr) @git_support def get_new_command(command): return replace_argument(command.script, 'pull', 'clone') thefuck-3.2/thefuck/rules/git_push.py000066400000000000000000000004061261610017700177670ustar00rootroot00000000000000from thefuck.specific.git import git_support @git_support def match(command): return ('push' in command.script and 'set-upstream' in command.stderr) @git_support def get_new_command(command): return command.stderr.split('\n')[-3].strip() thefuck-3.2/thefuck/rules/git_push_force.py000066400000000000000000000010261261610017700211440ustar00rootroot00000000000000from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): return ('push' in command.script and '! [rejected]' in command.stderr and 'failed to push some refs to' in command.stderr and 'Updates were rejected because the tip of your current branch is behind' in command.stderr) @git_support def get_new_command(command): return replace_argument(command.script, 'push', 'push --force-with-lease') enabled_by_default = False thefuck-3.2/thefuck/rules/git_push_pull.py000066400000000000000000000010651261610017700210250ustar00rootroot00000000000000from thefuck import shells from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): return ('push' in command.script and '! [rejected]' in command.stderr and 'failed to push some refs to' in command.stderr and 'Updates were rejected because the tip of your current branch is behind' in command.stderr) @git_support def get_new_command(command): return shells.and_(replace_argument(command.script, 'push', 'pull'), command.script) thefuck-3.2/thefuck/rules/git_stash.py000066400000000000000000000006401261610017700201320ustar00rootroot00000000000000from thefuck import shells from thefuck.specific.git import git_support @git_support def match(command): # catches "Please commit or stash them" and "Please, commit your changes or # stash them before you can switch branches." return 'or stash them' in command.stderr @git_support def get_new_command(command): formatme = shells.and_('git stash', '{}') return formatme.format(command.script) thefuck-3.2/thefuck/rules/git_two_dashes.py000066400000000000000000000005671261610017700211600ustar00rootroot00000000000000from thefuck.utils import replace_argument from thefuck.specific.git import git_support @git_support def match(command): return ('error: did you mean `' in command.stderr and '` (with two dashes ?)' in command.stderr) @git_support def get_new_command(command): to = command.stderr.split('`')[1] return replace_argument(command.script, to[1:], to) thefuck-3.2/thefuck/rules/go_run.py000066400000000000000000000005241261610017700174370ustar00rootroot00000000000000from thefuck.utils import for_app # Appends .go when compiling go files # # Example: # > go run foo # error: go run: no go files listed @for_app('go') def match(command): return (command.script.startswith('go run ') and not command.script.endswith('.go')) def get_new_command(command): return command.script + '.go' thefuck-3.2/thefuck/rules/grep_recursive.py000066400000000000000000000003221261610017700211660ustar00rootroot00000000000000from thefuck.utils import for_app @for_app('grep') def match(command): return 'is a directory' in command.stderr.lower() def get_new_command(command): return 'grep -r {}'.format(command.script[5:]) thefuck-3.2/thefuck/rules/gulp_not_task.py000066400000000000000000000011361261610017700210170ustar00rootroot00000000000000import re import subprocess from thefuck.utils import replace_command, for_app @for_app('gulp') def match(command): return 'is not in your gulpfile' in command.stdout def get_gulp_tasks(): proc = subprocess.Popen(['gulp', '--tasks-simple'], stdout=subprocess.PIPE) return [line.decode('utf-8')[:-1] for line in proc.stdout.readlines()] def get_new_command(command): wrong_task = re.findall(r"Task '(\w+)' is not in your gulpfile", command.stdout)[0] return replace_command(command, wrong_task, get_gulp_tasks()) thefuck-3.2/thefuck/rules/has_exists_script.py000066400000000000000000000004651261610017700217100ustar00rootroot00000000000000import os from thefuck.specific.sudo import sudo_support @sudo_support def match(command): return command.script_parts and os.path.exists(command.script_parts[0]) \ and 'command not found' in command.stderr @sudo_support def get_new_command(command): return u'./{}'.format(command.script) thefuck-3.2/thefuck/rules/heroku_not_command.py000066400000000000000000000010471261610017700220220ustar00rootroot00000000000000import re from thefuck.utils import replace_command, for_app @for_app('heroku') def match(command): return 'is not a heroku command' in command.stderr and \ 'Perhaps you meant' in command.stderr def _get_suggests(stderr): for line in stderr.split('\n'): if 'Perhaps you meant' in line: return re.findall(r'`([^`]+)`', line) def get_new_command(command): wrong = re.findall(r'`(\w+)` is not a heroku command', command.stderr)[0] return replace_command(command, wrong, _get_suggests(command.stderr)) thefuck-3.2/thefuck/rules/history.py000066400000000000000000000021431261610017700176460ustar00rootroot00000000000000from difflib import get_close_matches from thefuck.shells import get_history, thefuck_alias from thefuck.utils import get_closest, memoize, get_all_executables def _not_corrected(history, tf_alias): """Returns all lines from history except that comes before `fuck`.""" previous = None for line in history: if previous is not None and line != tf_alias: yield previous previous = line if history: yield history[-1] @memoize def _history_of_exists_without_current(command): history = get_history() tf_alias = thefuck_alias() executables = get_all_executables() return [line for line in _not_corrected(history, tf_alias) if not line.startswith(tf_alias) and not line == command.script and line.split(' ')[0] in executables] def match(command): return len(get_close_matches(command.script, _history_of_exists_without_current(command))) def get_new_command(command): return get_closest(command.script, _history_of_exists_without_current(command)) priority = 9999 thefuck-3.2/thefuck/rules/java.py000066400000000000000000000004521261610017700170670ustar00rootroot00000000000000"""Fixes common java command mistake Example: > java foo.java Error: Could not find or load main class foo.java """ from thefuck.utils import for_app @for_app('java') def match(command): return command.script.endswith('.java') def get_new_command(command): return command.script[:-5] thefuck-3.2/thefuck/rules/javac.py000066400000000000000000000005451261610017700172350ustar00rootroot00000000000000"""Appends .java when compiling java files Example: > javac foo error: Class names, 'foo', are only accepted if annotation processing is explicitly requested """ from thefuck.utils import for_app @for_app('javac') def match(command): return not command.script.endswith('.java') def get_new_command(command): return command.script + '.java' thefuck-3.2/thefuck/rules/lein_not_task.py000066400000000000000000000012011261610017700207700ustar00rootroot00000000000000import re from thefuck.utils import replace_command, get_all_matched_commands, for_app from thefuck.specific.sudo import sudo_support @sudo_support @for_app('lein') def match(command): return (command.script.startswith('lein') and "is not a task. See 'lein help'" in command.stderr and 'Did you mean this?' in command.stderr) @sudo_support def get_new_command(command): broken_cmd = re.findall(r"'([^']*)' is not a task", command.stderr)[0] new_cmds = get_all_matched_commands(command.stderr, 'Did you mean this?') return replace_command(command, broken_cmd, new_cmds) thefuck-3.2/thefuck/rules/ls_lah.py000066400000000000000000000004061261610017700174070ustar00rootroot00000000000000from thefuck.utils import for_app @for_app('ls') def match(command): return command.script_parts and 'ls -' not in command.script def get_new_command(command): command = command.script_parts[:] command[0] = 'ls -lah' return ' '.join(command) thefuck-3.2/thefuck/rules/man.py000066400000000000000000000007361261610017700167260ustar00rootroot00000000000000from thefuck.utils import for_app @for_app('man', at_least=1) def match(command): return True def get_new_command(command): if '3' in command.script: return command.script.replace("3", "2") if '2' in command.script: return command.script.replace("2", "3") split_cmd2 = command.script_parts split_cmd3 = split_cmd2[:] split_cmd2.insert(1, ' 2 ') split_cmd3.insert(1, ' 3 ') return ["".join(split_cmd3), "".join(split_cmd2)] thefuck-3.2/thefuck/rules/man_no_space.py000066400000000000000000000003431261610017700205670ustar00rootroot00000000000000def match(command): return (command.script.startswith(u'man') and u'command not found' in command.stderr.lower()) def get_new_command(command): return u'man {}'.format(command.script[3:]) priority = 2000 thefuck-3.2/thefuck/rules/mercurial.py000066400000000000000000000014471261610017700201360ustar00rootroot00000000000000import re from thefuck.utils import get_closest, for_app def extract_possibilities(command): possib = re.findall(r'\n\(did you mean one of ([^\?]+)\?\)', command.stderr) if possib: return possib[0].split(', ') possib = re.findall(r'\n ([^$]+)$', command.stderr) if possib: return possib[0].split(' ') return possib @for_app('hg') def match(command): return ('hg: unknown command' in command.stderr and '(did you mean one of ' in command.stderr or "hg: command '" in command.stderr and "' is ambiguous:" in command.stderr) def get_new_command(command): script = command.script_parts[:] possibilities = extract_possibilities(command) script[1] = get_closest(script[1], possibilities) return ' '.join(script) thefuck-3.2/thefuck/rules/mkdir_p.py000066400000000000000000000004631261610017700175750ustar00rootroot00000000000000import re from thefuck.specific.sudo import sudo_support @sudo_support def match(command): return ('mkdir' in command.script and 'No such file or directory' in command.stderr) @sudo_support def get_new_command(command): return re.sub('\\bmkdir (.*)', 'mkdir -p \\1', command.script) thefuck-3.2/thefuck/rules/mvn_no_command.py000066400000000000000000000004211261610017700211340ustar00rootroot00000000000000from thefuck.utils import for_app @for_app('mvn') def match(command): return 'No goals have been specified for this build' in command.stdout def get_new_command(command): return [command.script + ' clean package', command.script + ' clean install'] thefuck-3.2/thefuck/rules/mvn_unknown_lifecycle_phase.py000066400000000000000000000020321261610017700237200ustar00rootroot00000000000000from thefuck.utils import replace_command, for_app from difflib import get_close_matches import re def _get_failed_lifecycle(command): return re.search(r'\[ERROR\] Unknown lifecycle phase "(.+)"', command.stdout) def _getavailable_lifecycles(command): return re.search( r'Available lifecycle phases are: (.+) -> \[Help 1\]', command.stdout) @for_app('mvn') def match(command): failed_lifecycle = _get_failed_lifecycle(command) available_lifecycles = _getavailable_lifecycles(command) return available_lifecycles and failed_lifecycle def get_new_command(command): failed_lifecycle = _get_failed_lifecycle(command) available_lifecycles = _getavailable_lifecycles(command) if available_lifecycles and failed_lifecycle: selected_lifecycle = get_close_matches( failed_lifecycle.group(1), available_lifecycles.group(1).split(", "), 3, 0.6) return replace_command(command, failed_lifecycle.group(1), selected_lifecycle) else: return [] thefuck-3.2/thefuck/rules/no_command.py000066400000000000000000000012311261610017700202540ustar00rootroot00000000000000from difflib import get_close_matches from thefuck.utils import get_all_executables from thefuck.specific.sudo import sudo_support @sudo_support def match(command): return (command.script_parts and 'not found' in command.stderr and bool(get_close_matches(command.script_parts[0], get_all_executables()))) @sudo_support def get_new_command(command): old_command = command.script_parts[0] new_cmds = get_close_matches(old_command, get_all_executables(), cutoff=0.1) return [' '.join([new_command] + command.script_parts[1:]) for new_command in new_cmds] priority = 3000 thefuck-3.2/thefuck/rules/no_such_file.py000066400000000000000000000014161261610017700206040ustar00rootroot00000000000000import re from thefuck import shells patterns = ( r"mv: cannot move '[^']*' to '([^']*)': No such file or directory", r"mv: cannot move '[^']*' to '([^']*)': Not a directory", r"cp: cannot create regular file '([^']*)': No such file or directory", r"cp: cannot create regular file '([^']*)': Not a directory", ) def match(command): for pattern in patterns: if re.search(pattern, command.stderr): return True return False def get_new_command(command): for pattern in patterns: file = re.findall(pattern, command.stderr) if file: file = file[0] dir = file[0:file.rfind('/')] formatme = shells.and_('mkdir -p {}', '{}') return formatme.format(dir, command.script) thefuck-3.2/thefuck/rules/open.py000066400000000000000000000013621261610017700171100ustar00rootroot00000000000000# Opens URL's in the default web browser # # Example: # > open github.com # The file ~/github.com does not exist. # Perhaps you meant 'http://github.com'? # from thefuck.utils import for_app @for_app('open', 'xdg-open', 'gnome-open', 'kde-open') def match(command): return ('.com' in command.script or '.net' in command.script or '.org' in command.script or '.ly' in command.script or '.io' in command.script or '.se' in command.script or '.edu' in command.script or '.info' in command.script or '.me' in command.script or 'www.' in command.script) def get_new_command(command): return command.script.replace('open ', 'open http://') thefuck-3.2/thefuck/rules/pacman.py000066400000000000000000000007051261610017700174060ustar00rootroot00000000000000from thefuck.specific.archlinux import get_pkgfile, archlinux_env from thefuck import shells def match(command): return 'not found' in command.stderr and get_pkgfile(command.script) def get_new_command(command): packages = get_pkgfile(command.script) formatme = shells.and_('{} -S {}', '{}') return [formatme.format(pacman, package, command.script) for package in packages] enabled_by_default, pacman = archlinux_env() thefuck-3.2/thefuck/rules/pacman_not_found.py000066400000000000000000000012671261610017700214650ustar00rootroot00000000000000""" Fixes wrong package names with pacman or yaourt. For example the `llc` program is in package `llvm` so this: yaourt -S llc should be: yaourt -S llvm """ from thefuck.utils import replace_command from thefuck.specific.archlinux import get_pkgfile, archlinux_env def match(command): return (command.script_parts and (command.script_parts[0] in ('pacman', 'yaourt') or command.script_parts[0:2] == ['sudo', 'pacman']) and 'error: target not found:' in command.stderr) def get_new_command(command): pgr = command.script_parts[-1] return replace_command(command, pgr, get_pkgfile(pgr)) enabled_by_default, _ = archlinux_env() thefuck-3.2/thefuck/rules/pip_unknown_command.py000066400000000000000000000011201261610017700222040ustar00rootroot00000000000000import re from thefuck.utils import replace_argument, for_app from thefuck.specific.sudo import sudo_support @sudo_support @for_app('pip') def match(command): return ('pip' in command.script and 'unknown command' in command.stderr and 'maybe you meant' in command.stderr) def get_new_command(command): broken_cmd = re.findall(r'ERROR: unknown command \"([a-z]+)\"', command.stderr)[0] new_cmd = re.findall(r'maybe you meant \"([a-z]+)\"', command.stderr)[0] return replace_argument(command.script, broken_cmd, new_cmd) thefuck-3.2/thefuck/rules/python_command.py000066400000000000000000000007651261610017700211740ustar00rootroot00000000000000from thefuck.specific.sudo import sudo_support # add 'python' suffix to the command if # 1) The script does not have execute permission or # 2) is interpreted as shell script @sudo_support def match(command): toks = command.script_parts return (toks and toks[0].endswith('.py') and ('Permission denied' in command.stderr or 'command not found' in command.stderr)) @sudo_support def get_new_command(command): return 'python ' + command.script thefuck-3.2/thefuck/rules/python_execute.py000066400000000000000000000005151261610017700212110ustar00rootroot00000000000000# Appends .py when executing python files # # Example: # > python foo # error: python: can't open file 'foo': [Errno 2] No such file or directory from thefuck.utils import for_app @for_app('python') def match(command): return not command.script.endswith('.py') def get_new_command(command): return command.script + '.py' thefuck-3.2/thefuck/rules/quotation_marks.py000066400000000000000000000003541261610017700213670ustar00rootroot00000000000000# Fixes careless " and ' usage # # Example: # > git commit -m 'My Message" def match(command): return '\'' in command.script and '\"' in command.script def get_new_command(command): return command.script.replace('\'', '\"') thefuck-3.2/thefuck/rules/rm_dir.py000066400000000000000000000006061261610017700174230ustar00rootroot00000000000000import re from thefuck.specific.sudo import sudo_support @sudo_support def match(command): return ('rm' in command.script and 'is a directory' in command.stderr.lower()) @sudo_support def get_new_command(command): arguments = '-rf' if 'hdfs' in command.script: arguments = '-r' return re.sub('\\brm (.*)', 'rm ' + arguments + ' \\1', command.script) thefuck-3.2/thefuck/rules/rm_root.py000066400000000000000000000006471261610017700176350ustar00rootroot00000000000000from thefuck.specific.sudo import sudo_support enabled_by_default = False @sudo_support def match(command): return (command.script_parts and {'rm', '/'}.issubset(command.script_parts) and '--no-preserve-root' not in command.script and '--no-preserve-root' in command.stderr) @sudo_support def get_new_command(command): return u'{} --no-preserve-root'.format(command.script) thefuck-3.2/thefuck/rules/sed_unterminated_s.py000066400000000000000000000006351261610017700220250ustar00rootroot00000000000000import shlex from thefuck.shells import quote from thefuck.utils import for_app @for_app('sed') def match(command): return "unterminated `s' command" in command.stderr def get_new_command(command): script = shlex.split(command.script) for (i, e) in enumerate(script): if e.startswith(('s/', '-es/')) and e[-1] != '/': script[i] += '/' return ' '.join(map(quote, script)) thefuck-3.2/thefuck/rules/sl_ls.py000066400000000000000000000003511261610017700172600ustar00rootroot00000000000000""" This happens way too often When typing really fast cause I'm a 1337 H4X0R, I often fuck up 'ls' and type 'sl'. No more! """ def match(command): return command.script == 'sl' def get_new_command(command): return 'ls' thefuck-3.2/thefuck/rules/ssh_known_hosts.py000066400000000000000000000020541261610017700213770ustar00rootroot00000000000000import re from thefuck.utils import for_app commands = ('ssh', 'scp') @for_app(*commands) def match(command): if not command.script: return False if not command.script.startswith(commands): return False patterns = ( r'WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!', r'WARNING: POSSIBLE DNS SPOOFING DETECTED!', r"Warning: the \S+ host key for '([^']+)' differs from the key for the IP address '([^']+)'", ) return any(re.findall(pattern, command.stderr) for pattern in patterns) def get_new_command(command): return command.script def side_effect(old_cmd, command): offending_pattern = re.compile( r'(?:Offending (?:key for IP|\S+ key)|Matching host key) in ([^:]+):(\d+)', re.MULTILINE) offending = offending_pattern.findall(old_cmd.stderr) for filepath, lineno in offending: with open(filepath, 'r') as fh: lines = fh.readlines() del lines[int(lineno) - 1] with open(filepath, 'w') as fh: fh.writelines(lines) thefuck-3.2/thefuck/rules/sudo.py000066400000000000000000000022151261610017700171170ustar00rootroot00000000000000patterns = ['permission denied', 'EACCES', 'pkg: Insufficient privileges', 'you cannot perform this operation unless you are root', 'non-root users cannot', 'Operation not permitted', 'root privilege', 'This command has to be run under the root user.', 'This operation requires root.', 'requested operation requires superuser privilege', 'must be run as root', 'must run as root', 'must be superuser', 'must be root', 'need to be root', 'need root', 'only root can ', 'You don\'t have access to the history DB.', 'authentication is required'] def match(command): for pattern in patterns: if pattern.lower() in command.stderr.lower()\ or pattern.lower() in command.stdout.lower(): return True return False def get_new_command(command): if '>' in command.script: return u'sudo sh -c "{}"'.format(command.script.replace('"', '\\"')) else: return u'sudo {}'.format(command.script) thefuck-3.2/thefuck/rules/switch_lang.py000066400000000000000000000031001261610017700204410ustar00rootroot00000000000000# -*- encoding: utf-8 -*- from thefuck.shells import thefuck_alias from thefuck.utils import memoize target_layout = '''qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?''' source_layouts = [u'''йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,''', u'''ضصثقفغعهخحجچشسیبلاتنمکگظطزرذدپو./ًٌٍَُِّْ][}{ؤئيإأآة»«:؛كٓژٰ‌ٔء><؟''', u''';ςερτυθιοπ[]ασδφγηξκλ΄ζχψωβνμ,./:΅ΕΡΤΥΘΙΟΠ{}ΑΣΔΦΓΗΞΚΛ¨"ΖΧΨΩΒΝΜ<>?'''] @memoize def _get_matched_layout(command): # don't use command.split_script here because a layout mismatch will likely # result in a non-splitable sript as per shlex cmd = command.script.split(' ') for source_layout in source_layouts: if all([ch in source_layout or ch in '-_' for ch in cmd[0]]): return source_layout def _switch(ch, layout): if ch in layout: return target_layout[layout.index(ch)] else: return ch def _switch_command(command, layout): return ''.join(_switch(ch, layout) for ch in command.script) def match(command): if 'not found' not in command.stderr: return False matched_layout = _get_matched_layout(command) return matched_layout and \ _switch_command(command, matched_layout) != thefuck_alias() def get_new_command(command): matched_layout = _get_matched_layout(command) return _switch_command(command, matched_layout) thefuck-3.2/thefuck/rules/systemctl.py000066400000000000000000000011201261610017700201660ustar00rootroot00000000000000""" The confusion in systemctl's param order is massive. """ from thefuck.specific.sudo import sudo_support from thefuck.utils import for_app @sudo_support @for_app('systemctl') def match(command): # Catches "Unknown operation 'service'." when executing systemctl with # misordered arguments cmd = command.script_parts return (cmd and 'Unknown operation \'' in command.stderr and len(cmd) - cmd.index('systemctl') == 3) @sudo_support def get_new_command(command): cmd = command.script_parts cmd[-1], cmd[-2] = cmd[-2], cmd[-1] return ' '.join(cmd) thefuck-3.2/thefuck/rules/test.py.py000066400000000000000000000003211261610017700175470ustar00rootroot00000000000000def match(command): return command.script == 'test.py' and 'not found' in command.stderr def get_new_command(command): return 'py.test' # make it come before the python_command rule priority = 900 thefuck-3.2/thefuck/rules/tmux.py000066400000000000000000000007421261610017700171450ustar00rootroot00000000000000import re from thefuck.utils import replace_command, for_app @for_app('tmux') def match(command): return ('ambiguous command:' in command.stderr and 'could be:' in command.stderr) def get_new_command(command): cmd = re.match(r"ambiguous command: (.*), could be: (.*)", command.stderr) old_cmd = cmd.group(1) suggestions = [cmd.strip() for cmd in cmd.group(2).split(',')] return replace_command(command, old_cmd, suggestions) thefuck-3.2/thefuck/rules/touch.py000066400000000000000000000005301261610017700172650ustar00rootroot00000000000000import re from thefuck import shells from thefuck.utils import for_app @for_app('touch') def match(command): return 'No such file or directory' in command.stderr def get_new_command(command): path = re.findall(r"touch: cannot touch '(.+)/.+':", command.stderr)[0] return shells.and_(u'mkdir -p {}'.format(path), command.script) thefuck-3.2/thefuck/rules/tsuru_login.py000066400000000000000000000004461261610017700205230ustar00rootroot00000000000000from thefuck import shells from thefuck.utils import for_app @for_app('tsuru') def match(command): return ('not authenticated' in command.stderr and 'session has expired' in command.stderr) def get_new_command(command): return shells.and_('tsuru login', command.script) thefuck-3.2/thefuck/rules/tsuru_not_command.py000066400000000000000000000010171261610017700217040ustar00rootroot00000000000000import re from thefuck.utils import get_all_matched_commands, replace_command, for_app @for_app('tsuru') def match(command): return (' is not a tsuru command. See "tsuru help".' in command.stderr and '\nDid you mean?\n\t' in command.stderr) def get_new_command(command): broken_cmd = re.findall(r'tsuru: "([^"]*)" is not a tsuru command', command.stderr)[0] return replace_command(command, broken_cmd, get_all_matched_commands(command.stderr)) thefuck-3.2/thefuck/rules/unknown_command.py000066400000000000000000000007161261610017700213460ustar00rootroot00000000000000import re from thefuck.utils import replace_command def match(command): return (re.search(r"([^:]*): Unknown command.*", command.stderr) != None and re.search(r"Did you mean ([^?]*)?", command.stderr) != None) def get_new_command(command): broken_cmd = re.findall(r"([^:]*): Unknown command.*", command.stderr)[0] matched = re.findall(r"Did you mean ([^?]*)?", command.stderr) return replace_command(command, broken_cmd, matched) thefuck-3.2/thefuck/rules/vagrant_up.py000066400000000000000000000010041261610017700203060ustar00rootroot00000000000000from thefuck import shells from thefuck.utils import for_app @for_app('vagrant') def match(command): return 'run `vagrant up`' in command.stderr.lower() def get_new_command(command): cmds = command.script_parts machine = None if len(cmds) >= 3: machine = cmds[2] startAllInstances = shells.and_("vagrant up", command.script) if machine is None: return startAllInstances else: return [ shells.and_("vagrant up " + machine, command.script), startAllInstances] thefuck-3.2/thefuck/rules/whois.py000066400000000000000000000024121261610017700172750ustar00rootroot00000000000000# -*- encoding: utf-8 -*- from six.moves.urllib.parse import urlparse from thefuck.utils import for_app @for_app('whois', at_least=1) def match(command): """ What the `whois` command returns depends on the 'Whois server' it contacted and is not consistent through different servers. But there can be only two types of errors I can think of with `whois`: - `whois https://en.wikipedia.org/` → `whois en.wikipedia.org`; - `whois en.wikipedia.org` → `whois wikipedia.org`. So we match any `whois` command and then: - if there is a slash: keep only the FQDN; - if there is no slash but there is a point: removes the left-most subdomain. We cannot either remove all subdomains because we cannot know which part is the subdomains and which is the domain, consider: - www.google.fr → subdomain: www, domain: 'google.fr'; - google.co.uk → subdomain: None, domain; 'google.co.uk'. """ return True def get_new_command(command): url = command.script_parts[1] if '/' in command.script: return 'whois ' + urlparse(url).netloc elif '.' in command.script: path = urlparse(url).path.split('.') return ['whois ' + '.'.join(path[n:]) for n in range(1, len(path))] thefuck-3.2/thefuck/shells.py000066400000000000000000000226201261610017700163070ustar00rootroot00000000000000"""Module with shell specific actions, each shell class should implement `from_shell`, `to_shell`, `app_alias`, `put_to_history` and `get_aliases` methods. """ from collections import defaultdict from psutil import Process from subprocess import Popen, PIPE from time import time import io import os import shlex import six from .utils import DEVNULL, memoize, cache class Generic(object): def get_aliases(self): return {} def _expand_aliases(self, command_script): aliases = self.get_aliases() binary = command_script.split(' ')[0] if binary in aliases: return command_script.replace(binary, aliases[binary], 1) else: return command_script def from_shell(self, command_script): """Prepares command before running in app.""" return self._expand_aliases(command_script) def to_shell(self, command_script): """Prepares command for running in shell.""" return command_script def app_alias(self, fuck): return "alias {0}='TF_ALIAS={0} eval $(thefuck $(fc -ln -1))'".format(fuck) def _get_history_file_name(self): return '' def _get_history_line(self, command_script): return '' def put_to_history(self, command_script): """Puts command script to shell history.""" history_file_name = self._get_history_file_name() if os.path.isfile(history_file_name): with open(history_file_name, 'a') as history: history.write(self._get_history_line(command_script)) def _script_from_history(self, line): """Returns prepared history line. Should return a blank line if history line is corrupted or empty. """ return '' def get_history(self): """Returns list of history entries.""" history_file_name = self._get_history_file_name() if os.path.isfile(history_file_name): with io.open(history_file_name, 'r', encoding='utf-8', errors='ignore') as history: for line in history: prepared = self._script_from_history(line)\ .strip() if prepared: yield prepared def and_(self, *commands): return u' && '.join(commands) def how_to_configure(self): return def split_command(self, command): """Split the command using shell-like syntax.""" return shlex.split(command) def quote(self, s): """Return a shell-escaped version of the string s.""" if six.PY2: from pipes import quote else: from shlex import quote return quote(s) class Bash(Generic): def app_alias(self, fuck): return "TF_ALIAS={0} alias {0}='eval $(thefuck $(fc -ln -1));" \ " history -r'".format(fuck) def _parse_alias(self, alias): name, value = alias.replace('alias ', '', 1).split('=', 1) if value[0] == value[-1] == '"' or value[0] == value[-1] == "'": value = value[1:-1] return name, value @memoize @cache('.bashrc', '.bash_profile') def get_aliases(self): proc = Popen(['bash', '-ic', 'alias'], stdout=PIPE, stderr=DEVNULL) return dict( self._parse_alias(alias) for alias in proc.stdout.read().decode('utf-8').split('\n') if alias and '=' in alias) def _get_history_file_name(self): return os.environ.get("HISTFILE", os.path.expanduser('~/.bash_history')) def _get_history_line(self, command_script): return u'{}\n'.format(command_script) def _script_from_history(self, line): return line def how_to_configure(self): if os.path.join(os.path.expanduser('~'), '.bashrc'): config = '~/.bashrc' elif os.path.join(os.path.expanduser('~'), '.bash_profile'): config = '~/.bashrc' else: config = 'bash config' return 'eval $(thefuck --alias)', config class Fish(Generic): def _get_overridden_aliases(self): overridden_aliases = os.environ.get('TF_OVERRIDDEN_ALIASES', '').strip() if overridden_aliases: return [alias.strip() for alias in overridden_aliases.split(',')] else: return ['cd', 'grep', 'ls', 'man', 'open'] def app_alias(self, fuck): return ('function {0} -d "Correct your previous console command"\n' ' set -l exit_code $status\n' ' set -x TF_ALIAS {0}\n' ' set -l fucked_up_command $history[1]\n' ' thefuck $fucked_up_command | read -l unfucked_command\n' ' if [ "$unfucked_command" != "" ]\n' ' eval $unfucked_command\n' ' if test $exit_code -ne 0\n' ' history --delete $fucked_up_command\n' ' history --merge ^ /dev/null\n' ' return 0\n' ' end\n' ' end\n' 'end').format(fuck) @memoize def get_aliases(self): overridden = self._get_overridden_aliases() proc = Popen(['fish', '-ic', 'functions'], stdout=PIPE, stderr=DEVNULL) functions = proc.stdout.read().decode('utf-8').strip().split('\n') return {func: func for func in functions if func not in overridden} def _expand_aliases(self, command_script): aliases = self.get_aliases() binary = command_script.split(' ')[0] if binary in aliases: return u'fish -ic "{}"'.format(command_script.replace('"', r'\"')) else: return command_script def from_shell(self, command_script): """Prepares command before running in app.""" return self._expand_aliases(command_script) def _get_history_file_name(self): return os.path.expanduser('~/.config/fish/fish_history') def _get_history_line(self, command_script): return u'- cmd: {}\n when: {}\n'.format(command_script, int(time())) def and_(self, *commands): return u'; and '.join(commands) def how_to_configure(self): return 'eval thefuck --alias', '~/.config/fish/config.fish' class Zsh(Generic): def app_alias(self, fuck): return "TF_ALIAS={0}" \ " alias {0}='eval $(thefuck $(fc -ln -1 | tail -n 1));" \ " fc -R'".format(fuck) def _parse_alias(self, alias): name, value = alias.split('=', 1) if value[0] == value[-1] == '"' or value[0] == value[-1] == "'": value = value[1:-1] return name, value @memoize @cache('.zshrc') def get_aliases(self): proc = Popen(['zsh', '-ic', 'alias'], stdout=PIPE, stderr=DEVNULL) return dict( self._parse_alias(alias) for alias in proc.stdout.read().decode('utf-8').split('\n') if alias and '=' in alias) def _get_history_file_name(self): return os.environ.get("HISTFILE", os.path.expanduser('~/.zsh_history')) def _get_history_line(self, command_script): return u': {}:0;{}\n'.format(int(time()), command_script) def _script_from_history(self, line): if ';' in line: return line.split(';', 1)[1] else: return '' def how_to_configure(self): return 'eval $(thefuck --alias)', '~/.zshrc' class Tcsh(Generic): def app_alias(self, fuck): return ("alias {0} 'setenv TF_ALIAS {0} && " "set fucked_cmd=`history -h 2 | head -n 1` && " "eval `thefuck ${{fucked_cmd}}`'").format(fuck) def _parse_alias(self, alias): name, value = alias.split("\t", 1) return name, value @memoize def get_aliases(self): proc = Popen(['tcsh', '-ic', 'alias'], stdout=PIPE, stderr=DEVNULL) return dict( self._parse_alias(alias) for alias in proc.stdout.read().decode('utf-8').split('\n') if alias and '\t' in alias) def _get_history_file_name(self): return os.environ.get("HISTFILE", os.path.expanduser('~/.history')) def _get_history_line(self, command_script): return u'#+{}\n{}\n'.format(int(time()), command_script) def how_to_configure(self): return 'eval `thefuck --alias`', '~/.tcshrc' shells = defaultdict(Generic, { 'bash': Bash(), 'fish': Fish(), 'zsh': Zsh(), 'csh': Tcsh(), 'tcsh': Tcsh()}) @memoize def _get_shell(): try: shell = Process(os.getpid()).parent().name() except TypeError: shell = Process(os.getpid()).parent.name return shells[shell] def from_shell(command): return _get_shell().from_shell(command) def to_shell(command): return _get_shell().to_shell(command) def app_alias(alias): return _get_shell().app_alias(alias) def thefuck_alias(): return os.environ.get('TF_ALIAS', 'fuck') def put_to_history(command): return _get_shell().put_to_history(command) def and_(*commands): return _get_shell().and_(*commands) def get_aliases(): return list(_get_shell().get_aliases().keys()) def split_command(command): return _get_shell().split_command(command) def quote(s): return _get_shell().quote(s) @memoize def get_history(): return list(_get_shell().get_history()) def how_to_configure(): return _get_shell().how_to_configure() thefuck-3.2/thefuck/specific/000077500000000000000000000000001261610017700162265ustar00rootroot00000000000000thefuck-3.2/thefuck/specific/__init__.py000066400000000000000000000000001261610017700203250ustar00rootroot00000000000000thefuck-3.2/thefuck/specific/archlinux.py000066400000000000000000000020371261610017700205770ustar00rootroot00000000000000""" This file provide some utility functions for Arch Linux specific rules.""" import subprocess from .. import utils @utils.memoize def get_pkgfile(command): """ Gets the packages that provide the given command using `pkgfile`. If the command is of the form `sudo foo`, searches for the `foo` command instead. """ try: command = command.strip() if command.startswith('sudo '): command = command[5:] command = command.split(" ")[0] packages = subprocess.check_output( ['pkgfile', '-b', '-v', command], universal_newlines=True, stderr=utils.DEVNULL ).splitlines() return [package.split()[0] for package in packages] except subprocess.CalledProcessError: return None def archlinux_env(): if utils.which('yaourt'): pacman = 'yaourt' elif utils.which('pacman'): pacman = 'sudo pacman' else: return False, None enabled_by_default = utils.which('pkgfile') return enabled_by_default, pacman thefuck-3.2/thefuck/specific/brew.py000066400000000000000000000005201261610017700175340ustar00rootroot00000000000000import subprocess from ..utils import memoize, which enabled_by_default = bool(which('brew')) @memoize def get_brew_path_prefix(): """To get brew path""" try: return subprocess.check_output(['brew', '--prefix'], universal_newlines=True).strip() except: return None thefuck-3.2/thefuck/specific/git.py000066400000000000000000000021021261610017700173560ustar00rootroot00000000000000import re from decorator import decorator from ..utils import is_app from ..shells import quote, split_command @decorator def git_support(fn, command): """Resolves git aliases and supports testing for both git and hub.""" # supports GitHub's `hub` command # which is recommended to be used with `alias git=hub` # but at this point, shell aliases have already been resolved if not is_app(command, 'git', 'hub'): return False # perform git aliases expansion if 'trace: alias expansion:' in command.stderr: search = re.search("trace: alias expansion: ([^ ]*) => ([^\n]*)", command.stderr) alias = search.group(1) # by default git quotes everything, for example: # 'commit' '--amend' # which is surprising and does not allow to easily test for # eg. 'git commit' expansion = ' '.join(map(quote, split_command(search.group(2)))) new_script = command.script.replace(alias, expansion) command = command.update(script=new_script) return fn(command) thefuck-3.2/thefuck/specific/sudo.py000066400000000000000000000010201261610017700175430ustar00rootroot00000000000000import six from decorator import decorator from ..types import Command @decorator def sudo_support(fn, command): """Removes sudo before calling fn and adds it after.""" if not command.script.startswith('sudo '): return fn(command) result = fn(command.update(script=command.script[5:])) if result and isinstance(result, six.string_types): return u'sudo {}'.format(result) elif isinstance(result, list): return [u'sudo {}'.format(x) for x in result] else: return result thefuck-3.2/thefuck/types.py000066400000000000000000000214511261610017700161620ustar00rootroot00000000000000from imp import load_source from subprocess import Popen, PIPE import os import sys import six from psutil import Process, TimeoutExpired from . import logs, shells from .conf import settings, DEFAULT_PRIORITY, ALL_ENABLED from .exceptions import EmptyCommand from .utils import compatibility_call class Command(object): """Command that should be fixed.""" def __init__(self, script, stdout, stderr): """Initializes command with given values. :type script: basestring :type stdout: basestring :type stderr: basestring """ self.script = script self.stdout = stdout self.stderr = stderr @property def script_parts(self): if not hasattr(self, '_script_parts'): try: self._script_parts = shells.split_command(self.script) except Exception: logs.debug("Can't split command script {} because:\n {}".format( self, sys.exc_info())) self._script_parts = None return self._script_parts def __eq__(self, other): if isinstance(other, Command): return (self.script, self.stdout, self.stderr) \ == (other.script, other.stdout, other.stderr) else: return False def __repr__(self): return 'Command(script={}, stdout={}, stderr={})'.format( self.script, self.stdout, self.stderr) def update(self, **kwargs): """Returns new command with replaced fields. :rtype: Command """ kwargs.setdefault('script', self.script) kwargs.setdefault('stdout', self.stdout) kwargs.setdefault('stderr', self.stderr) return Command(**kwargs) @staticmethod def _wait_output(popen): """Returns `True` if we can get output of the command in the `settings.wait_command` time. Command will be killed if it wasn't finished in the time. :type popen: Popen :rtype: bool """ proc = Process(popen.pid) try: proc.wait(settings.wait_command) return True except TimeoutExpired: for child in proc.children(recursive=True): child.kill() proc.kill() return False @staticmethod def _prepare_script(raw_script): """Creates single script from a list of script parts. :type raw_script: [basestring] :rtype: basestring """ if six.PY2: script = ' '.join(arg.decode('utf-8') for arg in raw_script) else: script = ' '.join(raw_script) script = script.strip() return shells.from_shell(script) @classmethod def from_raw_script(cls, raw_script): """Creates instance of `Command` from a list of script parts. :type raw_script: [basestring] :rtype: Command :raises: EmptyCommand """ script = cls._prepare_script(raw_script) if not script: raise EmptyCommand env = dict(os.environ) env.update(settings.env) with logs.debug_time(u'Call: {}; with env: {};'.format(script, env)): result = Popen(script, shell=True, stdout=PIPE, stderr=PIPE, env=env) if cls._wait_output(result): stdout = result.stdout.read().decode('utf-8') stderr = result.stderr.read().decode('utf-8') logs.debug(u'Received stdout: {}'.format(stdout)) logs.debug(u'Received stderr: {}'.format(stderr)) return cls(script, stdout, stderr) else: logs.debug(u'Execution timed out!') return cls(script, None, None) class Rule(object): """Rule for fixing commands.""" def __init__(self, name, match, get_new_command, enabled_by_default, side_effect, priority, requires_output): """Initializes rule with given fields. :type name: basestring :type match: (Command) -> bool :type get_new_command: (Command) -> (basestring | [basestring]) :type enabled_by_default: boolean :type side_effect: (Command, basestring) -> None :type priority: int :type requires_output: bool """ self.name = name self.match = match self.get_new_command = get_new_command self.enabled_by_default = enabled_by_default self.side_effect = side_effect self.priority = priority self.requires_output = requires_output def __eq__(self, other): if isinstance(other, Rule): return (self.name, self.match, self.get_new_command, self.enabled_by_default, self.side_effect, self.priority, self.requires_output) \ == (other.name, other.match, other.get_new_command, other.enabled_by_default, other.side_effect, other.priority, other.requires_output) else: return False def __repr__(self): return 'Rule(name={}, match={}, get_new_command={}, ' \ 'enabled_by_default={}, side_effect={}, ' \ 'priority={}, requires_output)'.format( self.name, self.match, self.get_new_command, self.enabled_by_default, self.side_effect, self.priority, self.requires_output) @classmethod def from_path(cls, path): """Creates rule instance from path. :type path: pathlib.Path :rtype: Rule """ name = path.name[:-3] with logs.debug_time(u'Importing rule: {};'.format(name)): rule_module = load_source(name, str(path)) priority = getattr(rule_module, 'priority', DEFAULT_PRIORITY) return cls(name, rule_module.match, rule_module.get_new_command, getattr(rule_module, 'enabled_by_default', True), getattr(rule_module, 'side_effect', None), settings.priority.get(name, priority), getattr(rule_module, 'requires_output', True)) @property def is_enabled(self): """Returns `True` when rule enabled. :rtype: bool """ if self.name in settings.exclude_rules: return False elif self.name in settings.rules: return True elif self.enabled_by_default and ALL_ENABLED in settings.rules: return True else: return False def is_match(self, command): """Returns `True` if rule matches the command. :type command: Command :rtype: bool """ script_only = command.stdout is None and command.stderr is None if script_only and self.requires_output: return False try: with logs.debug_time(u'Trying rule: {};'.format(self.name)): if compatibility_call(self.match, command): return True except Exception: logs.rule_failed(self, sys.exc_info()) def get_corrected_commands(self, command): """Returns generator with corrected commands. :type command: Command :rtype: Iterable[CorrectedCommand] """ new_commands = compatibility_call(self.get_new_command, command) if not isinstance(new_commands, list): new_commands = (new_commands,) for n, new_command in enumerate(new_commands): yield CorrectedCommand(script=new_command, side_effect=self.side_effect, priority=(n + 1) * self.priority) class CorrectedCommand(object): """Corrected by rule command.""" def __init__(self, script, side_effect, priority): """Initializes instance with given fields. :type script: basestring :type side_effect: (Command, basestring) -> None :type priority: int """ self.script = script self.side_effect = side_effect self.priority = priority def __eq__(self, other): """Ignores `priority` field.""" if isinstance(other, CorrectedCommand): return (other.script, other.side_effect) == \ (self.script, self.side_effect) else: return False def __hash__(self): return (self.script, self.side_effect).__hash__() def __repr__(self): return 'CorrectedCommand(script={}, side_effect={}, priority={})'.format( self.script, self.side_effect, self.priority) def run(self, old_cmd): """Runs command from rule for passed command. :type old_cmd: Command """ if self.side_effect: compatibility_call(self.side_effect, old_cmd, self.script) shells.put_to_history(self.script) print(self.script) thefuck-3.2/thefuck/ui.py000066400000000000000000000060071261610017700154330ustar00rootroot00000000000000# -*- encoding: utf-8 -*- import sys from .conf import settings from .exceptions import NoRuleMatched from . import logs try: from msvcrt import getch except ImportError: def getch(): import tty import termios fd = sys.stdin.fileno() old = termios.tcgetattr(fd) try: tty.setraw(fd) ch = sys.stdin.read(1) if ch == '\x03': # For compatibility with msvcrt.getch raise KeyboardInterrupt return ch finally: termios.tcsetattr(fd, termios.TCSADRAIN, old) SELECT = 0 ABORT = 1 PREVIOUS = 2 NEXT = 3 def read_actions(): """Yields actions for pressed keys.""" buffer = [] while True: try: ch = getch() except KeyboardInterrupt: # Ctrl+C yield ABORT if ch in ('\n', '\r'): # Enter yield SELECT buffer.append(ch) buffer = buffer[-3:] if buffer == ['\x1b', '[', 'A'] or ch == 'k': # ↑ yield PREVIOUS elif buffer == ['\x1b', '[', 'B'] or ch == 'j': # ↓ yield NEXT class CommandSelector(object): """Helper for selecting rule from rules list.""" def __init__(self, commands): """:type commands: Iterable[thefuck.types.CorrectedCommand]""" self._commands_gen = commands try: self._commands = [next(self._commands_gen)] except StopIteration: raise NoRuleMatched self._realised = False self._index = 0 def _realise(self): if not self._realised: self._commands += list(self._commands_gen) self._realised = True def next(self): self._realise() self._index = (self._index + 1) % len(self._commands) def previous(self): self._realise() self._index = (self._index - 1) % len(self._commands) @property def value(self): """:rtype hefuck.types.CorrectedCommand""" return self._commands[self._index] def select_command(corrected_commands): """Returns: - the first command when confirmation disabled; - None when ctrl+c pressed; - selected command. :type corrected_commands: Iterable[thefuck.types.CorrectedCommand] :rtype: thefuck.types.CorrectedCommand | None """ try: selector = CommandSelector(corrected_commands) except NoRuleMatched: logs.failed('No fucks given') return if not settings.require_confirmation: logs.show_corrected_command(selector.value) return selector.value logs.confirm_text(selector.value) for action in read_actions(): if action == SELECT: sys.stderr.write('\n') return selector.value elif action == ABORT: logs.failed('\nAborted') return elif action == PREVIOUS: selector.previous() logs.confirm_text(selector.value) elif action == NEXT: selector.next() logs.confirm_text(selector.value) thefuck-3.2/thefuck/utils.py000066400000000000000000000156401261610017700161610ustar00rootroot00000000000000from difflib import get_close_matches from functools import wraps import shelve from warnings import warn from decorator import decorator from contextlib import closing import os import pickle import re from inspect import getargspec from pathlib import Path import pkg_resources from .conf import settings DEVNULL = open(os.devnull, 'w') def memoize(fn): """Caches previous calls to the function.""" memo = {} @wraps(fn) def wrapper(*args, **kwargs): key = pickle.dumps((args, kwargs)) if key not in memo or memoize.disabled: memo[key] = fn(*args, **kwargs) return memo[key] return wrapper memoize.disabled = False @memoize def which(program): """Returns `program` path or `None`.""" def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) fpath, fname = os.path.split(program) if fpath: if is_exe(program): return program else: for path in os.environ["PATH"].split(os.pathsep): path = path.strip('"') exe_file = os.path.join(path, program) if is_exe(exe_file): return exe_file return None def default_settings(params): """Adds default values to settings if it not presented. Usage: @default_settings({'apt': '/usr/bin/apt'}) def match(command, settings): print(settings.apt) """ def _default_settings(fn, command): for k, w in params.items(): settings.setdefault(k, w) return fn(command) return decorator(_default_settings) def get_closest(word, possibilities, n=3, cutoff=0.6, fallback_to_first=True): """Returns closest match or just first from possibilities.""" possibilities = list(possibilities) try: return get_close_matches(word, possibilities, n, cutoff)[0] except IndexError: if fallback_to_first: return possibilities[0] @memoize def get_all_executables(): from thefuck.shells import thefuck_alias, get_aliases def _safe(fn, fallback): try: return fn() except OSError: return fallback tf_alias = thefuck_alias() tf_entry_points = get_installation_info().get_entry_map()\ .get('console_scripts', {})\ .keys() bins = [exe.name for path in os.environ.get('PATH', '').split(':') for exe in _safe(lambda: list(Path(path).iterdir()), []) if not _safe(exe.is_dir, True) and exe.name not in tf_entry_points] aliases = [alias for alias in get_aliases() if alias != tf_alias] return bins + aliases def replace_argument(script, from_, to): """Replaces command line argument.""" replaced_in_the_end = re.sub(u' {}$'.format(from_), u' {}'.format(to), script, count=1) if replaced_in_the_end != script: return replaced_in_the_end else: return script.replace( u' {} '.format(from_), u' {} '.format(to), 1) @decorator def eager(fn, *args, **kwargs): return list(fn(*args, **kwargs)) @eager def get_all_matched_commands(stderr, separator='Did you mean'): should_yield = False for line in stderr.split('\n'): if separator in line: should_yield = True elif should_yield and line: yield line.strip() def replace_command(command, broken, matched): """Helper for *_no_command rules.""" new_cmds = get_close_matches(broken, matched, cutoff=0.1) return [replace_argument(command.script, broken, new_cmd.strip()) for new_cmd in new_cmds] @memoize def is_app(command, *app_names, **kwargs): """Returns `True` if command is call to one of passed app names.""" at_least = kwargs.pop('at_least', 0) if kwargs: raise TypeError("got an unexpected keyword argument '{}'".format(kwargs.keys())) if command.script_parts is not None and len(command.script_parts) > at_least: return command.script_parts[0] in app_names return False def for_app(*app_names, **kwargs): """Specifies that matching script is for on of app names.""" def _for_app(fn, command): if is_app(command, *app_names, **kwargs): return fn(command) else: return False return decorator(_for_app) def cache(*depends_on): """Caches function result in temporary file. Cache will be expired when modification date of files from `depends_on` will be changed. Function wrapped in `cache` should be arguments agnostic. """ def _get_mtime(name): path = os.path.join(os.path.expanduser('~'), name) try: return str(os.path.getmtime(path)) except OSError: return '0' def _get_cache_path(): default_xdg_cache_dir = os.path.expanduser("~/.cache") cache_dir = os.getenv("XDG_CACHE_HOME", default_xdg_cache_dir) cache_path = Path(cache_dir).joinpath('thefuck').as_posix() # Ensure the cache_path exists, Python 2 does not have the exist_ok # parameter try: os.makedirs(cache_dir) except OSError: if not os.path.isdir(cache_dir): raise return cache_path @decorator def _cache(fn, *args, **kwargs): if cache.disabled: return fn(*args, **kwargs) # A bit obscure, but simplest way to generate unique key for # functions and methods in python 2 and 3: key = '{}.{}'.format(fn.__module__, repr(fn).split('at')[0]) etag = '.'.join(_get_mtime(name) for name in depends_on) cache_path = _get_cache_path() with closing(shelve.open(cache_path)) as db: if db.get(key, {}).get('etag') == etag: return db[key]['value'] else: value = fn(*args, **kwargs) db[key] = {'etag': etag, 'value': value} return value return _cache cache.disabled = False def compatibility_call(fn, *args): """Special call for compatibility with user-defined old-style rules with `settings` param. """ fn_args_count = len(getargspec(fn).args) if fn.__name__ in ('match', 'get_new_command') and fn_args_count == 2: warn("Two arguments `{}` from rule `{}` is deprecated, please " "remove `settings` argument and use " "`from thefuck.conf import settings` instead." .format(fn.__name__, fn.__module__)) args += (settings,) if fn.__name__ == 'side_effect' and fn_args_count == 3: warn("Three arguments `side_effect` from rule `{}` is deprecated, " "please remove `settings` argument and use `from thefuck.conf " "import settings` instead." .format(fn.__name__, fn.__module__)) args += (settings,) return fn(*args) def get_installation_info(): return pkg_resources.require('thefuck')[0] thefuck-3.2/tox.ini000066400000000000000000000001551261610017700143240ustar00rootroot00000000000000[tox] envlist = py27,py33,py34,py35 [testenv] deps = -rrequirements.txt commands = py.test -v --capture=sys