${0} @@ -610,7 +608,7 @@ snippet map# snippet map+ - ${5}${6} + ${5}${6} snippet mark ${0} @@ -627,17 +625,17 @@ snippet menu:t ${0} snippet meta - + snippet meta:s - + snippet meta:d - + snippet meta:compat - + snippet meta:refresh - + snippet meta:utf - + snippet meter ${0} snippet nav @@ -665,13 +663,13 @@ snippet movie - - + + + pluginspage="http://www.apple.com/quicktime/download/" /> snippet ol
    @@ -711,7 +709,7 @@ snippet p. snippet p#

    ${0}

    snippet param - + snippet pre
     		${0}
    @@ -774,7 +772,7 @@ snippet select+
     snippet small
     	${0}
     snippet source
    -	
    +	
     snippet span
     	${0}
     snippet span.
    @@ -853,7 +851,7 @@ snippet tr+
     		td+${0}
     	
     snippet track
    -	
    Date: Thu, 14 Jul 2016 21:39:02 -0700
    Subject: [PATCH 175/254] Added Linux instructions
    
    ---
     README.md | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/README.md b/README.md
    index ad17e8cf..489ec5f9 100644
    --- a/README.md
    +++ b/README.md
    @@ -31,6 +31,10 @@ This is useful to install on remote servers where you don't need many plugins an
     Use [msysgit](http://msysgit.github.com/) to checkout the repository and run the installation instructions above. No special instructions needed ;-)
     
     
    +## How to install on Linux
    +
    +If you have vim aliased as `vi` instead of `vim`, make sure to either alias it: `alias vi=vim`. Otherwise, `apt-get install vim`
    +
     ## How to update to latest version?
     
     Simply just do a git rebase!
    
    From 64a81818ee2d54449a964e6eb9d8c424551a917e Mon Sep 17 00:00:00 2001
    From: amix 
    Date: Sat, 16 Jul 2016 20:30:35 +0200
    Subject: [PATCH 176/254] Updated vim plugins
    
    ---
     sources_non_forked/ack.vim/README.md          |  13 ++
     sources_non_forked/ack.vim/doc/ack.txt        |  14 +-
     .../ctrlp.vim/autoload/ctrlp.vim              |  13 ++
     sources_non_forked/syntastic/README.markdown  | 112 +++++++++++-----
     .../syntastic/doc/syntastic.txt               |  25 ++++
     .../syntastic/plugin/syntastic.vim            |   2 +-
     .../syntax_checkers/matlab/mlint.vim          |   2 +-
     .../vim-fugitive/plugin/fugitive.vim          |   2 +-
     sources_non_forked/vim-go/CHANGELOG.md        |   4 +-
     .../vim-go/autoload/go/guru.vim               |  79 +++++++++---
     .../vim-go/autoload/go/util.vim               | 122 ++++++++++++------
     sources_non_forked/vim-go/doc/vim-go.txt      |  45 ++++++-
     .../vim-go/ftplugin/go/commands.vim           |   5 +-
     .../vim-go/ftplugin/go/mappings.vim           |   4 +-
     .../vim-go/gosnippets/UltiSnips/go.snippets   |  29 +++--
     .../vim-go/gosnippets/snippets/go.snip        |   8 ++
     sources_non_forked/vim-go/plugin/go.vim       |   5 +
     sources_non_forked/vim-go/syntax/go.vim       |  13 +-
     .../vim-snippets/UltiSnips/markdown.snippets  |  39 ++++++
     .../vim-snippets/UltiSnips/php.snippets       |  13 +-
     .../vim-snippets/snippets/php.snippets        |   2 +
     21 files changed, 429 insertions(+), 122 deletions(-)
    
    diff --git a/sources_non_forked/ack.vim/README.md b/sources_non_forked/ack.vim/README.md
    index a82bb804..af8f522d 100644
    --- a/sources_non_forked/ack.vim/README.md
    +++ b/sources_non_forked/ack.vim/README.md
    @@ -122,6 +122,19 @@ nice code clean-up (which ack.vim is now hopefully getting), and ack.vim picked
     up a few features that haven't made their way to ag.vim, like `:AckWindow`,
     optional background search execution with [vim-dispatch], and auto-previewing.
     
    +#### I don't want to jump to the first result automatically. ####
    +
    +Use `:Ack!`, with bang. If you want this behavior most of the time, you might
    +like an abbreviation or mapping in your personal config, something like these:
    +
    +```vim
    +cnoreabbrev Ack Ack!
    +nnoremap a :Ack!
    +```
    +
    +Most of the `:[L]Ack*` commands support this. Note that this behavior follows
    +the convention of Vim's built-in `:grep` and `:make` commands.
    +
     [The Silver Searcher]: https://github.com/ggreer/the_silver_searcher
     [sadface]: https://github.com/mileszs/ack.vim/commit/d97090fb502d40229e6976dfec0e06636ba227d5#commitcomment-5771145
     
    diff --git a/sources_non_forked/ack.vim/doc/ack.txt b/sources_non_forked/ack.vim/doc/ack.txt
    index 33939516..22e884bc 100644
    --- a/sources_non_forked/ack.vim/doc/ack.txt
    +++ b/sources_non_forked/ack.vim/doc/ack.txt
    @@ -275,7 +275,19 @@ If you're using this plugin with ag, The Silver Searcher, bear in mind that:
     ==============================================================================
     ISSUES AND FAQ                                            *ack-issues-and-faq*
     
    -I use NERDTree and opening ack.vim results in a vertical split displaces it.~
    +I don't want to jump to the first result automatically.~
    +
    +    Use `:Ack!`, with bang. If you want this behavior most of the time, you
    +    might like an abbreviation or mapping in your personal config, something
    +    like these:
    +>
    +        cnoreabbrev Ack Ack!
    +        nnoremap a :Ack!
    +<
    +    Most of the `:[L]Ack*` commands support this. Note that this behavior
    +    follows the convention of Vim's built-in |:grep| and |:make| commands.
    +
    +I use NERDTree and opening ack.vim results in a vertical split displacing it.~
     
         You are probably using NERDTree with its default alignment at the left
         side of the window. Set these custom mappings in your vimrc to work around
    diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim
    index 04f1aa85..fef2544f 100644
    --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim
    +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim
    @@ -149,6 +149,7 @@ let [s:lcmap, s:prtmaps] = ['nn  ', {
     	\ 'CreateNewFile()':      [''],
     	\ 'MarkToOpen()':         [''],
     	\ 'OpenMulti()':          [''],
    +	\ 'YankLine()':           [],
     	\ 'PrtExit()':            ['', '', ''],
     	\ }]
     
    @@ -1325,6 +1326,18 @@ fu! s:OpenMulti(...)
     	unl! s:tabct
     endf
     
    +fu! s:YankLine(...)
    +	let @" = s:getinput()
    +	let has_marked = exists('s:marked')
    +	if !has_marked
    +		let line = ctrlp#getcline()
    +		if line == '' | retu | en
    +		let marked = { 1 : fnamemodify(line, ':p') }
    +	en
    +	let @" = join(values(has_marked ? s:marked : marked), "\n")
    +	cal s:PrtExit()
    +endf
    +
     fu! s:OpenNoMarks(md, line)
     	if a:md == 'a'
     		let [s:marked, key] = [{}, 1]
    diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown
    index 685d8408..7e493df2 100644
    --- a/sources_non_forked/syntastic/README.markdown
    +++ b/sources_non_forked/syntastic/README.markdown
    @@ -25,19 +25,21 @@
     3. [Recommended settings](#settings)  
     4. [FAQ](#faq)  
     4.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo)  
    -4.2. [The `python` checker complains about syntactically valid Python 3 constructs...](#faqpython3)  
    -4.3. [Are there any local checkers for HTML5 that I can use with syntastic?](#faqhtml5)  
    -4.4. [The `perl` checker has stopped working...](#faqperl)  
    -4.5. [What happened to the `rustc` checker?](#faqrust)  
    -4.6. [What happened to the `xcrun` checker?](#faqxcrun)  
    -4.7. [I run a checker and the location list is not updated...](#faqloclist)  
    -4.7. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist)  
    -4.8. [How can I pass additional arguments to a checker?](#faqargs)  
    -4.9. [Syntastic supports several checkers for my filetype - how do I tell which one(s) to use?](#faqcheckers)  
    -4.10. [What is the difference between syntax checkers and style checkers?](#faqstyle)  
    -4.11. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate)  
    -4.12. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext)  
    -4.13. [The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?](#faqbdelete)  
    +4.2. [How can I check scripts written for different versions of Python?](#faqpython)  
    +4.3. [How can I check scripts written for different versions of Ruby?](#faqruby)  
    +4.4. [Are there any local checkers for HTML5 that I can use with syntastic?](#faqhtml5)  
    +4.5. [The `perl` checker has stopped working...](#faqperl)  
    +4.6. [What happened to the `rustc` checker?](#faqrust)  
    +4.7. [What happened to the `xcrun` checker?](#faqxcrun)  
    +4.8. [I run a checker and the location list is not updated...](#faqloclist)  
    +4.8. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist)  
    +4.9. [How can I pass additional arguments to a checker?](#faqargs)  
    +4.10. [Syntastic supports several checkers for my filetype - how do I tell which one(s) to use?](#faqcheckers)  
    +4.11. [What is the difference between syntax checkers and style checkers?](#faqstyle)  
    +4.12. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate)  
    +4.13. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext)  
    +4.14. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig)  
    +4.15. [The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?](#faqbdelete)  
     5. [Resources](#otherresources)  
     
     - - -
    @@ -150,7 +152,7 @@ You now have pathogen installed and can put syntastic into `~/.vim/bundle` like
     this:
     ```sh
     cd ~/.vim/bundle && \
    -git clone https://github.com/scrooloose/syntastic.git
    +git clone --depth=1 https://github.com/scrooloose/syntastic.git
     ```
     Quit vim and start it back up to reload it, then type:
     ```vim
    @@ -227,19 +229,40 @@ or the error output for a syntax checker may have changed. In this case, make
     sure you have the latest version of the syntax checker installed. If it still
     fails then post an [issue][bug_tracker] - or better yet, create a pull request.
     
    -
    +
     
    -__4.2. Q. The `python` checker complains about syntactically valid Python 3 constructs...__
    +__4.2. Q. How can I check scripts written for different versions of Python?__
     
    -A. Configure the `python` checker to call a Python 3 interpreter rather than
    -Python 2, e.g:
    -```vim
    -let g:syntastic_python_python_exec = '/path/to/python3'
    -```
    +A. Install a Python version manager such as [virtualenv][virtualenv]
    +or [pyenv][pyenv], activate the environment for the relevant version
    +of Python, and install in it the checkers you want to use.  Set
    +`g:syntastic_python_checkers` accordingly in your `vimrc`, and run [Vim][vim]
    +from the virtual environment.
    +
    +If you're starting Vim from a desktop manager rather than from a terminal you
    +might need to write wrapper scripts around your checkers, to activate the
    +virtual environment before running the actual checks.  Then you'll need to
    +point the relevant `g:syntastic_python__exec` variables to the wrapper
    +scripts.
    +
    +
    +
    +__4.3. Q. How can I check scripts written for different versions of Ruby?__
    +
    +A. Install a Ruby version manager such as [rvm][rvm] or [rbenv][rbenv],
    +activate the environment for the relevant version of Ruby, and install in it
    +the checkers you want to use.  Set `g:syntastic_ruby_checkers` accordingly in
    +your `vimrc`, and run [Vim][vim] from the virtual environment.
    +
    +If you're starting Vim from a desktop manager rather than from a terminal you
    +might need to write wrapper scripts around your checkers, to activate the
    +virtual environment before running the actual checks.  Then you'll need to
    +point the relevant `g:syntastic_ruby__exec` variables to the wrapper
    +scripts.
     
     
     
    -__4.3. Q. Are there any local checkers for HTML5 that I can use with syntastic?__
    +__4.4. Q. Are there any local checkers for HTML5 that I can use with syntastic?__
     
     [HTML Tidy][tidy_old] has a fork named [HTML Tidy for HTML5][tidy]. It's a drop
     in replacement, and syntastic can use it without changes. Just install it
    @@ -259,7 +282,7 @@ let g:syntastic_html_validator_api = 'http://localhost:8888/'
     
     
     
    -__4.4. Q. The `perl` checker has stopped working...__
    +__4.5. Q. The `perl` checker has stopped working...__
     
     A. The `perl` checker runs `perl -c` against your file, which in turn
     __executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use`
    @@ -275,14 +298,14 @@ let g:syntastic_enable_perl_checker = 1
     
     
     
    -__4.5. Q. What happened to the `rustc` checker?__
    +__4.6. Q. What happened to the `rustc` checker?__
     
     A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the
     checker should be picked up automatically by syntastic.
     
     
     
    -__4.6. Q. What happened to the `xcrun` checker?__
    +__4.7. Q. What happened to the `xcrun` checker?__
     
     A. The `xcrun` checker used to have a security problem and it has been removed.
     A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you
    @@ -290,8 +313,8 @@ install this plugin the checker should be picked up automatically by syntastic.
     
     
     
    -__4.7. Q. I run a checker and the location list is not updated...__  
    -__4.7. Q. I run`:lopen` or `:lwindow` and the error window is empty...__
    +__4.8. Q. I run a checker and the location list is not updated...__  
    +__4.8. Q. I run`:lopen` or `:lwindow` and the error window is empty...__
     
     A. By default the location list is changed only when you run the `:Errors`
     command, in order to minimise conflicts with other plugins. If you want the
    @@ -303,7 +326,7 @@ let g:syntastic_always_populate_loc_list = 1
     
     
     
    -__4.8. Q. How can I pass additional arguments to a checker?__
    +__4.9. Q. How can I pass additional arguments to a checker?__
     
     A. Almost all syntax checkers use the `makeprgBuild()` function. Those checkers
     that do can be configured using global variables. The general form of the
    @@ -319,7 +342,7 @@ See `:help syntastic-checker-options` for more information.
     
     
     
    -__4.9. Q. Syntastic supports several checkers for my filetype - how do I tell it
    +__4.10. Q. Syntastic supports several checkers for my filetype - how do I tell it
     which one(s) to use?__
     
     A. Stick a line like this in your `vimrc`:
    @@ -360,7 +383,7 @@ filetype of the current file is `php`).
     
     
     
    -__4.10. Q. What is the difference between syntax checkers and style checkers?__
    +__4.11. Q. What is the difference between syntax checkers and style checkers?__
     
     A. The errors and warnings they produce are highlighted differently and can
     be filtered by different rules, but otherwise the distinction is pretty much
    @@ -390,7 +413,7 @@ See `:help syntastic_quiet_messages` for details.
     
     
     
    -__4.11. Q. I have enabled multiple checkers for the current filetype. How can I
    +__4.12. Q. I have enabled multiple checkers for the current filetype. How can I
     display all errors from all checkers together?__
     
     A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`:
    @@ -402,7 +425,7 @@ See `:help syntastic-aggregating-errors` for more details.
     
     
     
    -__4.12. Q. How can I jump between the different errors without using the location
    +__4.13. Q. How can I jump between the different errors without using the location
     list at the bottom of the window?__
     
     A. Vim provides several built-in commands for this. See `:help :lnext` and
    @@ -412,9 +435,28 @@ If you use these commands a lot then you may want to add shortcut mappings to
     your `vimrc`, or install something like [unimpaired][unimpaired], which provides such
     mappings (among other things).
     
    +
    +
    +__4.14. My favourite checker needs to load a configuration file from the
    +project's root rather than the current directory...__
    +
    +A. You can set up an `autocmd` to search for the configuration file in the
    +current directory and upwards, and add it to the checker's options when found.
    +For example for `jscs`:
    +
    +```vim
    +function! FindConfig(prefix, what, where)
    +    let cfg = findfile(a:what, escape(a:where, ' ') . ';')
    +    return cfg !=# '' ? ' ' . a:prefix . ' ' . cfg : ''
    +endfunction
    +
    +autocmd FileType javascript let b:syntastic_javascript_jscs_args =
    +    \ get(g:, 'syntastic_javascript_jscs_args', '') .
    +    \ FindConfig('-c', '.jscsrc', expand(':p:h', 1))
    +```
     
     
    -__4.13. Q. The error window is closed automatically when I :quit the current buffer
    +__4.15. Q. The error window is closed automatically when I :quit the current buffer
     but not when I :bdelete it?__
     
     A. There is no safe way to handle that situation automatically, but you can
    @@ -458,9 +500,12 @@ a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [v
     [pathogen]:         https://github.com/tpope/vim-pathogen
     [perlrun]:          http://perldoc.perl.org/perlrun.html#*-c*
     [plug]:             https://github.com/junegunn/vim-plug/
    +[pyenv]:            https://github.com/yyuu/pyenv
     [python_mode]:      https://github.com/klen/python-mode
    +[rbenv]:            https://github.com/rbenv/rbenv
     [roktas]:           https://github.com/roktas/syntastic-more
     [rust]:             https://github.com/rust-lang/rust.vim
    +[rvm]:              https://rvm.io/
     [stack_overflow]:   http://stackoverflow.com/questions/tagged/syntastic
     [swift]:            https://github.com/kballard/vim-swift
     [tidy]:             http://www.htacg.org/tidy-html5/
    @@ -469,6 +514,7 @@ a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [v
     [vam]:              https://github.com/MarcWeber/vim-addon-manager
     [vim]:              http://www.vim.org/
     [vimgo]:            https://github.com/fatih/vim-go
    +[virtualenv]:       https://virtualenv.pypa.io/en/stable/
     [vnu]:              http://about.validator.nu/
     [vnu_jar]:          https://github.com/validator/validator/releases/latest
     [vnu_server]:       http://validator.github.io/validator/#standalone
    diff --git a/sources_non_forked/syntastic/doc/syntastic.txt b/sources_non_forked/syntastic/doc/syntastic.txt
    index 9b9674ee..431638bb 100644
    --- a/sources_non_forked/syntastic/doc/syntastic.txt
    +++ b/sources_non_forked/syntastic/doc/syntastic.txt
    @@ -44,6 +44,7 @@ CONTENTS                                                  *syntastic-contents*
             6.2.Editing files over network.............|syntastic-netrw|
             6.3.The 'shellslash' option................|syntastic-shellslash|
             6.4.Saving Vim sessions....................|syntastic-sessions|
    +        6.5.The location list callback.............|syntastic-loclist-callback|
         7.Compatibility with other software............|syntastic-compatibility|
             7.1.The csh and tcsh shells................|syntastic-csh|
             7.2.Eclim..................................|syntastic-eclim|
    @@ -882,6 +883,7 @@ The syntax is of course identical to that of |syntastic_quiet_messages|.
     
     ------------------------------------------------------------------------------
     5.6 Debugging                                         *syntastic-config-debug*
    +                                                             *syntastic-debug*
     
     Syntastic can log a trace of its working to Vim's |message-history|. To verify
     the command line constructed by syntastic to run a checker, set the variable
    @@ -958,6 +960,29 @@ remove option "blank" from 'sessionoptions': >
     This will prevent `:mksession` from saving |syntastic-error-window| as empty
     quickfix windows.
     
    +------------------------------------------------------------------------------
    +6.5 The location list callback                    *syntastic-loclist-callback*
    +
    +                                                        *SyntasticCheckHook()*
    +Syntastic also gives you direct access to the list of errors.  A function
    +named |SyntasticCheckHook()| is called by syntastic (if it exists) right
    +before populating the |location-list| and enabling the notifiers. The function
    +takes exactly one argument, the list of errors in |location-list| format (see
    +|getqflist()| for details). format. You can do essentially anything with this
    +list, as long as you don't change its format, and you don't add or remove
    +elements.
    +
    +For example the following function will make the error window smaller if fewer
    +than 10 errors are found: >
    +    function! SyntasticCheckHook(errors)
    +        if !empty(a:errors)
    +            let g:syntastic_loc_list_height = min([len(a:errors), 10])
    +        endif
    +    endfunction
    +<
    +(Please keep in mind however that Vim options |winheight| and |winminheight|
    +also affect window sizes.)
    +
     ==============================================================================
     7. Compatibility with other software                 *syntastic-compatibility*
     
    diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim
    index 49b586cc..8076eebe 100644
    --- a/sources_non_forked/syntastic/plugin/syntastic.vim
    +++ b/sources_non_forked/syntastic/plugin/syntastic.vim
    @@ -19,7 +19,7 @@ if has('reltime')
         lockvar! g:_SYNTASTIC_START
     endif
     
    -let g:_SYNTASTIC_VERSION = '3.7.0-157'
    +let g:_SYNTASTIC_VERSION = '3.7.0-162'
     lockvar g:_SYNTASTIC_VERSION
     
     " Sanity checks {{{1
    diff --git a/sources_non_forked/syntastic/syntax_checkers/matlab/mlint.vim b/sources_non_forked/syntastic/syntax_checkers/matlab/mlint.vim
    index 6e0b8d17..dfb15932 100644
    --- a/sources_non_forked/syntastic/syntax_checkers/matlab/mlint.vim
    +++ b/sources_non_forked/syntastic/syntax_checkers/matlab/mlint.vim
    @@ -19,7 +19,7 @@ let s:save_cpo = &cpo
     set cpo&vim
     
     function! SyntaxCheckers_matlab_mlint_GetLocList() dict
    -    let makeprg = self.makeprgBuild({ 'args_after': '-id $*' })
    +    let makeprg = self.makeprgBuild({ 'args_after': '-id' })
     
         let errorformat =
             \ 'L %l (C %c): %*[a-zA-Z0-9]: %m,'.
    diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim
    index 90f123f9..805518ae 100644
    --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim
    +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim
    @@ -2840,7 +2840,7 @@ function! s:cfile() abort
           elseif getline('.') =~# '^#\trenamed:.* -> '
             let file = '/'.matchstr(getline('.'),' -> \zs.*')
             return [file]
    -      elseif getline('.') =~# '^#\t\(\k\| \)\+: *.'
    +      elseif getline('.') =~# '^#\t\(\k\| \)\+\p\?: *.'
             let file = '/'.matchstr(getline('.'),': *\zs.\{-\}\ze\%( ([^()[:digit:]]\+)\)\=$')
             return [file]
           elseif getline('.') =~# '^#\t.'
    diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md
    index c17fb8d7..c332edfc 100644
    --- a/sources_non_forked/vim-go/CHANGELOG.md
    +++ b/sources_non_forked/vim-go/CHANGELOG.md
    @@ -3,9 +3,11 @@
     FEATURES:
     
     * If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [gh-918]
    +* The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Checkout the demo to see it in action: https://github.com/fatih/vim-go/pull/927 [gh-927]
    +* **`:GoSameIds`** support. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically. Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [gh-936]
    +* Add new `errp` snippet to expand an `if err != nil { panic() }` clause [gh-926] 
     
     IMPROVEMENTS:
    -
     * `:GoDoc` accepts arguments now which are passed directly to `godoc`. So usages like `:GoDoc flag` works again (it was changed in previous versions [gh-894]
     * `:GoDef` works now for modified files as well [gh-910]
     * Internal: fix indentations on all files to **2-spaces/no tabs**. This is now the default vim-go style across all VimL files [gh-915]
    diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim
    index 053d5310..5ddc99d0 100644
    --- a/sources_non_forked/vim-go/autoload/go/guru.vim
    +++ b/sources_non_forked/vim-go/autoload/go/guru.vim
    @@ -7,7 +7,18 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort
         return {'err': "bin path not found"}
       endif
     
    -  let filename = expand('%:p')
    +  let filename = fnamemodify(expand("%"), ':p:gs?\\?/?')
    +  if !filereadable(filename)
    +    " this might happen for new buffers which are not written yet
    +    return {'err': "file does not exist"}
    +  endif
    +
    +  if &modified
    +    " Write current unsaved buffer to a temp file and use the modified content
    +    let l:tmpname = tempname()
    +    call writefile(getline(1, '$'), l:tmpname)
    +    let filename = l:tmpname
    +  endif
       let dirname = expand('%:p:h')
       let pkg = go#package#ImportPath(dirname)
     
    @@ -80,12 +91,18 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort
       let old_gopath = $GOPATH
       let $GOPATH = go#path#Detect()
     
    -  " the query might take time, let us give some feedback
    -  call go#util#EchoProgress("analysing ...")
    +  if a:mode !=# 'what'
    +    " the query might take time, let us give some feedback
    +    call go#util#EchoProgress("analysing ...")
    +  endif
     
       " run, forrest run!!!
       let out = go#util#System(command)
     
    +  if exists("l:tmpname")
    +    call delete(l:tmpname)
    +  endif
    +
       let $GOPATH = old_gopath
       if go#util#ShellError() != 0
         " the output contains the error message
    @@ -268,37 +285,65 @@ function! go#guru#What(selected)
     
       let out = s:RunGuru('what', 'json', a:selected, 0)
       if has_key(out, 'err')
    -    return out.err
    +    return {'err': out.err}
       endif
     
    -  call s:loclistSecond(out.out)
       let result = json_decode(out.out)
     
       if type(result) != type({})
         return {'err': "malformed output from guru"}
       endif
     
    -  if !has_key(result, 'what')
    -    return {'err': "no what query found for the given identifier"}
    -  endif
    -
    -  return {'out': result.what}
    +  return result
     endfunction
     
     function! go#guru#SameIds(selected)
    +  call go#guru#ClearSameIds()
    +
       let result = go#guru#What(a:selected)
    -  if has_key(out, 'err')
    -    call go#util#EchoError(out.err)
    +  if has_key(result, 'err') && !get(g:, 'go_auto_sameids', 0)
    +    " only echo if it's called via `:GoSameIds, but not if it's in automode
    +    call go#util#EchoError(result.err)
         return
       endif
     
    -  if !has_key(result.out, 'sameids')
    -    call go#util#EchoError("no same_ids founds for the given identifier")
    -    return -1
    +  if !has_key(result, 'sameids')
    +    if !get(g:, 'go_auto_sameids', 0)
    +      call go#util#EchoError("no same_ids founds for the given identifier")
    +    endif
    +    return
       endif
     
    -  let same_ids = result.what.sameids
    -  echo same_ids
    +  let poslen = 0
    +  for enclosing in result['enclosing']
    +    if enclosing['desc'] == 'identifier'
    +      let poslen = enclosing['end'] - enclosing['start']
    +      break
    +    endif
    +  endfor
    +
    +  " return when there's no identifier to highlight.
    +  if poslen == 0
    +    return
    +  endif
    +
    +  hi goSameId term=bold cterm=bold ctermbg=white ctermfg=black
    +
    +  let same_ids = result['sameids']
    +  " highlight the lines
    +  for item in same_ids
    +    let pos = split(item, ':')
    +    call matchaddpos('goSameId', [[str2nr(pos[-2]), str2nr(pos[-1]), str2nr(poslen)]])
    +  endfor
    +endfunction
    +
    +function! go#guru#ClearSameIds()
    +  let m = getmatches()
    +  for item in m
    +    if item['group'] == 'goSameId'
    +      call matchdelete(item['id'])
    +    endif
    +  endfor
     endfunction
     
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim
    index 321ce3a4..591606ff 100644
    --- a/sources_non_forked/vim-go/autoload/go/util.vim
    +++ b/sources_non_forked/vim-go/autoload/go/util.vim
    @@ -131,85 +131,121 @@ function! go#util#Shelljoin(arglist, ...)
           return join(map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')'), ' ')
         endif
     
    -        return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ')
    -    finally
    -        let &shellslash = ssl_save
    -    endtry
    +    return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ')
    +  finally
    +    let &shellslash = ssl_save
    +  endtry
     endfunction
     
     fu! go#util#Shellescape(arg)
    -    if s:has_vimproc()
    -        return vimproc#shellescape(a:arg)
    -    endif
    -    try
    -        let ssl_save = &shellslash
    -        set noshellslash
    -        return shellescape(a:arg)
    -    finally
    -        let &shellslash = ssl_save
    -    endtry
    +  if s:has_vimproc()
    +    return vimproc#shellescape(a:arg)
    +  endif
    +  try
    +    let ssl_save = &shellslash
    +    set noshellslash
    +    return shellescape(a:arg)
    +  finally
    +    let &shellslash = ssl_save
    +  endtry
     endf
     
     " Shelllist returns a shell-safe representation of the items in the given
     " arglist. The {special} argument of shellescape() may optionally be passed.
     function! go#util#Shelllist(arglist, ...)
    -    try
    -        let ssl_save = &shellslash
    -        set noshellslash
    -        if a:0
    -            return map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')')
    -        endif
    -        return map(copy(a:arglist), 'shellescape(v:val)')
    -    finally
    -        let &shellslash = ssl_save
    -    endtry
    +  try
    +    let ssl_save = &shellslash
    +    set noshellslash
    +    if a:0
    +      return map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')')
    +    endif
    +    return map(copy(a:arglist), 'shellescape(v:val)')
    +  finally
    +    let &shellslash = ssl_save
    +  endtry
     endfunction
     
     " Returns the byte offset for line and column
     function! go#util#Offset(line, col)
    -    if &encoding != 'utf-8'
    -        let sep = go#util#LineEnding()
    -        let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep)
    -        let buf .= a:col == 1 ? '' : getline('.')[:a:col-2]
    -        return len(iconv(buf, &encoding, 'utf-8'))
    -    endif
    -    return line2byte(a:line) + (a:col-2)
    +  if &encoding != 'utf-8'
    +    let sep = go#util#LineEnding()
    +    let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep)
    +    let buf .= a:col == 1 ? '' : getline('.')[:a:col-2]
    +    return len(iconv(buf, &encoding, 'utf-8'))
    +  endif
    +  return line2byte(a:line) + (a:col-2)
     endfunction
     "
     " Returns the byte offset for the cursor
     function! go#util#OffsetCursor()
    -    return go#util#Offset(line('.'), col('.'))
    +  return go#util#Offset(line('.'), col('.'))
     endfunction
     
     " Windo is like the built-in :windo, only it returns to the window the command
     " was issued from
     function! go#util#Windo(command)
    -    let s:currentWindow = winnr()
    -    try
    -        execute "windo " . a:command
    -    finally
    -        execute s:currentWindow. "wincmd w"
    -        unlet s:currentWindow
    -    endtry
    +  let s:currentWindow = winnr()
    +  try
    +    execute "windo " . a:command
    +  finally
    +    execute s:currentWindow. "wincmd w"
    +    unlet s:currentWindow
    +  endtry
     endfunction
     
    +" snippetcase converts the given word to given preferred snippet setting type
    +" case.
    +function! go#util#snippetcase(word)
    +  let l:snippet_case = get(g:, 'go_snippet_case_type', "snakecase")
    +  if l:snippet_case == "snakecase"
    +    return go#util#snakecase(a:word)
    +  elseif l:snippet_case == "camelcase"
    +    return go#util#camelcase(a:word)
    +  else
    +    return a:word " do nothing
    +  endif
    +endfunction
    +
    +" snakecase converts a string to snake case. i.e: FooBar -> foo_bar
    +" Copied from tpope/vim-abolish
    +function! go#util#snakecase(word)
    +  let word = substitute(a:word,'::','/','g')
    +  let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g')
    +  let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g')
    +  let word = substitute(word,'[.-]','_','g')
    +  let word = tolower(word)
    +  return word
    +endfunction
    +
    +" camelcase converts a string to camel case. i.e: FooBar -> fooBar
    +" Copied from tpope/vim-abolish
    +function! go#util#camelcase(word)
    +  let word = substitute(a:word, '-', '_', 'g')
    +  if word !~# '_' && word =~# '\l'
    +    return substitute(word,'^.','\l&','')
    +  else
    +    return substitute(word,'\C\(_\)\=\(.\)','\=submatch(1)==""?tolower(submatch(2)) : toupper(submatch(2))','g')
    +  endif
    +endfunction
    +
    +
     " TODO(arslan): I couldn't parameterize the highlight types. Check if we can
     " simplify the following functions
     
     function! go#util#EchoSuccess(msg)
    -    redraws! | echon "vim-go: " | echohl Function | echon a:msg | echohl None
    +  redraws! | echon "vim-go: " | echohl Function | echon a:msg | echohl None
     endfunction
     
     function! go#util#EchoError(msg)
    -    redraws! | echon "vim-go: " | echohl ErrorMsg | echon a:msg | echohl None
    +  redraws! | echon "vim-go: " | echohl ErrorMsg | echon a:msg | echohl None
     endfunction
     
     function! go#util#EchoWarning(msg)
    -    redraws! | echon "vim-go: " | echohl WarningMsg | echon a:msg | echohl None
    +  redraws! | echon "vim-go: " | echohl WarningMsg | echon a:msg | echohl None
     endfunction
     
     function! go#util#EchoProgress(msg)
    -    redraws! | echon "vim-go: " | echohl Identifier | echon a:msg | echohl None
    +  redraws! | echon "vim-go: " | echohl Identifier | echon a:msg | echohl None
     endfunction
     
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt
    index f15b4724..c3667b49 100644
    --- a/sources_non_forked/vim-go/doc/vim-go.txt
    +++ b/sources_non_forked/vim-go/doc/vim-go.txt
    @@ -552,6 +552,17 @@ CTRL-t
         object as does the selected identifier, within any package in the analysis
         scope.
     
    +                                                              *:GoSameIds*
    +:GoSameIds
    +
    +    Highlights all identifiers that are equivalent to the identifier under the
    +    cursor.
    +
    +                                                          *:GoSameIdsClear*
    +:GoSameIdsClear
    +
    +    Clears all SameIds highlights from a |:GoSameIds| call.
    +
                                                                   *:GoMetaLinter*
     :GoMetaLinter [path]
     
    @@ -778,7 +789,7 @@ Shows the godef tag stack
     
                                                             *(go-def-stack-clear)*
     
    -Resets and clers the tasg stack
    +Resets and clears the tag stack
     
                                                                   *(go-def-pop)*
     
    @@ -920,11 +931,17 @@ with |:GoPlay|. By default it's enabled. >
     
     Use this option to show the type info (|:GoInfo|) for the word under the cursor
     automatically. Whenever the cursor changes the type info will be updated.
    -By default it's disabled >
    -
    +By default it's disabled.
    +>
       let g:go_auto_type_info = 0
     <
    +                                                      *'g:go_auto_sameids'*
     
    +Use this option to highlight all uses of the identifier under the cursor
    +(:GoSameIds) automatically. By default it's disabled.
    +>
    +  let g:go_auto_sameids = 0
    +<
                                                           *'g:go_jump_to_error'*
     
     Use this option to enable/disable passing the bang attribute to the mappings
    @@ -1044,6 +1061,28 @@ is used. Use "neosnippet" for neosnippet.vim: >
       let g:go_snippet_engine = "ultisnips"
     <
     
    +                                                  *'g:go_snippet_case_type'*
    +
    +Use this option to define the default conversion type of snippet expansion for
    +field tags. For the following case, if `snakecase` is used the `json` snippet
    +will expand to:
    +>
    +  type T struct {
    +    FooBarQuz string `json:"foo_bar_quz"
    +  }
    +<
    +
    +If "camelcase" is used:
    +>
    +  type T struct {
    +    FooBarQuz string `json:"fooBarQuz"
    +  }
    +<
    +By default "snakecase" is used. Current values are: ["snakecase", "camelcase"].
    +>
    +  let g:go_snippet_case_type = "snakecase"
    +<
    +
                                                              *'g:go_get_update'*
     
     Use this option to disable updating dependencies with |GoInstallBinaries|. By
    diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim
    index 5b60b501..31e1f044 100644
    --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim
    +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim
    @@ -12,9 +12,8 @@ command! -range=% GoFreevars call go#guru#Freevars()
     command! -range=% GoChannelPeers call go#guru#ChannelPeers()
     command! -range=% GoReferrers call go#guru#Referrers()
     command! -nargs=? GoGuruTags call go#guru#Tags()
    -
    -" TODO(arslan): enable this once the function is implemented
    -" command! -range=% GoSameIds call go#guru#SameIds()
    +command! -range=% GoSameIds call go#guru#SameIds()
    +command! -range=0 GoSameIdsClear call go#guru#ClearSameIds()
     
     " -- tool
     command! -nargs=0 GoFiles echo go#tool#Files()
    diff --git a/sources_non_forked/vim-go/ftplugin/go/mappings.vim b/sources_non_forked/vim-go/ftplugin/go/mappings.vim
    index 3dafacc2..7bf8dcf3 100644
    --- a/sources_non_forked/vim-go/ftplugin/go/mappings.vim
    +++ b/sources_non_forked/vim-go/ftplugin/go/mappings.vim
    @@ -43,9 +43,7 @@ nnoremap  (go-callstack) :call go#guru#Callstack(-1)
     xnoremap  (go-freevars) :call go#guru#Freevars(0)
     nnoremap  (go-channelpeers) :call go#guru#ChannelPeers(-1)
     nnoremap  (go-referrers) :call go#guru#Referrers(-1)
    -
    -" TODO(arslan): enable this once the function is implemented
    -" nnoremap  (go-sameids) :call go#guru#SameIds(-1)
    +nnoremap  (go-sameids) :call go#guru#SameIds(-1)
     
     nnoremap  (go-rename) :call go#rename#Rename(!g:go_jump_to_error)
     
    diff --git a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets
    index 905d1d42..15d9b76f 100644
    --- a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets
    +++ b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets
    @@ -151,14 +151,7 @@ if err != nil {
     ${0}
     endsnippet
     
    -# error snippet
    -snippet errt "Error test fatal " !b
    -if err != nil {
    -	t.Fatal(err)
    -}
    -${0}
    -endsnippet
    -
    +# error multiple return
     snippet errn, "Error return with two return values" !b
     if err != nil {
     	return ${1:nil}, err
    @@ -166,6 +159,23 @@ if err != nil {
     ${0}
     endsnippet
     
    +# error panic
    +snippet errp "Error panic" !b
    +if err != nil {
    +	panic(${1})
    +}
    +${0}
    +endsnippet
    +
    +# error test 
    +snippet errt "Error test fatal " !b
    +if err != nil {
    +	t.Fatal(err)
    +}
    +${0}
    +endsnippet
    +
    +# error handle
     snippet errh "Error handle and return" !b
     if err != nil {
     	${1}
    @@ -174,8 +184,9 @@ if err != nil {
     ${0}
     endsnippet
     
    +# json field tag
     snippet json "\`json:key\`"
    -\`json:"${1:keyName}"\`
    +\`json:"${1:`!v  go#util#snippetcase(matchstr(getline("."), '\w\+'))`}"\`
     endsnippet
     
     # fallthrough
    diff --git a/sources_non_forked/vim-go/gosnippets/snippets/go.snip b/sources_non_forked/vim-go/gosnippets/snippets/go.snip
    index c24d2750..413eb1e1 100644
    --- a/sources_non_forked/vim-go/gosnippets/snippets/go.snip
    +++ b/sources_non_forked/vim-go/gosnippets/snippets/go.snip
    @@ -149,6 +149,14 @@ abbr if err != nil { return }
     	}
     	${0}
     
    +# error snippet with panic
    +snippet errp
    +abbr if err != nil { ... }
    +	if err != nil {
    +		panic(${1})
    +	}
    +	${0}
    +
     # json snippet
     snippet json
     abbr \`json:key\`
    diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim
    index 2c47ef18..3ba16d7e 100644
    --- a/sources_non_forked/vim-go/plugin/go.vim
    +++ b/sources_non_forked/vim-go/plugin/go.vim
    @@ -151,6 +151,11 @@ augroup vim-go
         autocmd CursorHold *.go nested call go#complete#Info(1)
       endif
     
    +  " GoSameId automatic update
    +  if get(g:, "go_auto_sameids", 0)
    +    autocmd CursorMoved *.go nested call go#guru#SameIds(-1)
    +  endif
    +
       " Echo the identifier information when completion is done. Useful to see
       " the signature of a function, etc...
       if exists('##CompleteDone')
    diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim
    index 9dcf0040..0ead7527 100644
    --- a/sources_non_forked/vim-go/syntax/go.vim
    +++ b/sources_non_forked/vim-go/syntax/go.vim
    @@ -286,19 +286,22 @@ if g:go_highlight_operators != 0
       syn match goOperator /:=\|||\|<-\|++\|--/
       " match ...
       syn match goOperator /\.\.\./
    +
    +  hi def link     goPointerOperator   Operator
     endif
     hi def link     goOperator          Operator
     
     " Functions;
     if g:go_highlight_functions != 0
       syn match goDeclaration       /\/ nextgroup=goReceiver,goFunction skipwhite skipnl
    -  syn match goReceiver /([^),]\+)/ contained nextgroup=goFunction contains=goReceiverType skipwhite skipnl
    -  syn match goReceiverType /\(\s\|*\)\w\+)/hs=s+1,he=e-1 contained
    -  syn match goFunction /\w\+/ contained
    +  syn match goReceiver          /(\(\w\|[ *]\)\+)/ contained nextgroup=goFunction contains=goReceiverVar skipwhite skipnl
    +  syn match goReceiverVar       /\w\+/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained
    +  syn match goPointerOperator   /\*/ nextgroup=goReceiverType contained skipwhite skipnl
    +  syn match goReceiverType      /\w\+/ contained
    +  syn match goFunction          /\w\+/ contained
     else
       syn keyword goDeclaration func
     endif
    -hi def link     goReceiverType      Type
     hi def link     goFunction          Function
     
     " Methods;
    @@ -320,6 +323,7 @@ if g:go_highlight_types != 0
       syn match goTypeDecl             /\/ nextgroup=goTypeName skipwhite skipnl
       syn match goTypeName             /\w\+/ contained nextgroup=goDeclType skipwhite skipnl
       syn match goDeclType             /\/ contained skipwhite skipnl
    +  hi def link     goReceiverType      Type
     else
       syn keyword goDeclType           struct interface
       syn keyword goDeclaration        type
    @@ -362,6 +366,7 @@ if g:go_highlight_build_constraints != 0
       hi def link goPackageComment    Comment
     endif
     
    +hi def link goSameId IncSearch
     
     " Search backwards for a global declaration to start processing the syntax.
     "syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/
    diff --git a/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets b/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets
    index 0720cbfc..add9f7f9 100644
    --- a/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets
    +++ b/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets
    @@ -1,5 +1,27 @@
     priority -50
     
    +global !p
    +def create_table(snip):
    +    # retrieving single line from current string and treat it like tabstops count
    +    placeholders_string = snip.buffer[snip.line].strip().split("x",1)
    +    rows_amount = int(placeholders_string[0])
    +    columns_amount = int(placeholders_string[1])
    +
    +    # erase current line
    +    snip.buffer[snip.line] = ''
    +
    +    # create anonymous snippet with expected content and number of tabstops
    +    anon_snippet_title = ' | '.join(['$' + str(col) for col in range(1,columns_amount+1)]) + "\n"
    +    anon_snippet_delimiter = ':-|' * (columns_amount-1) + ":-\n"
    +    anon_snippet_body = ""
    +    for row in range(1,rows_amount+1):
    +        anon_snippet_body += ' | '.join(['$' + str(row*columns_amount+col) for col in range(1,columns_amount+1)]) + "\n"
    +    anon_snippet_table = anon_snippet_title + anon_snippet_delimiter + anon_snippet_body
    +
    +    # expand anonymous snippet
    +    snip.expand_anon(anon_snippet_table)
    +endglobal
    +
     ###########################
     # Sections and Paragraphs #
     ###########################
    @@ -50,4 +72,21 @@ $1
     $0
     endsnippet
     
    +snippet refl "Reference Link"
    +[${1:${VISUAL:Text}}][${2:id}]$0
    +
    +[$2]:${4:http://${3:www.url.com}} "${5:$4}"
    +endsnippet
    +
    +snippet fnt "Footnote"
    +[^${1:${VISUAL:Footnote}}]$0
    +
    +[^$1]:${2:Text}
    +endsnippet
    +
    +post_jump "create_table(snip)"
    +snippet "tb(\d+x\d+)" "Customizable table" br
    +`!p snip.rv = match.group(1)`
    +endsnippet
    +
     # vim:ft=snippets:
    diff --git a/sources_non_forked/vim-snippets/UltiSnips/php.snippets b/sources_non_forked/vim-snippets/UltiSnips/php.snippets
    index 7ba51c75..c7344a59 100644
    --- a/sources_non_forked/vim-snippets/UltiSnips/php.snippets
    +++ b/sources_non_forked/vim-snippets/UltiSnips/php.snippets
    @@ -1,5 +1,14 @@
     priority -50
     
    +global !p
    +import vim
    +
    +# Set g:ultisnips_php_scalar_types to 1 if you'd like to enable PHP 7's scalar types for return values
    +def isPHPScalarTypesEnabled():
    +	isEnabled = vim.eval("get(g:, 'ultisnips_php_scalar_types', 0)") == "1"
    +	return isEnabled or re.match('<\?php\s+declare\(strict_types=[01]\);', '\n'.join(vim.current.window.buffer))
    +endglobal
    +
     ## Snippets from SnipMate, taken from
     ## https://github.com/scrooloose/snipmate-snippets.git
     
    @@ -9,7 +18,7 @@ snippet gm "PHP Class Getter" b
      *
      * @return ${2:string}
      */
    -public function get${1/\w+\s*/\u$0/}()
    +public function get${1/\w+\s*/\u$0/}()`!p snip.rv = ': '+t[2] if isPHPScalarTypesEnabled() else ''`
     {
         return $this->$1;
     }
    @@ -36,7 +45,7 @@ snippet gs "PHP Class Getter Setter" b
      *
      * @return ${2:string}
      */
    -public function get${1/\w+\s*/\u$0/}()
    +public function get${1/\w+\s*/\u$0/}()`!p snip.rv = ': '+t[2] if isPHPScalarTypesEnabled() else ''`
     {
         return $this->$1;
     }
    diff --git a/sources_non_forked/vim-snippets/snippets/php.snippets b/sources_non_forked/vim-snippets/snippets/php.snippets
    index 4faa1673..06448590 100644
    --- a/sources_non_forked/vim-snippets/snippets/php.snippets
    +++ b/sources_non_forked/vim-snippets/snippets/php.snippets
    @@ -2,6 +2,8 @@ snippet 
    Date: Tue, 2 Aug 2016 14:48:32 +0200
    Subject: [PATCH 177/254] Updated plugins
    
    ---
     .../ctrlp.vim/autoload/ctrlp.vim              | 119 ++-
     sources_non_forked/ctrlp.vim/doc/ctrlp.txt    |   9 +-
     sources_non_forked/ctrlp.vim/plugin/ctrlp.vim |  24 +-
     sources_non_forked/syntastic/README.markdown  |  88 +-
     .../syntastic/doc/syntastic-checkers.txt      | 148 +--
     .../syntastic/plugin/syntastic.vim            |   2 +-
     .../syntastic/plugin/syntastic/registry.vim   |   3 +-
     .../syntastic/syntax_checkers/asl/iasl.vim    |  59 ++
     .../syntastic/syntax_checkers/c/avrgcc.vim    |   6 +-
     .../syntastic/syntax_checkers/cpp/avrgcc.vim  |  24 +
     .../syntax_checkers/typescript/tsc.vim        |  66 --
     sources_non_forked/vim-flake8/README.mdown    |   2 +-
     sources_non_forked/vim-go/CHANGELOG.md        |  39 +-
     sources_non_forked/vim-go/README.md           |  24 +-
     .../vim-go/autoload/go/asmfmt.vim             |  15 +
     sources_non_forked/vim-go/autoload/go/cmd.vim |   3 +
     .../vim-go/autoload/go/complete.vim           |  12 +
     .../vim-go/autoload/go/coverage.vim           |  11 +-
     sources_non_forked/vim-go/autoload/go/def.vim |  78 +-
     sources_non_forked/vim-go/autoload/go/fmt.vim |  22 +-
     .../vim-go/autoload/go/guru.vim               | 101 +-
     .../vim-go/autoload/go/impl.vim               |   6 +-
     .../vim-go/autoload/go/lint.vim               |  11 +
     .../vim-go/autoload/go/package.vim            |   2 +-
     .../vim-go/autoload/go/template.vim           |  17 +-
     .../vim-go/autoload/go/tool.vim               |   2 +-
     .../vim-go/autoload/go/util.vim               |  79 +-
     sources_non_forked/vim-go/doc/vim-go.txt      | 860 ++++++++++--------
     .../vim-go/ftplugin/go/commands.vim           |  16 +
     .../vim-go/ftplugin/go/mappings.vim           |   2 +
     .../vim-go/gosnippets/UltiSnips/go.snippets   |   5 +
     .../vim-go/gosnippets/snippets/go.snip        |   5 +
     sources_non_forked/vim-go/plugin/go.vim       |  79 +-
     sources_non_forked/vim-go/syntax/go.vim       |  18 +-
     .../vim-snippets/UltiSnips/html.snippets      |  56 +-
     .../vim-snippets/snippets/elixir.snippets     |   6 +-
     .../vim-snippets/snippets/go.snippets         |   3 +
     .../snippets/javascript/javascript.snippets   |   5 +
     .../vim-snippets/snippets/vhdl.snippets       | 127 +++
     39 files changed, 1372 insertions(+), 782 deletions(-)
     create mode 100644 sources_non_forked/syntastic/syntax_checkers/asl/iasl.vim
     create mode 100644 sources_non_forked/syntastic/syntax_checkers/cpp/avrgcc.vim
     delete mode 100644 sources_non_forked/syntastic/syntax_checkers/typescript/tsc.vim
     create mode 100644 sources_non_forked/vim-snippets/snippets/vhdl.snippets
    
    diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim
    index fef2544f..b0146a36 100644
    --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim
    +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim
    @@ -97,6 +97,7 @@ let [s:pref, s:bpref, s:opts, s:new_opts, s:lc_opts] =
     	\ 'compare_lim':           ['s:compare_lim', 3000],
     	\ 'bufname_mod':           ['s:bufname_mod', ':t'],
     	\ 'bufpath_mod':           ['s:bufpath_mod', ':~:.:h'],
    +	\ 'formatline_func':       ['s:flfunc', 's:formatline(v:val)'],
     	\ }, {
     	\ 'open_multiple_files':   's:opmul',
     	\ 'regexp':                's:regexp',
    @@ -203,11 +204,11 @@ let s:hlgrps = {
     	\ }
     
     " lname, sname of the basic(non-extension) modes
    -let s:coretypes = [
    +let s:coretypes = filter([
     	\ ['files', 'fil'],
     	\ ['buffers', 'buf'],
     	\ ['mru files', 'mru'],
    -\ ]
    +\ ], 'index(g:ctrlp_types, v:val[1])!=-1')
     
     " Get the options {{{2
     fu! s:opts(...)
    @@ -439,9 +440,9 @@ fu! s:UserCmd(lscmd)
     	en
     	if has('patch-7.4-597') && !(has('win32') || has('win64'))
     		let g:ctrlp_allfiles = systemlist(printf(lscmd, path))
    -	else
    +	el
     		let g:ctrlp_allfiles = split(system(printf(lscmd, path)), "\n")
    -	end
    +	en
     	if exists('+ssl') && exists('ssl')
     		let &ssl = ssl
     		cal map(g:ctrlp_allfiles, 'tr(v:val, "\\", "/")')
    @@ -624,7 +625,7 @@ fu! s:Render(lines, pat)
     	en
     	if s:mw_order == 'btt' | cal reverse(lines) | en
     	let s:lines = copy(lines)
    -	cal map(lines, 's:formatline(v:val)')
    +	cal map(lines, s:flfunc)
     	cal setline(1, s:offset(lines, height))
     	cal s:unmarksigns()
     	cal s:remarksigns()
    @@ -719,7 +720,7 @@ fu! s:PrtBS()
     	if empty(s:prompt[0]) && s:brfprt != 0
     		cal s:PrtExit()
     		retu
    -	endif
    +	en
     	unl! s:hstgot
     	let [s:prompt[0], s:matches] = [substitute(s:prompt[0], '.$', '', ''), 1]
     	cal s:BuildPrompt(1)
    @@ -877,12 +878,13 @@ fu! s:PrtFocusMap(char)
     endf
     
     fu! s:PrtClearCache()
    -	if s:itemtype == 0
    +	let ct = s:curtype()
    +	if ct == 'fil'
     		cal ctrlp#clr()
    -	elsei s:itemtype > 2
    +	elsei s:itemtype >= len(s:coretypes)
     		cal ctrlp#clr(s:statypes[s:itemtype][1])
     	en
    -	if s:itemtype == 2
    +	if ct == 'mru'
     		let g:ctrlp_lines = ctrlp#mrufiles#refresh()
     	el
     		cal ctrlp#setlines()
    @@ -893,9 +895,10 @@ fu! s:PrtClearCache()
     endf
     
     fu! s:PrtDeleteEnt()
    -	if s:itemtype == 2
    +	let ct = s:curtype()
    +	if ct == 'mru'
     		cal s:PrtDeleteMRU()
    -	elsei s:itemtype == 1
    +	elsei ct == 'buf'
     		cal s:delbuf()
     	elsei type(s:getextvar('wipe')) == 1
     		cal s:delent(s:getextvar('wipe'))
    @@ -903,7 +906,7 @@ fu! s:PrtDeleteEnt()
     endf
     
     fu! s:PrtDeleteMRU()
    -	if s:itemtype == 2
    +	if s:curtype() == 'mru'
     		cal s:delent('ctrlp#mrufiles#remove')
     	en
     endf
    @@ -1011,7 +1014,7 @@ fu! s:ToggleByFname()
     endf
     
     fu! s:ToggleType(dir)
    -	let max = len(g:ctrlp_ext_vars) + 2
    +	let max = len(g:ctrlp_ext_vars) + len(s:coretypes) - 1
     	let next = s:walker(max, s:itemtype, a:dir)
     	cal ctrlp#setlines(next)
     	cal ctrlp#syntax()
    @@ -1151,7 +1154,7 @@ fu! s:AcceptSelection(action)
     	if subm | if s:SpecInputs(str) | retu | en | en
     	" Get the selected line
     	let line = ctrlp#getcline()
    -	if !subm && !s:itemtype && line == '' && line('.') > s:offset
    +	if !subm && s:curtype() != 'fil' && line == '' && line('.') > s:offset
     		\ && str !~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*|/|\\|\?|\@.+)$'
     		cal s:CreateNewFile(md) | retu
     	en
    @@ -1161,7 +1164,7 @@ fu! s:AcceptSelection(action)
     		let actfunc = s:openfunc[s:ctype]
     		let type = has_key(s:openfunc, 'arg_type') ? s:openfunc['arg_type'] : 'list'
     	el
    -		if s:itemtype < 3
    +		if s:itemtype < len(s:coretypes)
     			let [actfunc, type] = ['ctrlp#acceptfile', 'dict']
     		el
     			let [actfunc, exttype] = [s:getextvar('accept'), s:getextvar('act_farg')]
    @@ -1206,15 +1209,16 @@ fu! s:CreateNewFile(...)
     endf
     " * OpenMulti() {{{1
     fu! s:MarkToOpen()
    +	let ct = s:curtype()
     	if s:bufnr <= 0 || s:opmul == '0'
    -		\ || ( s:itemtype > 2 && s:getextvar('opmul') != 1 )
    +		\ || ( s:itemtype >= len(s:coretypes) && s:getextvar('opmul') != 1 )
     		retu
     	en
     	let line = ctrlp#getcline()
     
     	" Do not allow to mark modified or current buffer
     	let bufnr = s:bufnrfilpath(line)[0]
    -	if (s:itemtype == 1 && s:delbufcond(bufnr))
    +	if (ct == 'buf' && s:delbufcond(bufnr))
     		retu
     	en
     
    @@ -1247,7 +1251,7 @@ endf
     fu! s:OpenMulti(...)
     	let has_marked = exists('s:marked')
     	if ( !has_marked && a:0 ) || s:opmul == '0' || !s:ispath
    -		\ || ( s:itemtype > 2 && s:getextvar('opmul') != 1 )
    +		\ || ( s:itemtype >= len(s:coretypes) && s:getextvar('opmul') != 1 )
     		retu -1
     	en
     	" Get the options
    @@ -1442,7 +1446,8 @@ fu! s:shortest(lens)
     endf
     
     fu! s:mixedsort(...)
    -	if s:itemtype == 1
    +	let ct = s:curtype()
    +	if ct == 'buf'
     		let pat = '[\/]\?\[\d\+\*No Name\]$'
     		if a:1 =~# pat && a:2 =~# pat | retu 0
     		elsei a:1 =~# pat | retu 1
    @@ -1453,10 +1458,10 @@ fu! s:mixedsort(...)
     		let ms = []
     		if s:res_count < 21
     			let ms += [s:compfnlen(a:1, a:2)]
    -			if s:itemtype !~ '^[12]$' | let ms += [s:comptime(a:1, a:2)] | en
    +			if ct !~ '^\(buf\|mru\)$' | let ms += [s:comptime(a:1, a:2)] | en
     			if !s:itemtype | let ms += [s:comparent(a:1, a:2)] | en
     		en
    -		if s:itemtype =~ '^[12]$'
    +		if ct =~ '^\(buf\|mru\)$'
     			let ms += [s:compmref(a:1, a:2)]
     			let cln = cml ? cln : 0
     		en
    @@ -1540,7 +1545,8 @@ endf
     " Line formatting {{{3
     fu! s:formatline(str)
     	let str = a:str
    -	if s:itemtype == 1
    +	let ct = s:curtype()
    +	if ct == 'buf'
     		let bufnr = s:bufnrfilpath(str)[0]
     		let parts = s:bufparts(bufnr)
     		let str = printf('%'.s:bufnr_width.'s', bufnr)
    @@ -1560,7 +1566,7 @@ fu! s:formatline(str)
     			en
     		en
     	en
    -	let cond = s:itemtype != 1 &&s:ispath && ( s:winw - 4 ) < s:strwidth(str)
    +	let cond = ct != 'buf' &&s:ispath && ( s:winw - 4 ) < s:strwidth(str)
     	retu s:lineprefix.( cond ? s:pathshorten(str) : str )
     endf
     
    @@ -1615,7 +1621,7 @@ fu! s:lash(...)
     endf
     
     fu! s:ispathitem()
    -	retu s:itemtype < 3 || ( s:itemtype > 2 && s:getextvar('type') == 'path' )
    +	retu s:itemtype < len(s:coretypes) || s:getextvar('type') == 'path'
     endf
     
     fu! ctrlp#igncwd(cwd)
    @@ -1649,11 +1655,11 @@ fu! ctrlp#dirnfile(entries)
     endf
     
     fu! s:usrign(item, type)
    -	if s:igntype == 1 | retu a:item =~ s:usrign | end
    +	if s:igntype == 1 | retu a:item =~ s:usrign | en
     	if s:igntype == 2
     		if call(s:usrign, [a:item, a:type])
     			retu 1
    -		end
    +		en
     	elsei s:igntype == 4
     		if has_key(s:usrign, a:type) && s:usrign[a:type] != ''
     					\ && a:item =~ s:usrign[a:type]
    @@ -1661,8 +1667,8 @@ fu! s:usrign(item, type)
     		elsei has_key(s:usrign, 'func') && s:usrign['func'] != ''
     					\ && call(s:usrign['func'], [a:item, a:type])
     			retu 1
    -		end
    -	end
    +		en
    +	en
     	retu 0
     endf
     
    @@ -1772,7 +1778,7 @@ fu! ctrlp#syntax()
     		exe "sy match CtrlPLinePre '^".escape(get(g:, 'ctrlp_line_prefix', '>'),'^$.*~\')."'"
     	en
     
    -	if s:itemtype == 1 && s:has_conceal
    +	if s:curtype() == 'buf' && s:has_conceal
     		sy region CtrlPBufferNr     matchgroup=CtrlPLinePre start='^>\s\+' end='\s'
     		sy region CtrlPBufferInd    concealends matchgroup=Ignore start='' end=''
     		sy region CtrlPBufferRegion concealends matchgroup=Ignore start='' end=''
    @@ -1810,7 +1816,7 @@ fu! s:highlight(pat, grp)
     			if s:byfname()
     				" Make sure there are no slashes in our match
     				let beginning = beginning.'\([^\/]*$\)\@='
    -			end
    +			en
     
     			for i in range(len(chars))
     				" Surround our current target letter with \zs and \ze so it only
    @@ -1822,14 +1828,14 @@ fu! s:highlight(pat, grp)
     				if i == 0
     					let charcopy[i] = '\zs'.charcopy[i].'\ze'
     					let middle = join(charcopy, '.\{-}')
    -				else
    +				el
     					let before = join(charcopy[0:i-1], '.\{-}')
     					let after = join(charcopy[i+1:-1], '.\{-}')
     					let c = charcopy[i]
     					" for abc, match either ab.\{-}c or a.*b.\{-}c in that order
     					let cpat = '\(\zs'.c.'\|'.'.*\zs'.c.'\)\ze.*'
     					let middle = before.cpat.after
    -				endif
    +				en
     
     				" Now we matchadd for each letter, the basic form being:
     				" ^.*\zsx\ze.*$, but with our pattern we built above for the letter,
    @@ -1956,7 +1962,7 @@ fu! s:isabs(path)
     endf
     
     fu! s:bufnrfilpath(line)
    -	if s:isabs(a:line) || a:line =~ '^\~[/\\]' || a:line =~ '^\w\+:\/\/'
    +  if s:isabs(a:line) || a:line =~ '^\~[/\\]'
     		let filpath = a:line
     	el
     		let filpath = s:dyncwd.s:lash().a:line
    @@ -2140,12 +2146,13 @@ fu! s:modevar()
     endf
     
     fu! s:nosort()
    -	retu s:matcher != {} || s:nolim == 1 || ( s:itemtype == 2 && s:mrudef )
    -		\ || ( s:itemtype =~ '\v^(1|2)$' && s:prompt == ['', '', ''] ) || !s:dosort
    +	let ct = s:curtype()
    +	retu s:matcher != {} || s:nolim == 1 || ( ct == 'mru' && s:mrudef )
    +		\ || ( ct =~ '^\(buf\|mru\)$' && s:prompt == ['', '', ''] ) || !s:dosort
     endf
     
     fu! s:byfname()
    -	retu s:itemtype != 1 && s:ispath && s:byfname
    +	retu s:curtype() != 'buf' && s:ispath && s:byfname
     endf
     
     fu! s:narrowable()
    @@ -2374,13 +2381,17 @@ fu! s:buildpat(lst)
     	retu pat
     endf
     
    +fu! s:curtype()
    +	return s:CurTypeName()[1]
    +endf
    +
     fu! s:mfunc()
     	let mfunc = 'match'
     	if s:byfname()
     		let mfunc = 's:matchfname'
    -	elsei s:itemtype == 1
    +	elsei s:curtype() == 'buf'
     		let mfunc = 's:matchbuf'
    -	elsei s:itemtype > 2
    +	elsei s:itemtype >= len(s:coretypes)
     		let matchtypes = { 'tabs': 's:matchtabs', 'tabe': 's:matchtabe' }
     		if has_key(matchtypes, s:matchtype)
     			let mfunc = matchtypes[s:matchtype]
    @@ -2439,7 +2450,7 @@ fu! s:insertcache(str)
     endf
     " Extensions {{{2
     fu! s:mtype()
    -	retu s:itemtype > 2 ? s:getextvar('type') : 'path'
    +	retu s:itemtype >= len(s:coretypes) ? s:getextvar('type') : 'path'
     endf
     
     fu! s:execextvar(key)
    @@ -2450,8 +2461,8 @@ fu! s:execextvar(key)
     endf
     
     fu! s:getextvar(key)
    -	if s:itemtype > 2
    -		let vars = g:ctrlp_ext_vars[s:itemtype - 3]
    +	if s:itemtype >= len(s:coretypes) && len(g:ctrlp_ext_vars) > 0
    +		let vars = g:ctrlp_ext_vars[s:itemtype - len(s:coretypes)]
     		retu has_key(vars, a:key) ? vars[a:key] : -1
     	en
     	retu get(g:, 'ctrlp_' . s:matchtype . '_' . a:key, -1)
    @@ -2505,7 +2516,8 @@ endf
     fu! ctrlp#setlines(...)
     	if a:0 | let s:itemtype = a:1 | en
     	cal s:modevar()
    -	let types = ['ctrlp#files()', 'ctrlp#buffers()', 'ctrlp#mrufiles#list()']
    +	let inits = {'fil': 'ctrlp#files()', 'buf': 'ctrlp#buffers()', 'mru': 'ctrlp#mrufiles#list()'}
    +	let types = map(copy(g:ctrlp_types), 'inits[v:val]')
     	if !empty(g:ctrlp_ext_vars)
     		cal map(copy(g:ctrlp_ext_vars), 'add(types, v:val["init"])')
     	en
    @@ -2514,11 +2526,11 @@ endf
     
     " Returns [lname, sname]
     fu! s:CurTypeName()
    -	if s:itemtype < 3
    -		return s:coretypes[s:itemtype]
    -	else
    +	if s:itemtype < len(s:coretypes)
    +		return filter(copy(s:coretypes), 'v:val[1]==g:ctrlp_types[s:itemtype]')[0]
    +	el
     		return [s:getextvar("lname"), s:getextvar('sname')]
    -	endif
    +	en
     endfu
     
     fu! s:ExitIfSingleCandidate()
    @@ -2526,7 +2538,7 @@ fu! s:ExitIfSingleCandidate()
     		call s:AcceptSelection('e')
     		call ctrlp#exit()
     		return 1
    -	endif
    +	en
     	return 0
     endfu
     
    @@ -2539,14 +2551,23 @@ fu! ctrlp#init(type, ...)
     	cal s:SetWD(a:0 ? a:1 : {})
     	cal s:MapNorms()
     	cal s:MapSpecs()
    -	cal ctrlp#setlines(s:settype(a:type))
    +	if type(a:type) == 0
    +		let type = a:type
    +	el
    +		let type = index(g:ctrlp_types, a:type)
    +		if type == -1
    +			call ctrlp#exit()
    +			retu
    +		en
    +	en
    +	cal ctrlp#setlines(s:settype(type))
     	cal ctrlp#syntax()
     	cal s:SetDefTxt()
     	let curName = s:CurTypeName()
     	let shouldExitSingle = index(s:opensingle, curName[0])>=0 || index(s:opensingle, curName[1])>=0
     	if shouldExitSingle && s:ExitIfSingleCandidate()
     		return 0
    -	endif
    +	en
     	cal s:BuildPrompt(1)
     	if s:keyloop | cal s:KeyLoop() | en
     	return 1
    diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt
    index bd4fc095..4cc6017d 100644
    --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt
    +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt
    @@ -68,6 +68,7 @@ Overview:~
       |ctrlp_open_single_match|.....Automatically accept when only one candidate.
       |ctrlp_brief_prompt|..........Exit CtrlP on empty prompt by .
       |ctrlp_match_current_file|....Include current file in match entries.
    +  |ctrlp_types|.................Names of builtin types.
     
       MRU mode:
       |ctrlp_mruf_max|..............Max MRU entries to remember.
    @@ -454,13 +455,19 @@ This option works well together with |g:ctrlp_open_single_match|
     
     
                                                      *'g:ctrlp_match_current_file'*
    -Includes the current file in the match entries:
    +Includes the current file in the match entries: >
       let g:ctrlp_match_current_file = 1
     
     By default, the current file is excluded from the list.
     
     Note: does not apply when |g:ctrlp_match_func| is used. 
     
    +                                                              *'g:ctrlp_types'*
    +Set this to list of names to customize core types: >
    +  let g:ctrlp_types = ['mru', 'fil']
    +
    +By default, the types are: >
    +  let g:ctrlp_types = ['fil', 'buf', 'mru'].
     
                                                                  *'g:ctrlp_abbrev'*
     Define input abbreviations that can be expanded (either internally or visibly)
    diff --git a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim
    index 5f5303f1..9f2bb147 100644
    --- a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim
    +++ b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim
    @@ -10,17 +10,23 @@ if ( exists('g:loaded_ctrlp') && g:loaded_ctrlp ) || v:version < 700 || &cp
     en
     let g:loaded_ctrlp = 1
     
    +let s:types = ['fil', 'buf', 'mru']
    +if !exists('g:ctrlp_types')
    +	let g:ctrlp_types = s:types
    +el
    +	call filter(g:ctrlp_types, "index(['fil', 'buf', 'mru'], v:val)!=-1")
    +en
     let [g:ctrlp_lines, g:ctrlp_allfiles, g:ctrlp_alltags, g:ctrlp_alldirs,
     	\ g:ctrlp_allmixes, g:ctrlp_buftags, g:ctrlp_ext_vars, g:ctrlp_builtins]
    -	\ = [[], [], [], [], {}, {}, [], 2]
    +	\ = [[], [], [], [], {}, {}, [], len(g:ctrlp_types)-1]
     
     if !exists('g:ctrlp_map') | let g:ctrlp_map = '' | en
     if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en
     
    -com! -n=? -com=dir CtrlP         cal ctrlp#init(0, { 'dir':  })
    -com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init(2, { 'dir':  })
    +com! -n=? -com=dir CtrlP         cal ctrlp#init('fil', { 'dir':  })
    +com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init('mru', { 'dir':  })
     
    -com! -bar CtrlPBuffer   cal ctrlp#init(1)
    +com! -bar CtrlPBuffer   cal ctrlp#init('buf')
     com! -n=? CtrlPLastMode cal ctrlp#init(-1, { 'args':  })
     
     com! -bar CtrlPClearCache     cal ctrlp#clr()
    @@ -29,9 +35,9 @@ com! -bar CtrlPClearAllCaches cal ctrlp#clra()
     com! -bar ClearCtrlPCache     cal ctrlp#clr()
     com! -bar ClearAllCtrlPCaches cal ctrlp#clra()
     
    -com! -bar CtrlPCurWD   cal ctrlp#init(0, { 'mode': '' })
    -com! -bar CtrlPCurFile cal ctrlp#init(0, { 'mode': 'c' })
    -com! -bar CtrlPRoot    cal ctrlp#init(0, { 'mode': 'r' })
    +com! -bar CtrlPCurWD   cal ctrlp#init('fil', { 'mode': '' })
    +com! -bar CtrlPCurFile cal ctrlp#init('fil', { 'mode': 'c' })
    +com! -bar CtrlPRoot    cal ctrlp#init('fil', { 'mode': 'r' })
     
     exe 'nn  (ctrlp) :'.g:ctrlp_cmd.''
     
    @@ -55,10 +61,10 @@ com! -bar CtrlPRTS       cal ctrlp#init(ctrlp#rtscript#id())
     com! -bar CtrlPUndo      cal ctrlp#init(ctrlp#undo#id())
     
     com! -n=? -com=buffer CtrlPLine
    -	\ cal ctrlp#init(ctrlp#line#cmd(1, ))
    +	\ cal ctrlp#init(ctrlp#line#cmd('buf', ))
     
     com! -n=? -com=buffer CtrlPChange
    -	\ cal ctrlp#init(ctrlp#changes#cmd(0, ))
    +	\ cal ctrlp#init(ctrlp#changes#cmd('fil', ))
     
     com! -bar CtrlPChangeAll   cal ctrlp#init(ctrlp#changes#cmd(1))
     com! -bar CtrlPMixed       cal ctrlp#init(ctrlp#mixed#id())
    diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown
    index 7e493df2..19e986ef 100644
    --- a/sources_non_forked/syntastic/README.markdown
    +++ b/sources_non_forked/syntastic/README.markdown
    @@ -30,16 +30,17 @@
     4.4. [Are there any local checkers for HTML5 that I can use with syntastic?](#faqhtml5)  
     4.5. [The `perl` checker has stopped working...](#faqperl)  
     4.6. [What happened to the `rustc` checker?](#faqrust)  
    -4.7. [What happened to the `xcrun` checker?](#faqxcrun)  
    -4.8. [I run a checker and the location list is not updated...](#faqloclist)  
    -4.8. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist)  
    -4.9. [How can I pass additional arguments to a checker?](#faqargs)  
    -4.10. [Syntastic supports several checkers for my filetype - how do I tell which one(s) to use?](#faqcheckers)  
    -4.11. [What is the difference between syntax checkers and style checkers?](#faqstyle)  
    -4.12. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate)  
    -4.13. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext)  
    -4.14. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig)  
    -4.15. [The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?](#faqbdelete)  
    +4.7. [What happened to the `tsc` checker?](#faqtsc)  
    +4.8. [What happened to the `xcrun` checker?](#faqxcrun)  
    +4.9. [I run a checker and the location list is not updated...](#faqloclist)  
    +4.9. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist)  
    +4.10. [How can I pass additional arguments to a checker?](#faqargs)  
    +4.11. [Syntastic supports several checkers for my filetype - how do I tell which one(s) to use?](#faqcheckers)  
    +4.12. [What is the difference between syntax checkers and style checkers?](#faqstyle)  
    +4.13. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate)  
    +4.14. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext)  
    +4.15. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig)  
    +4.16. [The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?](#faqbdelete)  
     5. [Resources](#otherresources)  
     
     - - -
    @@ -54,26 +55,26 @@ can be done on demand, or automatically as files are saved. If syntax errors
     are detected, the user is notified and is happy because they didn't have to
     compile their code or execute their script to find them.
     
    -At the time of this writing, syntastic has checking plugins for ActionScript,
    -Ada, Ansible configurations, API Blueprint, AppleScript, AsciiDoc, Assembly
    -languages, BEMHTML, Bro, Bourne shell, C, C++, C#, Cabal, Chef, CoffeeScript,
    -Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dockerfile, Dust, Elixir,
    -Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go, Haml, Haskell, Haxe,
    -Handlebars, HSS, HTML, Java, JavaScript, JSON, JSX, LESS, Lex, Limbo, LISP,
    -LLVM intermediate language, Lua, Markdown, MATLAB, Mercury, NASM, Nix,
    -Objective-C, Objective-C++, OCaml, Perl, Perl POD, PHP, gettext Portable
    -Object, OS X and iOS property lists, Pug (formerly Jade), Puppet, Python,
    -QML, R, Racket, RDF TriG, RDF Turtle, Relax NG, reStructuredText, RPM spec,
    -Ruby, SASS/SCSS, Scala, Slim, SML, Sphinx, SQL, Stylus, Tcl, TeX, Texinfo,
    -Twig, TypeScript, Vala, Verilog, VHDL, VimL, xHtml, XML, XSLT, XQuery,
    -YACC, YAML, YANG data models, z80, Zope page templates, and Zsh. See the
    -[manual][checkers] for details about the corresponding supported checkers
    -(`:help syntastic-checkers` in Vim).
    +At the time of this writing, syntastic has checking plugins for ACPI
    +Source Language, ActionScript, Ada, Ansible configurations, API Blueprint,
    +AppleScript, AsciiDoc, Assembly languages, BEMHTML, Bro, Bourne shell, C,
    +C++, C#, Cabal, Chef, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart,
    +DocBook, Dockerfile, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata,
    +GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON,
    +JSX, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown,
    +MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl
    +POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug (formerly
    +Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax NG,
    +reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Sphinx, SQL,
    +Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, VimL, xHtml,
    +XML, XSLT, XQuery, YACC, YAML, YANG data models, z80, Zope page templates, and
    +Zsh. See the [manual][checkers] for details about the corresponding supported
    +checkers (`:help syntastic-checkers` in Vim).
     
    -A number of third-party Vim plugins also provide checkers for syntastic,
    -for example: [merlin][merlin], [omnisharp-vim][omnisharp], [rust.vim][rust],
    -[syntastic-extras][myint], [syntastic-more][roktas], [vim-crystal][crystal],
    -[vim-eastwood][eastwood], and [vim-swift][swift].
    +A number of third-party Vim plugins also provide checkers for syntastic, for
    +example: [merlin][merlin], [omnisharp-vim][omnisharp], [rust.vim][rust],
    +[syntastic-extras][myint], [syntastic-more][roktas], [tsuquyomi][tsuquyomi],
    +[vim-crystal][crystal], [vim-eastwood][eastwood], and [vim-swift][swift].
     
     Below is a screenshot showing the methods that Syntastic uses to display syntax
     errors. Note that, in practise, you will only have a subset of these methods
    @@ -303,9 +304,17 @@ __4.6. Q. What happened to the `rustc` checker?__
     A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the
     checker should be picked up automatically by syntastic.
     
    +
    +
    +__4.7. Q. What happened to the `tsc` checker?__
    +
    +A. It didn't meet people's expectations and it has been removed. Please
    +consider using the external checker [tsuquyomi][tsuquyomi] instead. If you
    +install this plugin the checker should be picked up automatically by syntastic.
    +
     
     
    -__4.7. Q. What happened to the `xcrun` checker?__
    +__4.8. Q. What happened to the `xcrun` checker?__
     
     A. The `xcrun` checker used to have a security problem and it has been removed.
     A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you
    @@ -313,8 +322,8 @@ install this plugin the checker should be picked up automatically by syntastic.
     
     
     
    -__4.8. Q. I run a checker and the location list is not updated...__  
    -__4.8. Q. I run`:lopen` or `:lwindow` and the error window is empty...__
    +__4.9. Q. I run a checker and the location list is not updated...__  
    +__4.9. Q. I run`:lopen` or `:lwindow` and the error window is empty...__
     
     A. By default the location list is changed only when you run the `:Errors`
     command, in order to minimise conflicts with other plugins. If you want the
    @@ -326,7 +335,7 @@ let g:syntastic_always_populate_loc_list = 1
     
     
     
    -__4.9. Q. How can I pass additional arguments to a checker?__
    +__4.10. Q. How can I pass additional arguments to a checker?__
     
     A. Almost all syntax checkers use the `makeprgBuild()` function. Those checkers
     that do can be configured using global variables. The general form of the
    @@ -342,7 +351,7 @@ See `:help syntastic-checker-options` for more information.
     
     
     
    -__4.10. Q. Syntastic supports several checkers for my filetype - how do I tell it
    +__4.11. Q. Syntastic supports several checkers for my filetype - how do I tell it
     which one(s) to use?__
     
     A. Stick a line like this in your `vimrc`:
    @@ -383,7 +392,7 @@ filetype of the current file is `php`).
     
     
     
    -__4.11. Q. What is the difference between syntax checkers and style checkers?__
    +__4.12. Q. What is the difference between syntax checkers and style checkers?__
     
     A. The errors and warnings they produce are highlighted differently and can
     be filtered by different rules, but otherwise the distinction is pretty much
    @@ -413,7 +422,7 @@ See `:help syntastic_quiet_messages` for details.
     
     
     
    -__4.12. Q. I have enabled multiple checkers for the current filetype. How can I
    +__4.13. Q. I have enabled multiple checkers for the current filetype. How can I
     display all errors from all checkers together?__
     
     A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`:
    @@ -425,7 +434,7 @@ See `:help syntastic-aggregating-errors` for more details.
     
     
     
    -__4.13. Q. How can I jump between the different errors without using the location
    +__4.14. Q. How can I jump between the different errors without using the location
     list at the bottom of the window?__
     
     A. Vim provides several built-in commands for this. See `:help :lnext` and
    @@ -437,7 +446,7 @@ mappings (among other things).
     
     
     
    -__4.14. My favourite checker needs to load a configuration file from the
    +__4.15. My favourite checker needs to load a configuration file from the
     project's root rather than the current directory...__
     
     A. You can set up an `autocmd` to search for the configuration file in the
    @@ -456,7 +465,7 @@ autocmd FileType javascript let b:syntastic_javascript_jscs_args =
     ```
     
     
    -__4.15. Q. The error window is closed automatically when I :quit the current buffer
    +__4.16. Q. The error window is closed automatically when I :quit the current buffer
     but not when I :bdelete it?__
     
     A. There is no safe way to handle that situation automatically, but you can
    @@ -510,6 +519,7 @@ a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [v
     [swift]:            https://github.com/kballard/vim-swift
     [tidy]:             http://www.htacg.org/tidy-html5/
     [tidy_old]:         http://tidy.sourceforge.net/
    +[tsuquyomi]:        https://github.com/Quramy/tsuquyomi/
     [unimpaired]:       https://github.com/tpope/vim-unimpaired
     [vam]:              https://github.com/MarcWeber/vim-addon-manager
     [vim]:              http://www.vim.org/
    diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt
    index 47948490..19974054 100644
    --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt
    +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt
    @@ -6,6 +6,7 @@ SYNTAX CHECKERS BY LANGUAGE                          *syntastic-checkers-lang*
     
     |syntastic| comes with checkers for the following languages:
     
    +    ACPI Source Language.....................|syntastic-checkers-asl|
         ActionScript.............................|syntastic-checkers-actionscript|
         Ada......................................|syntastic-checkers-ada|
         Ansible..................................|syntastic-checkers-ansible|
    @@ -132,6 +133,37 @@ SYNTAX CHECKERS BY LANGUAGE                          *syntastic-checkers-lang*
     
     Third-party checkers are available for additional languages.
     
    +==============================================================================
    +SYNTAX CHECKERS FOR ACPI SOURCE LANGUAGE              *syntastic-checkers-asl*
    +
    +The following checkers are available for the ACPI Source Language (filetype
    +"asl"):
    +
    +    1. iasl.....................|syntastic-asl-iasl|
    +
    +------------------------------------------------------------------------------
    +1. iasl                                                   *syntastic-asl-iasl*
    +
    +Name:        iasl
    +Maintainer:  Peter Wu 
    +
    +"iasl" is a compiler/decompiler for ACPI Source Language (ASL) and ACPI
    +Machine Language (AML). See the project's page for details:
    +
    +    https://acpica.org/
    +
    +Checker options~
    +
    +This checker is initialised using the "makeprgBuild()" function and thus it
    +accepts the standard options described at |syntastic-config-makeprg|.
    +
    +Note~
    +
    +You probably also need a plugin to set |filetype| for ASL files, such as
    +"vim-acpi-asl":
    +
    +    https://github.com/martinlroth/vim-acpi-asl
    +
     ==============================================================================
     SYNTAX CHECKERS FOR ACTIONSCRIPT             *syntastic-checkers-actionscript*
     
    @@ -344,7 +376,7 @@ accepts the standard options described at |syntastic-config-makeprg|.
     ==============================================================================
     SYNTAX CHECKERS FOR ASSEMBLY LANGUAGES                *syntastic-checkers-asm*
     
    -The following checkers are available for asembly languages (filetype "asm"):
    +The following checkers are available for assembly languages (filetype "asm"):
     
         1. GCC......................|syntastic-asm-gcc|
     
    @@ -432,7 +464,7 @@ The following checkers are available for BEMHTML (filetype "bemhtml"):
     Name:        bemhtmllint
     Maintainer:  Sergej Tatarincev
     
    -BEMHTML is a template engine intended for using with BEM methodology
    +BEMHTML is a template engine intended for using with the BEM methodology
     (http://bem.info/method/). See the project's page at GitHub for details:
     
         https://github.com/SevInf/bemhtml-lint
    @@ -492,9 +524,9 @@ Checker options~
     This checker is initialised using the "makeprgBuild()" function and thus it
     accepts the standard options described at |syntastic-config-makeprg|.
     
    -Aditionally:
    +Additionally:
     
    -                                              *g:syntastic_avrgcc_config_file*
    +                                            *'g:syntastic_avrgcc_config_file'*
     Type: string
     Default: ".syntastic_avrgcc_config"
     File containing compilation flags (such as defines or include directories),
    @@ -895,17 +927,39 @@ SYNTAX CHECKERS FOR C++                               *syntastic-checkers-cpp*
     
     The following checkers are available for C++ (filetype "cpp"):
     
    -    1. ClangCheck...............|syntastic-cpp-clang_check|
    -    2. Clang-Tidy...............|syntastic-cpp-clang_tidy|
    -    3. Cppcheck.................|syntastic-cpp-cppcheck|
    -    4. Cpplint..................|syntastic-cpp-cpplint|
    -    5. GCC......................|syntastic-cpp-gcc|
    -    6. OClint...................|syntastic-cpp-oclint|
    -    7. PC-Lint..................|syntastic-cpp-pc_lint|
    -    8. Vera++...................|syntastic-cpp-verapp|
    +    1. AVR-GCC..................|syntastic-cpp-avrgcc|
    +    2. ClangCheck...............|syntastic-cpp-clang_check|
    +    3. Clang-Tidy...............|syntastic-cpp-clang_tidy|
    +    4. Cppcheck.................|syntastic-cpp-cppcheck|
    +    5. Cpplint..................|syntastic-cpp-cpplint|
    +    6. GCC......................|syntastic-cpp-gcc|
    +    7. OClint...................|syntastic-cpp-oclint|
    +    8. PC-Lint..................|syntastic-cpp-pc_lint|
    +    9. Vera++...................|syntastic-cpp-verapp|
     
     ------------------------------------------------------------------------------
    -1. ClangCheck                                      *syntastic-cpp-clang_check*
    +1. AVR-GCC                                              *syntastic-cpp-avrgcc*
    +
    +Name:        avrgcc
    +Maintainer:  SÅ‚awek Piotrowski 
    +
    +Checker options~
    +
    +This checker is initialised using the "makeprgBuild()" function and thus it
    +accepts the standard options described at |syntastic-config-makeprg|.
    +
    +Additionally:
    +
    +                                            'g:syntastic_avrgcc_config_file'
    +Type: string
    +Default: ".syntastic_avrgcc_config"
    +File containing compilation flags (such as defines or include directories),
    +one option per line (cf. |syntastic-config-files|).
    +
    +See also: |syntastic-c-avrgcc|.
    +
    +------------------------------------------------------------------------------
    +2. ClangCheck                                      *syntastic-cpp-clang_check*
     
     Name:        clang_check
     Maintainer:  Benjamin Bannier 
    @@ -948,7 +1002,7 @@ then ignored.
     See also: |syntastic-c-clang_check|.
     
     ------------------------------------------------------------------------------
    -2. Clang-Tidy                                       *syntastic-cpp-clang_tidy*
    +3. Clang-Tidy                                       *syntastic-cpp-clang_tidy*
     
     Name:        clang_tidy
     Maintainer:  Benjamin Bannier 
    @@ -999,7 +1053,7 @@ then ignored.
     See also: |syntastic-c-clang_tidy|.
     
     ------------------------------------------------------------------------------
    -3. Cppcheck                                           *syntastic-cpp-cppcheck*
    +4. Cppcheck                                           *syntastic-cpp-cppcheck*
     
     Name:        cppcheck
     Maintainer:  LCD 47 
    @@ -1025,7 +1079,7 @@ one option per line (cf. |syntastic-config-files|).
     See also: |syntastic-c-cppcheck|.
     
     ------------------------------------------------------------------------------
    -4. Cpplint                                             *syntastic-cpp-cpplint*
    +5. Cpplint                                             *syntastic-cpp-cpplint*
     
     Name:        cpplint
     Maintainer:  LCD 47 
    @@ -1061,7 +1115,7 @@ However, if your "cpplint" was installed with "pip", the script's name is
         let g:syntastic_cpp_cpplint_exec = "cpplint"
     <
     ------------------------------------------------------------------------------
    -5. GCC                                                     *syntastic-cpp-gcc*
    +6. GCC                                                     *syntastic-cpp-gcc*
     
     Name:        gcc
     Maintainer:  Gregor Uhlenheuer 
    @@ -1158,7 +1212,7 @@ executable.
     See also: |syntastic-c-gcc|.
     
     ------------------------------------------------------------------------------
    -6. OClint                                               *syntastic-cpp-oclint*
    +7. OClint                                               *syntastic-cpp-oclint*
     
     Name:        oclint
     Maintainer:  "UnCO" Lin 
    @@ -1198,7 +1252,7 @@ Config files pointed to by 'g:syntastic_oclint_config_file' are then ignored.
     See also: |syntastic-c-oclint|.
     
     ------------------------------------------------------------------------------
    -7. PC-Lint                                             *syntastic-cpp-pc_lint*
    +8. PC-Lint                                             *syntastic-cpp-pc_lint*
     
     Name:        pc_lint
     Maintainer:  Steve Bragg 
    @@ -1225,7 +1279,7 @@ current directory and in parent directories; first such file found is used.
     See also: |syntastic-c-pc_lint|.
     
     ------------------------------------------------------------------------------
    -8. Vera++                                               *syntastic-cpp-verapp*
    +9. Vera++                                               *syntastic-cpp-verapp*
     
     Name:        verapp
     Maintainer:  Lucas Verney 
    @@ -1450,7 +1504,7 @@ The following checkers are available for Coq (filetype "coq"):
     Name:        coqtop
     Maintainer:  Matvey Aksenov 
     
    -"Coqtop" is the top level intrface for Coq. See the project's page for
    +"Coqtop" is the top level interface for Coq. See the project's page for
     details:
     
         http://coq.inria.fr/
    @@ -1989,8 +2043,8 @@ Name:        syntaxerl
     Maintainer:  locojay
     
     "SyntaxErl" is a syntax checker for Erlang. It uses "rebar"
    -(https://github.com/basho/rebar) to determine correct deps and libs paths.
    -See the project's page for more information:
    +(https://github.com/basho/rebar) to determine correct dependencies and library
    +paths. See the project's page for more information:
     
         https://github.com/ten0s/syntaxerl
     
    @@ -2191,7 +2245,7 @@ If the magic comment does not exist, then the dictionary
     'g:syntastic_glsl_extensions' is used to infer the appropriate profile from
     the current file's extension. If this dictionary does not exist either, a
     default dictionary is used instead. Finally, if the current file's extension
    -cannott be found in these dictionaries, the checker assumes a vertex shader
    +cannot be found in these dictionaries, the checker assumes a vertex shader
     profile.
     
                                                       *'g:syntastic_glsl_options'*
    @@ -2879,7 +2933,7 @@ point |'g:syntastic_java_checkstyle_classpath'| to it:
         http://iweb.dl.sourceforge.net/project/checkstyle/checkstyle/
         http://checkstyle.sourceforge.net/cmdline.html#Usage_by_Classpath_update
     
    -Current builds at Maven Central do not package "checkstyles" with its
    +Current builds at Maven Central do not package "checkstyle" with its
     dependencies:
     
         http://search.maven.org/#search|gav|1|g%3A%22com.puppycrawl.tools%22%20AND%20a%3A%22checkstyle%22
    @@ -4637,7 +4691,7 @@ Please note that transforming a file like this affects line numbers and
     column numbers, and syntastic has no way to make the necessary adjustments.
     Consequently, errors might appear on surprising lines if you enable this
     feature and the transformed file has code on different lines than the raw
    -file. For this reason the use of these transformations should be limitted
    +file. For this reason the use of these transformations should be limited
     to codecs that preserve line numbers, such as the "spec" codec provided by
     "NoseOfYeti":
     
    @@ -4741,7 +4795,7 @@ setting of "lint.style".
     Name:        lintr
     Maintainer:  Jim Hester 
     
    -"lintr" is a static code analysys tool for R files. See the project's page at
    +"lintr" is a static code analysis tool for R files. See the project's page at
     GitHub for details:
     
         https://github.com/jimhester/lintr
    @@ -4794,7 +4848,7 @@ This is a checker for R files, using the R package "svTools":
         http://cran.r-project.org/web/packages/svTools/
     
     In turn, this package delegates most of the work to the "checkUsage()"
    -function in the codetools package:
    +function in the "codetools" package:
     
         http://cran.r-project.org/web/packages/codetools/
     
    @@ -4851,7 +4905,7 @@ The following checkers are available for R Markdown (filetype "rmd"):
     Name:        lintr
     Maintainer:  Jim Hester 
     
    -"lintr" is a static code analysys tool for R files.  See the project's page at
    +"lintr" is a static code analysis tool for R files.  See the project's page at
     GitHub for details:
     
         https://github.com/jimhester/lintr
    @@ -5060,7 +5114,7 @@ directory, or if you want to override the autodetected paths, options
     |'g:syntastic_rst_sphinx_source_dir'| and |'g:syntastic_rst_sphinx_config_dir'|
     take precedence over the detected values.
     
    -Please not also that the checker creates output files in a temporary directory
    +Please note also that the checker creates output files in a temporary directory
     that is created upon the first run in the current session, and is removed when
     Vim exits. If you need to change the location of this directory you can do
     so by exporting the environment variables "TMPDIR" or "TMP" (on UNIX and Mac
    @@ -5081,7 +5135,7 @@ The following checkers are available for Linux RPM packages (filetype "spec"):
     Name:        rpmlint
     Maintainer:  LCD 47 
     
    -"rpmlint" is a trool for checking Linux RPM packages. See the project's page
    +"rpmlint" is a tool for checking Linux RPM packages. See the project's page
     for details:
     
         http://sourceforge.net/projects/rpmlint/
    @@ -5165,7 +5219,7 @@ Name:        macruby
     Maintainer:  Martin Grenfell 
     
     "MacRuby" is an implementation of Ruby for Mac OS X. See the project's
    -pagefor details:
    +page for details:
     
         http://www.macruby.org/
     
    @@ -5864,7 +5918,7 @@ The following checkers are available for Texinfo (filetype "texinfo"):
     Name:        makeinfo
     Maintainer:  LCD 47 
     
    -"Makeinfo" is a convertor for Texinfo files. It is distributed together with
    +"Makeinfo" is a converter for Texinfo files. It is distributed together with
     the GNU package "texinfo":
     
         http://www.gnu.org/software/texinfo/
    @@ -6087,8 +6141,7 @@ SYNTAX CHECKERS FOR TYPESCRIPT                 *syntastic-checkers-typescript*
     The following checkers are available for TypeScript (filetype "typescript"):
     
         1. ESLint...................|syntastic-typescript-eslint|
    -    2. tsc......................|syntastic-typescript-tsc|
    -    3. TSLint...................|syntastic-typescript-tslint|
    +    2. TSLint...................|syntastic-typescript-tslint|
     
     ------------------------------------------------------------------------------
     1. ESLint                                        *syntastic-typescript-eslint*
    @@ -6118,29 +6171,7 @@ as "typescript-vim":
     See also: |syntastic-html-eslint|, |syntastic-javascript-eslint|.
     
     ------------------------------------------------------------------------------
    -2. tsc                                              *syntastic-typescript-tsc*
    -
    -Name:        tsc
    -Maintainer:  Bill Casarin 
    -
    -"tsc" is a compiler for TypeScript. See the project's page for details:
    -
    -    http://www.typescriptlang.org/
    -
    -Checker options~
    -
    -This checker is initialised using the "makeprgBuild()" function and thus it
    -accepts the standard options described at |syntastic-config-makeprg|.
    -
    -Note~
    -
    -You probably also need a plugin to set |filetype| for TypeScript files, such
    -as "typescript-vim":
    -
    -    https://github.com/leafgarland/typescript-vim
    -
    -------------------------------------------------------------------------------
    -3. TSLint                                        *syntastic-typescript-tslint*
    +2. TSLint                                        *syntastic-typescript-tslint*
     
     Name:        tslint
     Maintainer:  Seon-Wook Park 
    @@ -6861,6 +6892,7 @@ syntastic-specific configuration files:
             OpenCOBOL (|syntastic-cobol-cobc|)
     
         C++~
    +        AVR-GCC (|syntastic-cpp-avrgcc|)
             ClangCheck (|syntastic-cpp-clang_check|)
             Clang-Tidy (|syntastic-cpp-clang_tidy|)
             Cppcheck (|syntastic-cpp-cppcheck|)
    diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim
    index 8076eebe..441490d5 100644
    --- a/sources_non_forked/syntastic/plugin/syntastic.vim
    +++ b/sources_non_forked/syntastic/plugin/syntastic.vim
    @@ -19,7 +19,7 @@ if has('reltime')
         lockvar! g:_SYNTASTIC_START
     endif
     
    -let g:_SYNTASTIC_VERSION = '3.7.0-162'
    +let g:_SYNTASTIC_VERSION = '3.7.0-177'
     lockvar g:_SYNTASTIC_VERSION
     
     " Sanity checks {{{1
    diff --git a/sources_non_forked/syntastic/plugin/syntastic/registry.vim b/sources_non_forked/syntastic/plugin/syntastic/registry.vim
    index 0c2d261f..8e78f112 100644
    --- a/sources_non_forked/syntastic/plugin/syntastic/registry.vim
    +++ b/sources_non_forked/syntastic/plugin/syntastic/registry.vim
    @@ -12,6 +12,7 @@ let s:_DEFAULT_CHECKERS = {
             \ 'apiblueprint':  ['drafter'],
             \ 'applescript':   ['osacompile'],
             \ 'asciidoc':      ['asciidoc'],
    +        \ 'asl':           ['iasl'],
             \ 'asm':           ['gcc'],
             \ 'bro':           ['bro'],
             \ 'bemhtml':       ['bemhtmllint'],
    @@ -93,7 +94,7 @@ let s:_DEFAULT_CHECKERS = {
             \ 'trig':          ['rapper'],
             \ 'turtle':        ['rapper'],
             \ 'twig':          ['twiglint'],
    -        \ 'typescript':    ['tsc'],
    +        \ 'typescript':    [],
             \ 'vala':          ['valac'],
             \ 'verilog':       ['verilator'],
             \ 'vhdl':          ['ghdl'],
    diff --git a/sources_non_forked/syntastic/syntax_checkers/asl/iasl.vim b/sources_non_forked/syntastic/syntax_checkers/asl/iasl.vim
    new file mode 100644
    index 00000000..0aae5d29
    --- /dev/null
    +++ b/sources_non_forked/syntastic/syntax_checkers/asl/iasl.vim
    @@ -0,0 +1,59 @@
    +"============================================================================
    +"File:        iasl.vim
    +"Description: Syntax checking plugin for syntastic using iasl
    +"Maintainer:  Peter Wu 
    +"License:     This program is free software. It comes without any warranty,
    +"             to the extent permitted by applicable law. You can redistribute
    +"             it and/or modify it under the terms of the Do What The Fuck You
    +"             Want To Public License, Version 2, as published by Sam Hocevar.
    +"             See http://sam.zoy.org/wtfpl/COPYING for more details.
    +"============================================================================
    +
    +if exists('g:loaded_syntastic_asl_iasl_checker')
    +    finish
    +endif
    +let g:loaded_syntastic_asl_iasl_checker = 1
    +
    +let s:save_cpo = &cpo
    +set cpo&vim
    +
    +function! SyntaxCheckers_asl_iasl_GetLocList() dict
    +    let tmpdir = syntastic#util#tmpdir() . syntastic#util#Slash()
    +    let makeprg = self.makeprgBuild({
    +        \ 'args': '-vi',
    +        \ 'args_after': ['-p', tmpdir] })
    +
    +    let errorformat =
    +        \ '%f(%l) : %trror    %n - %m,' .
    +        \ '%f(%l) : %tarning  %n - %m,' .
    +        \ '%f(%l) : %temark   %n - %m,' .
    +        \ '%f(%l) : %tptimize %n - %m,' .
    +        \ '%f(%l) : %m'
    +
    +    let loclist = SyntasticMake({
    +        \ 'makeprg': makeprg,
    +        \ 'errorformat': errorformat,
    +        \ 'returns': [0, 255] })
    +
    +    for e in loclist
    +        if e['type'] =~? 'r'
    +            let e['type'] = 'W'
    +        elseif e['type'] =~? 'o'
    +            let e['type'] = 'W'
    +            let e['subtype'] = 'Style'
    +        endif
    +    endfor
    +
    +    call syntastic#util#rmrf(tmpdir)
    +
    +    return loclist
    +endfunction
    +
    +call g:SyntasticRegistry.CreateAndRegisterChecker({
    +    \ 'filetype': 'asl',
    +    \ 'name': 'iasl'})
    +
    +let &cpo = s:save_cpo
    +unlet s:save_cpo
    +
    +" vim: set sw=4 sts=4 et fdm=marker:
    diff --git a/sources_non_forked/syntastic/syntax_checkers/c/avrgcc.vim b/sources_non_forked/syntastic/syntax_checkers/c/avrgcc.vim
    index 0fbb9840..a4124975 100644
    --- a/sources_non_forked/syntastic/syntax_checkers/c/avrgcc.vim
    +++ b/sources_non_forked/syntastic/syntax_checkers/c/avrgcc.vim
    @@ -1,6 +1,6 @@
     "============================================================================
     "File:        avrgcc.vim
    -"Description: Syntax checking plugin for syntastic.vim
    +"Description: Syntax checking plugin for syntastic
     "Maintainer:  Karel 
     "License:     This program is free software. It comes without any warranty,
     "             to the extent permitted by applicable law. You can redistribute
    @@ -22,10 +22,12 @@ endif
     let s:save_cpo = &cpo
     set cpo&vim
     
    +let s:opt_x = { 'c': 'c', 'cpp': 'c++' }
    +
     function! SyntaxCheckers_c_avrgcc_GetLocList() dict
         let makeprg = self.makeprgBuild({
             \ 'args_before': syntastic#c#ReadConfig(g:syntastic_avrgcc_config_file),
    -        \ 'args_after': '-x c -fsyntax-only' })
    +        \ 'args_after': '-x ' . get(s:opt_x, self.getFiletype(), '')  . ' -fsyntax-only' })
     
         let errorformat =
             \ '%-G%f:%s:,' .
    diff --git a/sources_non_forked/syntastic/syntax_checkers/cpp/avrgcc.vim b/sources_non_forked/syntastic/syntax_checkers/cpp/avrgcc.vim
    new file mode 100644
    index 00000000..cc48b74f
    --- /dev/null
    +++ b/sources_non_forked/syntastic/syntax_checkers/cpp/avrgcc.vim
    @@ -0,0 +1,24 @@
    +"============================================================================
    +"File:        avrgcc.vim
    +"Description: Syntax checking plugin for syntastic
    +"Maintainer:  SÅ‚awek Piotrowski 
    +"License:     This program is free software. It comes without any warranty,
    +"             to the extent permitted by applicable law. You can redistribute
    +"             it and/or modify it under the terms of the Do What The Fuck You
    +"             Want To Public License, Version 2, as published by Sam Hocevar.
    +"             See http://sam.zoy.org/wtfpl/COPYING for more details.
    +"
    +"============================================================================
    +
    +if exists('g:loaded_syntastic_cpp_avrgcc_checker')
    +    finish
    +endif
    +let g:loaded_syntastic_cpp_avrgcc_checker = 1
    +
    +call g:SyntasticRegistry.CreateAndRegisterChecker({
    +    \ 'filetype': 'cpp',
    +    \ 'name': 'avrgcc',
    +    \ 'exec': 'avr-g++',
    +    \ 'redirect': 'c/avrgcc'})
    +
    +" vim: set sw=4 sts=4 et fdm=marker:
    diff --git a/sources_non_forked/syntastic/syntax_checkers/typescript/tsc.vim b/sources_non_forked/syntastic/syntax_checkers/typescript/tsc.vim
    deleted file mode 100644
    index de9242e5..00000000
    --- a/sources_non_forked/syntastic/syntax_checkers/typescript/tsc.vim
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -"============================================================================
    -"File:        tsc.vim
    -"Description: TypeScript syntax checker
    -"Maintainer:  Bill Casarin 
    -"
    -"============================================================================
    -
    -if exists('g:loaded_syntastic_typescript_tsc_checker')
    -    finish
    -endif
    -let g:loaded_syntastic_typescript_tsc_checker = 1
    -
    -if !exists('g:syntastic_typescript_tsc_sort')
    -    let g:syntastic_typescript_tsc_sort = 1
    -endif
    -
    -let s:save_cpo = &cpo
    -set cpo&vim
    -
    -function! SyntaxCheckers_typescript_tsc_IsAvailable() dict
    -    if !executable(self.getExec())
    -        return 0
    -    endif
    -
    -    let version_output = split(syntastic#util#system(self.getExecEscaped() . ' --version'), '\n', 1)
    -    let ver = filter(copy(version_output), 'v:val =~# ''\m\= 0
    -endfunction
    -
    -function! SyntaxCheckers_typescript_tsc_GetLocList() dict
    -    let makeprg = self.makeprgBuild({
    -        \ 'args': '--module commonjs',
    -        \ 'args_after': (s:tsc_new ? '--noEmit' : '--out ' . syntastic#util#DevNull()) })
    -
    -    let errorformat =
    -        \ '%E%f %#(%l\,%c): error %m,' .
    -        \ '%E%f %#(%l\,%c): %m,' .
    -        \ '%Eerror %m,' .
    -        \ '%C%\s%\+%m'
    -
    -    return SyntasticMake({
    -        \ 'makeprg': makeprg,
    -        \ 'errorformat': errorformat,
    -        \ 'postprocess': ['guards'],
    -        \ 'defaults': {'bufnr': bufnr('')} })
    -endfunction
    -
    -call g:SyntasticRegistry.CreateAndRegisterChecker({
    -    \ 'filetype': 'typescript',
    -    \ 'name': 'tsc'})
    -
    -let &cpo = s:save_cpo
    -unlet s:save_cpo
    -
    -" vim: set sw=4 sts=4 et fdm=marker:
    diff --git a/sources_non_forked/vim-flake8/README.mdown b/sources_non_forked/vim-flake8/README.mdown
    index 692baadf..940eadf7 100644
    --- a/sources_non_forked/vim-flake8/README.mdown
    +++ b/sources_non_forked/vim-flake8/README.mdown
    @@ -41,7 +41,7 @@ the `` key if so.  For example, to remap it to `` instead, use:
     
     For flake8 configuration options please consult the following page:
     
    -https://flake8.readthedocs.org/en/latest/config.html
    +http://flake8.pycqa.org/en/latest/user/configuration.html
     
     To customize the location of your flake8 binary, set `g:flake8_cmd`:
     
    diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md
    index c332edfc..536b77dc 100644
    --- a/sources_non_forked/vim-go/CHANGELOG.md
    +++ b/sources_non_forked/vim-go/CHANGELOG.md
    @@ -1,17 +1,45 @@
    -## 1.8 (unplanned)
    +## Unplanned
    +
    +IMPROVEMENTS:
    +
    +* **guru** uses now the `-modified` flag, which allows us use guru on modified
    +  buffers as well. This affects all commands where `guru` is used. Such as
    +  `:GoDef`, `:GoReferrers`, etc.. [gh-944]
    +* Cleanup and improve documentation [gh-987]
    +
    +BUG FIXES:
    +
    +* Fix system calls on Windows [gh-988]
    +
    +
    +## 1.8 (July 31, 2016)
     
     FEATURES:
    -
    -* If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [gh-918]
    -* The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Checkout the demo to see it in action: https://github.com/fatih/vim-go/pull/927 [gh-927]
    -* **`:GoSameIds`** support. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically. Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [gh-936]
    +* New **`:GoAddTags`** command that adds field tags for the fields of a struct automatically based on the field names. Checkout the demo to see it in action: https://twitter.com/fatih/status/759822857773907968 [gh-971]
    +* The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Together with `:GoAddTags` it gives `vim-go` users flexible ways of populating a field tag. Checkout the demo to see it in action: https://twitter.com/fatih/status/754477622042689536 [gh-927]
    +* New **`:GoSameIds`** command. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically (with `:GoSameIdsAutoToggle` or `g:go_auto_sameids`). Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [gh-936]
    +* New **`:GoWhicherrs`** command. It shows all possible values of the selected error variable. [gh-948]
     * Add new `errp` snippet to expand an `if err != nil { panic() }` clause [gh-926] 
    +* If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [gh-918]
    +* Added new toggle commands to enable/disable feature that run for your
    +  automatic. For example if you have `let g:go_auto_type_info = 1` enabled, you
    +  can now easily enable/disable it on the fly. Support added with the following
    +  commands: `:GoAutoTypeInfoToggle`, `:GoFmtAutoSaveToggle`,
    +  `:GoAsmFmtAutoSaveToggle`, `:GoMetalinterAutoSaveToggle`,
    +  `:GoTemplateAutoCreateToggle` [gh-945]
    +
     
     IMPROVEMENTS:
     * `:GoDoc` accepts arguments now which are passed directly to `godoc`. So usages like `:GoDoc flag` works again (it was changed in previous versions [gh-894]
     * `:GoDef` works now for modified files as well [gh-910]
    +* Internal: pass filename to the `--srcdir` flag to enable upcoming `goimports` features [gh-957]
     * Internal: fix indentations on all files to **2-spaces/no tabs**. This is now the default vim-go style across all VimL files [gh-915]
    +* Internal: autocmd settings can be now dynamically enabled/disabled [gh-939]
    +* Internal: automatically detect `GOPATH`  for :GoInstall [gh-980]
    +* Internal: shell executions uses now by default `sh` and then resets it back to the user preference. [gh-967]
     * Syntax: improved syntax highglighting performance for methods, fields, structs and interface type declarations [gh-917]
    +* Syntax: moved `:GoCoverage` highlight definition into go's syntax file for more customizability [gh-962]
    +
     
     BUG FIXES:
     
    @@ -21,6 +49,7 @@ BUG FIXES:
     * Fix `:GoFmt` not picking up `-srcdir` if the command was set to use `goimports` [gh-904]
     * Fix `:GoTestCompile` to not leave behind artifacts if the cwd and the test files's directory do not match [gh-909]
     * Fix `:GoDocBrowser` to not fail if godoc doesn't exist [gh-920]
    +* Fix `:GoFmt` to not change the permissions of saved file. Now original file permissions are restored [gh-922]
     
     BACKWARDS INCOMPATIBILITIES:
     
    diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md
    index b65ca08e..47d8c416 100644
    --- a/sources_non_forked/vim-go/README.md
    +++ b/sources_non_forked/vim-go/README.md
    @@ -50,10 +50,16 @@ disabled/enabled easily.
       in their own new terminal. (beta)
     * Alternate between implementation and test code with `:GoAlternate`
     
    +Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial) 
    +that goes literally over all features and shows many tips and tricks. It shows 
    +how to install vim-go and explains many unknown use cases. Recommended for 
    +beginners as well as advanced users: https://github.com/fatih/vim-go-tutorial
    +
     ## Install
     
    -Master branch is supposed to be a development branch. So stuff here can break and change.
    -Please try use always the [latest release](https://github.com/fatih/vim-go/releases/latest)
    +Master branch is supposed to be a development branch. So stuff here can break
    +and change.  Please try use always the [latest
    +release](https://github.com/fatih/vim-go/releases/latest)
     
     Vim-go follows the standard runtime path structure, so I highly recommend to
     use a common and well known plugin manager to install vim-go. Do not use vim-go
    @@ -69,6 +75,8 @@ command.
       * `NeoBundle 'fatih/vim-go'`
     *  [Vundle](https://github.com/gmarik/vundle)
       * `Plugin 'fatih/vim-go'`
    +*  [Vim packages](http://vimhelp.appspot.com/repeat.txt.html#packages) (since Vim 7.4.1528)
    +  * `git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go`
     
     Please be sure all necessary binaries are installed (such as `gocode`, `godef`,
     `goimports`, etc.). You can easily install them with the included
    @@ -84,7 +92,8 @@ installed binaries.
     completion (completion by type) install:
     [neocomplete](https://github.com/Shougo/neocomplete.vim) for Vim or
     [deoplete](https://github.com/Shougo/deoplete.nvim) and
    -[deoplete-go](https://github.com/zchee/deoplete-go) for NeoVim
    +[deoplete-go](https://github.com/zchee/deoplete-go) for NeoVim or
    +[SimpleAutoCmplPop](https://github.com/roxma/SimpleAutoComplPop)
     * To display source code tag information on a sidebar install
     [tagbar](https://github.com/majutsushi/tagbar).
     * For snippet features install:
    @@ -270,7 +279,6 @@ To resolve this:
     let g:go_list_type = "quickfix"
     ```
     
    -
     ## More info
     
     Check out the [Wiki](https://github.com/fatih/vim-go/wiki) page for more
    @@ -282,8 +290,12 @@ other [various pieces](https://github.com/fatih/vim-go/wiki) of information.
     ## Donation
     
     People have asked for this for a long time, now you can be a fully supporter by
    -[being a patron](https://www.patreon.com/fatih)! This is fully optional and is
    -just a way to support vim-go's ongoing development directly. Thanks!
    +[being a patron](https://www.patreon.com/fatih)! 
    +
    +By being a patron, you are enabling vim-go to grow and mature, helping me to
    +invest in bug fixes, new documentation, and improving both current and future
    +features. It's completely optional and is just a direct way to support Vim-go's
    +ongoing development. Thanks!
     
     [https://www.patreon.com/fatih](https://www.patreon.com/fatih)
     
    diff --git a/sources_non_forked/vim-go/autoload/go/asmfmt.vim b/sources_non_forked/vim-go/autoload/go/asmfmt.vim
    index 711e3274..b47651da 100644
    --- a/sources_non_forked/vim-go/autoload/go/asmfmt.vim
    +++ b/sources_non_forked/vim-go/autoload/go/asmfmt.vim
    @@ -41,7 +41,11 @@ function! go#asmfmt#Format()
     
         " Replace the current file with the temp file; then reload the buffer.
         let old_fileformat = &fileformat
    +    " save old file permissions
    +    let original_fperm = getfperm(expand('%'))
         call rename(l:tmpname, expand('%'))
    +    " restore old file permissions
    +    call setfperm(expand('%'), original_fperm)
         silent edit!
         let &fileformat = old_fileformat
         let &syntax = &syntax
    @@ -51,4 +55,15 @@ function! go#asmfmt#Format()
       call winrestview(l:curw)
     endfunction
     
    +function! go#asmfmt#ToggleAsmFmtAutoSave()
    +  if get(g:, "go_asmfmt_autosave", 1)
    +    let g:go_asmfmt_autosave = 0
    +    call go#util#EchoProgress("auto asmfmt disabled")
    +    return
    +  end
    +
    +  let g:go_asmfmt_autosave = 1
    +  call go#util#EchoProgress("auto asmfmt enabled")
    +endfunction
    +
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim
    index a01e30d3..33fccd3a 100644
    --- a/sources_non_forked/vim-go/autoload/go/cmd.vim
    +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim
    @@ -143,6 +143,8 @@ endfunction
     " is given(which are passed directly to 'go install') it tries to install those
     " packages. Errors are populated in the location window.
     function! go#cmd#Install(bang, ...)
    +  let old_gopath = $GOPATH
    +  let $GOPATH = go#path#Detect()
       let default_makeprg = &makeprg
     
       " :make expands '%' and '#' wildcards, so they must also be escaped
    @@ -179,6 +181,7 @@ function! go#cmd#Install(bang, ...)
         redraws! | echon "vim-go: " | echohl Function | echon "installed to ". $GOPATH | echohl None
       endif
     
    +  let $GOPATH = old_gopath
       let &makeprg = default_makeprg
     endfunction
     
    diff --git a/sources_non_forked/vim-go/autoload/go/complete.vim b/sources_non_forked/vim-go/autoload/go/complete.vim
    index 96fc36c8..3cc52d2d 100644
    --- a/sources_non_forked/vim-go/autoload/go/complete.vim
    +++ b/sources_non_forked/vim-go/autoload/go/complete.vim
    @@ -153,4 +153,16 @@ function! go#complete#Complete(findstart, base)
       endif
     endf
     
    +function! go#complete#ToggleAutoTypeInfo()
    +  if get(g:, "go_auto_type_info", 0)
    +    let g:go_auto_type_info = 0
    +    call go#util#EchoProgress("auto type info disabled")
    +    return
    +  end
    +
    +  let g:go_auto_type_info = 1
    +  call go#util#EchoProgress("auto type info enabled")
    +endfunction
    +
    +
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/autoload/go/coverage.vim b/sources_non_forked/vim-go/autoload/go/coverage.vim
    index 83082174..f3d36c43 100644
    --- a/sources_non_forked/vim-go/autoload/go/coverage.vim
    +++ b/sources_non_forked/vim-go/autoload/go/coverage.vim
    @@ -134,9 +134,9 @@ endfunction
     " Generates matches to be added to matchaddpos for the given coverage profile
     " block
     function! go#coverage#genmatch(cov)
    -  let color = 'covered'
    +  let color = 'goCoverageCovered'
       if a:cov.cnt == 0
    -    let color = 'uncover'
    +    let color = 'goCoverageUncover'
       endif
     
       let matches = []
    @@ -195,12 +195,12 @@ function! go#coverage#overlay(file)
       " contains matches for matchaddpos()
       let matches = []
     
    -  " first mark all lines as normaltext. We use a custom group to not
    +  " first mark all lines as goCoverageNormalText. We use a custom group to not
       " interfere with other buffers highlightings. Because the priority is
       " lower than the cover and uncover matches, it'll be overriden.
       let cnt = 1
       while cnt <= line('$')
    -    call add(matches, {'group': 'normaltext', 'pos': [cnt], 'priority': 1})
    +    call add(matches, {'group': 'goCoverageNormalText', 'pos': [cnt], 'priority': 1})
         let cnt += 1
       endwhile
     
    @@ -234,9 +234,6 @@ function! go#coverage#overlay(file)
       endfor
     
       syntax manual
    -  highlight normaltext term=bold ctermfg=darkgrey guifg=#75715E
    -  highlight covered term=bold ctermfg=green guifg=#A6E22E
    -  highlight uncover term=bold ctermfg=red guifg=#F92672
     
       " clear the matches if we leave the buffer
       autocmd BufWinLeave  call go#coverage#Clear()
    diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim
    index bea95117..2c783939 100644
    --- a/sources_non_forked/vim-go/autoload/go/def.vim
    +++ b/sources_non_forked/vim-go/autoload/go/def.vim
    @@ -6,12 +6,6 @@ function! go#def#Jump(mode)
       let $GOPATH = go#path#Detect()
     
       let fname = fnamemodify(expand("%"), ':p:gs?\\?/?')
    -  if &modified
    -    " Write current unsaved buffer to a temp file and use the modified content
    -    let l:tmpname = tempname()
    -    call writefile(getline(1, '$'), l:tmpname)
    -    let fname = l:tmpname
    -  endif
     
       " so guru right now is slow for some people. previously we were using
       " godef which also has it's own quirks. But this issue come up so many
    @@ -19,6 +13,13 @@ function! go#def#Jump(mode)
       " covers all edge cases, but now anyone can switch to godef if they wish
       let bin_name = get(g:, 'go_def_mode', 'guru')
       if bin_name == 'godef'
    +    if &modified
    +      " Write current unsaved buffer to a temp file and use the modified content
    +      let l:tmpname = tempname()
    +      call writefile(getline(1, '$'), l:tmpname)
    +      let fname = l:tmpname
    +    endif
    +
         let bin_path = go#path#CheckBinPath("godef")
         if empty(bin_path)
           let $GOPATH = old_gopath
    @@ -31,31 +32,45 @@ function! go#def#Jump(mode)
         " jump_to_declaration() function can parse it. This makes it
         " compatible with guru definition as well too
         let out = join(split(out, '\n'), ':')
    +    if exists("l:tmpname")
    +      call delete(l:tmpname)
    +    endif
    +
       elseif bin_name == 'guru'
    +    let flags = ""
    +    let in = ""
    +
    +    if &modified
    +      let sep = go#util#LineEnding()
    +      let content  = join(getline(1, '$'), sep)
    +      let in = fname . "\n" . strlen(content) . "\n" . content
    +      let flags .= " -modified"
    +    endif
    +
         let bin_path = go#path#CheckBinPath("guru")
         if empty(bin_path)
           let $GOPATH = old_gopath
           return
         endif
     
    -    let flags = ""
         if exists('g:go_guru_tags')
           let tags = get(g:, 'go_guru_tags')
    -      let flags = printf(" -tags %s", tags)
    +      let flags .= printf(" -tags %s", tags)
         endif
     
         let fname = shellescape(fname.':#'.go#util#OffsetCursor())
         let command = printf("%s %s definition %s", bin_path, flags, fname)
    -    let out = go#util#System(command)
    +
    +    if &modified
    +      let out = go#util#System(command, in)
    +    else
    +      let out = go#util#System(command)
    +    endif
       else
         call go#util#EchoError('go_def_mode value: '. bin_name .' is not valid. Valid values are: [godef, guru]')
         return
       endif
     
    -  if exists("l:tmpname")
    -    call delete(l:tmpname)
    -  endif
    -
       if go#util#ShellError() != 0
         call go#util#EchoError(out)
         return
    @@ -98,24 +113,29 @@ function! s:jump_to_declaration(out, mode)
       " modes of switchbuf which we need based on the split mode
       let old_switchbuf = &switchbuf
     
    -  " jump to existing buffer if, 1. we have enabled it, 2. the buffer is loaded
    -  " and 3. there is buffer window number we switch to
    -  if get(g:, 'go_def_reuse_buffer', 0) && bufloaded(filename) != 0 && bufwinnr(filename) != -1
    -    " jumpt to existing buffer if it exists
    -    execute bufwinnr(filename) . 'wincmd w'
    -  elseif a:mode == "tab"
    -    let &switchbuf = "usetab"
    -    if bufloaded(filename) == 0
    -      tab split
    +  let l:fname = fnamemodify(expand("%"), ':p:gs?\\?/?')
    +  if filename != l:fname
    +    " jump to existing buffer if, 1. we have enabled it, 2. the buffer is loaded
    +    " and 3. there is buffer window number we switch to
    +    if get(g:, 'go_def_reuse_buffer', 0) && bufloaded(filename) != 0 && bufwinnr(filename) != -1
    +      " jumpt to existing buffer if it exists
    +      execute bufwinnr(filename) . 'wincmd w'
    +    elseif a:mode == "tab"
    +      let &switchbuf = "usetab"
    +      if bufloaded(filename) == 0
    +        tab split
    +      endif
    +    elseif a:mode == "split"
    +      split
    +    elseif a:mode == "vsplit"
    +      vsplit
    +    elseif &modified
    +      split
         endif
    -  elseif a:mode == "split"
    -    split
    -  elseif a:mode == "vsplit"
    -    vsplit
    -  endif
     
    -  " open the file and jump to line and column
    -  exec 'edit '.filename
    +    " open the file and jump to line and column
    +    exec 'edit '.filename
    +  endif
       call cursor(line, col)
     
       " also align the line to middle of the view
    diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim
    index eb49553d..e47b52d2 100644
    --- a/sources_non_forked/vim-go/autoload/go/fmt.vim
    +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim
    @@ -43,7 +43,7 @@ if !exists("g:go_fmt_experimental")
       let g:go_fmt_experimental = 0
     endif
     
    -"  we have those problems : 
    +"  we have those problems :
     "  http://stackoverflow.com/questions/12741977/prevent-vim-from-updating-its-undo-tree
     "  http://stackoverflow.com/questions/18532692/golang-formatter-and-vim-how-to-destroy-history-record?rq=1
     "
    @@ -124,7 +124,7 @@ function! go#fmt#Format(withGoimport)
         if exists('b:goimports_vendor_compatible') && b:goimports_vendor_compatible
           let ssl_save = &shellslash
           set noshellslash
    -      let command  = command . '-srcdir ' . shellescape(expand("%:p:h"))
    +      let command  = command . '-srcdir ' . shellescape(expand("%:p"))
           let &shellslash = ssl_save
         endif
       endif
    @@ -149,7 +149,15 @@ function! go#fmt#Format(withGoimport)
     
         " Replace current file with temp file, then reload buffer
         let old_fileformat = &fileformat
    +    if exists("*getfperm")
    +      " save old file permissions
    +      let original_fperm = getfperm(expand('%'))
    +    endif
         call rename(l:tmpname, expand('%'))
    +    " restore old file permissions
    +    if exists("*setfperm") && original_fperm != ''
    +      call setfperm(expand('%'), original_fperm)
    +    endif
         silent edit!
         let &fileformat = old_fileformat
         let &syntax = &syntax
    @@ -207,4 +215,14 @@ function! go#fmt#Format(withGoimport)
       endif
     endfunction
     
    +function! go#fmt#ToggleFmtAutoSave()
    +  if get(g:, "go_fmt_autosave", 1)
    +    let g:go_fmt_autosave = 0
    +    call go#util#EchoProgress("auto fmt disabled")
    +    return
    +  end
    +
    +  let g:go_fmt_autosave = 1
    +  call go#util#EchoProgress("auto fmt enabled")
    +endfunction
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim
    index 5ddc99d0..3fb5a7d5 100644
    --- a/sources_non_forked/vim-go/autoload/go/guru.vim
    +++ b/sources_non_forked/vim-go/autoload/go/guru.vim
    @@ -1,5 +1,6 @@
     "  guru.vim -- Vim integration for the Go guru.
     
    +
     func! s:RunGuru(mode, format, selected, needs_scope) range abort
       "return with a warning if the binary doesn't exist
       let bin_path = go#path#CheckBinPath("guru") 
    @@ -7,18 +8,6 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort
         return {'err': "bin path not found"}
       endif
     
    -  let filename = fnamemodify(expand("%"), ':p:gs?\\?/?')
    -  if !filereadable(filename)
    -    " this might happen for new buffers which are not written yet
    -    return {'err': "file does not exist"}
    -  endif
    -
    -  if &modified
    -    " Write current unsaved buffer to a temp file and use the modified content
    -    let l:tmpname = tempname()
    -    call writefile(getline(1, '$'), l:tmpname)
    -    let filename = l:tmpname
    -  endif
       let dirname = expand('%:p:h')
       let pkg = go#package#ImportPath(dirname)
     
    @@ -30,6 +19,15 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort
       " start constructing the 'command' variable
       let command = bin_path
     
    +  let filename = fnamemodify(expand("%"), ':p:gs?\\?/?')
    +  let in = ""
    +  if &modified
    +    let sep = go#util#LineEnding()
    +    let content  = join(getline(1, '$'), sep )
    +    let in = filename . "\n" . strlen(content) . "\n" . content
    +    let command .= " -modified"
    +  endif
    +
       " enable outputting in json format
       if a:format == "json"
         let command .= " -json"
    @@ -72,8 +70,8 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort
         let scopes = go#util#Shelllist(scopes)
     
         " guru expect a comma-separated list of patterns, construct it
    -    let scope = join(scopes, ",")
    -    let command .= printf(" -scope %s", scope)
    +    let l:scope = join(scopes, ",")
    +    let command .= printf(" -scope %s", l:scope)
       endif
     
       let pos = printf("#%s", go#util#OffsetCursor())
    @@ -91,16 +89,18 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort
       let old_gopath = $GOPATH
       let $GOPATH = go#path#Detect()
     
    -  if a:mode !=# 'what'
    +  if a:needs_scope
    +    call go#util#EchoProgress("analysing with scope ". l:scope . " ...")
    +  elseif a:mode !=# 'what'
         " the query might take time, let us give some feedback
         call go#util#EchoProgress("analysing ...")
       endif
     
       " run, forrest run!!!
    -  let out = go#util#System(command)
    -
    -  if exists("l:tmpname")
    -    call delete(l:tmpname)
    +  if &modified
    +    let out = go#util#System(command, in)
    +  else
    +    let out = go#util#System(command)
       endif
     
       let $GOPATH = old_gopath
    @@ -176,6 +176,23 @@ function! go#guru#Tags(...)
       endif
     endfunction
     
    +" Report the possible constants, global variables, and concrete types that may
    +" appear in a value of type error
    +function! go#guru#Whicherrs(selected)
    +  let out = s:RunGuru('whicherrs', 'plain', a:selected, 1)
    +  if has_key(out, 'err')
    +    call go#util#EchoError(out.err)
    +    return
    +  endif
    +
    +  if empty(out.out)
    +    call go#util#EchoSuccess("no error variables found. Try to change the scope with :GoGuruScope")
    +    return
    +  endif
    +
    +  call s:loclistSecond(out.out)
    +endfunction
    +
     " Show 'implements' relation for selected package
     function! go#guru#Implements(selected)
       let out = s:RunGuru('implements', 'plain', a:selected, 1)
    @@ -271,16 +288,11 @@ function! go#guru#Referrers(selected)
     endfunction
     
     function! go#guru#What(selected)
    -  " nvim doesn't have JSON support, though they work on it:
    -  " https://github.com/neovim/neovim/pull/4131
    -  if has('nvim')
    -    return {'err': "GoWhat is not supported in Neovim"}
    -  endif
    -
    -  " json_encode() and friends are introduced with this patch
    -  " https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ
    -  if !has('patch-7.4.1304')
    -    return {'err': "GoWhat is supported with Vim version 7.4-1304 or later"}
    +  " json_encode() and friends are introduced with this patch (7.4.1304)
    +  " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ
    +  " nvim: https://github.com/neovim/neovim/pull/4131        
    +  if !exists("*json_decode")
    +    return {'err': "GoWhat is not supported due old version of Vim/Neovim"}
       endif
     
       let out = s:RunGuru('what', 'json', a:selected, 0)
    @@ -297,10 +309,29 @@ function! go#guru#What(selected)
       return result
     endfunction
     
    +function! go#guru#AutoToogleSameIds()
    +  if get(g:, "go_auto_sameids", 0)
    +    call go#util#EchoProgress("sameids auto highlighting disabled")
    +    call go#guru#ClearSameIds()
    +    let g:go_auto_sameids = 0
    +    return
    +  endif
    +
    +  call go#util#EchoSuccess("sameids auto highlighting enabled")
    +  let g:go_auto_sameids = 1
    +endfunction
    +
     function! go#guru#SameIds(selected)
    -  call go#guru#ClearSameIds()
    +  " we use matchaddpos() which was introduce with 7.4.330, be sure we have
    +  " it: http://ftp.vim.org/vim/patches/7.4/7.4.330
    +  if !exists("*matchaddpos")
    +    call go#util#EchoError("GoSameIds is supported with Vim version 7.4-330 or later")
    +    return
    +  endif
     
       let result = go#guru#What(a:selected)
    +
    +  call go#guru#ClearSameIds() " run after calling guru to reduce flicker.
       if has_key(result, 'err') && !get(g:, 'go_auto_sameids', 0)
         " only echo if it's called via `:GoSameIds, but not if it's in automode
         call go#util#EchoError(result.err)
    @@ -327,8 +358,6 @@ function! go#guru#SameIds(selected)
         return
       endif
     
    -  hi goSameId term=bold cterm=bold ctermbg=white ctermfg=black
    -
       let same_ids = result['sameids']
       " highlight the lines
       for item in same_ids
    @@ -346,4 +375,12 @@ function! go#guru#ClearSameIds()
       endfor
     endfunction
     
    +function! go#guru#ToggleSameIds(selected)
    +  if len(getmatches()) != 0 
    +    call go#guru#ClearSameIds()
    +  else
    +    call go#guru#SameIds(a:selected)
    +  endif
    +endfunction
    +
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/autoload/go/impl.vim b/sources_non_forked/vim-go/autoload/go/impl.vim
    index e0ffac45..fce4a29b 100644
    --- a/sources_non_forked/vim-go/autoload/go/impl.vim
    +++ b/sources_non_forked/vim-go/autoload/go/impl.vim
    @@ -71,12 +71,12 @@ endif
     
     function! s:root_dirs()
       let dirs = []
    -  let root = go#util#GOROOT()
    +  let root = go#util#goroot()
       if root !=# '' && isdirectory(root)
         call add(dirs, root)
       endif
     
    -  let paths = map(split(go#util#GOPATH(), go#util#PathListSep()), "substitute(v:val, '\\\\', '/', 'g')")
    +  let paths = map(split(go#util#gopath(), go#util#PathListSep()), "substitute(v:val, '\\\\', '/', 'g')")
       if go#util#ShellError()
         return []
       endif
    @@ -91,7 +91,7 @@ endfunction
     function! s:go_packages(dirs)
       let pkgs = []
       for d in a:dirs
    -    let pkg_root = expand(d . '/pkg/' . go#util#OSARCH())
    +    let pkg_root = expand(d . '/pkg/' . go#util#osarch())
         call extend(pkgs, split(globpath(pkg_root, '**/*.a', 1), "\n"))
       endfor
       return map(pkgs, "fnamemodify(v:val, ':t:r')")
    diff --git a/sources_non_forked/vim-go/autoload/go/lint.vim b/sources_non_forked/vim-go/autoload/go/lint.vim
    index 1a2ef9aa..9b2a543a 100644
    --- a/sources_non_forked/vim-go/autoload/go/lint.vim
    +++ b/sources_non_forked/vim-go/autoload/go/lint.vim
    @@ -196,4 +196,15 @@ function! go#lint#Errcheck(...) abort
     
     endfunction
     
    +function! go#lint#ToggleMetaLinterAutoSave()
    +  if get(g:, "go_metalinter_autosave", 0)
    +    let g:go_metalinter_autosave = 0
    +    call go#util#EchoProgress("auto metalinter disabled")
    +    return
    +  end
    +
    +  let g:go_metalinter_autosave = 1
    +  call go#util#EchoProgress("auto metalinter enabled")
    +endfunction
    +
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/autoload/go/package.vim b/sources_non_forked/vim-go/autoload/go/package.vim
    index 2aefd5d6..c69cba4b 100644
    --- a/sources_non_forked/vim-go/autoload/go/package.vim
    +++ b/sources_non_forked/vim-go/autoload/go/package.vim
    @@ -33,7 +33,7 @@ function! go#package#Paths()
     
       if !exists("s:goroot")
         if executable('go')
    -      let s:goroot = substitute(go#util#System('go env GOROOT'), '\n', '', 'g')
    +      let s:goroot = go#util#goroot()
           if go#util#ShellError() != 0
             echomsg '''go env GOROOT'' failed'
           endif
    diff --git a/sources_non_forked/vim-go/autoload/go/template.vim b/sources_non_forked/vim-go/autoload/go/template.vim
    index 73b37e86..4b9e2713 100644
    --- a/sources_non_forked/vim-go/autoload/go/template.vim
    +++ b/sources_non_forked/vim-go/autoload/go/template.vim
    @@ -10,13 +10,13 @@ function! go#template#create()
       let l:package_name = go#tool#PackageName()
     
       " if we can't figure out any package name(no Go files or non Go package
    -  " files) from the directory create the template 
    +  " files) from the directory create the template
       if l:package_name == -1
         let l:template_file = get(g:, 'go_template_file', "hello_world.go")
         let l:template_path = go#util#Join(l:root_dir, "templates", l:template_file)
    -    exe '0r ' . l:template_path
    +    exe '0r ' . fnameescape(l:template_path)
         $delete _
    -  else  
    +  else
         let l:content = printf("package %s", l:package_name)
         call append(0, l:content)
         $delete _
    @@ -28,4 +28,15 @@ function! go#template#create()
       execute cd . fnameescape(dir)
     endfunction
     
    +function! go#template#ToggleAutoCreate()
    +  if get(g:, "go_template_autocreate", 1)
    +    let g:go_template_autocreate = 0
    +    call go#util#EchoProgress("auto template create disabled")
    +    return
    +  end
    +
    +  let g:go_template_autocreate = 1
    +  call go#util#EchoProgress("auto template create enabled")
    +endfunction
    +
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/autoload/go/tool.vim b/sources_non_forked/vim-go/autoload/go/tool.vim
    index 487b933d..c41bbd27 100644
    --- a/sources_non_forked/vim-go/autoload/go/tool.vim
    +++ b/sources_non_forked/vim-go/autoload/go/tool.vim
    @@ -44,7 +44,7 @@ function! go#tool#Imports()
     endfunction
     
     function! go#tool#PackageName()
    -  let command = "go list -f '{{.Name}}'"
    +  let command = "go list -f \"{{.Name}}\""
       let out = go#tool#ExecuteInDir(command)
       if go#util#ShellError() != 0
           return -1
    diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim
    index 591606ff..0251b14a 100644
    --- a/sources_non_forked/vim-go/autoload/go/util.vim
    +++ b/sources_non_forked/vim-go/autoload/go/util.vim
    @@ -43,27 +43,26 @@ function! go#util#IsWin()
       return 0
     endfunction
     
    -function! go#util#GOARCH()
    +function! go#util#goarch()
       return substitute(go#util#System('go env GOARCH'), '\n', '', 'g')
     endfunction
     
    -function! go#util#GOOS()
    +function! go#util#goos()
       return substitute(go#util#System('go env GOOS'), '\n', '', 'g')
     endfunction
     
    -function! go#util#GOROOT()
    +function! go#util#goroot()
       return substitute(go#util#System('go env GOROOT'), '\n', '', 'g')
     endfunction
     
    -function! go#util#GOPATH()
    +function! go#util#gopath()
       return substitute(go#util#System('go env GOPATH'), '\n', '', 'g')
     endfunction
     
    -function! go#util#OSARCH()
    -  return go#util#GOOS() . '_' . go#util#GOARCH()
    +function! go#util#osarch()
    +  return go#util#goos() . '_' . go#util#goarch()
     endfunction
     
    -
     "Check if has vimproc
     function! s:has_vimproc()
       if !exists('g:go#use_vimproc')
    @@ -92,8 +91,20 @@ else
       let s:vim_shell_error = ''
     endif
     
    +" System runs a shell command. It will reset the shell to /bin/sh for Unix-like
    +" systems if it is executable.
     function! go#util#System(str, ...)
    -  return call(s:vim_system, [a:str] + a:000)
    +  let l:shell = &shell
    +  if !go#util#IsWin() && executable('/bin/sh')
    +    let &shell = '/bin/sh'
    +  endif
    +
    +  try
    +    let l:output = call(s:vim_system, [a:str] + a:000)
    +    return l:output
    +  finally
    +    let &shell = l:shell
    +  endtry
     endfunction
     
     function! go#util#ShellError()
    @@ -228,24 +239,68 @@ function! go#util#camelcase(word)
       endif
     endfunction
     
    +function! go#util#AddTags(line1, line2, ...)
    +  " default is json
    +  let l:keys = ["json"]
    +  if a:0
    +    let l:keys = a:000
    +  endif
    +
    +  let l:line1 = a:line1
    +  let l:line2 = a:line2
    +
    +  " If we're inside a struct and just call this function let us add the tags
    +  " to all fields
    +  " TODO(arslan): I don't like using patterns. Check if we can move it to
    +  " `motion` and do it via AST based position
    +  let ln1 = searchpair('struct {', '', '}', 'bcnW')
    +  if ln1 == 0
    +    echon "vim-go: " | echohl ErrorMsg | echon "cursor is outside the struct" | echohl None
    +    return
    +  endif
    +
    +  " searchpair only returns a single position
    +  let ln2 = search('}', "cnW")
    +
    +  " if no range is given we apply for the whole struct
    +  if l:line1 == l:line2
    +    let l:line1 = ln1 + 1
    +    let l:line2 = ln2 - 1
    +  endif
    +
    +  for line in range(l:line1, l:line2)
    +    " get the field name (word) that are not part of a commented line
    +    let l:matched = matchstr(getline(line), '\(\/\/.*\)\@
     
         git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go
     <
    -
     *  https://github.com/junegunn/vim-plug >
     
         Plug 'fatih/vim-go'
     
    -<
     *  https://github.com/Shougo/neobundle.vim >
     
         NeoBundle 'fatih/vim-go'
     <
    -
     *  https://github.com/gmarik/vundle >
     
         Plugin 'fatih/vim-go'
     
    +*  Vim |packages| (since Vim 7.4.1528)
    +>
    +    git clone https://github.com/fatih/vim-go.git \
    +      ~/.vim/pack/plugins/start/vim-go
     <
     *  Manual >
     
         Copy all of the files into your `~/.vim` directory
     <
     
    -Please be sure all necessary binaries are installed (such as `gocode`, `godef`,
    -`goimports`, etc..). You can easily install them with the included
    -|GoInstallBinaries| command. If you invoke it, all necessary binaries will be
    -automatically downloaded and installed to your `$GOBIN` environment (if not set
    -it will use `$GOPATH/bin`).  It requires `git` for fetching the individual Go
    -packages.
    +Please be sure all necessary binaries are installed (such as `gocode`,
    +`godef`, `goimports`, etc.). You can easily install them with the included
    +|:GoInstallBinaries| command. If you invoke it, all necessary binaries will be
    +automatically downloaded and installed to your `$GOBIN` environment (if not
    +set it will use `$GOPATH/bin`).  It requires `git` for fetching the individual
    +Go packages.
     
     * Autocompletion is enabled by default via ``, to get real-time
     completion (completion by type) install:
    @@ -121,20 +127,21 @@ https://github.com/majutsushi/tagbar.
     * For snippet feature install:
     https://github.com/Shougo/neosnippet.vim or
     https://github.com/SirVer/ultisnips.
    -* For a better documentation viewer checkout: https://github.com/garyburd/go-explorer
    +* For a better documentation viewer check out:
    +  https://github.com/garyburd/go-explorer
     
    -===============================================================================
    -COMMANDS                                                          *go-commands*
    +==============================================================================
    +COMMANDS                                                         *go-commands*
     
    -                                                                  *:GoPath*
    +                                                                     *:GoPath*
     :GoPath [path]
     
         GoPath sets and overrides GOPATH with the given {path}. If no {path} is
         given it shows the current GOPATH. If `""` is given as path, it clears
    -    current `GOPATH` which was set with |GoPath| and restores `GOPATH` back to
    -    the initial value which was sourced when Vim was started.
    +    current `GOPATH` which was set with |:GoPath| and restores `GOPATH` back
    +    to the initial value which was sourced when Vim was started.
     
    -                                                                  *:GoImport*
    +                                                                   *:GoImport*
     :GoImport[!] [path]
     
         Import ensures that the provided package {path} is imported in the current
    @@ -143,36 +150,36 @@ COMMANDS                                                          *go-commands*
     
         If [!] is given it will download the package with `go get`
     
    -                                                                *:GoImportAs*
    +                                                                 *:GoImportAs*
     :GoImportAs [localname] [path]
     
         Same as Import, but uses a custom local name for the package.
     
    -                                                                    *:GoDrop*
    +                                                                     *:GoDrop*
     :GoDrop [path]
     
         Remove the import line for the provided package {path}, if present in the
         current Go buffer.  If {path} is not being imported, an error will be
         displayed and the buffer will be untouched.
     
    -                                                                    *:GoLint*
    +                                                                     *:GoLint*
     :GoLint [packages]
     
         Run golint for the current Go file, or for given packages.
     
    -                                                                     *:GoDoc*
    +                                                                      *:GoDoc*
     :GoDoc [word]
     
         Open the relevant GoDoc in split window for either the word[s] passed to
         the command or by default, the word under the cursor.
     
    -                                                              *:GoDocBrowser*
    +                                                               *:GoDocBrowser*
     :GoDocBrowser [word]
     
         Open the relevant GoDoc in browser for either the word[s] passed to the
         command or by default, the word under the cursor.
     
    -                                                                     *:GoFmt*
    +                                                                      *:GoFmt*
     :GoFmt
     
         Filter the current Go buffer through gofmt.  It tries to preserve cursor
    @@ -183,7 +190,7 @@ COMMANDS                                                          *go-commands*
     
         Filter the current Go buffer through goimports (needs to be installed).
         `goimports` automatically discards/add import path based on the code. Like
    -    |GoFmt|, It tries to preserve cursor position and avoids replacing the
    +    |:GoFmt|, It tries to preserve cursor position and avoids replacing the
         buffer with stderr output.
     
                                                                          *:GoPlay*
    @@ -194,14 +201,14 @@ COMMANDS                                                          *go-commands*
         is copied to system clipboard if Vim is compiled with 'clipboard' or
          'xterm-clipboard' otherwise it's get yanked into the `""` register.
     
    -                                                                     *:GoVet*
    +                                                                      *:GoVet*
     :GoVet[!] [options]
     
         Run `go vet` for the directory under your current file. Vet examines Go
         source code and reports suspicious constructs, such as Printf calls whose
    -    arguments do not align with the format string. Vet uses heuristics that do not
    -    guarantee all reports are genuine problems, but it can find errors not caught
    -    by the compilers.
    +    arguments do not align with the format string. Vet uses heuristics that do
    +    not guarantee all reports are genuine problems, but it can find errors not
    +    caught by the compilers.
     
         You may optionally pass any valid go tool vet flags/options. In this case,
         `go tool vet` is run in place of `go vet`. For a full list please see
    @@ -209,7 +216,7 @@ COMMANDS                                                          *go-commands*
     
         If [!] is not given the first error is jumped to.
     
    -                                                                     *:GoDef*
    +                                                                      *:GoDef*
     :GoDef [identifier]
     gd
     CTRL-]
    @@ -217,67 +224,68 @@ CTRL-]
         Goto declaration/definition for the given [identifier]. If no argument is
         given, it will jump to the declaration under the cursor. By default the
         CTRL-] key and the mapping `gd` are enabled to invoke :GoDef for the
    -    identifier under the cursor. See |g:go_def_mapping_enabled| to disable them.
    +    identifier under the cursor. See |'g:go_def_mapping_enabled'| to disable
    +    them.
     
    -    vim-go also keeps a per-window location stack, roughly analagous to how
    -    vim's internal |tags| functionality works. This is pushed to every time a
    -    jump is made using the GoDef functionality. In essence, this is a LIFO list
    -    of file locations you have visited with :GoDef that is retained to help you
    -    navigate software. For more information on displaying the stack, see
    -    |:GoDefJump|
    +    vim-go also keeps a per-window location stack, roughly analogous to how
    +    Vim's internal |tags| functionality works. This is pushed to every time a
    +    jump is made using the GoDef functionality. In essence, this is a LIFO
    +    list of file locations you have visited with :GoDef that is retained to
    +    help you navigate software.
     
    -                                                                *:GoDefStack*
    +                                                                 *:GoDefStack*
     :GoDefStack [number]
     
    -    This command Jumps to a given location in the jumpstack, retaining all other
    -    entries. Jumps to non-existent entries will print an informative message,
    -    but are otherwise a noop.
    +    This command Jumps to a given location in the jumpstack, retaining all
    +    other entries. Jumps to non-existent entries will print an informative
    +    message, but are otherwise a noop.
     
    -    If no argument is given, it will print out an interactive list of all items
    -    in the stack. Its output looks like this:
    +    If no argument is given, it will print out an interactive list of all
    +    items in the stack. Its output looks like this:
     
    -      1 /path/to/first/file.go|1187 col 16|AddThing func(t *Thing)
    -    > 2 /path/to/thing/thing.go|624 col 19|String() string
    -      3 /path/to/thing/thing.go|744 col 6|func Sprintln(a ...interface{}) string
    +      1 /path/first/file.go|1187 col 16|AddThing func(t *Thing)
    +    > 2 /path/thing/thing.go|624 col 19|String() string
    +      3 /path/thing/thing.go|744 col 6|func Sprintln(a ...interface{}) string
     
         This list shows the identifiers that you jumped to and the file and cursor
    -    position before that jump.  The older jumps are at the top, the newer at the
    -    bottom.
    +    position before that jump.  The older jumps are at the top, the newer at
    +    the bottom.
     
    -    The '>' points to the active entry.  This entry and any newer entries below
    -    it will be replaced if |:GoDef| is done from this location. The CTRL-t and
    -    |:GoDefPop| command will jump to the position above the active entry.
    +    The '>' points to the active entry.  This entry and any newer entries
    +    below it will be replaced if |:GoDef| is done from this location. The
    +    CTRL-t and |:GoDefPop| command will jump to the position above the active
    +    entry.
     
         Jumps to non-existent entries will print an informative message, but are
         otherwise a noop.
     
                                                                 *:GoDefStackClear*
    -:GoDefStackClear 
    +:GoDefStackClear
     
         Clears the current stack list and resets it.
     
    -                                                                  *:GoDefPop*
    +                                                                   *:GoDefPop*
     :GoDefPop [count]
     CTRL-t
     
    -    Navigate to the [count] earlier entry in the jump stack, retaining the newer
    -    entries. If no argument is given, it will jump to the next most recent entry
    -    (`:GoDefPop 1`).  If [count] is greater than the number of prior entries,
    -    an error will be printed and no jump will be performed.
    +    Navigate to the [count] earlier entry in the jump stack, retaining the
    +    newer entries. If no argument is given, it will jump to the next most
    +    recent entry (`:GoDefPop 1`).  If [count] is greater than the number of
    +    prior entries, an error will be printed and no jump will be performed.
     
         If you have used :GoDefPop to jump to an earlier location, and you issue
         another :GoDef command, the current entry will be replaced, and all newer
         entries will be removed, effectively resuming the stack at that location.
     
    -    By default [count]CTRL-t is enabled to invoke :GoDefPop.  Similarly, hitting
    -    CTRL-t without a prior count is equivalent to `:GoDefPop 1`.  See
    -    |g:go_def_mapping_enabled| to disable this.
    +    By default [count]CTRL-t is enabled to invoke :GoDefPop.  Similarly,
    +    hitting CTRL-t without a prior count is equivalent to `:GoDefPop 1`.  See
    +    |'g:go_def_mapping_enabled'| to disable this.
     
    -                                                                     *:GoRun*
    +                                                                      *:GoRun*
     :GoRun[!] [expand]
     
         Build and run your current main package. By default all main files for the
    -    current file is used. If an argument is passed, 'expand' is used as file
    +    current file is used. If an argument is passed, [expand] is used as file
         selector. For example use `:GoRun %` to select the current file only.
     
         You may optionally pass any valid go run flags/options. For a full list
    @@ -286,73 +294,73 @@ CTRL-t
         If [!] is not given the first error is jumped to.
     
         If using neovim then `:GoRun` will run in a new terminal according to
    -    |g:go_term_mode|.
    +    |'g:go_term_mode'|.
     
    -                                                                   *:GoBuild*
    +                                                                    *:GoBuild*
     :GoBuild[!] [expand]
     
         Build your package with `go build`. Errors are populated in the quickfix
         window. It automatically builds only the files that depends on the current
         file. `:GoBuild` doesn't produce a result file.
    -    Use 'make' to create a result file.
    +    Use |:make| to create a result file.
     
         You may optionally pass any valid go build flags/options. For a full list
    -    please see `go help build`. Options are expanded with 'expand'.
    +    please see `go help build`. Options are expanded with [expand].
     
         If [!] is not given the first error is jumped to.
     
         If using neovim then this command is fully async, it does not block the
         UI.
     
    -                                                                   *:GoGenerate*
    +                                                                 *:GoGenerate*
     :GoGenerate[!] [expand]
     
         Creates or updates your auto-generated source files by running `go
         generate`.
     
    -    You may optionally pass any valid go generate flags/options. For a full list
    -    please see `go help generate`. Options are expanded with 'expand'.
    +    You may optionally pass any valid go generate flags/options. For a full
    +    list please see `go help generate`. Options are expanded with [expand].
     
         If [!] is not given the first error is jumped to.
     
    -                                                                    *:GoInfo*
    +                                                                     *:GoInfo*
     :GoInfo
         Show type information about the identifier under the cursor. For example
         putting it above a function call is going to show the full function
         signature. It uses gocode to get the type informations.
     
     
    -                                                                 *:GoInstall*
    +                                                                  *:GoInstall*
     :GoInstall[!] [options]
     
         Install your package with `go install`.
     
    -    You may optionally pass any valid go install flags/options. For a full list
    -    please see `go help install`.
    +    You may optionally pass any valid go install flags/options. For a full
    +    list please see `go help install`.
     
         If [!] is not given the first error is jumped to.
     
    -                                                                    *:GoTest*
    +                                                                     *:GoTest*
     :GoTest[!] [expand]
     
         Run the tests on your _test.go files via in your current directory. Errors
    -    are populated in the quickfix window.  If an argument is passed, 'expand'
    +    are populated in the quickfix window.  If an argument is passed, [expand]
         is used as file selector (useful for cases like `:GoTest ./...`).
     
         You may optionally pass any valid go test flags/options. For a full list
         please see `go help test`.
     
         GoTest timesout automatically after 10 seconds. To customize the timeout
    -    use |g:go_test_timeout|. This feature is disabled if any arguments are
    +    use |'g:go_test_timeout'|. This feature is disabled if any arguments are
         passed to the `:GoTest` command.
     
         If [!] is not given the first error is jumped to.
     
         If using neovim `:GoTest` will run in a new terminal or run asynchronously
    -    in the background according to |g:go_term_enabled|. You can set the mode of
    -    the new terminal with |g:go_term_mode|.
    +    in the background according to |'g:go_term_enabled'|. You can set the mode
    +    of the new terminal with |'g:go_term_mode'|.
     
    -                                                              *:GoTestFunc*
    +                                                                 *:GoTestFunc*
     :GoTestFunc[!] [expand]
     
         Runs :GoTest, but only on the single test function immediate to your
    @@ -364,15 +372,15 @@ CTRL-t
     
         If [!] is not given the first error is jumped to.
     
    -    If using neovim `:GoTestFunc` will run in a new terminal or run asynchronously
    -    in the background according to |g:go_term_enabled|. You can set the mode of
    -    the new terminal with |g:go_term_mode|.
    +    If using neovim `:GoTestFunc` will run in a new terminal or run
    +    asynchronously in the background according to |'g:go_term_enabled'|. You
    +    can set the mode of the new terminal with |'g:go_term_mode'|.
     
                                                                   *:GoTestCompile*
     :GoTestCompile[!] [expand]
     
         Compile your _test.go files via in your current directory. Errors are
    -    populated in the quickfix window.  If an argument is passed, 'expand' is
    +    populated in the quickfix window.  If an argument is passed, [expand] is
         used as file selector (useful for cases like `:GoTest ./...`). Useful to
         not run the tests and capture/fix errors before running the tests or to
         create test binary.
    @@ -380,10 +388,10 @@ CTRL-t
         If [!] is not given the first error is jumped to.
     
         If using neovim `:GoTestCompile` will run in a new terminal or run
    -    asynchronously in the background according to |g:go_term_enabled|. You can
    -    set the mode of the new terminal with |g:go_term_mode|.
    +    asynchronously in the background according to |'g:go_term_enabled'|. You
    +    can set the mode of the new terminal with |'g:go_term_mode'|.
     
    -                                                                *:GoCoverage*
    +                                                                 *:GoCoverage*
     :GoCoverage[!] [options]
     
         Create a coverage profile and annotates the current file's source code. If
    @@ -391,7 +399,7 @@ CTRL-t
     
         If [!] is not given the first error is jumped to.
     
    -                                                            *:GoCoverageToggle*
    +                                                           *:GoCoverageToggle*
     :GoCoverageToggle[!] [options]
     
         Create a coverage profile and annotates the current file's source code. If
    @@ -399,7 +407,7 @@ CTRL-t
     
         If [!] is not given the first error is jumped to.
     
    -                                                             *:GoCoverageClear*
    +                                                            *:GoCoverageClear*
     :GoCoverageClear [options]
     
        Clears the coverage annotation.
    @@ -416,7 +424,7 @@ CTRL-t
     
         If [!] is not given the first error is jumped to.
     
    -                                                                *:GoErrCheck*
    +                                                                 *:GoErrCheck*
     :GoErrCheck [options]
     
         Check for unchecked errors in you current package. Errors are populated in
    @@ -425,12 +433,12 @@ CTRL-t
         You may optionally pass any valid errcheck flags/options. For a full list
         please see `errcheck -h`.
     
    -                                                                   *:GoFiles*
    +                                                                    *:GoFiles*
     :GoFiles
     
         Show source files that depends for the current package
     
    -                                                                    *:GoDeps*
    +                                                                     *:GoDeps*
     :GoDeps
     
         Show dependencies for the current package
    @@ -439,23 +447,23 @@ CTRL-t
     :GoInstallBinaries
     
         Download and Install all necessary Go tool binaries such as `godef`,
    -    `goimports`, `gocode`, etc.. under `g:go_bin_path`. Set |g:go_get_update|
    -    to disable updating dependencies.
    +    `goimports`, `gocode`, etc. under `g:go_bin_path`. Set
    +    |'g:go_get_update'| to disable updating dependencies.
     
    -                                                          *:GoUpdateBinaries*
    +                                                           *:GoUpdateBinaries*
     :GoUpdateBinaries
     
         Download and Update previously installed Go tool binaries such as `godef`,
         `goimports`, `gocode`, etc.. under `g:go_bin_path`. This can be used to
         update the necessary Go binaries.
     
    -                                                              *:GoImplements*
    +                                                               *:GoImplements*
     :GoImplements
     
    -    Show 'implements' relation for a selected package. A list of interfaces
    +    Show "implements" relation for a selected package. A list of interfaces
         for the type that implements an interface under the cursor (or selected
         package) is shown in a location list.
    -                                                                *:GoRename*
    +                                                                   *:GoRename*
     :GoRename[!] [to]
     
         Rename the identifier under the cursor to the desired new name. If no
    @@ -464,13 +472,13 @@ CTRL-t
         If [!] is not given the first error is jumped to.
     
     
    -                                                            *:GoGuruScope*
    +                                                                *:GoGuruScope*
     :GoGuruScope [pattern] [pattern2] ... [patternN]
     
    -    Changes the custom |g:go_guru_scope| setting and overrides it with the
    +    Changes the custom |'g:go_guru_scope'| setting and overrides it with the
         given package patterns. The custom scope is cleared (unset) if `""` is
         given as the only path. If no arguments is given it prints the current
    -    custom scope. Example patterns are: 
    +    custom scope. Example patterns are:
     >
           golang.org/x/tools/cmd/guru # a single package
           golang.org/x/tools/...      # all packages beneath dir
    @@ -488,21 +496,21 @@ CTRL-t
         Under the hood, the patterns are all joined to a comma-separated list and
         passed to `guru`'s `-scope` flag.
     
    -                                                              *:GoCallees*
    +                                                                  *:GoCallees*
     :GoCallees
     
    -    Show 'callees' relation for a selected package. A list of possible call
    +    Show "callees" relation for a selected package. A list of possible call
         targets for the type under the cursor (or selected package) is shown in a
         location list.
     
    -                                                              *:GoCallers*
    +                                                                  *:GoCallers*
     :GoCallers
     
    -    Show 'callers' relation for a selected function. A list of possible
    +    Show "callers" relation for a selected function. A list of possible
         callers for the selected function under the cursor is shown in a location
         list.
     
    -                                                              *:GoDescribe*
    +                                                                 *:GoDescribe*
     :GoDescribe
     
         Shows various properties of the selected syntax: its syntactic kind, its
    @@ -511,15 +519,15 @@ CTRL-t
         identifier), etc. Almost any piece of syntax may be described, and the
         guru will try to print all the useful information it can.
     
    -                                                              *:GoCallstack*
    +                                                                *:GoCallstack*
     :GoCallstack
     
    -    Shows 'callstack' relation for the selected function. An arbitrary path
    +    Shows "callstack" relation for the selected function. An arbitrary path
         from the root of the callgraph to the selected function is shown in a
         location list. This may be useful to understand how the function is
         reached in a given program.
     
    -                                                              *:GoFreevars*
    +                                                                 *:GoFreevars*
     :GoFreevars
     
         Enumerates the free variables of the selection. “Free variables†is a
    @@ -532,106 +540,121 @@ CTRL-t
         understand what the inputs are to a complex block of code even if you
         don’t plan to change it.
     
    -                                                            *:GoChannelPeers*
    +                                                             *:GoChannelPeers*
     :GoChannelPeers
     
         Shows the set of possible sends/receives on the channel operand of the
    -    selected send or receive operation; the selection must be a <- token.
    +    selected send or receive operation; the selection must be a `<-` token.
     
         For example, visually select a channel operand in the form of:
    -
    -      "done <- true"
    -
    -    and call |GoChannelPeers| on it. It will show where it was allocated, and
    +>
    +      done <- true
    +<
    +    And call |:GoChannelPeers| on it. It will show where it was allocated, and
         the sending and receiving endings.
     
    -                                                              *:GoReferrers*
    +                                                                *:GoReferrers*
     :GoReferrers
     
         The referrers query shows the set of identifiers that refer to the same
         object as does the selected identifier, within any package in the analysis
         scope.
     
    -                                                              *:GoSameIds*
    +                                                                  *:GoSameIds*
     :GoSameIds
     
         Highlights all identifiers that are equivalent to the identifier under the
         cursor.
     
    -                                                          *:GoSameIdsClear*
    +                                                             *:GoSameIdsClear*
     :GoSameIdsClear
     
         Clears all SameIds highlights from a |:GoSameIds| call.
     
    -                                                              *:GoMetaLinter*
    +                                                            *:GoSameIdsToggle*
    +:GoSameIdsToggle
    +
    +    Toggle between |:GoSameIds| and |:GoSameIdsClear|. 
    +
    +                                                        *:GoSameIdsAutoToggle*
    +:GoSameIdsAutoToggle
    +
    +    Enables or disables automatic highlighting of |:GoSameIds| while moving
    +    the cursor. This basically toggles the option |'g:go_auto_sameids'|
    +    on/off.
    +    If enabled it starts highlighting whenever your cursor is. If disabled it
    +    clears and stops automatic highlighting.
    +
    +                                                               *:GoMetaLinter*
     :GoMetaLinter [path]
     
         Calls the underlying `gometalinter` tool and displays all warnings and
    -    errors in the quickfix window. By default the following linters are
    -    enabled: "'vet', 'golint', 'errcheck'". This can be changed with the
    -    |g:go_metalinter_enabled| variable. To override the command completely use
    -    the variable |g:go_metalinter_command|. To override the maximum linters
    -    execution time use |g:go_metalinter_deadline| variable.
    +    errors in the |quickfix| window. By default the following linters are
    +    enabled: `vet`, `golint`, and `errcheck`. This can be changed with the
    +    |'g:go_metalinter_enabled'| variable. To override the command completely
    +    use the variable |'g:go_metalinter_command'|. To override the maximum
    +    linters execution time use |'g:go_metalinter_deadline'| variable.
     
    -                                                             *:GoGuruTags*
    +                                                                 *:GoGuruTags*
     :GoGuruTags [tags]
     
    -    Changes the custom |g:go_guru_tags| setting and overrides it with the
    +    Changes the custom |'g:go_guru_tags'| setting and overrides it with the
         given build tags. This command cooperate with GoReferrers command when
    -    there exist mulitiple build tags in your project, then you can set one
    -    of the build tags for GoReferrers to find more accurate.
    +    there exist mulitiple build tags in your project, then you can set one of
    +    the build tags for GoReferrers to find more accurate.
         The custom build tags is cleared (unset) if `""` is given. If no arguments
         is given it prints the current custom build tags.
     
                                                                          *:AsmFmt*
     :AsmFmt
     
    -    Filter the current Go asm buffer through asmfmt. It tries to preserve cursor
    -    position and avoids replacing the buffer with stderr output.
    +    Filter the current Go asm buffer through asmfmt. It tries to preserve
    +    cursor position and avoids replacing the buffer with stderr output.
     
    -
    -                                                                   *:GoAlternate*
    +                                                                *:GoAlternate*
     :GoAlternate[!]
     
    -    Alternates between the implementation and test code. For example if in main.go,
    -    switch to main_test.go. Uses the |g:go_alternate_mode| setting as the command
    -    to open the file.
    +    Alternates between the implementation and test code. For example if in
    +    main.go, switch to main_test.go. Uses the |'g:go_alternate_mode'| setting
    +    as the command to open the file.
     
    -    If [!] is given then it switches to the new file even if it does not exist.
    +    If [!] is given then it switches to the new file even if it does not
    +    exist.
     
    -    If you would like to override the traditional commands for alternating, add
    -    the following to your .vimrc:
    +    If you would like to override the traditional commands for alternating,
    +    add the following to your .vimrc:
     >
         augroup go
           autocmd!
    -      autocmd Filetype go command! -bang A call go#alternate#Switch(0, 'edit')
    -      autocmd Filetype go command! -bang AV call go#alternate#Switch(0, 'vsplit')
    -      autocmd Filetype go command! -bang AS call go#alternate#Switch(0, 'split')
    +      autocmd Filetype go
    +        \  command! -bang A call go#alternate#Switch(0, 'edit')
    +        \| command! -bang AV call go#alternate#Switch(0, 'vsplit')
    +        \| command! -bang AS call go#alternate#Switch(0, 'split')
         augroup END
     <
    -                                                              *:GoDecls*
    +                                                                *:GoWhicherrs*
    +:GoWhicherrs
    +
    +    Show the list of possible constants, global variables, and concrete types
    +    for the error type under the cursor in a location list.
    +
    +                                                                    *:GoDecls*
     :GoDecls [file]
    -  
    +
         Only enabled if `ctrlp.vim` is installed. If run shows all function and
         type declarations for the current file. If [file] is non empty it parses
    -    the given file. 
    -    By default `type` and `func` declarations are being showed. This can be
    -    changed via |g:go_decls_includes|, which accepts a comma delimited list of
    -    definitions. By default set to: `"func,type"`. Possible options are:
    -    `{func,type}`
    +    the given file.
    +    By default `type` and `func` declarations are shown. This can be changed
    +    via |'g:go_decls_includes'|.
     
    -                                                              *:GoDeclsDir*
    +                                                                 *:GoDeclsDir*
     :GoDeclsDir [dir]
    -  
    +
         Only enabled if `ctrlp.vim` is installed. If run shows all function and
         type declarations for the current directory. If [dir] is given it parses
         the given directory.
    -    By default `type` and `func` declarations are being showed. This can be
    -    changed via |g:go_decls_includes|, which accepts a comma delimited list of
    -    definitions. By default set to: `"func,type"`. Possible options are:
    -    `{func,type}`
     
    -                                                              *:GoImpl*
    +                                                                     *:GoImpl*
     :GoImpl [receiver] [interface]
     
         Generates method stubs for implementing an interface. If no arguments is
    @@ -642,9 +665,48 @@ CTRL-t
           :GoImpl f *Foo io.Writer
           :GoImpl T io.ReadWriteCloser
     <
    -  
    +                                                                  *:GoAddTags*
    +:[range]GoAddTags [key] [key1] ...
     
    -===============================================================================
    +    Adds field tags for the fields of a struct. If called inside a struct it
    +    automatically add field tags with the `json` key and the value
    +    automatically generated based on the field name. An error message is given
    +    if it's called outside a struct definition.
    +
    +    If [range] is given, only the selected fields will be changed.
    +
    +    The default `json` can be changed by providing one or more [key]
    +    arguments. An example of adding `xml` and `db` would be:
    +>
    +      :GoAddTags xml db
    +<
    +                                                       *:GoAutoTypeInfoToggle*
    +:GoAutoTypeInfoToggle
    +
    +    Toggles |'g:go_auto_type_info'|.
    +
    +                                                        *:GoFmtAutoSaveToggle*
    +:GoFmtAutoSaveToggle
    +
    +    Toggles |'g:go_fmt_autosave'|.
    +
    +                                                     *:GoAsmFmtAutoSaveToggle*
    +:GoAsmFmtAutoSaveToggle
    +
    +    Toggles |'g:go_asmfmt_autosave'|.
    +
    +                                                 *:GoMetalinterAutoSaveToggle*
    +:GoMetalinterAutoSaveToggle
    +
    +    Toggles |'g:go_metalinter_autosave'|.
    +
    +                                                 *:GoTemplateAutoCreateToggle*
    +:GoTemplateAutoCreateToggle
    +
    +    Toggles |'g:go_template_autocreate'|.
    +
    +
    +==============================================================================
     MAPPINGS                                                        *go-mappings*
     
     vim-go has several  keys which can be used to create custom mappings
    @@ -657,11 +719,11 @@ As always one is free to create more advanced mappings or functions based with
     |go-commands|. For more information please check out the mappings command
     documentation in the |go-commands| section. Available  keys are:
     
    -                                                                  *(go-run)*
    +                                                                    *(go-run)*
     
     Calls `go run` for the current main package
     
    -                                                               *(go-run-tab)*
    +                                                                *(go-run-tab)*
     
     Calls `go run` for the current file in a new terminal tab
     This option is neovim only.
    @@ -671,46 +733,45 @@ This option is neovim only.
     Calls `go run` for the current file in a new terminal horizontal split
     This option is neovim only.
     
    -                                                              *(go-run-vertical)*
    +                                                           *(go-run-vertical)*
     
     Calls `go run` for the current file in a new terminal vertical split
     This option is neovim only.
     
    -
    -                                                                *(go-build)*
    +                                                                  *(go-build)*
     
     Calls `go build` for the current package
     
    -                                                                *(go-generate)*
    +                                                               *(go-generate)*
     
     Calls `go generate` for the current package
     
    -                                                                 *(go-info)*
    +                                                                   *(go-info)*
     
     Shows type information for the word under the cursor
     
    -                                                              *(go-install)*
    +                                                                *(go-install)*
     
     Calls `go install` for the current package
     
    -                                                                 *(go-test)*
    +                                                                   *(go-test)*
     
     Calls `go test` for the current package
     
    -                                                          *(go-test-func)*
    +                                                              *(go-test-func)*
     
     Calls `go test -run '...'` for the test function immediate to cursor
     
    -                                                          *(go-test-compile)*
    +                                                           *(go-test-compile)*
     
     Calls `go test -c` for the current package
     
    -                                                             *(go-coverage)*
    +                                                               *(go-coverage)*
     
     Calls `go test -coverprofile-temp.out` for the current package and shows the
     coverage annotation.
     
    -                                                        *(go-coverage-clear)*
    +                                                         *(go-coverage-clear)*
     
     Clears the coverage annotation
     
    @@ -724,64 +785,62 @@ annotation.
     
     Calls `goimports` for the current package
     
    -                                                                  *(go-vet)*
    +                                                                    *(go-vet)*
     
     Calls `go vet` for the current package
     
     
    -                                                                *(go-files)*
    +                                                                  *(go-files)*
     
     Show source files that depends for the current package
     
     
    -                                                                 *(go-deps)*
    +                                                                   *(go-deps)*
     
     Show dependencies for the current package
     
    -                                                                  *(go-doc)*
    +                                                                    *(go-doc)*
     
     Show the relevant GoDoc for the word under the cursor in a split window
     leftabove (default mode).
     
    -                                                            *(go-doc-split)*
    +                                                              *(go-doc-split)*
     
     Show the relevant GoDoc for the word under the cursor in a split window.
     
     
    -                                                         *(go-doc-vertical)*
    +                                                           *(go-doc-vertical)*
     
     Show the relevant GoDoc for the word under the cursor in a vertical split
     window.
     
    -
    -                                                              *(go-doc-tab)*
    +                                                                *(go-doc-tab)*
     
     Show the relevant GoDoc for the word under the cursor in a tab window.
     
     
    -                                                          *(go-doc-browser)*
    +                                                            *(go-doc-browser)*
     
     Show the relevant GoDoc for the word under in browser
     
    -                                                                  *(go-def)*
    +                                                                    *(go-def)*
     
     Goto declaration/definition. Results are shown in the current buffer.
     
    +                                                              *(go-def-split)*
     
    -                                                            *(go-def-split)*
    +Goto declaration/definition. Results are shown in a split window.
    +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
     
    -Goto declaration/definition. Results are shown in a split window. 
    -Jumps to an existing buffer if |g:go_def_reuse_buffer| is enabled.
    -
    -                                                         *(go-def-vertical)*
    +                                                           *(go-def-vertical)*
     
     Goto declaration/definition. Results are shown in a vertical split window.
    -Jumps to an existing buffer if |g:go_def_reuse_buffer| is enabled.
    +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
     
    -                                                              *(go-def-tab)*
    +                                                                *(go-def-tab)*
     
     Goto declaration/definition. Results are shown in a tab window.
    -Jumps to an existing buffer if |g:go_def_reuse_buffer| is enabled.
    +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled.
     
                                                                   *(go-def-stack)*
     
    @@ -791,77 +850,76 @@ Shows the godef tag stack
     
     Resets and clears the tag stack
     
    -                                                              *(go-def-pop)*
    +                                                                *(go-def-pop)*
     
     Jump to previous entry in the tag stack
     
    -                                                            *(go-implements)*
    +                                                             *(go-implements)*
     
     Show the interfaces that the type under the cursor implements.
     
    -                                                                *(go-rename)*
    +                                                                 *(go-rename)*
     
     Rename the identifier under the cursor to the desired new name
     
    -                                                              *(go-callees)*
    +                                                                *(go-callees)*
     
     Show the call targets for the type under the cursor
     
    -                                                              *(go-callers)*
    +                                                                *(go-callers)*
     
     Show possible callers of selected function
     
    -                                                             *(go-describe)*
    +                                                               *(go-describe)*
     
     Describe selected syntax: definition, methods, etc
     
    -
    -                                                            *(go-callstack)*
    +                                                              *(go-callstack)*
     
     Show path from callgraph root to selected function
     
    -                                                             *(go-freevars)*
    +                                                               *(go-freevars)*
     
     Show free variables of selection
     
    -                                                          *(go-channelpeers)*
    +                                                           *(go-channelpeers)*
     
     Show send/receive corresponding to selected channel op
     
    -                                                            *(go-referrers)*
    +                                                              *(go-referrers)*
     
     Show all refs to entity denoted by selected identifier
     
    -                                                            *(go-metalinter)*
    +                                                             *(go-metalinter)*
     
     Calls `go-metalinter` for the current directory
     
    -                                                        *(go-alternate-edit)*
    +                                                         *(go-alternate-edit)*
     
     Alternates between the implementation and test code in the current window
     
    -                                                      *(go-alternate-split)*
    +                                                        *(go-alternate-split)*
     
     Alternates between the implementation and test code in a new horizontal split
     
    -                                                    *(go-alternate-vertical)*
    +                                                     *(go-alternate-vertical)*
     
     Alternates between the implementation and test code in a new vertical split
     
    -                                                                *(go-import)*
    +                                                                 *(go-import)*
     
     Calls `:GoImport` for the current package
     
     
    -===============================================================================
    +==============================================================================
     TEXT OBJECTS                                                 *go-text-objects*
     
     vim-go comes with several custom |text-objects| that can be used to operate
     upon regions of text. vim-go currently defines the following text objects:
     
                                                    *go-v_af* *go-af*
    -af			      "a function", select contents from a function definition to the
    -               closing bracket. If |g:go_textobj_include_function_doc| is
    +af            "a function", select contents from a function definition to the
    +               closing bracket. If |'g:go_textobj_include_function_doc'| is
                    enabled it also includes the comment doc for a function
                    declaration. This text-object also supports literal functions.
     
    @@ -874,9 +932,9 @@ if            "inside a function", select contents of a function,
     vim-go also defines the following text motion objects:
     
                                                    *go-v_]]* *go-]]*
    -]]			      [count] forward to next function declaration. If 
    -              |g:go_textobj_include_function_doc| is enabled and if your 
    -              on a comment, it skips the function which the comment 
    +]]            [count] forward to next function declaration. If
    +              |'g:go_textobj_include_function_doc'| is enabled and if your
    +              on a comment, it skips the function which the comment
                   belongs and forwards to the next function declaration.
     
                                                    *go-v_[[* *go-[[*
    @@ -884,34 +942,33 @@ vim-go also defines the following text motion objects:
     
     
     
    -===============================================================================
    +==============================================================================
     FUNCTIONS                                                       *go-functions*
     
                                                       *go#jobcontrol#Statusline()*
     
     Shows the status of a job running asynchronously. Can be used to plug into the
     statusline. It works to show the status per package instead of per
    -file. Assume you have three files open, all belonging to the same package,
    -if the package build (`:GoBuild`) is successful, all statusline's will be empty
    +file. Assume you have three files open, all belonging to the same package, if
    +the package build (`:GoBuild`) is successful, all statusline's will be empty
     (means SUCCESS), if you it fails all file's statusline will show FAILED.
     
    -                                                      *go#complete#GetInfo()*
    +                                                       *go#complete#GetInfo()*
     
     Returns the description of the identifer under the cursor. Can be used to plug
    -into the statusline. This function is also used for |g:go_auto_type_info|.
    +into the statusline. This function is also used for |'g:go_auto_type_info'|.
     
    -===============================================================================
    +==============================================================================
     SETTINGS                                                        *go-settings*
     
    -                                                      *'g:go_test_timeout'*
    +                                                         *'g:go_test_timeout'*
     
     Use this option to change the test timeout of |:GoTest|. By default it is
     set to 10 seconds . >
     
       let g:go_test_timeout= '10s'
     <
    -
    -                                                *'g:go_play_browser_command'*
    +                                                 *'g:go_play_browser_command'*
     
     Use this option to change the browser that is used to open the snippet url
     posted to play.golang.org with |:GoPlay| or for the relevant documentation
    @@ -920,29 +977,29 @@ the current OS. >
     
       let g:go_play_browser_command = ''
     <
    -                                                   *'g:go_play_open_browser'*
    +                                                    *'g:go_play_open_browser'*
     
     Use this option to open browser after posting the snippet to play.golang.org
     with |:GoPlay|. By default it's enabled. >
     
       let g:go_play_open_browser = 1
     <
    -                                                      *'g:go_auto_type_info'*
    +                                                       *'g:go_auto_type_info'*
     
    -Use this option to show the type info (|:GoInfo|) for the word under the cursor
    -automatically. Whenever the cursor changes the type info will be updated.
    -By default it's disabled.
    +Use this option to show the type info (|:GoInfo|) for the word under the
    +cursor automatically. Whenever the cursor changes the type info will be
    +updated. By default it's disabled.
     >
       let g:go_auto_type_info = 0
     <
    -                                                      *'g:go_auto_sameids'*
    +                                                         *'g:go_auto_sameids'*
     
     Use this option to highlight all uses of the identifier under the cursor
     (:GoSameIds) automatically. By default it's disabled.
     >
       let g:go_auto_sameids = 0
     <
    -                                                      *'g:go_jump_to_error'*
    +                                                        *'g:go_jump_to_error'*
     
     Use this option to enable/disable passing the bang attribute to the mappings
     |(go-build)|, |(go-run)|, etc..  When enabled it will jump to the first error
    @@ -953,36 +1010,34 @@ changing the behaviour of our custom static mappings. By default it's enabled.
     >
       let g:go_jump_to_error = 1
     <
    -                                                        *'g:go_fmt_autosave'*
    +                                                         *'g:go_fmt_autosave'*
     
     Use this option to auto |:GoFmt| on save. By default it's enabled >
     
       let g:go_fmt_autosave = 1
     <
    -                                                         *'g:go_fmt_command'*
    +                                                          *'g:go_fmt_command'*
     
     Use this option to define which tool is used to gofmt. By default `gofmt` is
     used >
     
       let g:go_fmt_command = "gofmt"
     <
    -                                                         *'g:go_fmt_options'*
    +                                                          *'g:go_fmt_options'*
     
    -Use this option to add additional options to the |g:go_fmt_command|. Default
    +Use this option to add additional options to the |'g:go_fmt_command'|. Default
     is empty. >
     
       let g:go_fmt_options = ''
     <
    +                                                    *'g:go_fmt_fail_silently'*
     
    -                                                   *'g:go_fmt_fail_silently'*
    -
    -Use this option to disable showing a location list when |g:go_fmt_command|
    +Use this option to disable showing a location list when |'g:go_fmt_command'|
     fails. By default the location list is shown. >
     
       let g:go_fmt_fail_silently = 0
     <
    -
    -                                                   *'g:go_fmt_experimental'*
    +                                                     *'g:go_fmt_experimental'*
     
     Use this option to enable fmt's experimental mode. This experimental mode is
     superior to the current mode as it fully saves the undo history, so undo/redo
    @@ -991,15 +1046,15 @@ it's causing problems on some Vim versions. By default it's disabled. >
     
       let g:go_fmt_experimental = 0
     <
    -                                              *'g:go_doc_keywordprg_enabled'*
    +                                               *'g:go_doc_keywordprg_enabled'*
     
    -Use this option to run `godoc` on words under the cursor with the default
    -K , keywordprg shortcut. Usually this shortcut is set to use the program `man`.
    -In Go, using `godoc` is more idiomatic. Default is enabled. >
    +Use this option to run `godoc` on words under the cursor with the default K ,
    +keywordprg shortcut. Usually this shortcut is set to use the program `man`. In
    +Go, using `godoc` is more idiomatic. Default is enabled. >
     
       let g:go_doc_keywordprg_enabled = 1
     <
    -                                                            *'g:go_def_mode'*
    +                                                             *'g:go_def_mode'*
     
     Use this option to define the command to be used for |:GoDef|. By default
     `guru` is being used as it covers all edge cases. But one might also use
    @@ -1007,11 +1062,11 @@ Use this option to define the command to be used for |:GoDef|. By default
     
       let g:go_def_mode = 'guru'
     <
    -                                                 *'g:go_def_mapping_enabled'*
    +                                                  *'g:go_def_mapping_enabled'*
     
     Use this option to enable/disable the default mapping of CTRL-] and (`gd`) for
    -GoDef and CTRL-t for :GoDefPop. Disabling it allows you to map something else to
    -these keys or mappings. Default is enabled. >
    +GoDef and CTRL-t for :GoDefPop. Disabling it allows you to map something else
    +to these keys or mappings. Default is enabled. >
     
       let g:go_def_mapping_enabled = 1
     <
    @@ -1022,25 +1077,24 @@ mappings of |:GoDef|. By default it's disabled. >
     
       let g:go_def_reuse_buffer = 0
     <
    +                                                     *'g:go_dispatch_enabled'*
     
    -                                                    *'g:go_dispatch_enabled'*
    -
    -Use this option to enable/disable the use of Dispatch to execute the
    -`:GoRun`, `:GoBuild` and `:GoGenerate` commands. More information about Dispatch
    -is available at https://github.com/tpope/vim-dispatch. Default is disabled. >
    +Use this option to enable/disable the use of Dispatch to execute the `:GoRun`,
    +`:GoBuild` and `:GoGenerate` commands. More information about Dispatch is
    +available at https://github.com/tpope/vim-dispatch. Default is disabled. >
     
       let g:go_dispatch_enabled = 0
     <
    -                                                         *'g:go_doc_command'*
    +                                                          *'g:go_doc_command'*
     
     Use this option to define which tool is used to godoc. By default `godoc` is
     used >
     
       let g:go_doc_command = "godoc"
     <
    -                                                         *'g:go_doc_options'*
    +                                                          *'g:go_doc_options'*
     
    -Use this option to add additional options to the |g:go_doc_command|. Default
    +Use this option to add additional options to the |'g:go_doc_command'|. Default
     is empty. >
     
       let g:go_doc_options = ''
    @@ -1048,20 +1102,19 @@ is empty. >
     <                                                            *'g:go_bin_path'*
     
     Use this option to change default path for vim-go tools when using
    -|GoInstallBinaries| and |GoUpdateBinaries|. If not set `$GOBIN` or
    +|:GoInstallBinaries| and |:GoUpdateBinaries|. If not set `$GOBIN` or
     `$GOPATH/bin` is used. >
     
       let g:go_bin_path = ""
     <
    -                                                      *'g:go_snippet_engine'*
    +                                                       *'g:go_snippet_engine'*
     
     Use this option to define the default snippet engine.  By default "ultisnips"
     is used. Use "neosnippet" for neosnippet.vim: >
     
       let g:go_snippet_engine = "ultisnips"
     <
    -
    -                                                  *'g:go_snippet_case_type'*
    +                                                    *'g:go_snippet_case_type'*
     
     Use this option to define the default conversion type of snippet expansion for
     field tags. For the following case, if `snakecase` is used the `json` snippet
    @@ -1078,38 +1131,44 @@ If "camelcase" is used:
         FooBarQuz string `json:"fooBarQuz"
       }
     <
    -By default "snakecase" is used. Current values are: ["snakecase", "camelcase"].
    +By default "snakecase" is used. Current values are: ["snakecase",
    +"camelcase"].
     >
       let g:go_snippet_case_type = "snakecase"
     <
    +                                                           *'g:go_get_update'*
     
    -                                                         *'g:go_get_update'*
    -
    -Use this option to disable updating dependencies with |GoInstallBinaries|. By
    +Use this option to disable updating dependencies with |:GoInstallBinaries|. By
     default this is enabled.
     >
       let g:go_get_update = 1
     <
    -
    -                                                         *'g:go_guru_scope'*
    +                                                           *'g:go_guru_scope'*
     
     Use this option to define the scope of the analysis to be passed for guru
    -related commands, such as |GoImplements|, |GoCallers|, etc.You can change it
    -on-the-fly with |GoGuruScope|. The input should be a a list of package
    +related commands, such as |:GoImplements|, |:GoCallers|, etc. You can change
    +it on-the-fly with |:GoGuruScope|. The input should be a a list of package
     pattern. An example input might be:
    -`["github.com/fatih/color","github.com/fatih/structs"]` By default it's not set,
    -so the relevant commands defaults are being used. 
    +`["github.com/fatih/color","github.com/fatih/structs"]` By default it's not
    +set, so the relevant commands defaults are being used.
     >
       let g:go_guru_scope = []
     <
    +                                                        *'g:go_guru_tags'*
     
    -                                      *'g:go_highlight_array_whitespace_error'*
    +These options that will be automatically passed to the `-tags` option of
    +`go guru` when it's invoked with |:GoDef|. You can use |:GoGuruTags| to set
    +this. By default it's not set.
    +>
    +  let g:go_guru_tags = ''
    +<
    +
    +                                     *'g:go_highlight_array_whitespace_error'*
     
     Highlights white space after "[]". >
     
       let g:go_highlight_array_whitespace_error = 1
     <
    -
                                           *'g:go_highlight_chan_whitespace_error'*
     
     Highlights white space around the communications operator (`<-`) that doesn't
    @@ -1117,14 +1176,12 @@ follow the standard style. >
     
       let g:go_highlight_chan_whitespace_error = 1
     <
    -
                                                     *'g:go_highlight_extra_types'*
     
     Highlights commonly used library types (io.Reader, etc.). >
     
       let g:go_highlight_extra_types = 1
     <
    -
                                                 *'g:go_highlight_space_tab_error'*
     
     Highlights instances of tabs following spaces. >
    @@ -1136,100 +1193,106 @@ Highlights instances of tabs following spaces. >
     Highlights trailing white space. >
     
       let g:go_highlight_trailing_whitespace_error = 1
    -
     <
                                                       *'g:go_highlight_operators'*
     
     Highlights operators such as `:=` , `==`, `-=`, etc. By default it's
     disabled. >
     
    -	let g:go_highlight_operators = 0
    +  let g:go_highlight_operators = 0
     <
    -                                                *'g:go_highlight_functions'*
    +                                                  *'g:go_highlight_functions'*
     
     Highlights function names. By default it's disabled. >
     
    -	let g:go_highlight_functions = 0
    +  let g:go_highlight_functions = 0
     <
    -                                                  *'g:go_highlight_methods'*
    +                                                    *'g:go_highlight_methods'*
     
     Highlights method names. By default it's disabled. >
     
    -	let g:go_highlight_methods = 0
    +  let g:go_highlight_methods = 0
     <
    -                                                  *'g:go_highlight_types'*
    +                                                      *'g:go_highlight_types'*
     
     Highlights struct and interface names. By default it's disabled. >
     
       let g:go_highlight_types = 0
     <
    -                                                  *'g:go_highlight_fields'*
    +                                                     *'g:go_highlight_fields'*
     
     Highlights field names. By default it's disabled. >
     
       let g:go_highlight_fields = 0
     <
    -                                        *'g:go_highlight_build_constraints'*
    +                                          *'g:go_highlight_build_constraints'*
     
     Highlights build constraints. By default it's disabled. >
     
    -	let g:go_highlight_build_constraints = 0
    +  let g:go_highlight_build_constraints = 0
     <
    -                                        *'g:go_highlight_string_spellcheck*
    +                                          *'g:go_highlight_string_spellcheck'*
     
     Use this option to highlight spelling errors in strings when |spell| is
     also enabled. By default it's enabled. >
     
    -	let g:go_highlight_string_spellcheck = 1
    +  let g:go_highlight_string_spellcheck = 1
     <
    -                                        *'g:go_highlight_format_strings*
    +                                             *'g:go_highlight_format_strings'*
     
     Use this option to highlight printf-style operators inside string literals.
     By default it's enabled. >
     
    -	let g:go_highlight_format_strings = 1
    +  let g:go_highlight_format_strings = 1
     <
    -                                                *'g:go_autodetect_gopath'*
    +                                                    *'g:go_autodetect_gopath'*
     
     Automatically modifies GOPATH for certain directory structures, such as for
     the tool `godep` which has his own dependencies via the `Godeps` folder. What
     this means is that all tools are now working with the newly modified GOPATH.
    -So |GoDef| for example jumps to the source inside the `Godeps` (vendored)
    +So |:GoDef| for example jumps to the source inside the `Godeps` (vendored)
     source. Currently `godep` and `gb` is supported, in the near future more tool
     supports will be added. By default it's enabled. >
     
    -	let g:go_autodetect_gopath = 1
    +  let g:go_autodetect_gopath = 1
     <
    -                                                  *'g:go_textobj_enabled'*
    +                                                      *'g:go_textobj_enabled'*
     
     Adds custom text objects. By default it's enabled. >
     
    -	let g:go_textobj_enabled = 1
    +  let g:go_textobj_enabled = 1
     <
    -                                                 *'g:go_metalinter_autosave'*
    +                                         *'g:go_textobj_include_function_doc'*
    +
    +Consider the comment above a function to be part of the function when using
    +the `af` text object and `[[` motion. By default it's enabled. >
    +
    +  let g:go_textobj_include_function_doc = 1
    +<
    +                                                  *'g:go_metalinter_autosave'*
     
     Use this option to auto |:GoMetaLinter| on save. Only linter messages for
     the active buffer will be shown. By default it's disabled >
     
       let g:go_metalinter_autosave = 0
     <
    -                                         *'g:go_metalinter_autosave_enabled'*
    +                                          *'g:go_metalinter_autosave_enabled'*
     
    -Specifies the enabled linters for auto |GoMetaLinter| on save. By
    +Specifies the enabled linters for auto |:GoMetaLinter| on save. By
     default it's using `vet` and `golint`.
     >
       let g:go_metalinter_autosave_enabled = ['vet', 'golint']
     <
    -                                                  *'g:go_metalinter_enabled'*
    +                                                   *'g:go_metalinter_enabled'*
     
    -Specifies the currently enabled linters for the |GoMetaLinter| command. By
    +Specifies the currently enabled linters for the |:GoMetaLinter| command. By
     default it's using `vet`, `golint` and `errcheck`.
     >
       let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck']
     <
    -                                                  *'g:go_metalinter_command'*
    +                                                   *'g:go_metalinter_command'*
     
    -Overrides the command to be executed when |GoMetaLinter| is called. This is
    +Overrides the command to be executed when |:GoMetaLinter| is called. This is
     an advanced settings and is for users who want to have a complete control
     over how `gometalinter` should be executed. By default it's empty.
     >
    @@ -1242,7 +1305,7 @@ seconds.
     >
       let g:go_metalinter_deadline = "5s"
     <
    -                                                  *'g:go_list_height'*
    +                                                          *'g:go_list_height'*
     
     Specifies the window height for the quickfix and location list windows. The
     default value (empty) automatically sets the height to the number of items
    @@ -1251,7 +1314,7 @@ explicitly overrides this behavior. For standard Vim behavior, set it to 10.
     >
       let g:go_list_height = 0
     <
    -                                                  *'g:go_list_type'*
    +                                                            *'g:go_list_type'*
     
     Specifies the type of list to use. The default value (empty) will use the
     appropriate kind of list for the command that was called. Supported values are
    @@ -1259,13 +1322,13 @@ appropriate kind of list for the command that was called. Supported values are
     
       let g:go_list_type = ""
     <
    -                                                  *'g:go_asmfmt_autosave'*
    +                                                      *'g:go_asmfmt_autosave'*
     
     Use this option to auto |:AsmFmt| on save. By default it's enabled. >
     
       let g:go_asmfmt_autosave = 1
     <
    -                                                       *g:go_term_mode*
    +                                                            *'g:go_term_mode'*
     
     This option is Neovim only. Use it to change the default command used to
     open a new terminal for go commands such as |:GoRun|.
    @@ -1273,8 +1336,8 @@ The default is vsplit.
     >
       let g:go_term_mode = "vsplit"
     <
    -                                                       *g:go_term_height*
    -                                                        *g:go_term_width*
    +                                                          *'g:go_term_height'*
    +                                                           *'g:go_term_width'*
     
     These options are Neovim only. Use them to control the height and width of
     a terminal split. By default these are not set, meaning that the height and
    @@ -1286,51 +1349,51 @@ For example here is how to set each to 30.
       let g:go_term_height = 30
       let g:go_term_width = 30
     <
    -                                                       *g:go_term_enabled*
    +                                                         *'g:go_term_enabled'*
     
     This option is Neovim only. Use it to change the behavior of the test
     commands. If set to 1 it opens the test commands inside a new terminal
    -according to |g:go_term_mode|, otherwise it will run them in the background
    -just like `:GoBuild` and then display the status with |go#jobcontrol#Statusline()|.
    -By default it is disabled.
    +according to |'g:go_term_mode'|, otherwise it will run them in the background
    +just like `:GoBuild` and then display the status with
    +|go#jobcontrol#Statusline()|. By default it is disabled.
     >
       let g:go_term_enabled = 0
     <
    -                                                        *g:go_alternate_mode*
    +                                                       *'g:go_alternate_mode'*
     
     Specifies the command that |:GoAlternate| uses to open the alternate file.
     By default it is set to edit.
     >
       let g:go_alternate_mode = "edit"
     <
    -                                                       *g:go_gorename_prefill*
    +                                                     *'g:go_gorename_prefill'*
     
     Specifies whether |:GoRename| prefills the new identifier name with the
     word under the cursor. By default it is enabled.
     >
       let g:go_gorename_prefill = 1
     <
    -                                                       *g:go_gocode_autobuild*
    +                                                     *'g:go_gocode_autobuild'*
     
     Specifies whether `gocode` should automatically build out-of-date packages
    -when their source fiels are modified, in order to obtahin the freshes
    +when their source fields are modified, in order to obtain the freshest
     autocomplete results for them.  By default it is enabled.
     >
       let g:go_gocode_autobuild = 1
     <
    -                                                *g:go_gocode_propose_builtins*
    +                                              *'g:go_gocode_propose_builtins'*
     
     Specifies whether `gocode` should add built-in types, functions and constants
     to an autocompletion proposals. By default it is enabled.
     >
       let g:go_gocode_propose_builtins = 1
     <
    -                                                      *g:go_template_autocreate*
    +                                                  *'g:go_template_autocreate'*
     
     When a new Go file is created, vim-go automatically fills the buffer content
     with a Go code template. By default the template under
     `templates/hello_world.go` is used. This can be changed with the
    -|g:go_template_file| setting. 
    +|'g:go_template_file'| setting.
     
     If the new file is created in an already prepopulated package (with other Go
     files), in this case a Go code template with only the Go package declaration
    @@ -1340,64 +1403,81 @@ By default it is enabled.
     >
       let g:go_template_autocreate = 1
     <
    -                                                      *g:go_template_file*
    +                                                        *'g:go_template_file'*
     
     Specifies the file under the `templates` folder that is used if a new Go file
    -is created. Checkout |g:go_template_autocreate| for more info. By default the
    -`hello_world.go` file is used.
    +is created. Checkout |'g:go_template_autocreate'| for more info. By default
    +the `hello_world.go` file is used.
     >
       let g:go_template_file = "hello_world.go"
     <
    -===============================================================================
    +                                                       *'g:go_decls_includes'*
    +
    +    Only useful if `ctrlp.vim` is installed. This sets which declarations to
    +    show for |:GoDecls|.
    +    It is a Comma delimited list Possible options are: {func,type}.
    +    The default is: >
    +
    +      let g:go_decls_includes = 'func,type'
    +<
    +==============================================================================
     TROUBLESHOOTING                                         *go-troubleshooting*
     
    -I'm using Fish shell but have some problems using vim-go~
    +I get "not an editor command" error when I invoke :GoXXX~
     
    -First environment variables in Fish are applied differently, it should be like:
    +This happens if vim-go is not installed properly. Be sure you have added this
    +line into your vimrc:
     >
    -	set -x GOPATH /your/own/gopath
    +  filetype plugin indent on
     <
    -Second, Vim needs a POSIX compatible shell (more info here:
    -https://github.com/dag/vim-fish#teach-a-vim-to-fish). If you use Fish to open
    -Vim, it will make certain shell based commands fail (means vim-go will fail
    -too). To overcome this problem change the default shell by adding the
    -following into your .vimrc (on the top of the file):
    ->
    -	if $SHELL =~ 'fish'
    -	  set shell='/bin/sh'
    -	endif
    -<
    -or
    ->
    -	set shell='/bin/sh'
    ->
     
    -I'm seeing weird errors during installation of binaries with
    -GoInstallBinaries:
    +I get a "command not found" error when I invoke :GoXXX~
    +
    +If you try to call |:GoDef|, |:GoInfo| and get a command not found, check that
    +you have the binaries installed by using |:GoInstallBinaries|.
    +
    +Before opening vim, check your current $PATH:
    +>
    +  echo $PATH
    +<
    +After opening vim, run `:echo $PATH`, the output must be your current `$PATH`
    +plus `$GOPATH/bin` (the location where |:GoInstallBinaries| installed the
    +binaries).
    +
    +
    +Vim becomes slow while editing Go files~
    +
    +Don't enable these options:
    +>
    +  let g:go_highlight_structs = 0
    +  let g:go_highlight_interfaces = 0
    +  let g:go_highlight_operators = 0
    +<
    +
    +I get errors when using GoInstallBinaries~
     
     If you see errors like this:
     >
    -  Error installing code.google.com/p/go.tools/cmd/goimports:
    -	Error installing code.google.com/p/rog-go/exp/cmd/godef:
    +  Error installing golang.org/x/tools/cmd/goimports
     <
     that means your local Go setup is broken or the remote website is down.  For
    -example sometimes code.google.com times out. To test, just execute a simple go
    -get:
    +example sometimes code.google.com times out. To test, just execute a simple
    +`go get`:
     
    ->
    -	go get code.google.com/p/go.tools/cmd/goimports
    +  go get golang.org/x/tools/cmd/goimports
     <
     You'll see a more detailed error. If this works, vim-go will work too.
     
    -===============================================================================
    +
    +==============================================================================
     CREDITS                                                         *go-credits*
     
    -* Go Authors for official vim plugins
    +* Go Authors for official Vim plugins.
     * Gocode, Godef, Golint, Guru, Goimports, Errcheck projects and authors of
       those projects.
     * Other vim-plugins, thanks for inspiration (vim-golang, go.vim, vim-gocode,
    -  vim-godef)
    -* vim-go contributors: https://github.com/fatih/vim-go/graphs/contributors
    +  vim-godef).
    +* vim-go contributors: https://github.com/fatih/vim-go/graphs/contributors.
     
     
     vim:ft=help:et:ts=2:sw=2:sts=2:norl
    diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim
    index 31e1f044..89c1a984 100644
    --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim
    +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim
    @@ -4,6 +4,7 @@ command! -nargs=? GoRename call go#rename#Rename(0,)
     " -- guru
     command! -nargs=* -complete=customlist,go#package#Complete GoGuruScope call go#guru#Scope()
     command! -range=% GoImplements call go#guru#Implements()
    +command! -range=% GoWhicherrs call go#guru#Whicherrs()
     command! -range=% GoCallees call go#guru#Callees()
     command! -range=% GoDescribe call go#guru#Describe()
     command! -range=% GoCallers call go#guru#Callers()
    @@ -12,13 +13,20 @@ command! -range=% GoFreevars call go#guru#Freevars()
     command! -range=% GoChannelPeers call go#guru#ChannelPeers()
     command! -range=% GoReferrers call go#guru#Referrers()
     command! -nargs=? GoGuruTags call go#guru#Tags()
    +
    +
    +command! -nargs=* -range GoAddTags call go#util#AddTags(, , )
    +
     command! -range=% GoSameIds call go#guru#SameIds()
     command! -range=0 GoSameIdsClear call go#guru#ClearSameIds()
    +command! -range=% GoSameIdsToggle call go#guru#ToggleSameIds()
    +command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds()
     
     " -- tool
     command! -nargs=0 GoFiles echo go#tool#Files()
     command! -nargs=0 GoDeps echo go#tool#Deps()
     command! -nargs=* GoInfo call go#complete#Info(0)
    +command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo()
     
     " -- cmd
     command! -nargs=* -bang GoBuild call go#cmd#Build(0,)
    @@ -50,8 +58,12 @@ command! -nargs=* -range -complete=customlist,go#package#Complete GoDocBrowser c
     
     " -- fmt
     command! -nargs=0 GoFmt call go#fmt#Format(-1)
    +command! -nargs=0 GoFmtAutoSaveToggle call go#fmt#ToggleFmtAutoSave()
     command! -nargs=0 GoImports call go#fmt#Format(1)
     
    +" -- asmfmt
    +command! -nargs=0 GoAsmFmtAutoSaveToggle call go#asmfmt#ToggleAsmFmtAutoSave()
    +
     " -- import
     command! -nargs=? -complete=customlist,go#package#Complete GoDrop call go#import#SwitchImport(0, '', , '')
     command! -nargs=1 -bang -complete=customlist,go#package#Complete GoImport call go#import#SwitchImport(1, '', , '')
    @@ -59,6 +71,7 @@ command! -nargs=* -bang -complete=customlist,go#package#Complete GoImportAs call
     
     " -- linters
     command! -nargs=* GoMetaLinter call go#lint#Gometa(0, )
    +command! -nargs=0 GoMetalinterAutoSaveToggle call go#lint#ToggleMetaLinterAutoSave()
     command! -nargs=* GoLint call go#lint#Golint()
     command! -nargs=* -bang GoVet call go#lint#Vet(0, )
     command! -nargs=* -complete=customlist,go#package#Complete GoErrCheck call go#lint#Errcheck()
    @@ -75,4 +88,7 @@ endif
     " -- impl
     command! -nargs=* -buffer -complete=customlist,go#impl#Complete GoImpl call go#impl#Impl()
     
    +" -- template
    +command! -nargs=0 GoTemplateAutoCreateToggle call go#template#ToggleAutoCreate()
    +
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/ftplugin/go/mappings.vim b/sources_non_forked/vim-go/ftplugin/go/mappings.vim
    index 7bf8dcf3..b798209d 100644
    --- a/sources_non_forked/vim-go/ftplugin/go/mappings.vim
    +++ b/sources_non_forked/vim-go/ftplugin/go/mappings.vim
    @@ -44,6 +44,8 @@ xnoremap  (go-freevars) :call go#guru#Freevars(0)
     nnoremap  (go-channelpeers) :call go#guru#ChannelPeers(-1)
     nnoremap  (go-referrers) :call go#guru#Referrers(-1)
     nnoremap  (go-sameids) :call go#guru#SameIds(-1)
    +nnoremap  (go-whicherrs) :call go#guru#Whicherrs(-1)
    +nnoremap  (go-sameids-toggle) :call go#guru#ToggleSameIds(-1)
     
     nnoremap  (go-rename) :call go#rename#Rename(!g:go_jump_to_error)
     
    diff --git a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets
    index 15d9b76f..fcb82985 100644
    --- a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets
    +++ b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets
    @@ -189,6 +189,11 @@ snippet json "\`json:key\`"
     \`json:"${1:`!v  go#util#snippetcase(matchstr(getline("."), '\w\+'))`}"\`
     endsnippet
     
    +# yaml field tag
    +snippet yaml "\`yaml:key\`"
    +\`yaml:"${1:`!v  go#util#snippetcase(matchstr(getline("."), '\w\+'))`}"\`
    +endsnippet
    +
     # fallthrough
     snippet ft "fallthrough"
     fallthrough
    diff --git a/sources_non_forked/vim-go/gosnippets/snippets/go.snip b/sources_non_forked/vim-go/gosnippets/snippets/go.snip
    index 413eb1e1..942a82e0 100644
    --- a/sources_non_forked/vim-go/gosnippets/snippets/go.snip
    +++ b/sources_non_forked/vim-go/gosnippets/snippets/go.snip
    @@ -162,6 +162,11 @@ snippet json
     abbr \`json:key\`
     	\`json:"${1:keyName}"\`
     
    +# yaml snippet
    +snippet yaml
    +abbr \`yaml:key\`
    +	\`yaml:"${1:keyName}"\`
    +
     # fallthrough
     snippet ft
     abbr fallthrough
    diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim
    index 3ba16d7e..6c050083 100644
    --- a/sources_non_forked/vim-go/plugin/go.vim
    +++ b/sources_non_forked/vim-go/plugin/go.vim
    @@ -27,7 +27,6 @@ command! GoInstallBinaries call s:GoInstallBinaries(-1)
     command! GoUpdateBinaries call s:GoInstallBinaries(1)
     command! -nargs=? -complete=dir GoPath call go#path#GoPath()
     
    -
     " GoInstallBinaries downloads and install all necessary binaries stated in the
     " packages variable. It uses by default $GOBIN or $GOPATH/bin as the binary
     " target install directory. GoInstallBinaries doesn't install binaries if they
    @@ -143,44 +142,64 @@ function! s:echo_go_info()
       redraws! | echo "vim-go: " | echohl Function | echon item.info | echohl None
     endfunction
     
    +function! s:auto_type_info()
    +  " GoInfo automatic update
    +  if get(g:, "go_auto_type_info", 0)
    +    call go#complete#Info(1)
    +  endif
    +endfunction
    +
    +function! s:auto_sameids()
    +  " GoSameId automatic update
    +  if get(g:, "go_auto_sameids", 0)
    +    call go#guru#SameIds(-1)
    +  endif
    +endfunction
    +
    +function! s:fmt_autosave()
    +  " Go code formatting on save
    +  if get(g:, "go_fmt_autosave", 1)
    +    call go#fmt#Format(-1)
    +  endif
    +endfunction
    +
    +function! s:asmfmt_autosave()
    +  " Go asm formatting on save
    +  if get(g:, "go_asmfmt_autosave", 1)
    +    call go#asmfmt#Format()
    +  endif
    +endfunction
    +
    +function! s:metalinter_autosave()
    +  " run gometalinter on save
    +  if get(g:, "go_metalinter_autosave", 0)
    +    call go#lint#Gometa(1)
    +  endif
    +endfunction
    +
    +function! s:template_autocreate()
    +  " create new template from scratch
    +  if get(g:, "go_template_autocreate", 1)
    +    call go#template#create()
    +  endif
    +endfunction
    +
     augroup vim-go
       autocmd!
     
    -  " GoInfo automatic update
    -  if get(g:, "go_auto_type_info", 0)
    -    autocmd CursorHold *.go nested call go#complete#Info(1)
    -  endif
    -
    -  " GoSameId automatic update
    -  if get(g:, "go_auto_sameids", 0)
    -    autocmd CursorMoved *.go nested call go#guru#SameIds(-1)
    -  endif
    +  autocmd CursorHold *.go call s:auto_type_info()
    +  autocmd CursorHold *.go call s:auto_sameids()
     
       " Echo the identifier information when completion is done. Useful to see
       " the signature of a function, etc...
       if exists('##CompleteDone')
    -    autocmd CompleteDone *.go nested call s:echo_go_info()
    +    autocmd CompleteDone *.go call s:echo_go_info()
       endif
     
    -  " Go code formatting on save
    -  if get(g:, "go_fmt_autosave", 1)
    -    autocmd BufWritePre *.go call go#fmt#Format(-1)
    -  endif
    -
    -  " Go asm formatting on save
    -  if get(g:, "go_asmfmt_autosave", 1)
    -    autocmd BufWritePre *.s call go#asmfmt#Format()
    -  endif
    -
    -  " run gometalinter on save
    -  if get(g:, "go_metalinter_autosave", 0)
    -    autocmd BufWritePost *.go call go#lint#Gometa(1)
    -  endif
    -
    -  " create new template from scratch
    -  if get(g:, "go_template_autocreate", 1)
    -    autocmd BufNewFile *.go call go#template#create()
    -  endif
    +  autocmd BufWritePre *.go call s:fmt_autosave()
    +  autocmd BufWritePre *.s call s:asmfmt_autosave()
    +  autocmd BufWritePost *.go call s:metalinter_autosave()
    +  autocmd BufNewFile *.go call s:template_autocreate()
     augroup END
     
     " vim: sw=2 ts=2 et
    diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim
    index 0ead7527..33315317 100644
    --- a/sources_non_forked/vim-go/syntax/go.vim
    +++ b/sources_non_forked/vim-go/syntax/go.vim
    @@ -271,6 +271,7 @@ hi def link     goSpaceError        Error
     syn keyword     goTodo              contained NOTE
     hi def link     goTodo              Todo
     
    +syn match goVarArgs /\.\.\./
     
     " Operators;
     if g:go_highlight_operators != 0
    @@ -285,9 +286,9 @@ if g:go_highlight_operators != 0
       " match remaining two-char operators: := && || <- ++ --
       syn match goOperator /:=\|||\|<-\|++\|--/
       " match ...
    -  syn match goOperator /\.\.\./
     
    -  hi def link     goPointerOperator   Operator
    +  hi def link     goPointerOperator   goOperator
    +  hi def link     goVarArgs           goOperator
     endif
     hi def link     goOperator          Operator
     
    @@ -306,14 +307,13 @@ hi def link     goFunction          Function
     
     " Methods;
     if g:go_highlight_methods != 0
    -  syn match goMethod                /\.\w\+(/hs=s+1,he=e-1
    +  syn match goMethod                /\.\w\+\ze(/hs=s+1
     endif
     hi def link     goMethod            Type
     
     " Fields;
     if g:go_highlight_fields != 0
    -  syn match goVarArgs               /\.\.\.\w\+\>/
    -  syn match goField                 /\.\a\+\([\ \n\r\:\)\[]\)\@=/hs=s+1
    +  syn match goField                 /\.\w\+\([\ \n\r\:\)\[,]\)\@=/hs=s+1
     endif
     hi def link    goField              Identifier
     
    @@ -366,7 +366,13 @@ if g:go_highlight_build_constraints != 0
       hi def link goPackageComment    Comment
     endif
     
    -hi def link goSameId IncSearch
    +" :GoSameIds
    +hi def goSameId term=bold cterm=bold ctermbg=white ctermfg=black
    +
    +" :GoCoverage commands
    +hi def link goCoverageNormalText Comment
    +hi def      goCoverageCovered    ctermfg=green guifg=#A6E22E
    +hi def      goCoverageUncover    ctermfg=red guifg=#F92672
     
     " Search backwards for a global declaration to start processing the syntax.
     "syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/
    diff --git a/sources_non_forked/vim-snippets/UltiSnips/html.snippets b/sources_non_forked/vim-snippets/UltiSnips/html.snippets
    index fd1aca51..4e92a960 100644
    --- a/sources_non_forked/vim-snippets/UltiSnips/html.snippets
    +++ b/sources_non_forked/vim-snippets/UltiSnips/html.snippets
    @@ -127,7 +127,6 @@ endsnippet
     #############
     snippet input "Input with Label" w
     
    -
     endsnippet
     
     snippet input "XHTML   " w
    @@ -141,9 +140,7 @@ endsnippet
     
     snippet select "Select Box" w
     
     endsnippet
     
    @@ -162,25 +159,25 @@ endsnippet
     
     snippet body ""
     
    -	$0
    +	${0:${VISUAL}}
     
     endsnippet
     
     snippet div "
    " w
    - $0 + ${0:${VISUAL}}
    endsnippet snippet div. "
    with class" w - $0 + ${0:${VISUAL}}
    endsnippet snippet div# "
    with ID & class" w - $0 + ${0:${VISUAL}}
    endsnippet @@ -188,33 +185,39 @@ snippet form "XHTML
    " w - $0 - -

    + ${0:${VISUAL}}
    endsnippet snippet h1 "XHTML

    " w -

    $0

    +

    ${0:${VISUAL}}

    endsnippet snippet h2 "XHTML

    " w -

    $0

    +

    ${0:${VISUAL}}

    endsnippet snippet h3 "XHTML

    " w -

    $0

    +

    ${0:${VISUAL}}

    endsnippet snippet h4 "XHTML

    " w -

    $0

    +

    ${0:${VISUAL}}

    +endsnippet + +snippet h5 "XHTML
    " w +
    ${0:${VISUAL}}
    +endsnippet + +snippet h6 "XHTML
    " w +
    ${0:${VISUAL}}
    endsnippet snippet head "XHTML " ${1:`!p snip.rv = snip.basename or "Page Title"`} - $0 + ${0:${VISUAL}} endsnippet @@ -232,20 +235,19 @@ endsnippet snippet script "XHTML endsnippet snippet style "XHTML endsnippet snippet table "XHTML " w
    - - + ${0:${VISUAL}}
    ${5:Header}
    ${0:Data}
    endsnippet @@ -254,29 +256,29 @@ snippet a "Link" w endsnippet snippet p "paragraph" w -

    $0

    +

    ${0:${VISUAL}}

    endsnippet snippet li "list item" w -
  1. $0
  2. +
  3. ${0:${VISUAL}}
  4. endsnippet snippet ul "unordered list" w
      -$0 + ${0:${VISUAL}}
    endsnippet snippet td "table cell" w -$0 +${0:${VISUAL}} endsnippet snippet th "table header" w -$0 +${0:${VISUAL}} endsnippet snippet tr "table row" w -$0 +${0:${VISUAL}} endsnippet snippet title "XHTML " w @@ -286,7 +288,7 @@ endsnippet snippet fieldset "Fieldset" w <fieldset id="${1/[\w\d]+|( )/(?1:_:\L$0\E)/g}" ${2:class="${3:}"}> <legend>$1</legend> - $0 + ${0:${VISUAL}} </fieldset> endsnippet diff --git a/sources_non_forked/vim-snippets/snippets/elixir.snippets b/sources_non_forked/vim-snippets/snippets/elixir.snippets index 851dc8be..0a3efbdc 100644 --- a/sources_non_forked/vim-snippets/snippets/elixir.snippets +++ b/sources_non_forked/vim-snippets/snippets/elixir.snippets @@ -105,13 +105,17 @@ snippet imp snippet ali alias ${0:module_name} snippet test - test "${1:test_name}" do + test "${1:test name}" do ${0} end snippet testa test "${1:test_name}", %{${2:arg: arg}} do ${0} end +snippet des + describe "${1:test group subject}" do + ${0} + end snippet exunit defmodule ${1:`substitute(vim_snippets#Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} do use ExUnit.Case, async: true diff --git a/sources_non_forked/vim-snippets/snippets/go.snippets b/sources_non_forked/vim-snippets/snippets/go.snippets index b3acac1a..b2bdc9e0 100644 --- a/sources_non_forked/vim-snippets/snippets/go.snippets +++ b/sources_non_forked/vim-snippets/snippets/go.snippets @@ -171,6 +171,9 @@ snippet pn # print snippet pr fmt.Printf("%${1:s}\n", ${2:var}) +# println +snippet pl + fmt.Println("${1:s}") # range snippet rn range ${0} diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets index 0d054f4e..db04e545 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets @@ -30,6 +30,11 @@ snippet (f (function(${1}) { ${0} }(${2})); +# Minify safe iife +snippet ;fe + ;(function(${1}) { + ${0} + }(${2})) # self-defining function snippet sdf var ${1:function_name} = function (${2:argument}) { diff --git a/sources_non_forked/vim-snippets/snippets/vhdl.snippets b/sources_non_forked/vim-snippets/snippets/vhdl.snippets new file mode 100644 index 00000000..f13f5bf9 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/vhdl.snippets @@ -0,0 +1,127 @@ +# +## Libraries + +snippet lib + library ${1} + use ${1}.${2} + +# Standard Libraries +snippet libs + library IEEE; + use IEEE.std_logic_1164.ALL; + use IEEE.numeric_std.ALL; + +# Xilinx Library +snippet libx + library UNISIM; + use UNISIM.VCOMPONENTS.ALL; + +## Entity Declaration +snippet ent + entity ${1:`vim_snippets#Filename()`} is + generic ( + ${2} + ); + port ( + ${3} + ); + end entity $1; + +## Architecture +snippet arc + architecture ${1:behav} of ${2:`vim_snippets#Filename()`} is + + ${3} + + begin + + + end $1; + +## Declarations +# std_logic +snippet st + signal ${1} : std_logic; +# std_logic_vector +snippet sv + signal ${1} : std_logic_vector (${2} downto 0); +# std_logic in +snippet ist + ${1} : in std_logic; +# std_logic_vector in +snippet isv + ${1} : in std_logic_vector (${2} downto 0); +# std_logic out +snippet ost + ${1} : out std_logic; +# std_logic_vector out +snippet osv + ${1} : out std_logic_vector (${2} downto 0); +# unsigned +snippet un + signal ${1} : unsigned (${2} downto 0); +## Process Statements +# process +snippet pr + process (${1}) + begin + ${2} + end process; +# process with clock +snippet prc + process (${1:clk}) + begin + if rising_edge ($1) then + ${2} + end if; + end process; +# process all +snippet pra + process (${1:all}) + begin + ${2} + end process; +## Control Statements +# if +snippet if + if ${1} then + ${2} + end if; +# if +snippet ife + if ${1} then + ${2} + else + ${3} + end if; +# else +snippet el + else + ${1} +# if +snippet eif + elsif ${1} then + ${2} +# case +snippet ca + case ${1} is + ${2} + end case; +# when +snippet wh + when ${1} => + ${2} +# for +snippet for + for ${1:i} in ${2} ${3:to} ${4} loop + ${5} + end loop; +# while +snippet wh + while ${1} loop + ${2} + end loop; +## Misc +# others +snippet oth + (others => '${1:0}'); From f8d1d3bb5008925a1af6a6cad09a915da6aeb7dc Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 20 Aug 2016 13:23:52 +0200 Subject: [PATCH 178/254] Updated vim plugins --- .../lightline/colorscheme/solarized.vim | 77 +++++++++++++++++- .../lightline/colorscheme/solarized_dark.vim | 73 ----------------- .../lightline/colorscheme/solarized_light.vim | 80 ------------------- .../lightline.vim/doc/lightline.txt | 5 +- sources_non_forked/syntastic/README.markdown | 14 ++-- .../autoload/syntastic/preprocess.vim | 26 +++--- .../syntastic/doc/syntastic-checkers.txt | 32 ++++++++ .../syntastic/plugin/syntastic.vim | 2 +- .../syntastic/plugin/syntastic/registry.vim | 1 + .../dockerfile/dockerfile_lint.vim | 2 +- .../syntastic/syntax_checkers/perl/perl.vim | 16 ++-- .../syntastic/syntax_checkers/scala/fsc.vim | 3 +- .../syntax_checkers/solidity/solc.vim | 38 +++++++++ .../vim-coffee-script/after/syntax/haml.vim | 10 +++ .../vim-coffee-script/after/syntax/html.vim | 9 +++ .../vim-coffee-script/syntax/coffee.vim | 2 +- .../vim-fugitive/plugin/fugitive.vim | 2 +- sources_non_forked/vim-go/CHANGELOG.md | 5 ++ .../vim-go/autoload/go/complete.vim | 11 ++- .../vim-go/autoload/go/guru.vim | 12 ++- .../vim-go/autoload/go/package.vim | 11 ++- sources_non_forked/vim-go/doc/vim-go.txt | 7 ++ sources_non_forked/vim-go/ftplugin/go.vim | 2 +- .../vim-go/ftplugin/go/tagbar.vim | 2 +- sources_non_forked/vim-go/syntax/go.vim | 24 ++++-- .../vim-snippets/UltiSnips/ada.snippets | 4 +- .../vim-snippets/snippets/cpp.snippets | 2 +- 27 files changed, 264 insertions(+), 208 deletions(-) delete mode 100644 sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_dark.vim delete mode 100644 sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_light.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/solidity/solc.vim diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized.vim index 2695c357..577177e2 100644 --- a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized.vim +++ b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized.vim @@ -2,10 +2,79 @@ " Filename: autoload/lightline/colorscheme/solarized.vim " Author: itchyny " License: MIT License -" Last Change: 2013/08/27 10:24:28. +" Last Change: 2016/08/08 10:31:00. " ============================================================================= -if &background ==# 'light' - let g:lightline#colorscheme#solarized#palette = g:lightline#colorscheme#solarized_light#palette + +let s:cuicolors = { + \ 'base03': [ '8', '234', 'DarkGray' ], + \ 'base02': [ '0', '235', 'Black' ], + \ 'base01': [ '10', '239', 'LightGreen' ], + \ 'base00': [ '11', '240', 'LightYellow' ], + \ 'base0': [ '12', '244', 'LightBlue' ], + \ 'base1': [ '14', '245', 'LightCyan' ], + \ 'base2': [ '7', '187', 'LightGray' ], + \ 'base3': [ '15', '230', 'White' ], + \ 'yellow': [ '3', '136', 'DarkYellow' ], + \ 'orange': [ '9', '166', 'LightRed' ], + \ 'red': [ '1', '124', 'DarkRed' ], + \ 'magenta': [ '5', '125', 'DarkMagenta' ], + \ 'violet': [ '13', '61', 'LightMagenta' ], + \ 'blue': [ '4', '33', 'DarkBlue' ], + \ 'cyan': [ '6', '37', 'DarkCyan' ], + \ 'green': [ '2', '64', 'DarkGreen' ], + \ } + +" The following condition only applies for the console and is the same +" condition vim-colors-solarized uses to determine which set of colors +" to use. +let s:solarized_termcolors = get(g:, 'solarized_termcolors', 256) +if s:solarized_termcolors != 256 && &t_Co >= 16 + let s:cuiindex = 0 +elseif s:solarized_termcolors == 256 + let s:cuiindex = 1 else - let g:lightline#colorscheme#solarized#palette = g:lightline#colorscheme#solarized_dark#palette + let s:cuiindex = 2 endif + +let s:base03 = [ '#002b36', s:cuicolors.base03[s:cuiindex] ] +let s:base02 = [ '#073642', s:cuicolors.base02[s:cuiindex] ] +let s:base01 = [ '#586e75', s:cuicolors.base01[s:cuiindex] ] +let s:base00 = [ '#657b83', s:cuicolors.base00[s:cuiindex] ] +let s:base0 = [ '#839496', s:cuicolors.base0[s:cuiindex] ] +let s:base1 = [ '#93a1a1', s:cuicolors.base1[s:cuiindex] ] +let s:base2 = [ '#eee8d5', s:cuicolors.base2[s:cuiindex] ] +let s:base3 = [ '#fdf6e3', s:cuicolors.base3[s:cuiindex] ] +let s:yellow = [ '#b58900', s:cuicolors.yellow[s:cuiindex] ] +let s:orange = [ '#cb4b16', s:cuicolors.orange[s:cuiindex] ] +let s:red = [ '#dc322f', s:cuicolors.red[s:cuiindex] ] +let s:magenta = [ '#d33682', s:cuicolors.magenta[s:cuiindex] ] +let s:violet = [ '#6c71c4', s:cuicolors.violet[s:cuiindex] ] +let s:blue = [ '#268bd2', s:cuicolors.blue[s:cuiindex] ] +let s:cyan = [ '#2aa198', s:cuicolors.cyan[s:cuiindex] ] +let s:green = [ '#859900', s:cuicolors.green[s:cuiindex] ] + +if &background ==# 'light' + let [ s:base03, s:base3 ] = [ s:base3, s:base03 ] + let [ s:base02, s:base2 ] = [ s:base2, s:base02 ] + let [ s:base01, s:base1 ] = [ s:base1, s:base01 ] + let [ s:base00, s:base0 ] = [ s:base0, s:base00 ] +endif + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:base03, s:blue ], [ s:base03, s:base00 ] ] +let s:p.normal.right = [ [ s:base03, s:base1 ], [ s:base03, s:base00 ] ] +let s:p.inactive.right = [ [ s:base03, s:base00 ], [ s:base0, s:base02 ] ] +let s:p.inactive.left = [ [ s:base0, s:base02 ], [ s:base0, s:base02 ] ] +let s:p.insert.left = [ [ s:base03, s:green ], [ s:base03, s:base00 ] ] +let s:p.replace.left = [ [ s:base03, s:red ], [ s:base03, s:base00 ] ] +let s:p.visual.left = [ [ s:base03, s:magenta ], [ s:base03, s:base00 ] ] +let s:p.normal.middle = [ [ s:base1, s:base02 ] ] +let s:p.inactive.middle = [ [ s:base01, s:base02 ] ] +let s:p.tabline.left = [ [ s:base03, s:base00 ] ] +let s:p.tabline.tabsel = [ [ s:base03, s:base1 ] ] +let s:p.tabline.middle = [ [ s:base0, s:base02 ] ] +let s:p.tabline.right = copy(s:p.normal.right) +let s:p.normal.error = [ [ s:base03, s:red ] ] +let s:p.normal.warning = [ [ s:base03, s:yellow ] ] + +let g:lightline#colorscheme#solarized#palette = lightline#colorscheme#flatten(s:p) diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_dark.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_dark.vim deleted file mode 100644 index 37a3dc7e..00000000 --- a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_dark.vim +++ /dev/null @@ -1,73 +0,0 @@ -" ============================================================================= -" Filename: autoload/lightline/colorscheme/solarized_dark.vim -" Author: itchyny -" License: MIT License -" Last Change: 2014/05/31 01:04:15. -" ============================================================================= - -let s:cuicolors = { - \ 'base03': [ '8', '234', 'DarkGray' ], - \ 'base02': [ '0', '235', 'Black' ], - \ 'base01': [ '10', '239', 'LightGreen' ], - \ 'base00': [ '11', '240', 'LightYellow' ], - \ 'base0': [ '12', '244', 'LightBlue' ], - \ 'base1': [ '14', '245', 'LightCyan' ], - \ 'base2': [ '7', '187', 'LightGray' ], - \ 'base3': [ '15', '230', 'White' ], - \ 'yellow': [ '3', '136', 'DarkYellow' ], - \ 'orange': [ '9', '166', 'LightRed' ], - \ 'red': [ '1', '124', 'DarkRed' ], - \ 'magenta': [ '5', '125', 'DarkMagenta' ], - \ 'violet': [ '13', '61', 'LightMagenta' ], - \ 'blue': [ '4', '33', 'DarkBlue' ], - \ 'cyan': [ '6', '37', 'DarkCyan' ], - \ 'green': [ '2', '64', 'DarkGreen' ], - \ } - -" The following condition only applies for the console and is the same -" condition vim-colors-solarized uses to determine which set of colors -" to use. -let s:solarized_termcolors = get(g:, 'solarized_termcolors', 256) -if s:solarized_termcolors != 256 && &t_Co >= 16 - let s:cuiindex = 0 -elseif s:solarized_termcolors == 256 - let s:cuiindex = 1 -else - let s:cuiindex = 2 -endif - -let s:base03 = [ '#002b36', s:cuicolors.base03[s:cuiindex] ] -let s:base02 = [ '#073642', s:cuicolors.base02[s:cuiindex] ] -let s:base01 = [ '#586e75', s:cuicolors.base01[s:cuiindex] ] -let s:base00 = [ '#657b83', s:cuicolors.base00[s:cuiindex] ] -let s:base0 = [ '#839496', s:cuicolors.base0[s:cuiindex] ] -let s:base1 = [ '#93a1a1', s:cuicolors.base1[s:cuiindex] ] -let s:base2 = [ '#eee8d5', s:cuicolors.base2[s:cuiindex] ] -let s:base3 = [ '#fdf6e3', s:cuicolors.base3[s:cuiindex] ] -let s:yellow = [ '#b58900', s:cuicolors.yellow[s:cuiindex] ] -let s:orange = [ '#cb4b16', s:cuicolors.orange[s:cuiindex] ] -let s:red = [ '#dc322f', s:cuicolors.red[s:cuiindex] ] -let s:magenta = [ '#d33682', s:cuicolors.magenta[s:cuiindex] ] -let s:violet = [ '#6c71c4', s:cuicolors.violet[s:cuiindex] ] -let s:blue = [ '#268bd2', s:cuicolors.blue[s:cuiindex] ] -let s:cyan = [ '#2aa198', s:cuicolors.cyan[s:cuiindex] ] -let s:green = [ '#859900', s:cuicolors.green[s:cuiindex] ] - -let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} -let s:p.normal.left = [ [ s:base3, s:blue ], [ s:base3, s:base01 ] ] -let s:p.normal.right = [ [ s:base02, s:base0 ], [ s:base1, s:base01 ] ] -let s:p.inactive.right = [ [ s:base02, s:base01 ], [ s:base00, s:base02 ] ] -let s:p.inactive.left = [ [ s:base0, s:base02 ], [ s:base00, s:base02 ] ] -let s:p.insert.left = [ [ s:base3, s:green ], [ s:base3, s:base01 ] ] -let s:p.replace.left = [ [ s:base3, s:red ], [ s:base3, s:base01 ] ] -let s:p.visual.left = [ [ s:base3, s:magenta ], [ s:base3, s:base01 ] ] -let s:p.normal.middle = [ [ s:base1, s:base02 ] ] -let s:p.inactive.middle = [ [ s:base0, s:base02 ] ] -let s:p.tabline.left = [ [ s:base1, s:base00 ] ] -let s:p.tabline.tabsel = [ [ s:base3, s:base0 ] ] -let s:p.tabline.middle = [ [ s:base01, s:base02 ] ] -let s:p.tabline.right = copy(s:p.normal.right) -let s:p.normal.error = [ [ s:base2, s:red ] ] -let s:p.normal.warning = [ [ s:base02, s:yellow ] ] - -let g:lightline#colorscheme#solarized_dark#palette = lightline#colorscheme#flatten(s:p) diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_light.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_light.vim deleted file mode 100644 index 99046afb..00000000 --- a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/solarized_light.vim +++ /dev/null @@ -1,80 +0,0 @@ -" ============================================================================= -" Filename: autoload/lightline/colorscheme/solarized_light.vim -" Author: itchyny -" License: MIT License -" Last Change: 2014/05/31 01:04:21. -" ============================================================================= - -let s:cuicolors = { - \ 'base03': [ '8', '234', 'DarkGray' ], - \ 'base02': [ '0', '235', 'Black' ], - \ 'base01': [ '10', '239', 'LightGreen' ], - \ 'base00': [ '11', '240', 'LightYellow' ], - \ 'base0': [ '12', '244', 'LightBlue' ], - \ 'base1': [ '14', '245', 'LightCyan' ], - \ 'base2': [ '7', '187', 'LightGray' ], - \ 'base3': [ '15', '230', 'White' ], - \ 'yellow': [ '3', '136', 'DarkYellow' ], - \ 'orange': [ '9', '166', 'LightRed' ], - \ 'red': [ '1', '124', 'DarkRed' ], - \ 'magenta': [ '5', '125', 'DarkMagenta' ], - \ 'violet': [ '13', '61', 'LightMagenta' ], - \ 'blue': [ '4', '33', 'DarkBlue' ], - \ 'cyan': [ '6', '37', 'DarkCyan' ], - \ 'green': [ '2', '64', 'DarkGreen' ], - \ } - -" The following condition only applies for the console and is the same -" condition vim-colors-solarized uses to determine which set of colors -" to use. -let s:solarized_termcolors = get(g:, 'solarized_termcolors', 256) -if s:solarized_termcolors != 256 && &t_Co >= 16 - let s:cuiindex = 0 -elseif s:solarized_termcolors == 256 - let s:cuiindex = 1 -else - let s:cuiindex = 2 -endif - -let s:base03 = [ '#002b36', s:cuicolors.base03[s:cuiindex] ] -let s:base02 = [ '#073642', s:cuicolors.base02[s:cuiindex] ] -let s:base01 = [ '#586e75', s:cuicolors.base01[s:cuiindex] ] -let s:base00 = [ '#657b83', s:cuicolors.base00[s:cuiindex] ] -let s:base0 = [ '#839496', s:cuicolors.base0[s:cuiindex] ] -let s:base1 = [ '#93a1a1', s:cuicolors.base1[s:cuiindex] ] -let s:base2 = [ '#eee8d5', s:cuicolors.base2[s:cuiindex] ] -let s:base3 = [ '#fdf6e3', s:cuicolors.base3[s:cuiindex] ] -let s:yellow = [ '#b58900', s:cuicolors.yellow[s:cuiindex] ] -let s:orange = [ '#cb4b16', s:cuicolors.orange[s:cuiindex] ] -let s:red = [ '#dc322f', s:cuicolors.red[s:cuiindex] ] -let s:magenta = [ '#d33682', s:cuicolors.magenta[s:cuiindex] ] -let s:violet = [ '#6c71c4', s:cuicolors.violet[s:cuiindex] ] -let s:blue = [ '#268bd2', s:cuicolors.blue[s:cuiindex] ] -let s:cyan = [ '#2aa198', s:cuicolors.cyan[s:cuiindex] ] -let s:green = [ '#859900', s:cuicolors.green[s:cuiindex] ] - -let [s:base03, s:base3] = [s:base3, s:base03] -let [s:base02, s:base2] = [s:base2, s:base02] -let [s:base01, s:base1] = [s:base1, s:base01] -let [s:base00, s:base0] = [s:base0, s:base00] - -let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} -let s:p.normal.left = [ [ s:base3, s:blue ], [ s:base3, s:base01 ] ] -let s:p.normal.right = [ [ s:base02, s:base0 ], [ s:base1, s:base01 ] ] -let s:p.inactive.right = [ [ s:base02, s:base01 ], [ s:base00, s:base02 ] ] -let s:p.inactive.left = [ [ s:base0, s:base02 ], [ s:base00, s:base02 ] ] -let s:p.insert.left = [ [ s:base3, s:green ], [ s:base3, s:base01 ] ] -let s:p.replace.left = [ [ s:base3, s:red ], [ s:base3, s:base01 ] ] -let s:p.visual.left = [ [ s:base3, s:magenta ], [ s:base3, s:base01 ] ] -let s:p.normal.middle = [ [ s:base1, s:base02 ] ] -let s:p.inactive.middle = [ [ s:base0, s:base02 ] ] -let s:p.tabline.left = [ [ s:base2, s:base01 ] ] -let s:p.tabline.tabsel = [ [ s:base2, s:base03 ] ] -let s:p.tabline.middle = [ [ s:base1, s:base02 ] ] -let s:p.tabline.right = copy(s:p.normal.right) -let s:p.normal.error = [ [ s:red, s:base01 ] ] -let s:p.normal.warning = [ [ s:yellow, s:base01 ] ] -let s:p.normal.error = [ [ s:base02, s:red ] ] -let s:p.normal.warning = [ [ s:base2, s:yellow ] ] - -let g:lightline#colorscheme#solarized_light#palette = lightline#colorscheme#flatten(s:p) diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index 99367251..c151bddb 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -4,7 +4,7 @@ Version: 0.0 Author: itchyny (https://github.com/itchyny) License: MIT License Repository: https://github.com/itchyny/lightline.vim -Last Change: 2016/05/26 21:57:34. +Last Change: 2016/08/09 06:22:39. CONTENTS *lightline-contents* @@ -1202,8 +1202,7 @@ Problem 13: *lightline-problem-13* try if g:colors_name =~# 'wombat\|solarized\|landscape\|jellybeans\|seoul256\|Tomorrow' let g:lightline.colorscheme = - \ substitute(substitute(g:colors_name, '-', '_', 'g'), '256.*', '', '') . - \ (g:colors_name ==# 'solarized' ? '_' . &background : '') + \ substitute(substitute(g:colors_name, '-', '_', 'g'), '256.*', '', '') call lightline#init() call lightline#colorscheme() call lightline#update() diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index 19e986ef..5523d088 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -65,11 +65,11 @@ JSX, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug (formerly Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax NG, -reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Sphinx, SQL, -Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, VimL, xHtml, -XML, XSLT, XQuery, YACC, YAML, YANG data models, z80, Zope page templates, and -Zsh. See the [manual][checkers] for details about the corresponding supported -checkers (`:help syntastic-checkers` in Vim). +reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity, +Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, +VHDL, VimL, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, z80, Zope +page templates, and Zsh. See the [manual][checkers] for details about the +corresponding supported checkers (`:help syntastic-checkers` in Vim). A number of third-party Vim plugins also provide checkers for syntastic, for example: [merlin][merlin], [omnisharp-vim][omnisharp], [rust.vim][rust], @@ -456,12 +456,12 @@ For example for `jscs`: ```vim function! FindConfig(prefix, what, where) let cfg = findfile(a:what, escape(a:where, ' ') . ';') - return cfg !=# '' ? ' ' . a:prefix . ' ' . cfg : '' + return cfg !=# '' ? ' ' . a:prefix . ' ' . shellescape(cfg) : '' endfunction autocmd FileType javascript let b:syntastic_javascript_jscs_args = \ get(g:, 'syntastic_javascript_jscs_args', '') . - \ FindConfig('-c', '.jscsrc', expand('<amatch>:p:h', 1)) + \ FindConfig('-c', '.jscsrc', expand('<afile>:p:h', 1)) ``` <a name="faqbdelete"></a> diff --git a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim index cbab6fdd..9d25b849 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim @@ -89,11 +89,11 @@ function! syntastic#preprocess#dockerfile_lint(errors) abort " {{{2 call add(out, msg) endfor catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format') + call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)') let out = [] endtry else - call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format') + call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 @@ -132,18 +132,18 @@ function! syntastic#preprocess#flow(errors) abort " {{{2 call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker javascript/flow: unrecognized error format') + call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') let out = [] break endtry else - call syntastic#log#warn('checker javascript/flow: unrecognized error format') + call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') let out = [] break endif endfor else - call syntastic#log#warn('checker javascript/flow: unrecognized error format') + call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') endif return out @@ -178,11 +178,11 @@ function! syntastic#preprocess#jscs(errors) abort " {{{2 endtry endfor else - call syntastic#log#warn('checker javascript/jscs: unrecognized error format') + call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)') endif endfor else - call syntastic#log#warn('checker javascript/jscs: unrecognized error format') + call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 @@ -238,7 +238,7 @@ function! syntastic#preprocess#prospector(errors) abort " {{{2 endif endfor else - call syntastic#log#warn('checker python/prospector: unrecognized error format') + call syntastic#log#warn('checker python/prospector: unrecognized error format (crashed checker?)') endif endif @@ -311,11 +311,11 @@ function! syntastic#preprocess#scss_lint(errors) abort " {{{2 endtry endfor else - call syntastic#log#warn('checker scss/scss_lint: unrecognized error format') + call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)') endif endfor else - call syntastic#log#warn('checker scss/scss_lint: unrecognized error format') + call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)') endif return out endfunction " }}}2 @@ -351,7 +351,7 @@ function! syntastic#preprocess#stylelint(errors) abort " {{{2 endtry endfor else - call syntastic#log#warn('checker css/stylelint: unrecognized error format') + call syntastic#log#warn('checker css/stylelint: unrecognized error format (crashed checker?)') endif endif return out @@ -398,7 +398,7 @@ echomsg string(json) endtry endfor else - call syntastic#log#warn('checker javascript/tern_lint: unrecognized error format') + call syntastic#log#warn('checker javascript/tern_lint: unrecognized error format (crashed checker?)') endif echomsg string(out) @@ -453,7 +453,7 @@ function! syntastic#preprocess#vint(errors) abort " {{{2 endif endfor else - call syntastic#log#warn('checker vim/vint: unrecognized error format') + call syntastic#log#warn('checker vim/vint: unrecognized error format (crashed checker?)') endif return out diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index 19974054..dbb6d7ab 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -101,6 +101,7 @@ SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* Sh.......................................|syntastic-checkers-sh| Slim.....................................|syntastic-checkers-slim| SML......................................|syntastic-checkers-sml| + Solidity.................................|syntastic-checkers-solidity| SQL......................................|syntastic-checkers-sql| Stylus...................................|syntastic-checkers-stylus| @@ -5779,6 +5780,37 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +============================================================================== +SYNTAX CHECKERS FOR SOLIDITY *syntastic-checkers-solidity* + +The following checkers are available for Solidity (filetype "solidity"): + + 1. solc.....................|syntastic-solidity-solc| + +------------------------------------------------------------------------------ +1. solc *syntastic-solidity-solc* + +Name: solc +Maintainer: Jacob Cholewa <jacob@cholewa.dk> + +"solc" is a compiler for Ethereum's smart-contract language "Solidity" +(https://solidity.readthedocs.io/). See the project's page for details: + + https://github.com/ethereum/solidity + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +Note~ + +You probably also need a plugin to set |filetype| for Solidity files, such as +"vim-solidity": + + https://github.com/tomlion/vim-solidity + + ============================================================================== SYNTAX CHECKERS FOR SQL *syntastic-checkers-sql* diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 441490d5..3678990c 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.7.0-177' +let g:_SYNTASTIC_VERSION = '3.7.0-193' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/sources_non_forked/syntastic/plugin/syntastic/registry.vim b/sources_non_forked/syntastic/plugin/syntastic/registry.vim index 8e78f112..bcfd5c63 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/registry.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/registry.vim @@ -85,6 +85,7 @@ let s:_DEFAULT_CHECKERS = { \ 'slim': ['slimrb'], \ 'sml': ['smlnj'], \ 'spec': ['rpmlint'], + \ 'solidity': ['solc'], \ 'sql': ['sqlint'], \ 'stylus': ['stylint'], \ 'tcl': ['nagelfar'], diff --git a/sources_non_forked/syntastic/syntax_checkers/dockerfile/dockerfile_lint.vim b/sources_non_forked/syntastic/syntax_checkers/dockerfile/dockerfile_lint.vim index 3a5b7694..4858a6b5 100644 --- a/sources_non_forked/syntastic/syntax_checkers/dockerfile/dockerfile_lint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/dockerfile/dockerfile_lint.vim @@ -1,7 +1,7 @@ "============================================================================ "File: dockerfile_lint.vim "Description: Syntax checking plugin for syntastic.vim using dockerfile-lint -" (https://github.com/projectatomic/dockerfile-lint). +" (https://github.com/projectatomic/dockerfile_lint). "Maintainer: Tim Carry <tim at pixelastic dot com> "License: This program is free software. It comes without any warranty, " to the extent permitted by applicable law. You can redistribute diff --git a/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim b/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim index e039518a..ca3d0d76 100644 --- a/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim +++ b/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim @@ -1,6 +1,6 @@ "============================================================================ "File: perl.vim -"Description: Syntax checking plugin for syntastic.vim +"Description: Syntax checking plugin for syntastic "Maintainer: Anthony Carapetis <anthony.carapetis at gmail dot com>, " Eric Harmon <http://eharmon.net> "License: This program is free software. It comes without any warranty, @@ -23,7 +23,7 @@ " " let g:syntastic_enable_perl_checker = 1 " -" References: +" Reference: " " - http://perldoc.perl.org/perlrun.html#*-c* @@ -55,15 +55,15 @@ function! SyntaxCheckers_perl_perl_GetLocList() dict " {{{1 call syntastic#log#oneTimeWarn('variable g:syntastic_perl_lib_path should be a list') let includes = split(g:syntastic_perl_lib_path, ',') else - let includes = copy(syntastic#util#var('perl_lib_path')) + let includes = copy(syntastic#util#var('perl_lib_path', [])) endif let shebang = syntastic#util#parseShebang() - let extra = join(map(includes, '"-I" . v:val')) . - \ (index(shebang['args'], '-T') >= 0 ? ' -T' : '') . - \ (index(shebang['args'], '-t') >= 0 ? ' -t' : '') + let extra = map(includes, '"-I" . v:val') + + \ (index(shebang['args'], '-T') >= 0 ? ['-T'] : []) + + \ (index(shebang['args'], '-t') >= 0 ? ['-t'] : []) let errorformat = '%f:%l:%m' - let makeprg = self.makeprgBuild({ 'args_before': '-c -X ' . extra }) + let makeprg = self.makeprgBuild({ 'args_before': ['-c', '-X '] + extra }) let errors = SyntasticMake({ \ 'makeprg': makeprg, @@ -74,7 +74,7 @@ function! SyntaxCheckers_perl_perl_GetLocList() dict " {{{1 return errors endif - let makeprg = self.makeprgBuild({ 'args_before': '-c -Mwarnings ' . extra }) + let makeprg = self.makeprgBuild({ 'args_before': ['-c', '-Mwarnings'] + extra }) return SyntasticMake({ \ 'makeprg': makeprg, diff --git a/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim b/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim index 25d6a4d7..0398e7ac 100644 --- a/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim +++ b/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim @@ -25,11 +25,12 @@ function! SyntaxCheckers_scala_fsc_GetLocList() dict " working directory changing after being started " that's why we better pass an absolute path let makeprg = self.makeprgBuild({ - \ 'args_after': '-Ystop-after:parser', + \ 'args': '-Ystop-after:parser', \ 'fname': syntastic#util#shexpand('%:p') }) let errorformat = \ '%E%f:%l: %trror: %m,' . + \ '%W%f:%l: %tarning:%m,' . \ '%Z%p^,' . \ '%-G%.%#' diff --git a/sources_non_forked/syntastic/syntax_checkers/solidity/solc.vim b/sources_non_forked/syntastic/syntax_checkers/solidity/solc.vim new file mode 100644 index 00000000..e401c3e0 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/solidity/solc.vim @@ -0,0 +1,38 @@ +"============================================================================ +"File: solc.vim +"Description: Solidity syntax checker - using solc +"Maintainer: Jacob Cholewa <jacob@cholewa.dk> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_solidity_solc_checker') + finish +endif +let g:loaded_syntastic_solidity_solc_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_solidity_solc_GetLocList() dict + let makeprg = self.makeprgBuild({}) + + let errorformat = '%f:%l:%c: %trror: %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'solidity', + \ 'name': 'solc'}) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/vim-coffee-script/after/syntax/haml.vim b/sources_non_forked/vim-coffee-script/after/syntax/haml.vim index 4c517ebb..3e186cdc 100644 --- a/sources_non_forked/vim-coffee-script/after/syntax/haml.vim +++ b/sources_non_forked/vim-coffee-script/after/syntax/haml.vim @@ -3,6 +3,11 @@ " URL: http://github.com/kchmck/vim-coffee-script " License: WTFPL + +if exists('b:current_syntax') + let s:current_syntax_save = b:current_syntax +endif + " Inherit coffee from html so coffeeComment isn't redefined and given higher " priority than hamlInterpolation. syn cluster hamlCoffeescript contains=@htmlCoffeeScript @@ -11,3 +16,8 @@ syn region hamlCoffeescriptFilter matchgroup=hamlFilter \ end="^\%(\z1 \| *$\)\@!" \ contains=@hamlCoffeeScript,hamlInterpolation \ keepend + +if exists('s:current_syntax_save') + let b:current_syntax = s:current_syntax_save + unlet s:current_syntax_save +endif diff --git a/sources_non_forked/vim-coffee-script/after/syntax/html.vim b/sources_non_forked/vim-coffee-script/after/syntax/html.vim index 82b44f13..aa01e7e9 100644 --- a/sources_non_forked/vim-coffee-script/after/syntax/html.vim +++ b/sources_non_forked/vim-coffee-script/after/syntax/html.vim @@ -3,9 +3,18 @@ " URL: http://github.com/kchmck/vim-coffee-script " License: WTFPL +if exists('b:current_syntax') + let s:current_syntax_save = b:current_syntax +endif + " Syntax highlighting for text/coffeescript script tags syn include @htmlCoffeeScript syntax/coffee.vim syn region coffeeScript start=#<script [^>]*type="text/coffeescript"[^>]*># \ end=#</script>#me=s-1 keepend \ contains=@htmlCoffeeScript,htmlScriptTag,@htmlPreproc \ containedin=htmlHead + +if exists('s:current_syntax_save') + let b:current_syntax = s:current_syntax_save + unlet s:current_syntax_save +endif diff --git a/sources_non_forked/vim-coffee-script/syntax/coffee.vim b/sources_non_forked/vim-coffee-script/syntax/coffee.vim index bfb252f5..662ab756 100644 --- a/sources_non_forked/vim-coffee-script/syntax/coffee.vim +++ b/sources_non_forked/vim-coffee-script/syntax/coffee.vim @@ -32,7 +32,7 @@ hi def link coffeeConditional Conditional syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display hi def link coffeeException Exception -syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\)\>/ +syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\)\>/ \ display " The `own` keyword is only a keyword after `for`. syn match coffeeKeyword /\<for\s\+own\>/ contained containedin=coffeeRepeat diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index 805518ae..345ea349 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -859,7 +859,7 @@ function! s:StageUndo() abort let hash = repo.git_chomp('hash-object', '-w', filename) if !empty(hash) if section ==# 'untracked' - call repo.git_chomp_in_tree('clean', '--', filename) + call repo.git_chomp_in_tree('clean', '-f', '--', filename) elseif section ==# 'unmerged' call repo.git_chomp_in_tree('rm', '--', filename) elseif section ==# 'unstaged' diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 536b77dc..02d0e4d2 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -6,10 +6,15 @@ IMPROVEMENTS: buffers as well. This affects all commands where `guru` is used. Such as `:GoDef`, `:GoReferrers`, etc.. [gh-944] * Cleanup and improve documentation [gh-987] +* Add new `g:go_gocode_socket_type` setting to change the underlying socket type passed to `gocode`. Usefull to fallback to `tcp` on cases such as Bash on Windows [gh-1000] +* `:GoSameIds` is now automatically re-evaluated in cases of buffer reloads (such as `:GoRename`) [gh-998] BUG FIXES: * Fix system calls on Windows [gh-988] +* Fix :GoSameIds and :GoCoverage for light background and after changing color schemes [gh-983] +* Fix TagBar and `GoCallers` for Windows user [gh-999] +* Set updatetime for for `auto_sameids` feature as well [gh-1016] ## 1.8 (July 31, 2016) diff --git a/sources_non_forked/vim-go/autoload/go/complete.vim b/sources_non_forked/vim-go/autoload/go/complete.vim index 3cc52d2d..5ebad4da 100644 --- a/sources_non_forked/vim-go/autoload/go/complete.vim +++ b/sources_non_forked/vim-go/autoload/go/complete.vim @@ -32,10 +32,17 @@ function! s:gocodeCommand(cmd, preargs, args) let old_gopath = $GOPATH let $GOPATH = go#path#Detect() - let result = go#util#System(printf('%s %s %s %s', go#util#Shellescape(bin_path), join(a:preargs), go#util#Shellescape(a:cmd), join(a:args))) + let socket_type = get(g:, 'go_gocode_socket_type', 'unix') + let cmd = printf('%s -sock %s %s %s %s', + \ go#util#Shellescape(bin_path), + \ socket_type, + \ join(a:preargs), + \ go#util#Shellescape(a:cmd), + \ join(a:args) + \ ) + let result = go#util#System(cmd) let $GOPATH = old_gopath - if go#util#ShellError() != 0 return "[\"0\", []]" else diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim index 3fb5a7d5..c1f7f193 100644 --- a/sources_non_forked/vim-go/autoload/go/guru.vim +++ b/sources_non_forked/vim-go/autoload/go/guru.vim @@ -1,6 +1,5 @@ " guru.vim -- Vim integration for the Go guru. - func! s:RunGuru(mode, format, selected, needs_scope) range abort "return with a warning if the binary doesn't exist let bin_path = go#path#CheckBinPath("guru") @@ -364,6 +363,12 @@ function! go#guru#SameIds(selected) let pos = split(item, ':') call matchaddpos('goSameId', [[str2nr(pos[-2]), str2nr(pos[-1]), str2nr(poslen)]]) endfor + + if get(g:, "go_auto_sameids", 0) + " re-apply SameIds at the current cursor position at the time the buffer + " is redisplayed: e.g. :edit, :GoRename, etc. + autocmd BufWinEnter <buffer> nested call go#guru#SameIds(-1) + endif endfunction function! go#guru#ClearSameIds() @@ -373,6 +378,11 @@ function! go#guru#ClearSameIds() call matchdelete(item['id']) endif endfor + + " remove the autocmds we defined + if exists("#BufWinEnter<buffer>") + autocmd! BufWinEnter <buffer> + endif endfunction function! go#guru#ToggleSameIds(selected) diff --git a/sources_non_forked/vim-go/autoload/go/package.vim b/sources_non_forked/vim-go/autoload/go/package.vim index c69cba4b..e6f194ae 100644 --- a/sources_non_forked/vim-go/autoload/go/package.vim +++ b/sources_non_forked/vim-go/autoload/go/package.vim @@ -59,7 +59,7 @@ function! go#package#ImportPath(arg) let dirs = go#package#Paths() for dir in dirs - if len(dir) && match(path, dir) == 0 + if len(dir) && matchstr(escape(path, '\/'), escape(dir, '\/')) == 0 let workspace = dir endif endfor @@ -68,8 +68,13 @@ function! go#package#ImportPath(arg) return -1 endif - let srcdir = substitute(workspace . '/src/', '//', '/', '') - return substitute(path, srcdir, '', '') + if go#util#IsWin() + let srcdir = substitute(workspace . '\src\', '//', '/', '') + return path[len(srcdir):] + else + let srcdir = substitute(workspace . '/src/', '//', '/', '') + return substitute(path, srcdir, '', '') + endif endfunction function! go#package#FromPath(arg) diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index cd278e19..39d0b670 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -1387,6 +1387,13 @@ Specifies whether `gocode` should add built-in types, functions and constants to an autocompletion proposals. By default it is enabled. > let g:go_gocode_propose_builtins = 1 +< + *'g:go_gocode_socket_type'* + +Specifies whether `gocode` should use a different socket type. By default +`unix` is enabled. Possible values: `unix`, `tcp` +> + let g:go_gocode_socket_type = 'unix' < *'g:go_template_autocreate'* diff --git a/sources_non_forked/vim-go/ftplugin/go.vim b/sources_non_forked/vim-go/ftplugin/go.vim index e4e993aa..dfe068f4 100644 --- a/sources_non_forked/vim-go/ftplugin/go.vim +++ b/sources_non_forked/vim-go/ftplugin/go.vim @@ -56,7 +56,7 @@ if get(g:, "go_textobj_enabled", 1) xnoremap <buffer> <silent> [[ :<c-u>call go#textobj#FunctionJump('v', 'prev')<cr> endif -if get(g:, "go_auto_type_info", 0) +if get(g:, "go_auto_type_info", 0) || get(g:, "go_auto_sameids", 0) setlocal updatetime=800 endif diff --git a/sources_non_forked/vim-go/ftplugin/go/tagbar.vim b/sources_non_forked/vim-go/ftplugin/go/tagbar.vim index e8982aaa..efdc397b 100644 --- a/sources_non_forked/vim-go/ftplugin/go/tagbar.vim +++ b/sources_non_forked/vim-go/ftplugin/go/tagbar.vim @@ -45,7 +45,7 @@ function! s:SetTagbar() \ 'ctype' : 't', \ 'ntype' : 'n' \ }, - \ 'ctagsbin' : expand(bin_path), + \ 'ctagsbin' : bin_path, \ 'ctagsargs' : '-sort -silent' \ } endif diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim index 33315317..987485a0 100644 --- a/sources_non_forked/vim-go/syntax/go.vim +++ b/sources_non_forked/vim-go/syntax/go.vim @@ -366,13 +366,27 @@ if g:go_highlight_build_constraints != 0 hi def link goPackageComment Comment endif -" :GoSameIds -hi def goSameId term=bold cterm=bold ctermbg=white ctermfg=black - " :GoCoverage commands hi def link goCoverageNormalText Comment -hi def goCoverageCovered ctermfg=green guifg=#A6E22E -hi def goCoverageUncover ctermfg=red guifg=#F92672 + +function! s:hi() + " :GoSameIds + if &background == 'dark' + hi def goSameId term=bold cterm=bold ctermbg=white ctermfg=black guibg=white guifg=black + else + hi def goSameId term=bold cterm=bold ctermbg=14 guibg=Cyan + endif + + " :GoCoverage commands + hi def goCoverageCovered ctermfg=green guifg=#A6E22E + hi def goCoverageUncover ctermfg=red guifg=#F92672 +endfunction + +augroup vim-go-hi + autocmd! + autocmd ColorScheme * call s:hi() +augroup end +call s:hi() " Search backwards for a global declaration to start processing the syntax. "syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/ diff --git a/sources_non_forked/vim-snippets/UltiSnips/ada.snippets b/sources_non_forked/vim-snippets/UltiSnips/ada.snippets index cc35c2c2..bea2a6cd 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/ada.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/ada.snippets @@ -5,7 +5,9 @@ global !p def ada_case(word): out = word[0].upper() for i in range(1, len(word)): - if word[i - 1] == '_': + if word[i] == '-': + out = out + '.' + elif word[i - 1] == '_' or word[i - 1] == '-': out = out + word[i].upper() else: out = out + word[i] diff --git a/sources_non_forked/vim-snippets/snippets/cpp.snippets b/sources_non_forked/vim-snippets/snippets/cpp.snippets index d06b3c90..42c37341 100644 --- a/sources_non_forked/vim-snippets/snippets/cpp.snippets +++ b/sources_non_forked/vim-snippets/snippets/cpp.snippets @@ -3,7 +3,7 @@ extends c ## ## Preprocessor # #include <...> -snippet inc +snippet incc #include <${1:iostream}> snippet binc #include <boost/${1:shared_ptr}.hpp> From 48e1c892ede1e91a6552f50a9c5a0a81381b173c Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 20 Aug 2016 13:28:37 +0200 Subject: [PATCH 179/254] Fixes https://github.com/amix/vimrc/issues/221 --- vimrcs/basic.vim | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index 837469f7..f80164bf 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -189,8 +189,9 @@ set tabstop=4 set lbr set tw=500 -set ai "Auto indent -set si "Smart indent +set cindent +set cinkeys-=0# +set indentkeys-=0# set wrap "Wrap lines From 44481c92786910bd6f608853fdaefb4c2fdbd903 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 20 Aug 2016 13:31:52 +0200 Subject: [PATCH 180/254] Fixes https://github.com/amix/vimrc/issues/215 --- vimrcs/filetypes.vim | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vimrcs/filetypes.vim b/vimrcs/filetypes.vim index 164454eb..9ac5c552 100644 --- a/vimrcs/filetypes.vim +++ b/vimrcs/filetypes.vim @@ -54,3 +54,11 @@ endfunction au FileType coffee call CoffeeScriptFold() au FileType gitcommit call setpos('.', [0, 1, 1, 0]) + + +"""""""""""""""""""""""""""""" +" => Shell section +"""""""""""""""""""""""""""""" +if exists('$TMUX') + set term=screen-256color +endif From 1f9936148427a5d5ad7e3f3b6bb442e4895943ea Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 20 Aug 2016 14:44:55 +0200 Subject: [PATCH 181/254] Added the auto-pairs plugin --- sources_non_forked/auto-pairs/README.md | 310 ++++++++++ .../auto-pairs/plugin/auto-pairs.vim | 564 ++++++++++++++++++ update_plugins.py | 1 + 3 files changed, 875 insertions(+) create mode 100644 sources_non_forked/auto-pairs/README.md create mode 100644 sources_non_forked/auto-pairs/plugin/auto-pairs.vim diff --git a/sources_non_forked/auto-pairs/README.md b/sources_non_forked/auto-pairs/README.md new file mode 100644 index 00000000..72bde892 --- /dev/null +++ b/sources_non_forked/auto-pairs/README.md @@ -0,0 +1,310 @@ +Auto Pairs +========== +Insert or delete brackets, parens, quotes in pair. + +Installation +------------ +copy plugin/auto-pairs.vim to ~/.vim/plugin + +or if you are using `pathogen`: + +```git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs``` + +Features +-------- +* Insert in pair + + input: [ + output: [|] + +* Delete in pair + + input: foo[<BS>] + output: foo + +* Insert new indented line after Return + + input: {|} (press <CR> at |) + output: { + | + } + +* Insert spaces before closing characters, only for [], (), {} + + input: {|} (press <SPACE> at |) + output: { | } + + input: {|} (press <SPACE>foo} at |) + output: { foo }| + + input: '|' (press <SPACE> at |) + output: ' |' + +* Skip ' when inside a word + + input: foo| (press ' at |) + output: foo' + +* Skip closed bracket. + + input: [] + output: [] + +* Ignore auto pair when previous character is \ + + input: "\' + output: "\'" + +* Fast Wrap + + input: |'hello' (press (<M-e> at |) + output: ('hello') + + wrap string, only support c style string + input: |'h\\el\'lo' (press (<M-e> at |) + output ('h\\ello\'') + + input: |[foo, bar()] (press (<M-e> at |) + output: ([foo, bar()]) + +* Quick jump to closed pair. + + input: + { + something;| + } + + (press } at |) + + output: + { + + }| + +* Support ``` ''' and """ + + input: + ''' + + output: + '''|''' + +* Delete Repeated Pairs in one time + + input: """|""" (press <BS> at |) + output: | + + input: {{|}} (press <BS> at |) + output: | + + input: [[[[[[|]]]]]] (press <BS> at |) + output: | + +* Fly Mode + + input: if(a[3) + output: if(a[3])| (In Fly Mode) + output: if(a[3)]) (Without Fly Mode) + + input: + { + hello();| + world(); + } + + (press } at |) + + output: + { + hello(); + world(); + }| + + (then press <M-b> at | to do backinsert) + output: + { + hello();}| + world(); + } + + See Fly Mode section for details + +Fly Mode +-------- +Fly Mode will always force closed-pair jumping instead of inserting. only for ")", "}", "]" + +If jumps in mistake, could use AutoPairsBackInsert(Default Key: `<M-b>`) to jump back and insert closed pair. + +the most situation maybe want to insert single closed pair in the string, eg ")" + +Fly Mode is DISABLED by default. + +add **let g:AutoPairsFlyMode = 1** .vimrc to turn it on + +Default Options: + + let g:AutoPairsFlyMode = 0 + let g:AutoPairsShortcutBackInsert = '<M-b>' + +Shortcuts +--------- + + System Shortcuts: + <CR> : Insert new indented line after return if cursor in blank brackets or quotes. + <BS> : Delete brackets in pair + <M-p> : Toggle Autopairs (g:AutoPairsShortcutToggle) + <M-e> : Fast Wrap (g:AutoPairsShortcutFastWrap) + <M-n> : Jump to next closed pair (g:AutoPairsShortcutJump) + <M-b> : BackInsert (g:AutoPairsShortcutBackInsert) + + If <M-p> <M-e> or <M-n> conflict with another keys or want to bind to another keys, add + + let g:AutoPairsShortcutToggle = '<another key>' + + to .vimrc, if the key is empty string '', then the shortcut will be disabled. + +Options +------- +* g:AutoPairs + + Default: {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'} + +* b:AutoPairs + + Default: g:AutoPairs + + Buffer level pairs set. + +* g:AutoPairsShortcutToggle + + Default: '<M-p>' + + The shortcut to toggle autopairs. + +* g:AutoPairsShortcutFastWrap + + Default: '<M-e>' + + Fast wrap the word. all pairs will be consider as a block (include <>). + (|)'hello' after fast wrap at |, the word will be ('hello') + (|)<hello> after fast wrap at |, the word will be (<hello>) + +* g:AutoPairsShortcutJump + + Default: '<M-n>' + + Jump to the next closed pair + +* g:AutoPairsMapBS + + Default : 1 + + Map <BS> to delete brackets, quotes in pair + execute 'inoremap <buffer> <silent> <BS> <C-R>=AutoPairsDelete()<CR>' + +* g:AutoPairsMapCh + + Default : 1 + + Map <C-h> to delete brackets, quotes in pair + +* g:AutoPairsMapCR + + Default : 1 + + Map <CR> to insert a new indented line if cursor in (|), {|} [|], '|', "|" + execute 'inoremap <buffer> <silent> <CR> <C-R>=AutoPairsReturn()<CR>' + +* g:AutoPairsCenterLine + + Default : 1 + + When g:AutoPairsMapCR is on, center current line after return if the line is at the bottom 1/3 of the window. + +* g:AutoPairsMapSpace + + Default : 1 + + Map <space> to insert a space after the opening character and before the closing one. + execute 'inoremap <buffer> <silent> <CR> <C-R>=AutoPairsSpace()<CR>' + +* g:AutoPairsFlyMode + + Default : 0 + + set it to 1 to enable FlyMode. + see FlyMode section for details. + +* g:AutoPairsMultilineClose + + Default : 1 + + When you press the key for the closing pair (e.g. `)`) it jumps past it. + If set to 1, then it'll jump to the next line, if there is only whitespace. + If set to 0, then it'll only jump to a closing pair on the same line. + +* g:AutoPairsShortcutBackInsert + + Default : <M-b> + + Work with FlyMode, insert the key at the Fly Mode jumped postion + +Buffer Level Pairs Setting +-------------------------- + +Set b:AutoPairs before BufEnter + +eg: + + " When the filetype is FILETYPE then make AutoPairs only match for parenthesis + au Filetype FILETYPE let b:AutoPairs = {"(": ")"} + +TroubleShooting +--------------- + The script will remap keys ([{'"}]) <BS>, + If auto pairs cannot work, use :imap ( to check if the map is corrected. + The correct map should be <C-R>=AutoPairsInsert("\(")<CR> + Or the plugin conflict with some other plugins. + use command :call AutoPairsInit() to remap the keys. + + +* How to insert parens purely + + There are 3 ways + + 1. use Ctrl-V ) to insert paren without trigger the plugin. + + 2. use Alt-P to turn off the plugin. + + 3. use DEL or <C-O>x to delete the character insert by plugin. + +* Swedish Character Conflict + + Because AutoPairs uses Meta(Alt) key as shortcut, it is conflict with some Swedish character such as Ã¥. + To fix the issue, you need remap or disable the related shortcut. + +Known Issues +----------------------- +Breaks '.' - [issue #3](https://github.com/jiangmiao/auto-pairs/issues/3) + + Description: After entering insert mode and inputing `[hello` then leave insert + mode by `<ESC>`. press '.' will insert 'hello' instead of '[hello]'. + Reason: `[` actually equals `[]\<LEFT>` and \<LEFT> will break '.'. + After version 7.4.849, Vim implements new keyword <C-G>U to avoid the break + Solution: Update Vim to 7.4.849+ + +Contributors +------------ +* [camthompson](https://github.com/camthompson) + + +License +------- + +Copyright (C) 2011-2013 Miao Jiang + +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. diff --git a/sources_non_forked/auto-pairs/plugin/auto-pairs.vim b/sources_non_forked/auto-pairs/plugin/auto-pairs.vim new file mode 100644 index 00000000..200b2ddd --- /dev/null +++ b/sources_non_forked/auto-pairs/plugin/auto-pairs.vim @@ -0,0 +1,564 @@ +" Insert or delete brackets, parens, quotes in pairs. +" Maintainer: JiangMiao <jiangfriend@gmail.com> +" Contributor: camthompson +" Last Change: 2013-07-13 +" Version: 1.3.2 +" Homepage: http://www.vim.org/scripts/script.php?script_id=3599 +" Repository: https://github.com/jiangmiao/auto-pairs +" License: MIT + +if exists('g:AutoPairsLoaded') || &cp + finish +end +let g:AutoPairsLoaded = 1 + +if !exists('g:AutoPairs') + let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'} +end + +if !exists('g:AutoPairsParens') + let g:AutoPairsParens = {'(':')', '[':']', '{':'}'} +end + +if !exists('g:AutoPairsMapBS') + let g:AutoPairsMapBS = 1 +end + +" Map <C-h> as the same BS +if !exists('g:AutoPairsMapCh') + let g:AutoPairsMapCh = 1 +end + +if !exists('g:AutoPairsMapCR') + let g:AutoPairsMapCR = 1 +end + +if !exists('g:AutoPairsMapSpace') + let g:AutoPairsMapSpace = 1 +end + +if !exists('g:AutoPairsCenterLine') + let g:AutoPairsCenterLine = 1 +end + +if !exists('g:AutoPairsShortcutToggle') + let g:AutoPairsShortcutToggle = '<M-p>' +end + +if !exists('g:AutoPairsShortcutFastWrap') + let g:AutoPairsShortcutFastWrap = '<M-e>' +end + +if !exists('g:AutoPairsShortcutJump') + let g:AutoPairsShortcutJump = '<M-n>' +endif + +" Fly mode will for closed pair to jump to closed pair instead of insert. +" also support AutoPairsBackInsert to insert pairs where jumped. +if !exists('g:AutoPairsFlyMode') + let g:AutoPairsFlyMode = 0 +endif + +" When skipping the closed pair, look at the current and +" next line as well. +if !exists('g:AutoPairsMultilineClose') + let g:AutoPairsMultilineClose = 1 +endif + +" Work with Fly Mode, insert pair where jumped +if !exists('g:AutoPairsShortcutBackInsert') + let g:AutoPairsShortcutBackInsert = '<M-b>' +endif + +if !exists('g:AutoPairsSmartQuotes') + let g:AutoPairsSmartQuotes = 1 +endif + +" 7.4.849 support <C-G>U to avoid breaking '.' +" Issue talk: https://github.com/jiangmiao/auto-pairs/issues/3 +" Vim note: https://github.com/vim/vim/releases/tag/v7.4.849 +if v:version >= 704 && has("patch849") + let s:Go = "\<C-G>U" +else + let s:Go = "" +endif + +let s:Left = s:Go."\<LEFT>" +let s:Right = s:Go."\<RIGHT>" + + +" Will auto generated {']' => '[', ..., '}' => '{'}in initialize. +let g:AutoPairsClosedPairs = {} + + +function! AutoPairsInsert(key) + if !b:autopairs_enabled + return a:key + end + + let line = getline('.') + let pos = col('.') - 1 + let before = strpart(line, 0, pos) + let after = strpart(line, pos) + let next_chars = split(after, '\zs') + let current_char = get(next_chars, 0, '') + let next_char = get(next_chars, 1, '') + let prev_chars = split(before, '\zs') + let prev_char = get(prev_chars, -1, '') + + let eol = 0 + if col('$') - col('.') <= 1 + let eol = 1 + end + + " Ignore auto close if prev character is \ + if prev_char == '\' + return a:key + end + + " The key is difference open-pair, then it means only for ) ] } by default + if !has_key(b:AutoPairs, a:key) + let b:autopairs_saved_pair = [a:key, getpos('.')] + + " Skip the character if current character is the same as input + if current_char == a:key + return s:Right + end + + if !g:AutoPairsFlyMode + " Skip the character if next character is space + if current_char == ' ' && next_char == a:key + return s:Right.s:Right + end + + " Skip the character if closed pair is next character + if current_char == '' + if g:AutoPairsMultilineClose + let next_lineno = line('.')+1 + let next_line = getline(nextnonblank(next_lineno)) + let next_char = matchstr(next_line, '\s*\zs.') + else + let next_char = matchstr(line, '\s*\zs.') + end + if next_char == a:key + return "\<ESC>e^a" + endif + endif + endif + + " Fly Mode, and the key is closed-pairs, search closed-pair and jump + if g:AutoPairsFlyMode && has_key(b:AutoPairsClosedPairs, a:key) + let n = stridx(after, a:key) + if n != -1 + return repeat(s:Right, n+1) + end + if search(a:key, 'W') + " force break the '.' when jump to different line + return "\<Right>" + endif + endif + + " Insert directly if the key is not an open key + return a:key + end + + let open = a:key + let close = b:AutoPairs[open] + + if current_char == close && open == close + return s:Right + end + + " Ignore auto close ' if follows a word + " MUST after closed check. 'hello|' + if a:key == "'" && prev_char =~ '\v\w' + return a:key + end + + " support for ''' ``` and """ + if open == close + " The key must be ' " ` + let pprev_char = line[col('.')-3] + if pprev_char == open && prev_char == open + " Double pair found + return repeat(a:key, 4) . repeat(s:Left, 3) + end + end + + let quotes_num = 0 + " Ignore comment line for vim file + if &filetype == 'vim' && a:key == '"' + if before =~ '^\s*$' + return a:key + end + if before =~ '^\s*"' + let quotes_num = -1 + end + end + + " Keep quote number is odd. + " Because quotes should be matched in the same line in most of situation + if g:AutoPairsSmartQuotes && open == close + " Remove \\ \" \' + let cleaned_line = substitute(line, '\v(\\.)', '', 'g') + let n = quotes_num + let pos = 0 + while 1 + let pos = stridx(cleaned_line, open, pos) + if pos == -1 + break + end + let n = n + 1 + let pos = pos + 1 + endwhile + if n % 2 == 1 + return a:key + endif + endif + + return open.close.s:Left +endfunction + +function! AutoPairsDelete() + if !b:autopairs_enabled + return "\<BS>" + end + + let line = getline('.') + let pos = col('.') - 1 + let current_char = get(split(strpart(line, pos), '\zs'), 0, '') + let prev_chars = split(strpart(line, 0, pos), '\zs') + let prev_char = get(prev_chars, -1, '') + let pprev_char = get(prev_chars, -2, '') + + if pprev_char == '\' + return "\<BS>" + end + + " Delete last two spaces in parens, work with MapSpace + if has_key(b:AutoPairs, pprev_char) && prev_char == ' ' && current_char == ' ' + return "\<BS>\<DEL>" + endif + + " Delete Repeated Pair eg: '''|''' [[|]] {{|}} + if has_key(b:AutoPairs, prev_char) + let times = 0 + let p = -1 + while get(prev_chars, p, '') == prev_char + let p = p - 1 + let times = times + 1 + endwhile + + let close = b:AutoPairs[prev_char] + let left = repeat(prev_char, times) + let right = repeat(close, times) + + let before = strpart(line, pos-times, times) + let after = strpart(line, pos, times) + if left == before && right == after + return repeat("\<BS>\<DEL>", times) + end + end + + + if has_key(b:AutoPairs, prev_char) + let close = b:AutoPairs[prev_char] + if match(line,'^\s*'.close, col('.')-1) != -1 + " Delete (|___) + let space = matchstr(line, '^\s*', col('.')-1) + return "\<BS>". repeat("\<DEL>", len(space)+1) + elseif match(line, '^\s*$', col('.')-1) != -1 + " Delete (|__\n___) + let nline = getline(line('.')+1) + if nline =~ '^\s*'.close + if &filetype == 'vim' && prev_char == '"' + " Keep next line's comment + return "\<BS>" + end + + let space = matchstr(nline, '^\s*') + return "\<BS>\<DEL>". repeat("\<DEL>", len(space)+1) + end + end + end + + return "\<BS>" +endfunction + +function! AutoPairsJump() + call search('["\]'')}]','W') +endfunction +" string_chunk cannot use standalone +let s:string_chunk = '\v%(\\\_.|[^\1]|[\r\n]){-}' +let s:ss_pattern = '\v''' . s:string_chunk . '''' +let s:ds_pattern = '\v"' . s:string_chunk . '"' + +func! s:RegexpQuote(str) + return substitute(a:str, '\v[\[\{\(\<\>\)\}\]]', '\\&', 'g') +endf + +func! s:RegexpQuoteInSquare(str) + return substitute(a:str, '\v[\[\]]', '\\&', 'g') +endf + +" Search next open or close pair +func! s:FormatChunk(open, close) + let open = s:RegexpQuote(a:open) + let close = s:RegexpQuote(a:close) + let open2 = s:RegexpQuoteInSquare(a:open) + let close2 = s:RegexpQuoteInSquare(a:close) + if open == close + return '\v'.open.s:string_chunk.close + else + return '\v%(' . s:ss_pattern . '|' . s:ds_pattern . '|' . '[^'.open2.close2.']|[\r\n]' . '){-}(['.open2.close2.'])' + end +endf + +" Fast wrap the word in brackets +function! AutoPairsFastWrap() + let line = getline('.') + let current_char = line[col('.')-1] + let next_char = line[col('.')] + let open_pair_pattern = '\v[({\[''"]' + let at_end = col('.') >= col('$') - 1 + normal x + " Skip blank + if next_char =~ '\v\s' || at_end + call search('\v\S', 'W') + let line = getline('.') + let next_char = line[col('.')-1] + end + + if has_key(b:AutoPairs, next_char) + let followed_open_pair = next_char + let inputed_close_pair = current_char + let followed_close_pair = b:AutoPairs[next_char] + if followed_close_pair != followed_open_pair + " TODO replace system searchpair to skip string and nested pair. + " eg: (|){"hello}world"} will transform to ({"hello})world"} + call searchpair('\V'.followed_open_pair, '', '\V'.followed_close_pair, 'W') + else + call search(s:FormatChunk(followed_open_pair, followed_close_pair), 'We') + end + return s:Right.inputed_close_pair.s:Left + else + normal he + return s:Right.current_char.s:Left + end +endfunction + +function! AutoPairsMap(key) + " | is special key which separate map command from text + let key = a:key + if key == '|' + let key = '<BAR>' + end + let escaped_key = substitute(key, "'", "''", 'g') + " use expr will cause search() doesn't work + execute 'inoremap <buffer> <silent> '.key." <C-R>=AutoPairsInsert('".escaped_key."')<CR>" +endfunction + +function! AutoPairsToggle() + if b:autopairs_enabled + let b:autopairs_enabled = 0 + echo 'AutoPairs Disabled.' + else + let b:autopairs_enabled = 1 + echo 'AutoPairs Enabled.' + end + return '' +endfunction + +function! AutoPairsReturn() + if b:autopairs_enabled == 0 + return '' + end + let line = getline('.') + let pline = getline(line('.')-1) + let prev_char = pline[strlen(pline)-1] + let cmd = '' + let cur_char = line[col('.')-1] + if has_key(b:AutoPairs, prev_char) && b:AutoPairs[prev_char] == cur_char + if g:AutoPairsCenterLine && winline() * 3 >= winheight(0) * 2 + " Use \<BS> instead of \<ESC>cl will cause the placeholder deleted + " incorrect. because <C-O>zz won't leave Normal mode. + " Use \<DEL> is a bit wierd. the character before cursor need to be deleted. + " Adding a space, recentering, and deleting it interferes with default + " whitespace-removing behavior when exiting insert mode. + let cmd = "\<ESC>zzcc" + end + + " If equalprg has been set, then avoid call = + " https://github.com/jiangmiao/auto-pairs/issues/24 + if &equalprg != '' + return "\<ESC>O".cmd + endif + + " conflict with javascript and coffee + " javascript need indent new line + " coffeescript forbid indent new line + if &filetype == 'coffeescript' || &filetype == 'coffee' + return "\<ESC>k==o".cmd + else + return "\<ESC>=ko".cmd + endif + end + return '' +endfunction + +function! AutoPairsSpace() + let line = getline('.') + let prev_char = line[col('.')-2] + let cmd = '' + let cur_char =line[col('.')-1] + if has_key(g:AutoPairsParens, prev_char) && g:AutoPairsParens[prev_char] == cur_char + let cmd = "\<SPACE>".s:Left + endif + return "\<SPACE>".cmd +endfunction + +function! AutoPairsBackInsert() + if exists('b:autopairs_saved_pair') + let pair = b:autopairs_saved_pair[0] + let pos = b:autopairs_saved_pair[1] + call setpos('.', pos) + return pair + endif + return '' +endfunction + +function! AutoPairsInit() + let b:autopairs_loaded = 1 + let b:autopairs_enabled = 1 + let b:AutoPairsClosedPairs = {} + + if !exists('b:AutoPairs') + let b:AutoPairs = g:AutoPairs + end + + " buffer level map pairs keys + for [open, close] in items(b:AutoPairs) + call AutoPairsMap(open) + if open != close + call AutoPairsMap(close) + end + let b:AutoPairsClosedPairs[close] = open + endfor + + " Still use <buffer> level mapping for <BS> <SPACE> + if g:AutoPairsMapBS + " Use <C-R> instead of <expr> for issue #14 sometimes press BS output strange words + execute 'inoremap <buffer> <silent> <BS> <C-R>=AutoPairsDelete()<CR>' + end + + if g:AutoPairsMapCh + execute 'inoremap <buffer> <silent> <C-h> <C-R>=AutoPairsDelete()<CR>' + endif + + if g:AutoPairsMapSpace + " Try to respect abbreviations on a <SPACE> + let do_abbrev = "" + if v:version == 703 && has("patch489") || v:version > 703 + let do_abbrev = "<C-]>" + endif + execute 'inoremap <buffer> <silent> <SPACE> '.do_abbrev.'<C-R>=AutoPairsSpace()<CR>' + end + + if g:AutoPairsShortcutFastWrap != '' + execute 'inoremap <buffer> <silent> '.g:AutoPairsShortcutFastWrap.' <C-R>=AutoPairsFastWrap()<CR>' + end + + if g:AutoPairsShortcutBackInsert != '' + execute 'inoremap <buffer> <silent> '.g:AutoPairsShortcutBackInsert.' <C-R>=AutoPairsBackInsert()<CR>' + end + + if g:AutoPairsShortcutToggle != '' + " use <expr> to ensure showing the status when toggle + execute 'inoremap <buffer> <silent> <expr> '.g:AutoPairsShortcutToggle.' AutoPairsToggle()' + execute 'noremap <buffer> <silent> '.g:AutoPairsShortcutToggle.' :call AutoPairsToggle()<CR>' + end + + if g:AutoPairsShortcutJump != '' + execute 'inoremap <buffer> <silent> ' . g:AutoPairsShortcutJump. ' <ESC>:call AutoPairsJump()<CR>a' + execute 'noremap <buffer> <silent> ' . g:AutoPairsShortcutJump. ' :call AutoPairsJump()<CR>' + end + +endfunction + +function! s:ExpandMap(map) + let map = a:map + let map = substitute(map, '\(<Plug>\w\+\)', '\=maparg(submatch(1), "i")', 'g') + return map +endfunction + +function! AutoPairsTryInit() + if exists('b:autopairs_loaded') + return + end + + " for auto-pairs starts with 'a', so the priority is higher than supertab and vim-endwise + " + " vim-endwise doesn't support <Plug>AutoPairsReturn + " when use <Plug>AutoPairsReturn will cause <Plug> isn't expanded + " + " supertab doesn't support <SID>AutoPairsReturn + " when use <SID>AutoPairsReturn will cause Duplicated <CR> + " + " and when load after vim-endwise will cause unexpected endwise inserted. + " so always load AutoPairs at last + + " Buffer level keys mapping + " comptible with other plugin + if g:AutoPairsMapCR + if v:version == 703 && has('patch32') || v:version > 703 + " VIM 7.3 supports advancer maparg which could get <expr> info + " then auto-pairs could remap <CR> in any case. + let info = maparg('<CR>', 'i', 0, 1) + if empty(info) + let old_cr = '<CR>' + let is_expr = 0 + else + let old_cr = info['rhs'] + let old_cr = s:ExpandMap(old_cr) + let old_cr = substitute(old_cr, '<SID>', '<SNR>' . info['sid'] . '_', 'g') + let is_expr = info['expr'] + let wrapper_name = '<SID>AutoPairsOldCRWrapper73' + endif + else + " VIM version less than 7.3 + " the mapping's <expr> info is lost, so guess it is expr or not, it's + " not accurate. + let old_cr = maparg('<CR>', 'i') + if old_cr == '' + let old_cr = '<CR>' + let is_expr = 0 + else + let old_cr = s:ExpandMap(old_cr) + " old_cr contain (, I guess the old cr is in expr mode + let is_expr = old_cr =~ '\V(' && toupper(old_cr) !~ '\V<C-R>' + + " The old_cr start with " it must be in expr mode + let is_expr = is_expr || old_cr =~ '\v^"' + let wrapper_name = '<SID>AutoPairsOldCRWrapper' + end + end + + if old_cr !~ 'AutoPairsReturn' + if is_expr + " remap <expr> to `name` to avoid mix expr and non-expr mode + execute 'inoremap <buffer> <expr> <script> '. wrapper_name . ' ' . old_cr + let old_cr = wrapper_name + end + " Always silent mapping + execute 'inoremap <script> <buffer> <silent> <CR> '.old_cr.'<SID>AutoPairsReturn' + end + endif + call AutoPairsInit() +endfunction + +" Always silent the command +inoremap <silent> <SID>AutoPairsReturn <C-R>=AutoPairsReturn()<CR> +imap <script> <Plug>AutoPairsReturn <SID>AutoPairsReturn + + +au BufEnter * :call AutoPairsTryInit() diff --git a/update_plugins.py b/update_plugins.py index 07116c96..97292d72 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -52,6 +52,7 @@ vim-flake8 https://github.com/nvie/vim-flake8 vim-pug https://github.com/digitaltoad/vim-pug vim-yankstack https://github.com/maxbrunsfeld/vim-yankstack lightline.vim https://github.com/itchyny/lightline.vim +auto-pairs https://github.com/jiangmiao/auto-pairs """.strip() GITHUB_ZIP = '%s/archive/master.zip' From a56d7679894536b799fce21573ef95685703f8b5 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Wed, 24 Aug 2016 00:02:31 +0200 Subject: [PATCH 182/254] Remove auto entering full screen view --- vimrcs/extended.vim | 6 ------ 1 file changed, 6 deletions(-) diff --git a/vimrcs/extended.vim b/vimrcs/extended.vim index 649ed083..499959a2 100644 --- a/vimrcs/extended.vim +++ b/vimrcs/extended.vim @@ -21,12 +21,6 @@ elseif has("unix") set gfn=Monospace\ 11 endif -" Open MacVim in fullscreen mode -if has("gui_macvim") - set fuoptions=maxvert,maxhorz - au GUIEnter * set fullscreen -endif - " Disable scrollbars (real hackers don't use scrollbars for navigation!) set guioptions-=r set guioptions-=R From 23ba938b6dcd2c3af9bbd58c607d91d3d9ae3fdc Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Wed, 24 Aug 2016 00:02:40 +0200 Subject: [PATCH 183/254] Revert "Added the auto-pairs plugin" This reverts commit 1f9936148427a5d5ad7e3f3b6bb442e4895943ea. --- sources_non_forked/auto-pairs/README.md | 310 ---------- .../auto-pairs/plugin/auto-pairs.vim | 564 ------------------ update_plugins.py | 1 - 3 files changed, 875 deletions(-) delete mode 100644 sources_non_forked/auto-pairs/README.md delete mode 100644 sources_non_forked/auto-pairs/plugin/auto-pairs.vim diff --git a/sources_non_forked/auto-pairs/README.md b/sources_non_forked/auto-pairs/README.md deleted file mode 100644 index 72bde892..00000000 --- a/sources_non_forked/auto-pairs/README.md +++ /dev/null @@ -1,310 +0,0 @@ -Auto Pairs -========== -Insert or delete brackets, parens, quotes in pair. - -Installation ------------- -copy plugin/auto-pairs.vim to ~/.vim/plugin - -or if you are using `pathogen`: - -```git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs``` - -Features --------- -* Insert in pair - - input: [ - output: [|] - -* Delete in pair - - input: foo[<BS>] - output: foo - -* Insert new indented line after Return - - input: {|} (press <CR> at |) - output: { - | - } - -* Insert spaces before closing characters, only for [], (), {} - - input: {|} (press <SPACE> at |) - output: { | } - - input: {|} (press <SPACE>foo} at |) - output: { foo }| - - input: '|' (press <SPACE> at |) - output: ' |' - -* Skip ' when inside a word - - input: foo| (press ' at |) - output: foo' - -* Skip closed bracket. - - input: [] - output: [] - -* Ignore auto pair when previous character is \ - - input: "\' - output: "\'" - -* Fast Wrap - - input: |'hello' (press (<M-e> at |) - output: ('hello') - - wrap string, only support c style string - input: |'h\\el\'lo' (press (<M-e> at |) - output ('h\\ello\'') - - input: |[foo, bar()] (press (<M-e> at |) - output: ([foo, bar()]) - -* Quick jump to closed pair. - - input: - { - something;| - } - - (press } at |) - - output: - { - - }| - -* Support ``` ''' and """ - - input: - ''' - - output: - '''|''' - -* Delete Repeated Pairs in one time - - input: """|""" (press <BS> at |) - output: | - - input: {{|}} (press <BS> at |) - output: | - - input: [[[[[[|]]]]]] (press <BS> at |) - output: | - -* Fly Mode - - input: if(a[3) - output: if(a[3])| (In Fly Mode) - output: if(a[3)]) (Without Fly Mode) - - input: - { - hello();| - world(); - } - - (press } at |) - - output: - { - hello(); - world(); - }| - - (then press <M-b> at | to do backinsert) - output: - { - hello();}| - world(); - } - - See Fly Mode section for details - -Fly Mode --------- -Fly Mode will always force closed-pair jumping instead of inserting. only for ")", "}", "]" - -If jumps in mistake, could use AutoPairsBackInsert(Default Key: `<M-b>`) to jump back and insert closed pair. - -the most situation maybe want to insert single closed pair in the string, eg ")" - -Fly Mode is DISABLED by default. - -add **let g:AutoPairsFlyMode = 1** .vimrc to turn it on - -Default Options: - - let g:AutoPairsFlyMode = 0 - let g:AutoPairsShortcutBackInsert = '<M-b>' - -Shortcuts ---------- - - System Shortcuts: - <CR> : Insert new indented line after return if cursor in blank brackets or quotes. - <BS> : Delete brackets in pair - <M-p> : Toggle Autopairs (g:AutoPairsShortcutToggle) - <M-e> : Fast Wrap (g:AutoPairsShortcutFastWrap) - <M-n> : Jump to next closed pair (g:AutoPairsShortcutJump) - <M-b> : BackInsert (g:AutoPairsShortcutBackInsert) - - If <M-p> <M-e> or <M-n> conflict with another keys or want to bind to another keys, add - - let g:AutoPairsShortcutToggle = '<another key>' - - to .vimrc, if the key is empty string '', then the shortcut will be disabled. - -Options -------- -* g:AutoPairs - - Default: {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'} - -* b:AutoPairs - - Default: g:AutoPairs - - Buffer level pairs set. - -* g:AutoPairsShortcutToggle - - Default: '<M-p>' - - The shortcut to toggle autopairs. - -* g:AutoPairsShortcutFastWrap - - Default: '<M-e>' - - Fast wrap the word. all pairs will be consider as a block (include <>). - (|)'hello' after fast wrap at |, the word will be ('hello') - (|)<hello> after fast wrap at |, the word will be (<hello>) - -* g:AutoPairsShortcutJump - - Default: '<M-n>' - - Jump to the next closed pair - -* g:AutoPairsMapBS - - Default : 1 - - Map <BS> to delete brackets, quotes in pair - execute 'inoremap <buffer> <silent> <BS> <C-R>=AutoPairsDelete()<CR>' - -* g:AutoPairsMapCh - - Default : 1 - - Map <C-h> to delete brackets, quotes in pair - -* g:AutoPairsMapCR - - Default : 1 - - Map <CR> to insert a new indented line if cursor in (|), {|} [|], '|', "|" - execute 'inoremap <buffer> <silent> <CR> <C-R>=AutoPairsReturn()<CR>' - -* g:AutoPairsCenterLine - - Default : 1 - - When g:AutoPairsMapCR is on, center current line after return if the line is at the bottom 1/3 of the window. - -* g:AutoPairsMapSpace - - Default : 1 - - Map <space> to insert a space after the opening character and before the closing one. - execute 'inoremap <buffer> <silent> <CR> <C-R>=AutoPairsSpace()<CR>' - -* g:AutoPairsFlyMode - - Default : 0 - - set it to 1 to enable FlyMode. - see FlyMode section for details. - -* g:AutoPairsMultilineClose - - Default : 1 - - When you press the key for the closing pair (e.g. `)`) it jumps past it. - If set to 1, then it'll jump to the next line, if there is only whitespace. - If set to 0, then it'll only jump to a closing pair on the same line. - -* g:AutoPairsShortcutBackInsert - - Default : <M-b> - - Work with FlyMode, insert the key at the Fly Mode jumped postion - -Buffer Level Pairs Setting --------------------------- - -Set b:AutoPairs before BufEnter - -eg: - - " When the filetype is FILETYPE then make AutoPairs only match for parenthesis - au Filetype FILETYPE let b:AutoPairs = {"(": ")"} - -TroubleShooting ---------------- - The script will remap keys ([{'"}]) <BS>, - If auto pairs cannot work, use :imap ( to check if the map is corrected. - The correct map should be <C-R>=AutoPairsInsert("\(")<CR> - Or the plugin conflict with some other plugins. - use command :call AutoPairsInit() to remap the keys. - - -* How to insert parens purely - - There are 3 ways - - 1. use Ctrl-V ) to insert paren without trigger the plugin. - - 2. use Alt-P to turn off the plugin. - - 3. use DEL or <C-O>x to delete the character insert by plugin. - -* Swedish Character Conflict - - Because AutoPairs uses Meta(Alt) key as shortcut, it is conflict with some Swedish character such as Ã¥. - To fix the issue, you need remap or disable the related shortcut. - -Known Issues ------------------------ -Breaks '.' - [issue #3](https://github.com/jiangmiao/auto-pairs/issues/3) - - Description: After entering insert mode and inputing `[hello` then leave insert - mode by `<ESC>`. press '.' will insert 'hello' instead of '[hello]'. - Reason: `[` actually equals `[]\<LEFT>` and \<LEFT> will break '.'. - After version 7.4.849, Vim implements new keyword <C-G>U to avoid the break - Solution: Update Vim to 7.4.849+ - -Contributors ------------- -* [camthompson](https://github.com/camthompson) - - -License -------- - -Copyright (C) 2011-2013 Miao Jiang - -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. diff --git a/sources_non_forked/auto-pairs/plugin/auto-pairs.vim b/sources_non_forked/auto-pairs/plugin/auto-pairs.vim deleted file mode 100644 index 200b2ddd..00000000 --- a/sources_non_forked/auto-pairs/plugin/auto-pairs.vim +++ /dev/null @@ -1,564 +0,0 @@ -" Insert or delete brackets, parens, quotes in pairs. -" Maintainer: JiangMiao <jiangfriend@gmail.com> -" Contributor: camthompson -" Last Change: 2013-07-13 -" Version: 1.3.2 -" Homepage: http://www.vim.org/scripts/script.php?script_id=3599 -" Repository: https://github.com/jiangmiao/auto-pairs -" License: MIT - -if exists('g:AutoPairsLoaded') || &cp - finish -end -let g:AutoPairsLoaded = 1 - -if !exists('g:AutoPairs') - let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'} -end - -if !exists('g:AutoPairsParens') - let g:AutoPairsParens = {'(':')', '[':']', '{':'}'} -end - -if !exists('g:AutoPairsMapBS') - let g:AutoPairsMapBS = 1 -end - -" Map <C-h> as the same BS -if !exists('g:AutoPairsMapCh') - let g:AutoPairsMapCh = 1 -end - -if !exists('g:AutoPairsMapCR') - let g:AutoPairsMapCR = 1 -end - -if !exists('g:AutoPairsMapSpace') - let g:AutoPairsMapSpace = 1 -end - -if !exists('g:AutoPairsCenterLine') - let g:AutoPairsCenterLine = 1 -end - -if !exists('g:AutoPairsShortcutToggle') - let g:AutoPairsShortcutToggle = '<M-p>' -end - -if !exists('g:AutoPairsShortcutFastWrap') - let g:AutoPairsShortcutFastWrap = '<M-e>' -end - -if !exists('g:AutoPairsShortcutJump') - let g:AutoPairsShortcutJump = '<M-n>' -endif - -" Fly mode will for closed pair to jump to closed pair instead of insert. -" also support AutoPairsBackInsert to insert pairs where jumped. -if !exists('g:AutoPairsFlyMode') - let g:AutoPairsFlyMode = 0 -endif - -" When skipping the closed pair, look at the current and -" next line as well. -if !exists('g:AutoPairsMultilineClose') - let g:AutoPairsMultilineClose = 1 -endif - -" Work with Fly Mode, insert pair where jumped -if !exists('g:AutoPairsShortcutBackInsert') - let g:AutoPairsShortcutBackInsert = '<M-b>' -endif - -if !exists('g:AutoPairsSmartQuotes') - let g:AutoPairsSmartQuotes = 1 -endif - -" 7.4.849 support <C-G>U to avoid breaking '.' -" Issue talk: https://github.com/jiangmiao/auto-pairs/issues/3 -" Vim note: https://github.com/vim/vim/releases/tag/v7.4.849 -if v:version >= 704 && has("patch849") - let s:Go = "\<C-G>U" -else - let s:Go = "" -endif - -let s:Left = s:Go."\<LEFT>" -let s:Right = s:Go."\<RIGHT>" - - -" Will auto generated {']' => '[', ..., '}' => '{'}in initialize. -let g:AutoPairsClosedPairs = {} - - -function! AutoPairsInsert(key) - if !b:autopairs_enabled - return a:key - end - - let line = getline('.') - let pos = col('.') - 1 - let before = strpart(line, 0, pos) - let after = strpart(line, pos) - let next_chars = split(after, '\zs') - let current_char = get(next_chars, 0, '') - let next_char = get(next_chars, 1, '') - let prev_chars = split(before, '\zs') - let prev_char = get(prev_chars, -1, '') - - let eol = 0 - if col('$') - col('.') <= 1 - let eol = 1 - end - - " Ignore auto close if prev character is \ - if prev_char == '\' - return a:key - end - - " The key is difference open-pair, then it means only for ) ] } by default - if !has_key(b:AutoPairs, a:key) - let b:autopairs_saved_pair = [a:key, getpos('.')] - - " Skip the character if current character is the same as input - if current_char == a:key - return s:Right - end - - if !g:AutoPairsFlyMode - " Skip the character if next character is space - if current_char == ' ' && next_char == a:key - return s:Right.s:Right - end - - " Skip the character if closed pair is next character - if current_char == '' - if g:AutoPairsMultilineClose - let next_lineno = line('.')+1 - let next_line = getline(nextnonblank(next_lineno)) - let next_char = matchstr(next_line, '\s*\zs.') - else - let next_char = matchstr(line, '\s*\zs.') - end - if next_char == a:key - return "\<ESC>e^a" - endif - endif - endif - - " Fly Mode, and the key is closed-pairs, search closed-pair and jump - if g:AutoPairsFlyMode && has_key(b:AutoPairsClosedPairs, a:key) - let n = stridx(after, a:key) - if n != -1 - return repeat(s:Right, n+1) - end - if search(a:key, 'W') - " force break the '.' when jump to different line - return "\<Right>" - endif - endif - - " Insert directly if the key is not an open key - return a:key - end - - let open = a:key - let close = b:AutoPairs[open] - - if current_char == close && open == close - return s:Right - end - - " Ignore auto close ' if follows a word - " MUST after closed check. 'hello|' - if a:key == "'" && prev_char =~ '\v\w' - return a:key - end - - " support for ''' ``` and """ - if open == close - " The key must be ' " ` - let pprev_char = line[col('.')-3] - if pprev_char == open && prev_char == open - " Double pair found - return repeat(a:key, 4) . repeat(s:Left, 3) - end - end - - let quotes_num = 0 - " Ignore comment line for vim file - if &filetype == 'vim' && a:key == '"' - if before =~ '^\s*$' - return a:key - end - if before =~ '^\s*"' - let quotes_num = -1 - end - end - - " Keep quote number is odd. - " Because quotes should be matched in the same line in most of situation - if g:AutoPairsSmartQuotes && open == close - " Remove \\ \" \' - let cleaned_line = substitute(line, '\v(\\.)', '', 'g') - let n = quotes_num - let pos = 0 - while 1 - let pos = stridx(cleaned_line, open, pos) - if pos == -1 - break - end - let n = n + 1 - let pos = pos + 1 - endwhile - if n % 2 == 1 - return a:key - endif - endif - - return open.close.s:Left -endfunction - -function! AutoPairsDelete() - if !b:autopairs_enabled - return "\<BS>" - end - - let line = getline('.') - let pos = col('.') - 1 - let current_char = get(split(strpart(line, pos), '\zs'), 0, '') - let prev_chars = split(strpart(line, 0, pos), '\zs') - let prev_char = get(prev_chars, -1, '') - let pprev_char = get(prev_chars, -2, '') - - if pprev_char == '\' - return "\<BS>" - end - - " Delete last two spaces in parens, work with MapSpace - if has_key(b:AutoPairs, pprev_char) && prev_char == ' ' && current_char == ' ' - return "\<BS>\<DEL>" - endif - - " Delete Repeated Pair eg: '''|''' [[|]] {{|}} - if has_key(b:AutoPairs, prev_char) - let times = 0 - let p = -1 - while get(prev_chars, p, '') == prev_char - let p = p - 1 - let times = times + 1 - endwhile - - let close = b:AutoPairs[prev_char] - let left = repeat(prev_char, times) - let right = repeat(close, times) - - let before = strpart(line, pos-times, times) - let after = strpart(line, pos, times) - if left == before && right == after - return repeat("\<BS>\<DEL>", times) - end - end - - - if has_key(b:AutoPairs, prev_char) - let close = b:AutoPairs[prev_char] - if match(line,'^\s*'.close, col('.')-1) != -1 - " Delete (|___) - let space = matchstr(line, '^\s*', col('.')-1) - return "\<BS>". repeat("\<DEL>", len(space)+1) - elseif match(line, '^\s*$', col('.')-1) != -1 - " Delete (|__\n___) - let nline = getline(line('.')+1) - if nline =~ '^\s*'.close - if &filetype == 'vim' && prev_char == '"' - " Keep next line's comment - return "\<BS>" - end - - let space = matchstr(nline, '^\s*') - return "\<BS>\<DEL>". repeat("\<DEL>", len(space)+1) - end - end - end - - return "\<BS>" -endfunction - -function! AutoPairsJump() - call search('["\]'')}]','W') -endfunction -" string_chunk cannot use standalone -let s:string_chunk = '\v%(\\\_.|[^\1]|[\r\n]){-}' -let s:ss_pattern = '\v''' . s:string_chunk . '''' -let s:ds_pattern = '\v"' . s:string_chunk . '"' - -func! s:RegexpQuote(str) - return substitute(a:str, '\v[\[\{\(\<\>\)\}\]]', '\\&', 'g') -endf - -func! s:RegexpQuoteInSquare(str) - return substitute(a:str, '\v[\[\]]', '\\&', 'g') -endf - -" Search next open or close pair -func! s:FormatChunk(open, close) - let open = s:RegexpQuote(a:open) - let close = s:RegexpQuote(a:close) - let open2 = s:RegexpQuoteInSquare(a:open) - let close2 = s:RegexpQuoteInSquare(a:close) - if open == close - return '\v'.open.s:string_chunk.close - else - return '\v%(' . s:ss_pattern . '|' . s:ds_pattern . '|' . '[^'.open2.close2.']|[\r\n]' . '){-}(['.open2.close2.'])' - end -endf - -" Fast wrap the word in brackets -function! AutoPairsFastWrap() - let line = getline('.') - let current_char = line[col('.')-1] - let next_char = line[col('.')] - let open_pair_pattern = '\v[({\[''"]' - let at_end = col('.') >= col('$') - 1 - normal x - " Skip blank - if next_char =~ '\v\s' || at_end - call search('\v\S', 'W') - let line = getline('.') - let next_char = line[col('.')-1] - end - - if has_key(b:AutoPairs, next_char) - let followed_open_pair = next_char - let inputed_close_pair = current_char - let followed_close_pair = b:AutoPairs[next_char] - if followed_close_pair != followed_open_pair - " TODO replace system searchpair to skip string and nested pair. - " eg: (|){"hello}world"} will transform to ({"hello})world"} - call searchpair('\V'.followed_open_pair, '', '\V'.followed_close_pair, 'W') - else - call search(s:FormatChunk(followed_open_pair, followed_close_pair), 'We') - end - return s:Right.inputed_close_pair.s:Left - else - normal he - return s:Right.current_char.s:Left - end -endfunction - -function! AutoPairsMap(key) - " | is special key which separate map command from text - let key = a:key - if key == '|' - let key = '<BAR>' - end - let escaped_key = substitute(key, "'", "''", 'g') - " use expr will cause search() doesn't work - execute 'inoremap <buffer> <silent> '.key." <C-R>=AutoPairsInsert('".escaped_key."')<CR>" -endfunction - -function! AutoPairsToggle() - if b:autopairs_enabled - let b:autopairs_enabled = 0 - echo 'AutoPairs Disabled.' - else - let b:autopairs_enabled = 1 - echo 'AutoPairs Enabled.' - end - return '' -endfunction - -function! AutoPairsReturn() - if b:autopairs_enabled == 0 - return '' - end - let line = getline('.') - let pline = getline(line('.')-1) - let prev_char = pline[strlen(pline)-1] - let cmd = '' - let cur_char = line[col('.')-1] - if has_key(b:AutoPairs, prev_char) && b:AutoPairs[prev_char] == cur_char - if g:AutoPairsCenterLine && winline() * 3 >= winheight(0) * 2 - " Use \<BS> instead of \<ESC>cl will cause the placeholder deleted - " incorrect. because <C-O>zz won't leave Normal mode. - " Use \<DEL> is a bit wierd. the character before cursor need to be deleted. - " Adding a space, recentering, and deleting it interferes with default - " whitespace-removing behavior when exiting insert mode. - let cmd = "\<ESC>zzcc" - end - - " If equalprg has been set, then avoid call = - " https://github.com/jiangmiao/auto-pairs/issues/24 - if &equalprg != '' - return "\<ESC>O".cmd - endif - - " conflict with javascript and coffee - " javascript need indent new line - " coffeescript forbid indent new line - if &filetype == 'coffeescript' || &filetype == 'coffee' - return "\<ESC>k==o".cmd - else - return "\<ESC>=ko".cmd - endif - end - return '' -endfunction - -function! AutoPairsSpace() - let line = getline('.') - let prev_char = line[col('.')-2] - let cmd = '' - let cur_char =line[col('.')-1] - if has_key(g:AutoPairsParens, prev_char) && g:AutoPairsParens[prev_char] == cur_char - let cmd = "\<SPACE>".s:Left - endif - return "\<SPACE>".cmd -endfunction - -function! AutoPairsBackInsert() - if exists('b:autopairs_saved_pair') - let pair = b:autopairs_saved_pair[0] - let pos = b:autopairs_saved_pair[1] - call setpos('.', pos) - return pair - endif - return '' -endfunction - -function! AutoPairsInit() - let b:autopairs_loaded = 1 - let b:autopairs_enabled = 1 - let b:AutoPairsClosedPairs = {} - - if !exists('b:AutoPairs') - let b:AutoPairs = g:AutoPairs - end - - " buffer level map pairs keys - for [open, close] in items(b:AutoPairs) - call AutoPairsMap(open) - if open != close - call AutoPairsMap(close) - end - let b:AutoPairsClosedPairs[close] = open - endfor - - " Still use <buffer> level mapping for <BS> <SPACE> - if g:AutoPairsMapBS - " Use <C-R> instead of <expr> for issue #14 sometimes press BS output strange words - execute 'inoremap <buffer> <silent> <BS> <C-R>=AutoPairsDelete()<CR>' - end - - if g:AutoPairsMapCh - execute 'inoremap <buffer> <silent> <C-h> <C-R>=AutoPairsDelete()<CR>' - endif - - if g:AutoPairsMapSpace - " Try to respect abbreviations on a <SPACE> - let do_abbrev = "" - if v:version == 703 && has("patch489") || v:version > 703 - let do_abbrev = "<C-]>" - endif - execute 'inoremap <buffer> <silent> <SPACE> '.do_abbrev.'<C-R>=AutoPairsSpace()<CR>' - end - - if g:AutoPairsShortcutFastWrap != '' - execute 'inoremap <buffer> <silent> '.g:AutoPairsShortcutFastWrap.' <C-R>=AutoPairsFastWrap()<CR>' - end - - if g:AutoPairsShortcutBackInsert != '' - execute 'inoremap <buffer> <silent> '.g:AutoPairsShortcutBackInsert.' <C-R>=AutoPairsBackInsert()<CR>' - end - - if g:AutoPairsShortcutToggle != '' - " use <expr> to ensure showing the status when toggle - execute 'inoremap <buffer> <silent> <expr> '.g:AutoPairsShortcutToggle.' AutoPairsToggle()' - execute 'noremap <buffer> <silent> '.g:AutoPairsShortcutToggle.' :call AutoPairsToggle()<CR>' - end - - if g:AutoPairsShortcutJump != '' - execute 'inoremap <buffer> <silent> ' . g:AutoPairsShortcutJump. ' <ESC>:call AutoPairsJump()<CR>a' - execute 'noremap <buffer> <silent> ' . g:AutoPairsShortcutJump. ' :call AutoPairsJump()<CR>' - end - -endfunction - -function! s:ExpandMap(map) - let map = a:map - let map = substitute(map, '\(<Plug>\w\+\)', '\=maparg(submatch(1), "i")', 'g') - return map -endfunction - -function! AutoPairsTryInit() - if exists('b:autopairs_loaded') - return - end - - " for auto-pairs starts with 'a', so the priority is higher than supertab and vim-endwise - " - " vim-endwise doesn't support <Plug>AutoPairsReturn - " when use <Plug>AutoPairsReturn will cause <Plug> isn't expanded - " - " supertab doesn't support <SID>AutoPairsReturn - " when use <SID>AutoPairsReturn will cause Duplicated <CR> - " - " and when load after vim-endwise will cause unexpected endwise inserted. - " so always load AutoPairs at last - - " Buffer level keys mapping - " comptible with other plugin - if g:AutoPairsMapCR - if v:version == 703 && has('patch32') || v:version > 703 - " VIM 7.3 supports advancer maparg which could get <expr> info - " then auto-pairs could remap <CR> in any case. - let info = maparg('<CR>', 'i', 0, 1) - if empty(info) - let old_cr = '<CR>' - let is_expr = 0 - else - let old_cr = info['rhs'] - let old_cr = s:ExpandMap(old_cr) - let old_cr = substitute(old_cr, '<SID>', '<SNR>' . info['sid'] . '_', 'g') - let is_expr = info['expr'] - let wrapper_name = '<SID>AutoPairsOldCRWrapper73' - endif - else - " VIM version less than 7.3 - " the mapping's <expr> info is lost, so guess it is expr or not, it's - " not accurate. - let old_cr = maparg('<CR>', 'i') - if old_cr == '' - let old_cr = '<CR>' - let is_expr = 0 - else - let old_cr = s:ExpandMap(old_cr) - " old_cr contain (, I guess the old cr is in expr mode - let is_expr = old_cr =~ '\V(' && toupper(old_cr) !~ '\V<C-R>' - - " The old_cr start with " it must be in expr mode - let is_expr = is_expr || old_cr =~ '\v^"' - let wrapper_name = '<SID>AutoPairsOldCRWrapper' - end - end - - if old_cr !~ 'AutoPairsReturn' - if is_expr - " remap <expr> to `name` to avoid mix expr and non-expr mode - execute 'inoremap <buffer> <expr> <script> '. wrapper_name . ' ' . old_cr - let old_cr = wrapper_name - end - " Always silent mapping - execute 'inoremap <script> <buffer> <silent> <CR> '.old_cr.'<SID>AutoPairsReturn' - end - endif - call AutoPairsInit() -endfunction - -" Always silent the command -inoremap <silent> <SID>AutoPairsReturn <C-R>=AutoPairsReturn()<CR> -imap <script> <Plug>AutoPairsReturn <SID>AutoPairsReturn - - -au BufEnter * :call AutoPairsTryInit() diff --git a/update_plugins.py b/update_plugins.py index 97292d72..07116c96 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -52,7 +52,6 @@ vim-flake8 https://github.com/nvie/vim-flake8 vim-pug https://github.com/digitaltoad/vim-pug vim-yankstack https://github.com/maxbrunsfeld/vim-yankstack lightline.vim https://github.com/itchyny/lightline.vim -auto-pairs https://github.com/jiangmiao/auto-pairs """.strip() GITHUB_ZIP = '%s/archive/master.zip' From 183ca1cfc5b36727d7aaf357b54bda73aa0a2ca4 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Fri, 26 Aug 2016 14:14:22 +0200 Subject: [PATCH 184/254] Improved auto indenting for regular langs and for Python --- vimrcs/basic.vim | 5 ++--- vimrcs/filetypes.vim | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index f80164bf..837469f7 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -189,9 +189,8 @@ set tabstop=4 set lbr set tw=500 -set cindent -set cinkeys-=0# -set indentkeys-=0# +set ai "Auto indent +set si "Smart indent set wrap "Wrap lines diff --git a/vimrcs/filetypes.vim b/vimrcs/filetypes.vim index 9ac5c552..8c4eb9db 100644 --- a/vimrcs/filetypes.vim +++ b/vimrcs/filetypes.vim @@ -17,6 +17,9 @@ au FileType python map <buffer> <leader>1 /class au FileType python map <buffer> <leader>2 /def au FileType python map <buffer> <leader>C ?class au FileType python map <buffer> <leader>D ?def +au FileType python set cindent +au FileType python set cinkeys-=0# +au FileType python set indentkeys-=0# """""""""""""""""""""""""""""" From b9974151b8c830df347edb9f34c9eda5c36f1b82 Mon Sep 17 00:00:00 2001 From: dgitelson <dgitelson@tango.me> Date: Fri, 2 Sep 2016 11:29:18 +0300 Subject: [PATCH 185/254] Enable 256 color palettes for Gnome Terminal. --- vimrcs/basic.vim | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index 837469f7..85eb91bc 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -141,6 +141,11 @@ set foldcolumn=1 " Enable syntax highlighting syntax enable +" Enable 256 colors palette in Gnome Terminal +if $COLORTERM == 'gnome-terminal' + set t_Co=256 +endif + try colorscheme desert catch From 52e1b93cf028368c09283ef052493a15907c81f7 Mon Sep 17 00:00:00 2001 From: Tomas Slusny <slusnucky@gmail.com> Date: Fri, 16 Sep 2016 01:08:54 +0200 Subject: [PATCH 186/254] Properly disable sound on errors on MacVim Current configuration was not disabling that annoying sounds on MacVim. According to help: ``` Use visual bell instead of beeping. The terminal code to display the visual bell is given with 't_vb'. When no beep or flash is wanted, use ":set vb t_vb=". Note: When the GUI starts, 't_vb' is reset to its default value. You might want to set it again in your |gvimrc|. ``` --- vimrcs/basic.vim | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index 837469f7..a98823b5 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -131,6 +131,12 @@ set novisualbell set t_vb= set tm=500 +" Properly disable sound on errors on MacVim +if has("gui_macvim") + autocmd GUIEnter * set vb t_vb= +endif + + " Add a bit extra margin to the left set foldcolumn=1 From aad95603eaf7eacbd346369935fe1c6ff2df6a96 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sun, 2 Oct 2016 13:37:21 +0200 Subject: [PATCH 187/254] Updated plugins --- .../ctrlp.vim/autoload/ctrlp.vim | 15 +- sources_non_forked/ctrlp.vim/doc/ctrlp.txt | 21 +- sources_non_forked/ctrlp.vim/plugin/ctrlp.vim | 8 +- sources_non_forked/ctrlp.vim/readme.md | 4 + sources_non_forked/lightline.vim/README.md | 27 +- .../lightline.vim/autoload/lightline.vim | 13 +- .../lightline.vim/doc/lightline.txt | 40 +- .../lightline.vim/test/expand.vim | 12 + .../lightline.vim/test/subseparator.vim | 105 +++ sources_non_forked/nerdtree/CHANGELOG | 12 + sources_non_forked/nerdtree/README.markdown | 19 +- sources_non_forked/nerdtree/doc/NERD_tree.txt | 23 +- .../nerdtree/lib/nerdtree/opener.vim | 2 +- .../nerdtree/lib/nerdtree/path.vim | 17 +- .../nerdtree/lib/nerdtree/tree_dir_node.vim | 32 +- .../nerdtree/lib/nerdtree/ui.vim | 3 +- .../nerdtree/nerdtree_plugin/fs_menu.vim | 6 +- .../nerdtree/plugin/NERD_tree.vim | 7 +- .../nerdtree/syntax/nerdtree.vim | 2 +- sources_non_forked/syntastic/README.markdown | 359 ++++---- .../syntastic/autoload/syntastic/util.vim | 36 +- .../syntastic/doc/syntastic-checkers.txt | 6 +- .../syntastic/doc/syntastic.txt | 127 ++- .../syntastic/plugin/syntastic.vim | 175 ++-- .../plugin/syntastic/autoloclist.vim | 25 +- .../syntastic/plugin/syntastic/loclist.vim | 34 +- .../syntastic/plugin/syntastic/modemap.vim | 2 +- .../syntastic/plugin/syntastic/notifiers.vim | 2 +- .../syntastic/plugin/syntastic/registry.vim | 5 +- .../syntax_checkers/haskell/hdevtools.vim | 10 +- .../syntax_checkers/javascript/flow.vim | 2 +- .../syntastic/syntax_checkers/lua/luac.vim | 2 +- .../vim-coffee-script/syntax/coffee.vim | 4 +- sources_non_forked/vim-go/.gitignore | 1 + sources_non_forked/vim-go/CHANGELOG.md | 21 + sources_non_forked/vim-go/README.md | 14 +- .../vim-go/assets/screenshot.png | Bin 0 -> 764721 bytes sources_non_forked/vim-go/assets/vim-go.png | Bin 0 -> 29252 bytes sources_non_forked/vim-go/assets/vim-go.svg | 821 ++++++++++++++++++ sources_non_forked/vim-go/autoload/go/cmd.vim | 5 +- .../vim-go/autoload/go/complete.vim | 4 +- sources_non_forked/vim-go/autoload/go/def.vim | 8 +- sources_non_forked/vim-go/autoload/go/doc.vim | 21 +- sources_non_forked/vim-go/autoload/go/fmt.vim | 2 +- .../vim-go/autoload/go/path.vim | 2 +- sources_non_forked/vim-go/doc/vim-go.txt | 21 +- .../vim-go/ftplugin/go/commands.vim | 2 +- sources_non_forked/vim-go/syntax/go.vim | 16 +- .../vim-snipmate/autoload/snipMate.vim | 14 +- .../vim-snipmate/doc/snipMate.txt | 6 + .../vim-snippets/UltiSnips/all.snippets | 23 + .../vim-snippets/UltiSnips/html.snippets | 12 + .../UltiSnips/javascript.snippets | 2 +- .../vim-snippets/snippets/elixir.snippets | 15 + .../vim-snippets/snippets/eruby.snippets | 1 + .../snippets/javascript/bemjson.snippets | 52 ++ .../snippets/javascript/javascript.snippets | 3 + .../vim-snippets/snippets/lfe.snippets | 18 + .../vim-snippets/snippets/perl.snippets | 8 +- .../vim-snippets/snippets/stylus.snippets | 2 + 60 files changed, 1788 insertions(+), 463 deletions(-) create mode 100644 sources_non_forked/vim-go/assets/screenshot.png create mode 100644 sources_non_forked/vim-go/assets/vim-go.png create mode 100644 sources_non_forked/vim-go/assets/vim-go.svg create mode 100644 sources_non_forked/vim-snippets/snippets/javascript/bemjson.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/lfe.snippets diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index b0146a36..568b0f3a 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -204,6 +204,14 @@ let s:hlgrps = { \ } " lname, sname of the basic(non-extension) modes +let s:types = ['fil', 'buf', 'mru'] +if !exists('g:ctrlp_types') + let g:ctrlp_types = s:types +el + call filter(g:ctrlp_types, "index(['fil', 'buf', 'mru'], v:val)!=-1") +en +let g:ctrlp_builtins = len(g:ctrlp_types)-1 + let s:coretypes = filter([ \ ['files', 'fil'], \ ['buffers', 'buf'], @@ -912,10 +920,13 @@ fu! s:PrtDeleteMRU() endf fu! s:PrtExit() + let bw = bufwinnr('%') exe bufwinnr(s:bufnr).'winc w' if bufnr('%') == s:bufnr && bufname('%') == 'ControlP' noa cal s:Close(1) noa winc p + els + exe bw.'winc w' en endf @@ -1962,7 +1973,7 @@ fu! s:isabs(path) endf fu! s:bufnrfilpath(line) - if s:isabs(a:line) || a:line =~ '^\~[/\\]' + if s:isabs(a:line) || a:line =~ '^\~[/\\]' || a:line =~ '^\w\+:\/\/' let filpath = a:line el let filpath = s:dyncwd.s:lash().a:line @@ -2032,7 +2043,7 @@ fu! s:checkbuf() endf fu! s:iscmdwin() - let ermsg = v:errmsg + let [ermsg, v:errmsg] = [v:errmsg, ''] sil! noa winc p sil! noa winc p let [v:errmsg, ermsg] = [ermsg, v:errmsg] diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt index 4cc6017d..416fd000 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt @@ -255,8 +255,9 @@ plugins look for .git/, .hg/,... some other plugins look for external *.exe tools on Windows). So be a little mindful of what you put in your |wildignore|. *'g:ctrlp_custom_ignore'* -In addition to |'wildignore'|, use this for files and directories you want only -CtrlP to not show. Use regexp to specify the patterns: > +In addition to |'wildignore'| and |g:ctrlp_show_hidden|, use this for files +and directories you want only CtrlP to not show. Use regexp to specify the +patterns: > let g:ctrlp_custom_ignore = '' < Examples: > @@ -860,7 +861,8 @@ COMMANDS *ctrlp-commands* Open CtrlP in find file mode. If no argument is given, the value of |g:ctrlp_working_path_mode| will be - used to determine the starting directory. + used to determine the starting directory. See |:CtrlPCurFile| and + |:CtrlPCurWD| to temporarily override the setting. You can use <tab> to auto-complete the [starting-directory] when typing it. @@ -868,6 +870,16 @@ COMMANDS *ctrlp-commands* :CtrlPBuffer Open CtrlP in find buffer mode. + *:CtrlPCurFile* +:CtrlPCurFile + This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = '' and ignores + the variable's current value. + + *:CtrlPCurWD* +:CtrlPCurWD + This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = '' and ignores + the variable's current value. + *:CtrlPMRU* :CtrlPMRU Open CtrlP in find Most-Recently-Used file mode. @@ -1329,7 +1341,8 @@ Available extensions:~ Buffer Tag mode options:~ *'g:ctrlp_buftag_ctags_bin'* -If ctags isn't in your $PATH, use this to set its location: > +If ctags isn't in your $PATH, or a ctags binary exists in either +/opt/local/bin or /usr/local/bin, us this to set its location: > let g:ctrlp_buftag_ctags_bin = '' < diff --git a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim index 9f2bb147..5ab368aa 100644 --- a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim @@ -10,15 +10,9 @@ if ( exists('g:loaded_ctrlp') && g:loaded_ctrlp ) || v:version < 700 || &cp en let g:loaded_ctrlp = 1 -let s:types = ['fil', 'buf', 'mru'] -if !exists('g:ctrlp_types') - let g:ctrlp_types = s:types -el - call filter(g:ctrlp_types, "index(['fil', 'buf', 'mru'], v:val)!=-1") -en let [g:ctrlp_lines, g:ctrlp_allfiles, g:ctrlp_alltags, g:ctrlp_alldirs, \ g:ctrlp_allmixes, g:ctrlp_buftags, g:ctrlp_ext_vars, g:ctrlp_builtins] - \ = [[], [], [], [], {}, {}, [], len(g:ctrlp_types)-1] + \ = [[], [], [], [], {}, {}, [], 2] if !exists('g:ctrlp_map') | let g:ctrlp_map = '<c-p>' | en if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en diff --git a/sources_non_forked/ctrlp.vim/readme.md b/sources_non_forked/ctrlp.vim/readme.md index 66fc9e8c..5412b6de 100644 --- a/sources_non_forked/ctrlp.vim/readme.md +++ b/sources_non_forked/ctrlp.vim/readme.md @@ -64,6 +64,10 @@ Use `:diffthis` when opening multiple files to run `:diffthis` on the first 4 fi If more than one mode is specified, they will be tried in order until a directory is located. +* If a file is already open, open it again in a new pane instead of switching to the existing pane + + `let g:ctrlp_switch_buffer = 'et'` + * Exclude files and directories using Vim's `wildignore` and CtrlP's own `g:ctrlp_custom_ignore`. If a custom listing command is being used, exclusions are ignored: ```vim diff --git a/sources_non_forked/lightline.vim/README.md b/sources_non_forked/lightline.vim/README.md index 03f5da1b..31f79fda 100644 --- a/sources_non_forked/lightline.vim/README.md +++ b/sources_non_forked/lightline.vim/README.md @@ -272,7 +272,7 @@ set noshowmode ``` -Now, let us get back to the tutorial (with the patched font for vim-powerline). +Now, let's get back to the tutorial (with the patched font for vim-powerline). You look into a help file to find the marks annoying. ![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/6.png) @@ -293,8 +293,8 @@ let g:lightline = { ![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/7.png) Huh? Weird! -The components do not collapse even if they have no information! -In order to avoid this situation, you set expressions to `g:lightline.component_visible_condition`, which should become 1 only when the corresponding components have information. +The subseparators are visible even if the components are empty. +In order to hide the subseparators, you can set expressions to `g:lightline.component_visible_condition`, which should be 1 only when the corresponding component is not empty. ```vim let g:lightline = { \ 'colorscheme': 'wombat', @@ -313,8 +313,8 @@ let g:lightline = { ![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/8.png) Okay. It works nice. - - +The configuration `component_visible_condition` is used to control the visibility of the subseparators. +You cannot use this variable to control the visibility of the components themselves. How does lightline decide the components to show in the statusline? It's very simple. @@ -340,16 +340,9 @@ let g:lightline = { \ } ``` If the plugin arranges all the components (in a situation you `set paste` and the file `.vimrc` is read-only, try to modify): + ![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/9.png) -The mode component, the paste component, read-only component, filename component and modified component in a row. -Normally, the paste component does not show up. -![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/10.png) - -If the file is not read-only (more common cases), the read-only component does not show up. -![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/11.png) - - Again look into `g:lightline.active.left`. ```vim let g:lightline = { @@ -357,8 +350,6 @@ let g:lightline = { \ 'left': [ [ 'mode', 'paste' ], \ [ 'readonly', 'filename', 'modified' ] ] ... ``` -And the screen shot of all the components. -![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/9.png) The mode and paste component are displayed in the same group. The read-only, filename and modified component are in the second group. @@ -369,11 +360,11 @@ You can configure the components in the statusline by the following four variabl + `g:lightline.inactive.left` + `g:lightline.inactive.right` -Of course, your settings in `.vimrc` have priority over the default settings in lightline. +Of course, your configurations in `.vimrc` have priority over the default settings in lightline. -GitHub branch is important for us. +Git branch is important for us. And it is a default component in [powerline](https://github.com/Lokaltog/powerline) and [vim-powerline](https://github.com/Lokaltog/vim-powerline). However, lightline does not provide the branch feature by default. @@ -552,7 +543,7 @@ subseparator.left | '\|' | '' (\ue0b1) | 'â®' (\u2b81) subseparator.right | '\|' | '' (\ue0b3) | '⮃' (\u2b83) branch symbol | -- | 'î‚ ' (\ue0a0) | 'â­ ' (\u2b60) readonly symbol | -- | 'î‚¢' (\ue0a2) | 'â­¤' (\u2b64) -linecolumn symbol | -- | 'î‚¡' (\ue0a1) | 'â­¡' (\u2b81) +linecolumn symbol | -- | 'î‚¡' (\ue0a1) | 'â­¡' (\u2b61) ### My settings I show my settings. I use the patched font for vim-powerline. diff --git a/sources_non_forked/lightline.vim/autoload/lightline.vim b/sources_non_forked/lightline.vim/autoload/lightline.vim index 045e2b85..14d1d2ab 100644 --- a/sources_non_forked/lightline.vim/autoload/lightline.vim +++ b/sources_non_forked/lightline.vim/autoload/lightline.vim @@ -2,7 +2,7 @@ " Filename: autoload/lightline.vim " Author: itchyny " License: MIT License -" Last Change: 2016/06/12 22:40:00. +" Last Change: 2016/09/04 13:01:40. " ============================================================================= let s:save_cpo = &cpo @@ -111,6 +111,7 @@ let s:_lightline = { \ 'modified': '&modified||!&modifiable', 'readonly': '&readonly', 'paste': '&paste', 'spell': '&spell' \ }, \ 'component_function': {}, + \ 'component_function_visible_condition': {}, \ 'component_expand': { \ 'tabs': 'lightline#tabs' \ }, @@ -293,11 +294,11 @@ function! lightline#highlight(...) abort endfunction function! s:subseparator(components, subseparator, expanded) abort - let [a, c, f, v] = [ a:components, s:lightline.component, s:lightline.component_function, s:lightline.component_visible_condition ] + let [a, c, f, v, u ] = [ a:components, s:lightline.component, s:lightline.component_function, s:lightline.component_visible_condition, s:lightline.component_function_visible_condition ] let xs = map(range(len(a:components)), 'a:expanded[v:val] ? "1" : - \ has_key(f, a[v:val]) ? (exists("*".f[a[v:val]]) ? "" : "exists(\"*".f[a[v:val]]."\")&&").f[a[v:val]]."()!=#\"\"" : - \ has_key(v, a[v:val]) ? "(" . v[a[v:val]] . ")" : has_key(c, a[v:val]) ? "1" : "0"') - return '%{' . (xs[0] ==# '1' ? '' : xs[0] . '&&(') . join(xs[1:], '||') . (xs[0] ==# '1' ? '' : ')') . '?"' . a:subseparator . '":""}' + \ has_key(f, a[v:val]) ? (has_key(u, a[v:val]) ? "(".u[a[v:val]].")" : (exists("*".f[a[v:val]]) ? "" : "exists(\"*".f[a[v:val]]."\")&&").f[a[v:val]]."()!=#\"\"") : + \ has_key(v, a[v:val]) ? "(".v[a[v:val]].")" : has_key(c, a[v:val]) ? "1" : "0"') + return '%{' . (xs[0] ==# '1' || xs[0] ==# '(1)' ? '' : xs[0] . '&&(') . join(xs[1:], '||') . (xs[0] ==# '1' || xs[0] ==# '(1)' ? '' : ')') . '?"' . a:subseparator . '":""}' endfunction function! lightline#concatenate(xs, right) abort @@ -324,7 +325,7 @@ endfunction function! s:evaluate_expand(component) abort try - let result = call(a:component, []) + let result = eval(a:component . '()') if type(result) == 1 && result ==# '' return [] endif diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index c151bddb..f4bc29be 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -1,10 +1,10 @@ *lightline.txt* A light and configurable statusline/tabline for Vim -Version: 0.0 +Version: 0.1 Author: itchyny (https://github.com/itchyny) License: MIT License Repository: https://github.com/itchyny/lightline.vim -Last Change: 2016/08/09 06:22:39. +Last Change: 2016/09/13 23:56:56. CONTENTS *lightline-contents* @@ -19,7 +19,6 @@ Examples |lightline-examples| Nice Examples |lightline-nice-examples| Powerful Example |lightline-powerful-example| Troubleshooting |lightline-troubleshooting| -Changelog |lightline-changelog| ============================================================================== INTRODUCTION *lightline-introduction* @@ -115,10 +114,13 @@ OPTIONS *lightline-option* \ 'column': '%c' \ 'close': '%999X X ' } < - g:lightline.component_visible_condition *g:lightline.component_visible_condition* - Dictionary of boolean expressions for the components. + g:lightline.component_visible_condition + *g:lightline.component_visible_condition* + Dictionary to store the visible condition of the components. Each expression should correspond to the condition each - component have non-zero length. + component is not empty. This configuration is used to control + the visibility of the subseparators. You cannot use this + configuration to control the visibility of the components. The default value is: > let g:lightline.component_visible_condition = { @@ -135,6 +137,11 @@ OPTIONS *lightline-option* because the user does not have to set both component and component_visible_condition. If a component set to both component and component_function, the setting of component_function has priority. + + The default value is: +> + let g:lightline.component_function = {} +< For example, if you want a component for read-only mark, which disappears in help windows: > @@ -150,6 +157,19 @@ OPTIONS *lightline-option* function! LightLineReadonly() return &ft !~? 'help' && &readonly ? 'RO' : '' endfunction +< + g:lightline.component_function_visible_condition + *g:lightline.component_function_visible_condition* + Dictionary to store the visible conditions of the function + components. Each expression should correspond to the condition + each component is not empty. This configuration is used to + control the visibility of the subseparators. You can use this + configuration to reduce the number of function calls for + function components by setting the value 1 (to tell lightline + that the component is always visible). + The default value is: +> + let g:lightline.component_function_visible_condition = {} < g:lightline.component_expand *g:lightline.component_expand* Another dictionary for components. You can create a component @@ -1126,7 +1146,7 @@ Problem 9: *lightline-problem-9* subseparator.right '|' '' (\ue0b3) '⮃' (\u2b83) branch symbol -- 'î‚ ' (\ue0a0) 'â­ ' (\u2b60) readonly symbol -- 'î‚¢' (\ue0a2) 'â­¤' (\u2b64) - linecolumn symbol -- 'î‚¡' (\ue0a1) 'â­¡' (\u2b81) + linecolumn symbol -- 'î‚¡' (\ue0a1) 'â­¡' (\u2b61) Problem 10: *lightline-problem-10* Cool statusline disappears on |unite|, |vimfiler| and |vimshell| @@ -1270,11 +1290,5 @@ Problem 17: *lightline-problem-17* Report/Request the issue/feature at https://github.com/itchyny/lightline.vim/issues. -============================================================================== -CHANGELOG *lightline-changelog* - -0.0 2013-08-21, ... - - Initial commit and implementation - ============================================================================== vim:tw=78:sw=4:ts=8:ft=help:norl:noet: diff --git a/sources_non_forked/lightline.vim/test/expand.vim b/sources_non_forked/lightline.vim/test/expand.vim index c2fc0ab9..37804eed 100644 --- a/sources_non_forked/lightline.vim/test/expand.vim +++ b/sources_non_forked/lightline.vim/test/expand.vim @@ -610,3 +610,15 @@ function! s:suite.duplicated_type_both_nil_right_most() \ [[['filename'], ['y0', 'y1', 'y0', 'y1']], [[0], [1, 1, 1, 1]], ['0', 'custom', '1']]) delfunction Custom endfunction + +function! s:suite.dictionary_function() + let g:lightline = { 'component_expand': { 'custom': 'g:lightline.Custom' } } + function! g:lightline.Custom() + return [ ['left'], ['middle'], ['right'] ] + endfunction + call lightline#init() + call s:assert.equals(s:expand([['readonly', 'filename'], ['custom'], ['modified']]), + \ [[['readonly', 'filename'], ['left', 'middle', 'right'], ['modified']], [[0, 0], [1, 1, 1], [0]], ['0', '1', '2', '3']]) + call s:assert.equals(s:expand([['readonly', 'filename', 'custom', 'modified']]), + \ [[['readonly', 'filename', 'left', 'middle', 'right', 'modified']], [[0, 0, 1, 1, 1, 0]], ['0', '1']]) +endfunction diff --git a/sources_non_forked/lightline.vim/test/subseparator.vim b/sources_non_forked/lightline.vim/test/subseparator.vim index 02cac4cc..2393840d 100644 --- a/sources_non_forked/lightline.vim/test/subseparator.vim +++ b/sources_non_forked/lightline.vim/test/subseparator.vim @@ -177,6 +177,111 @@ function! s:suite.subseparator_component_function_7() delfunction Custom3 endfunction +function! s:suite.subseparator_component_function_visible_condition_1() + function! Custom1() + return 'custom1' + endfunction + function! Custom2() + return 'custom2' + endfunction + function! Custom3() + return 'custom3' + endfunction + let g:lightline = { 'component_function': { 'custom1': 'Custom1', 'custom2': 'Custom2', 'custom3': 'Custom3' }, 'component_function_visible_condition': { 'custom1': '1', 'custom2': '1', 'custom3': '1' } } + call lightline#init() + call s:assert.equals(s:subseparator(['custom1', 'custom2', 'custom3'], '|', [0, 0, 0]), '|') +endfunction + +function! s:suite.subseparator_component_function_visible_condition_2() + function! Custom1() + return 'custom1' + endfunction + function! Custom2() + return 'custom2' + endfunction + function! Custom3() + return 'custom3' + endfunction + let g:lightline = { 'component_function': { 'custom1': 'Custom1', 'custom2': 'Custom2', 'custom3': 'Custom3' }, 'component_function_visible_condition': { 'custom1': '0', 'custom2': '1', 'custom3': '1' } } + call lightline#init() + call s:assert.equals(s:subseparator(['custom1', 'custom2', 'custom3'], '|', [0, 0, 0]), '') +endfunction + +function! s:suite.subseparator_component_function_visible_condition_3() + function! Custom1() + return 'custom1' + endfunction + function! Custom2() + return 'custom2' + endfunction + function! Custom3() + return 'custom3' + endfunction + let g:lightline = { 'component_function': { 'custom1': 'Custom1', 'custom2': 'Custom2', 'custom3': 'Custom3' }, 'component_function_visible_condition': { 'custom1': '1', 'custom2': '0', 'custom3': '1' } } + call lightline#init() + call s:assert.equals(s:subseparator(['custom1', 'custom2', 'custom3'], '|', [0, 0, 0]), '|') +endfunction + +function! s:suite.subseparator_component_function_visible_condition_4() + function! Custom1() + return 'custom1' + endfunction + function! Custom2() + return 'custom2' + endfunction + function! Custom3() + return 'custom3' + endfunction + let g:lightline = { 'component_function': { 'custom1': 'Custom1', 'custom2': 'Custom2', 'custom3': 'Custom3' }, 'component_function_visible_condition': { 'custom1': '1', 'custom2': '0', 'custom3': '0' } } + call lightline#init() + call s:assert.equals(s:subseparator(['custom1', 'custom2', 'custom3'], '|', [0, 0, 0]), '') +endfunction + +function! s:suite.subseparator_component_function_visible_condition_5() + function! Custom1() + return 'custom1' + endfunction + function! Custom2() + return '' + endfunction + function! Custom3() + return '' + endfunction + let g:lightline = { 'component_function': { 'custom1': 'Custom1', 'custom2': 'Custom2', 'custom3': 'Custom3' }, 'component_function_visible_condition': { 'custom1': '0' } } + call lightline#init() + call s:assert.equals(s:subseparator(['custom1', 'custom2', 'custom3'], '|', [0, 0, 0]), '') +endfunction + +function! s:suite.subseparator_component_function_visible_condition_6() + function! Custom1() + return '' + endfunction + function! Custom2() + return 'custom2' + endfunction + function! Custom3() + return 'custom3' + endfunction + let g:lightline = { 'component_function': { 'custom1': 'Custom1', 'custom2': 'Custom2', 'custom3': 'Custom3' }, 'component_function_visible_condition': { 'custom2': '1', 'custom3': '1' } } + call lightline#init() + call s:assert.equals(s:subseparator(['custom1', 'custom2', 'custom3'], '|', [0, 0, 0]), '') +endfunction + +function! s:suite.subseparator_component_function_visible_condition_7() + function! Custom1() + return 'custom1' + endfunction + function! Custom2() + return '' + endfunction + function! Custom3() + return 'custom3' + endfunction + let g:lightline = { 'component_function': { 'custom1': 'Custom1', 'custom2': 'Custom2', 'custom3': 'Custom3' }, 'component_function_visible_condition': { 'custom3': '1' } } + call lightline#init() + call s:assert.equals(s:subseparator(['custom1', 'custom2', 'custom3'], '|', [0, 0, 0]), '|') +endfunction + function! s:suite.subseparator_component_expand() function! Custom1() return 'custom1' diff --git a/sources_non_forked/nerdtree/CHANGELOG b/sources_non_forked/nerdtree/CHANGELOG index 2e08dd2a..a06c1669 100644 --- a/sources_non_forked/nerdtree/CHANGELOG +++ b/sources_non_forked/nerdtree/CHANGELOG @@ -1,4 +1,16 @@ Next + - Shorten delete confimration of empty directory to 'y' (mikeperri) #530 + - Fix API call to open directory tree in window (devm33) #533 + - Change default arrows on non-Windows platforms (gwilk) #546 + - Update to README - combine cd and git clone (zwhitchcox) #584 + - Update to README - Tip: start NERDTree when vim starts (therealplato) #593 + - Escape filename when moving an open buffer (zacharyvoase) #595 + - Fixed incorrect :helptags command in README (curran) #619 + - Fixed incomplete escaping of folder arrows (adityanatraj) #548 + - Added NERDTreeCascadeSingleChildDir option (juanibiapina) #558 + - Replace strchars() with backward compatible workaround. + - Add support for copy command in Windows (SkylerLipthay) #231 + - Fixed typo in README.markdown - :Helptags -> :helptags - Rename "primary" and "secondary" trees to "tab" and "window" trees. - Move a bunch of buffer level variables into the NERDTree and UI classes. - Display cascading dirs on one line to save vertical/horizontal space (@matt-gardner: brainstorming/testing) diff --git a/sources_non_forked/nerdtree/README.markdown b/sources_non_forked/nerdtree/README.markdown index 3fb9ee70..b25b97ef 100644 --- a/sources_non_forked/nerdtree/README.markdown +++ b/sources_non_forked/nerdtree/README.markdown @@ -57,10 +57,9 @@ Installation ####[pathogen.vim](https://github.com/tpope/vim-pathogen) - cd ~/.vim/bundle - git clone https://github.com/scrooloose/nerdtree.git + git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree -Then reload vim, run `:Helptags`, and check out `:help NERD_tree.txt`. +Then reload vim, run `:helptags ~/.vim/bundle/nerdtree/doc/`, and check out `:help NERD_tree.txt`. ####[apt-vim](https://github.com/egalpin/apt-vim) @@ -101,6 +100,16 @@ Stick this in your vimrc: Note: Now start vim with plain `vim`, not `vim .` +--- +> How can I open NERDTree on startup, and have my cursor start in the other window? + +Stick this in your vimrc: + + autocmd vimenter * NERDTree + autocmd vimenter * wincmd p + + *via [stackoverflow/Yohann](http://stackoverflow.com/questions/4277808/nerdtree-auto-focus-to-file-when-opened-in-new-tab/19330023#19330023)* + --- > How can I map a specific key or shortcut to open NERDTree? @@ -125,5 +134,5 @@ See here: https://github.com/scrooloose/nerdtree/issues/433#issuecomment-9259069 Use these variables in your vimrc. Note that below are default arrow symbols - let g:NERDTreeDirArrowExpandable = 'â–¸' - let g:NERDTreeDirArrowCollapsible = 'â–¾' + let g:NERDTreeDirArrowExpandable = 'â–º' + let g:NERDTreeDirArrowCollapsible = 'â–¼' diff --git a/sources_non_forked/nerdtree/doc/NERD_tree.txt b/sources_non_forked/nerdtree/doc/NERD_tree.txt index bf1ab5a8..d0af4a82 100644 --- a/sources_non_forked/nerdtree/doc/NERD_tree.txt +++ b/sources_non_forked/nerdtree/doc/NERD_tree.txt @@ -668,14 +668,18 @@ NERD tree. These options should be set in your vimrc. |'NERDTreeWinSize'| Sets the window size when the NERD tree is opened. -|'NERDTreeMinimalUI'| Disables display of the 'Bookmarks' label and +|'NERDTreeMinimalUI'| Disables display of the 'Bookmarks' label and 'Press ? for help' text. +|'NERDTreeCascadeSingleChildDir'| + Collapses on the same line directories that + have only one child directory. + |'NERDTreeCascadeOpenSingleChildDir'| Cascade open while selected directory has only one child that also is a directory. -|'NERDTreeAutoDeleteBuffer'| Tells the NERD tree to automatically remove +|'NERDTreeAutoDeleteBuffer'| Tells the NERD tree to automatically remove a buffer when a file is being deleted or renamed via a context menu command. @@ -987,7 +991,18 @@ of the following lines to set this option: > < ------------------------------------------------------------------------------ - *'NERDTreeCascadeOpenSingleChildDir'* + *'NERDTreeCascadeSingleChildDir'* +Values: 0 or 1 +Default: 1. + +When displaying dir nodes, this option tells NERDTree to collapse dirs that +have only one child. Use one of the follow lines to set this option: > + let NERDTreeCascadeSingleChildDir=0 + let NERDTreeCascadeSingleChildDir=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeCascadeOpenSingleChildDir'* Values: 0 or 1 Default: 1. @@ -1001,7 +1016,7 @@ useful for Java projects. Use one of the follow lines to set this option: > < ------------------------------------------------------------------------------ - *'NERDTreeAutoDeleteBuffer'* + *'NERDTreeAutoDeleteBuffer'* Values: 0 or 1 Default: 0. diff --git a/sources_non_forked/nerdtree/lib/nerdtree/opener.vim b/sources_non_forked/nerdtree/lib/nerdtree/opener.vim index 00947cdb..ac0f92eb 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/opener.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/opener.vim @@ -257,7 +257,7 @@ endfunction function! s:Opener._openDirectory(node) if self._nerdtree.isWinTree() call self._gotoTargetWin() - call g:NERDTreeCreator.CreateWindow(a:node.path.str()) + call g:NERDTreeCreator.CreateWindowTree(a:node.path.str()) else call self._gotoTargetWin() if empty(self._where) diff --git a/sources_non_forked/nerdtree/lib/nerdtree/path.vim b/sources_non_forked/nerdtree/lib/nerdtree/path.vim index 674ca03e..5f3b16ad 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/path.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/path.vim @@ -174,11 +174,15 @@ function! s:Path.copy(dest) call s:Path.createParentDirectories(a:dest) - let dest = s:Path.WinToUnixPath(a:dest) + if exists('g:NERDTreeCopyCmd') + let cmd_prefix = g:NERDTreeCopyCmd + else + let cmd_prefix = (self.isDirectory ? g:NERDTreeCopyDirCmd : g:NERDTreeCopyFileCmd) + endif - let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), self._escChars()) . " " . escape(dest, self._escChars()) + let cmd = cmd_prefix . " " . escape(self.str(), self._escChars()) . " " . escape(a:dest, self._escChars()) let success = system(cmd) - if success != 0 + if v:shell_error != 0 throw "NERDTree.CopyError: Could not copy ''". self.str() ."'' to: '" . a:dest . "'" endif endfunction @@ -187,7 +191,7 @@ endfunction " "returns 1 if copying is supported for this OS function! s:Path.CopyingSupported() - return exists('g:NERDTreeCopyCmd') + return exists('g:NERDTreeCopyCmd') || (exists('g:NERDTreeCopyDirCmd') && exists('g:NERDTreeCopyFileCmd')) endfunction "FUNCTION: Path.copyingWillOverwrite(dest) {{{1 @@ -213,7 +217,7 @@ endfunction "FUNCTION: Path.createParentDirectories(path) {{{1 " "create parent directories for this path if needed -"without throwing any errors is those directories already exist +"without throwing any errors if those directories already exist " "Args: "path: full path of the node whose parent directories may need to be created @@ -226,8 +230,7 @@ endfunction "FUNCTION: Path.delete() {{{1 " -"Deletes the file represented by this path. -"Deletion of directories is not supported +"Deletes the file or directory represented by this path. " "Throws NERDTree.Path.Deletion exceptions function! s:Path.delete() diff --git a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim index 48e9bda3..c41077df 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim @@ -117,28 +117,14 @@ endfunction "FUNCTION: TreeDirNode.getCascade() {{{1 "Return an array of dir nodes (starting from self) that can be cascade opened. function! s:TreeDirNode.getCascade() + if !self.isCascadable() + return [self] + endif - let rv = [self] - let node = self + let vc = self.getVisibleChildren() + let visChild = vc[0] - while 1 - let vc = node.getVisibleChildren() - if len(vc) != 1 - break - endif - - let visChild = vc[0] - - "TODO: optimize - if !visChild.path.isDirectory - break - endif - - call add(rv, visChild) - let node = visChild - endwhile - - return rv + return [self] + visChild.getCascade() endfunction "FUNCTION: TreeDirNode.getChildCount() {{{1 @@ -264,6 +250,10 @@ endfunction "FUNCTION: TreeDirNode.isCascadable() {{{1 "true if this dir has only one visible child - which is also a dir function! s:TreeDirNode.isCascadable() + if g:NERDTreeCascadeSingleChildDir == 0 + return 0 + endif + let c = self.getVisibleChildren() return len(c) == 1 && c[0].path.isDirectory endfunction @@ -466,7 +456,7 @@ function! s:TreeDirNode.refresh() " Regular expression is too expensive. Use simply string comparison " instead - if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." && + if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." && \ i[len(i)-2:1] != "." && i[len(i)-1] != "." try "create a new path and see if it exists in this nodes children diff --git a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim index 094fa0f9..d107814c 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim @@ -282,7 +282,8 @@ endfunction function! s:UI._indentLevelFor(line) "have to do this work around because match() returns bytes, not chars let numLeadBytes = match(a:line, '\M\[^ '.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.']') - let leadChars = strchars(a:line[0:numLeadBytes-1]) + " The next line is a backward-compatible workaround for strchars(a:line(0:numLeadBytes-1]). strchars() is in 7.3+ + let leadChars = len(split(a:line[0:numLeadBytes-1], '\zs')) return leadChars / s:UI.IndentWid() endfunction diff --git a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim index 20a9fcd3..dff4027e 100644 --- a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim +++ b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim @@ -74,7 +74,7 @@ endfunction function! s:promptToRenameBuffer(bufnum, msg, newFileName) echo a:msg if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' - let quotedFileName = "'" . a:newFileName . "'" + let quotedFileName = fnameescape(a:newFilename) " 1. ensure that a new buffer is loaded exec "badd " . quotedFileName " 2. ensure that all windows which display the just deleted filename @@ -160,10 +160,10 @@ function! NERDTreeDeleteNode() let currentNode = g:NERDTreeFileNode.GetSelected() let confirmed = 0 - if currentNode.path.isDirectory + if currentNode.path.isDirectory && currentNode.getChildCount() > 0 let choice =input("Delete the current node\n" . \ "==========================================================\n" . - \ "STOP! To delete this entire directory, type 'yes'\n" . + \ "STOP! Directory is not empty! To delete, type 'yes'\n" . \ "" . currentNode.path.str() . ": ") let confirmed = choice ==# 'yes' else diff --git a/sources_non_forked/nerdtree/plugin/NERD_tree.vim b/sources_non_forked/nerdtree/plugin/NERD_tree.vim index 0bcfe968..a27714f4 100644 --- a/sources_non_forked/nerdtree/plugin/NERD_tree.vim +++ b/sources_non_forked/nerdtree/plugin/NERD_tree.vim @@ -68,13 +68,14 @@ call s:initVariable("g:NERDTreeShowLineNumbers", 0) call s:initVariable("g:NERDTreeSortDirs", 1) if !nerdtree#runningWindows() - call s:initVariable("g:NERDTreeDirArrowExpandable", "â–¸") - call s:initVariable("g:NERDTreeDirArrowCollapsible", "â–¾") + call s:initVariable("g:NERDTreeDirArrowExpandable", "â–º") + call s:initVariable("g:NERDTreeDirArrowCollapsible", "â–¼") else call s:initVariable("g:NERDTreeDirArrowExpandable", "+") call s:initVariable("g:NERDTreeDirArrowCollapsible", "~") endif call s:initVariable("g:NERDTreeCascadeOpenSingleChildDir", 1) +call s:initVariable("g:NERDTreeCascadeSingleChildDir", 1) if !exists("g:NERDTreeSortOrder") let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$'] @@ -103,6 +104,8 @@ call s:initVariable("g:NERDTreeWinSize", 31) "Note: the space after the command is important if nerdtree#runningWindows() call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ') + call s:initVariable("g:NERDTreeCopyDirCmd", 'xcopy /s /e /i /y /q ') + call s:initVariable("g:NERDTreeCopyFileCmd", 'copy /y ') else call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ') call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ') diff --git a/sources_non_forked/nerdtree/syntax/nerdtree.vim b/sources_non_forked/nerdtree/syntax/nerdtree.vim index d2a94834..efdd9436 100644 --- a/sources_non_forked/nerdtree/syntax/nerdtree.vim +++ b/sources_non_forked/nerdtree/syntax/nerdtree.vim @@ -25,7 +25,7 @@ syn match NERDTreeDirSlash #/# containedin=NERDTreeDir exec 'syn match NERDTreeClosable #'.escape(g:NERDTreeDirArrowCollapsible, '~').'# containedin=NERDTreeDir,NERDTreeFile' exec 'syn match NERDTreeOpenable #'.escape(g:NERDTreeDirArrowExpandable, '~').'# containedin=NERDTreeDir,NERDTreeFile' -let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~').escape(g:NERDTreeDirArrowExpandable, '~') +let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~]\-').escape(g:NERDTreeDirArrowExpandable, '~]\-') exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#' syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile' diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index 5523d088..1cf31e6f 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -25,22 +25,21 @@ 3. [Recommended settings](#settings) 4. [FAQ](#faq) 4.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo) -4.2. [How can I check scripts written for different versions of Python?](#faqpython) -4.3. [How can I check scripts written for different versions of Ruby?](#faqruby) -4.4. [Are there any local checkers for HTML5 that I can use with syntastic?](#faqhtml5) -4.5. [The `perl` checker has stopped working...](#faqperl) -4.6. [What happened to the `rustc` checker?](#faqrust) -4.7. [What happened to the `tsc` checker?](#faqtsc) -4.8. [What happened to the `xcrun` checker?](#faqxcrun) -4.9. [I run a checker and the location list is not updated...](#faqloclist) -4.9. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist) -4.10. [How can I pass additional arguments to a checker?](#faqargs) -4.11. [Syntastic supports several checkers for my filetype - how do I tell which one(s) to use?](#faqcheckers) -4.12. [What is the difference between syntax checkers and style checkers?](#faqstyle) -4.13. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate) -4.14. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext) -4.15. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig) -4.16. [The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?](#faqbdelete) +4.2. [Syntastic supports several checkers for my filetype, how do I tell it which one(s) to use?](#faqcheckers) +4.3. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate) +4.4. [How can I pass additional arguments to a checker?](#faqargs) +4.5. [I run a checker and the location list is not updated...](#faqloclist) +4.5. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist) +4.6. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext) +4.7. [The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?](#faqbdelete) +4.8. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig) +4.9. [What is the difference between syntax checkers and style checkers?](#faqstyle) +4.10. [How can I check scripts written for different versions of Python?](#faqpython) +4.11. [How can I check scripts written for different versions of Ruby?](#faqruby) +4.12. [The `perl` checker has stopped working...](#faqperl) +4.13. [What happened to the `rustc` checker?](#faqrust) +4.14. [What happened to the `tsc` checker?](#faqtsc) +4.15. [What happened to the `xcrun` checker?](#faqxcrun) 5. [Resources](#otherresources) - - - @@ -106,9 +105,9 @@ version 7 or later with the "normal", "big", or "huge" feature sets should be fine. Syntastic should work with any modern plugin managers for Vim, such as -[NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam], [Vim-Plug][plug], or -[Vundle][vundle]. Instructions for installing syntastic with [Pathogen][pathogen] are -included below for completeness. +[NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam], +[Vim-Plug][plug], or [Vundle][vundle]. Instructions for installing syntastic +with [Pathogen][pathogen] are included below for completeness. Starting with Vim version 7.4.1486 you can also load syntastic using the standard mechanism of packages, without the help of third-party plugin managers @@ -230,131 +229,12 @@ or the error output for a syntax checker may have changed. In this case, make sure you have the latest version of the syntax checker installed. If it still fails then post an [issue][bug_tracker] - or better yet, create a pull request. -<a name="faqpython"></a> - -__4.2. Q. How can I check scripts written for different versions of Python?__ - -A. Install a Python version manager such as [virtualenv][virtualenv] -or [pyenv][pyenv], activate the environment for the relevant version -of Python, and install in it the checkers you want to use. Set -`g:syntastic_python_checkers` accordingly in your `vimrc`, and run [Vim][vim] -from the virtual environment. - -If you're starting Vim from a desktop manager rather than from a terminal you -might need to write wrapper scripts around your checkers, to activate the -virtual environment before running the actual checks. Then you'll need to -point the relevant `g:syntastic_python_<checker>_exec` variables to the wrapper -scripts. - -<a name="faqruby"></a> - -__4.3. Q. How can I check scripts written for different versions of Ruby?__ - -A. Install a Ruby version manager such as [rvm][rvm] or [rbenv][rbenv], -activate the environment for the relevant version of Ruby, and install in it -the checkers you want to use. Set `g:syntastic_ruby_checkers` accordingly in -your `vimrc`, and run [Vim][vim] from the virtual environment. - -If you're starting Vim from a desktop manager rather than from a terminal you -might need to write wrapper scripts around your checkers, to activate the -virtual environment before running the actual checks. Then you'll need to -point the relevant `g:syntastic_ruby_<checker>_exec` variables to the wrapper -scripts. - -<a name="faqhtml5"></a> - -__4.4. Q. Are there any local checkers for HTML5 that I can use with syntastic?__ - -[HTML Tidy][tidy_old] has a fork named [HTML Tidy for HTML5][tidy]. It's a drop -in replacement, and syntastic can use it without changes. Just install it -somewhere and point `g:syntastic_html_tidy_exec` to its executable: -```vim -let g:syntastic_html_tidy_exec = 'tidy5' -``` -Alternatively, you can install [vnu.jar][vnu_jar] from the [validator.nu][vnu] -project and run it as a [HTTP server][vnu_server]: -```sh -$ java -Xss512k -cp /path/to/vnu.jar nu.validator.servlet.Main 8888 -``` -Then you can configure syntastic to use it: -```vim -let g:syntastic_html_validator_api = 'http://localhost:8888/' -``` - -<a name="faqperl"></a> - -__4.5. Q. The `perl` checker has stopped working...__ - -A. The `perl` checker runs `perl -c` against your file, which in turn -__executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use` -statements in your file (cf. [perlrun][perlrun]). This is probably fine if you -wrote the file yourself, but it's a security problem if you're checking -third-party files. Since there is currently no way to disable this behaviour -while still producing useful results, the checker is now disabled by default. -To (re-)enable it, make sure the `g:syntastic_perl_checkers` list includes -`perl`, and set `g:syntastic_enable_perl_checker` to 1 in your `vimrc`: -```vim -let g:syntastic_enable_perl_checker = 1 -``` - -<a name="faqrust"></a> - -__4.6. Q. What happened to the `rustc` checker?__ - -A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the -checker should be picked up automatically by syntastic. - -<a name="faqtsc"></a> - -__4.7. Q. What happened to the `tsc` checker?__ - -A. It didn't meet people's expectations and it has been removed. Please -consider using the external checker [tsuquyomi][tsuquyomi] instead. If you -install this plugin the checker should be picked up automatically by syntastic. - -<a name="faqxcrun"></a> - -__4.8. Q. What happened to the `xcrun` checker?__ - -A. The `xcrun` checker used to have a security problem and it has been removed. -A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you -install this plugin the checker should be picked up automatically by syntastic. - -<a name="faqloclist"></a> - -__4.9. Q. I run a checker and the location list is not updated...__ -__4.9. Q. I run`:lopen` or `:lwindow` and the error window is empty...__ - -A. By default the location list is changed only when you run the `:Errors` -command, in order to minimise conflicts with other plugins. If you want the -location list to always be updated when you run the checkers, add this line to -your `vimrc`: -```vim -let g:syntastic_always_populate_loc_list = 1 -``` - -<a name="faqargs"></a> - -__4.10. Q. How can I pass additional arguments to a checker?__ - -A. Almost all syntax checkers use the `makeprgBuild()` function. Those checkers -that do can be configured using global variables. The general form of the -global `args` variables is `syntastic_<filetype>_<checker>_args`. - -So, If you wanted to pass `--my --args --here` to the ruby mri checker you -would add this line to your `vimrc`: -```vim -let g:syntastic_ruby_mri_args = "--my --args --here" -``` - -See `:help syntastic-checker-options` for more information. - <a name="faqcheckers"></a> -__4.11. Q. Syntastic supports several checkers for my filetype - how do I tell it +__4.2. Q. Syntastic supports several checkers for my filetype, how do I tell it which one(s) to use?__ -A. Stick a line like this in your `vimrc`: +A. Add a line like this to your `vimrc`: ```vim let g:syntastic_<filetype>_checkers = ['<checker-name>'] ``` @@ -362,10 +242,9 @@ let g:syntastic_<filetype>_checkers = ['<checker-name>'] To see the list of supported checkers for your filetype read the [manual][checkers] (`:help syntastic-checkers` in Vim). -e.g. Python has the following checkers, among others: `flake8`, `pyflakes`, -`pylint` and a native `python` checker. - -To tell syntastic to use `pylint`, you would use this setting: +For example, Python has the following checkers, among others: `flake8`, +`pyflakes`, `pylint` and a native `python` checker. To tell syntastic to use +`pylint`, you would use this setting: ```vim let g:syntastic_python_checkers = ['pylint'] ``` @@ -379,8 +258,7 @@ This is telling syntastic to run the `php` checker first, and if no errors are found, run `phpcs`, and then `phpmd`. You can also run checkers explicitly by calling `:SyntasticCheck <checker>`. - -e.g. to run `phpcs` and `phpmd`: +For example to run `phpcs` and `phpmd`: ```vim :SyntasticCheck phpcs phpmd ``` @@ -390,39 +268,9 @@ aren't listed in `g:syntastic_<filetype>_checkers`. You can't run checkers for "foreign" filetypes though (e.g. you can't run, say, a Python checker if the filetype of the current file is `php`). -<a name="faqstyle"></a> - -__4.12. Q. What is the difference between syntax checkers and style checkers?__ - -A. The errors and warnings they produce are highlighted differently and can -be filtered by different rules, but otherwise the distinction is pretty much -arbitrary. There is an ongoing effort to keep things consistent, so you can -_generally_ expect messages produced by syntax checkers to be _mostly_ related -to syntax, and messages produced by style checkers to be _mostly_ about style. -But there can be no formal guarantee that, say, a style checker that runs into -a syntax error wouldn't die with a fatal message, nor that a syntax checker -wouldn't give you warnings against using some constructs as being bad practice. -There is also no guarantee that messages marked as "style" are less severe than -the ones marked as "syntax" (whatever that might mean). And there are even a -few Frankenstein checkers (for example `flake8` and `pylama`) that, by their -nature, produce both kinds of messages. Syntastic is not smart enough to be -able to sort out these things by itself. - -In fact it's more useful to look at this from the perspective of filtering -unwanted messages, rather than as an indicator of severity levels. The -distinction between syntax and style is orthogonal to the distinction between -errors and warnings, and thus you can turn off messages based on level, on -type, or both. - -e.g. To disable all style messages: -```vim -let g:syntastic_quiet_messages = { "type": "style" } -``` -See `:help syntastic_quiet_messages` for details. - <a name="faqaggregate"></a> -__4.13. Q. I have enabled multiple checkers for the current filetype. How can I +__4.3. Q. I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?__ A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`: @@ -432,9 +280,46 @@ let g:syntastic_aggregate_errors = 1 See `:help syntastic-aggregating-errors` for more details. +<a name="faqargs"></a> + +__4.4. Q. How can I pass additional arguments to a checker?__ + +A. In most cases a command line is constructed using an internal function +named `makeprgBuild()`, which provides a number of options that allow you to +customise every part of the command that gets run. You can set these options +using global variables. + +The general form of the global `args` variable is +`syntastic_<filetype>_<checker>_args`. Thus if you wanted to pass +`--my --args --here` to the Ruby `mri` checker you would add this line to your +`vimrc`: +```vim +let g:syntastic_ruby_mri_args = "--my --args --here" +``` + +See `:help syntastic-checker-options` for more information. + +A number of checkers don't use the `makeprgBuild()` function mentioned above, +or have additional options that can be configured. For these checkers the exact +list of options should be included in the [manual][checkers] +(`:help syntastic-checkers` in Vim). + +<a name="faqloclist"></a> + +__4.5. Q. I run a checker and the location list is not updated...__ +__4.5. Q. I run`:lopen` or `:lwindow` and the error window is empty...__ + +A. By default the location list is changed only when you run the `:Errors` +command, in order to minimise conflicts with other plugins. If you want the +location list to always be updated when you run the checkers, add this line to +your `vimrc`: +```vim +let g:syntastic_always_populate_loc_list = 1 +``` + <a name="faqlnext"></a> -__4.14. Q. How can I jump between the different errors without using the location +__4.6. Q. How can I jump between the different errors without using the location list at the bottom of the window?__ A. Vim provides several built-in commands for this. See `:help :lnext` and @@ -444,9 +329,21 @@ If you use these commands a lot then you may want to add shortcut mappings to your `vimrc`, or install something like [unimpaired][unimpaired], which provides such mappings (among other things). +<a name="faqbdelete"></a> + +__4.7. Q. The error window is closed automatically when I `:quit` the current buffer +but not when I `:bdelete` it?__ + +A. There is no safe way to handle that situation automatically, but you can +work around it: +```vim +nnoremap <silent> <C-d> :lclose<CR>:bdelete<CR> +cabbrev <silent> bd <C-r>=(getcmdtype()==#':' && getcmdpos()==1 ? 'lclose\|bdelete' : 'bd')<CR> +``` + <a name="faqconfig"></a> -__4.15. My favourite checker needs to load a configuration file from the +__4.8. My favourite checker needs to load a configuration file from the project's root rather than the current directory...__ A. You can set up an `autocmd` to search for the configuration file in the @@ -463,18 +360,106 @@ autocmd FileType javascript let b:syntastic_javascript_jscs_args = \ get(g:, 'syntastic_javascript_jscs_args', '') . \ FindConfig('-c', '.jscsrc', expand('<afile>:p:h', 1)) ``` -<a name="faqbdelete"></a> -__4.16. Q. The error window is closed automatically when I :quit the current buffer -but not when I :bdelete it?__ +<a name="faqstyle"></a> -A. There is no safe way to handle that situation automatically, but you can -work around it: +__4.9. Q. What is the difference between syntax checkers and style checkers?__ +A. The errors and warnings they produce are highlighted differently and can +be filtered by different rules, but otherwise the distinction is pretty much +arbitrary. There is an ongoing effort to keep things consistent, so you can +_generally_ expect messages produced by syntax checkers to be _mostly_ related +to syntax, and messages produced by style checkers to be _mostly_ about style. +But there can be no formal guarantee that, say, a style checker that runs into +a syntax error wouldn't die with a fatal message, nor that a syntax checker +wouldn't give you warnings against using some constructs as being bad practice. +There is also no guarantee that messages marked as `style` are less severe than +the ones marked as `syntax` (whatever that might mean). And there are even a +few Frankenstein checkers (for example `flake8` and `pylama`) that, by their +nature, produce both kinds of messages. Syntastic is not smart enough to be +able to sort out these things by itself. + +Generally it's more useful to look at this from the perspective of filtering +unwanted messages, rather than as an indicator of severity levels. The +distinction between syntax and style is orthogonal to the distinction between +errors and warnings, and thus you can turn off messages based on level, on +type, or both. + +e.g. To disable all style messages: ```vim -nnoremap <silent> <C-d> :lclose<CR>:bdelete<CR> -cabbrev <silent> bd <C-r>=(getcmdtype()==#':' && getcmdpos()==1 ? 'lclose\|bdelete' : 'bd')<CR> +let g:syntastic_quiet_messages = { "type": "style" } ``` +See `:help syntastic_quiet_messages` for more information. + +<a name="faqpython"></a> + +__4.10. Q. How can I check scripts written for different versions of Python?__ + +A. Install a Python version manager such as [virtualenv][virtualenv] +or [pyenv][pyenv], activate the environment for the relevant version +of Python, and install in it the checkers you want to use. Set +`g:syntastic_python_checkers` accordingly in your `vimrc`, and run [Vim][vim] +from the virtual environment. + +If you're starting Vim from a desktop manager rather than from a terminal you +might need to write wrapper scripts around your checkers, to activate the +virtual environment before running the actual checks. Then you'll need to +point the relevant `g:syntastic_python_<checker>_exec` variables to the wrapper +scripts. + +<a name="faqruby"></a> + +__4.11. Q. How can I check scripts written for different versions of Ruby?__ + +A. Install a Ruby version manager such as [rvm][rvm] or [rbenv][rbenv], +activate the environment for the relevant version of Ruby, and install in it +the checkers you want to use. Set `g:syntastic_ruby_checkers` accordingly in +your `vimrc`, and run [Vim][vim] from the virtual environment. + +If you're starting Vim from a desktop manager rather than from a terminal you +might need to write wrapper scripts around your checkers, to activate the +virtual environment before running the actual checks. Then you'll need to +point the relevant `g:syntastic_ruby_<checker>_exec` variables to the wrapper +scripts. + +<a name="faqperl"></a> + +__4.12. Q. The `perl` checker has stopped working...__ + +A. The `perl` checker runs `perl -c` against your file, which in turn +__executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use` +statements in your file (cf. [perlrun][perlrun]). This is probably fine if you +wrote the file yourself, but it's a security problem if you're checking +third-party files. Since there is currently no way to disable this behaviour +while still producing useful results, the checker is now disabled by default. +To (re-)enable it, make sure the `g:syntastic_perl_checkers` list includes +`perl`, and set `g:syntastic_enable_perl_checker` to 1 in your `vimrc`: +```vim +let g:syntastic_enable_perl_checker = 1 +``` + +<a name="faqrust"></a> + +__4.13. Q. What happened to the `rustc` checker?__ + +A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the +checker should be picked up automatically by syntastic. + +<a name="faqtsc"></a> + +__4.14. Q. What happened to the `tsc` checker?__ + +A. It didn't meet people's expectations and it has been removed. The plugin +[tsuquyomi][tsuquyomi] comes packaged with a checker for TypeScript. If you +install this plugin the checker should be picked up automatically by syntastic. + +<a name="faqxcrun"></a> + +__4.15. Q. What happened to the `xcrun` checker?__ + +A. The `xcrun` checker used to have a security problem and it has been removed. +A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you +install this plugin the checker should be picked up automatically by syntastic. <a name="otherresources"></a> @@ -517,8 +502,6 @@ a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [v [rvm]: https://rvm.io/ [stack_overflow]: http://stackoverflow.com/questions/tagged/syntastic [swift]: https://github.com/kballard/vim-swift -[tidy]: http://www.htacg.org/tidy-html5/ -[tidy_old]: http://tidy.sourceforge.net/ [tsuquyomi]: https://github.com/Quramy/tsuquyomi/ [unimpaired]: https://github.com/tpope/vim-unimpaired [vam]: https://github.com/MarcWeber/vim-addon-manager diff --git a/sources_non_forked/syntastic/autoload/syntastic/util.vim b/sources_non_forked/syntastic/autoload/syntastic/util.vim index 68eb06ea..535d2671 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/util.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/util.vim @@ -271,6 +271,36 @@ function! syntastic#util#findGlobInParent(what, where) abort " {{{2 return '' endfunction " }}}2 +" Returns the buffer number of a filename +" @vimlint(EVL104, 1, l:old_shellslash) +function! syntastic#util#fname2buf(fname) abort " {{{2 + if exists('+shellslash') + " bufnr() can't cope with backslashes + let old_shellslash = &shellslash + let &shellslash = 1 + endif + + " this is a best-effort attempt to escape file patterns (cf. :h file-pattern) + " XXX it fails for filenames containing something like \{2,3} + for md in [':~:.', ':~', ':p'] + let buf = bufnr('^' . escape(fnamemodify(a:fname, md), '\*?,{}[') . '$') + if buf != -1 + break + endif + endfor + if buf == -1 + " XXX definitely wrong, but hope is the last thing to die :) + let buf = bufnr(fnamemodify(a:fname, ':p')) + endif + + if exists('+shellslash') + let &shellslash = old_shellslash + endif + + return buf +endfunction " }}}2 +" @vimlint(EVL104, 0, l:old_shellslash) + " Returns unique elements in a list function! syntastic#util#unique(list) abort " {{{2 let seen = {} @@ -342,10 +372,8 @@ function! syntastic#util#stamp() abort " {{{2 return split( split(reltimestr(reltime(g:_SYNTASTIC_START)))[0], '\.' ) endfunction " }}}2 -function! syntastic#util#setChangedtick() abort " {{{2 - unlockvar! b:syntastic_changedtick - let b:syntastic_changedtick = b:changedtick - lockvar! b:syntastic_changedtick +function! syntastic#util#setLastTick(buf) abort " {{{2 + call setbufvar(a:buf, 'syntastic_lasttick', getbufvar(a:buf, 'changedtick')) endfunction " }}}2 let s:_wid_base = 'syntastic_' . getpid() . '_' . reltimestr(g:_SYNTASTIC_START) . '_' diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index dbb6d7ab..4541ddf2 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -3147,13 +3147,13 @@ accepts the standard options described at |syntastic-config-makeprg|. Notes~ -Syntastic requires "Flow" version 0.6 or later. +Syntastic requires "Flow" version 0.18.1 or later. To use "Flow" with your projects, you must: a. Install it: - https://github.com/sindresorhus/flow-bin + https://github.com/flowtype/flow-bin b. Configure your project: > @@ -6183,7 +6183,7 @@ Maintainer: LCD 47 <lcd047@gmail.com> "ESLint" is a tool for identifying and reporting on patterns found in ECMAScript/JavaScript code. With the "babel-eslint" plugin -(https://github.com/babel/babel-eslint) "ESLint" can also can also be +(https://github.com/babel/babel-eslint) "ESLint" can also be used to check TypeScript files. See the project's page for details: https://github.com/nzakas/eslint diff --git a/sources_non_forked/syntastic/doc/syntastic.txt b/sources_non_forked/syntastic/doc/syntastic.txt index 431638bb..8f3473bc 100644 --- a/sources_non_forked/syntastic/doc/syntastic.txt +++ b/sources_non_forked/syntastic/doc/syntastic.txt @@ -46,19 +46,21 @@ CONTENTS *syntastic-contents* 6.4.Saving Vim sessions....................|syntastic-sessions| 6.5.The location list callback.............|syntastic-loclist-callback| 7.Compatibility with other software............|syntastic-compatibility| - 7.1.The csh and tcsh shells................|syntastic-csh| - 7.2.Eclim..................................|syntastic-eclim| - 7.3.The fish shell.........................|syntastic-fish| - 7.4.The fizsh shell........................|syntastic-fizsh| - 7.5.flagship...............................|syntastic-flagship| - 7.6.powerline..............................|syntastic-powerline| - 7.7.The PowerShell shell...................|syntastic-powershell| - 7.8.python-mode............................|syntastic-pymode| - 7.9.vim-auto-save..........................|syntastic-vim-auto-save| - 7.10.vim-go................................|syntastic-vim-go| - 7.11.vim-virtualenv........................|syntastic-vim-virtualenv| - 7.12.YouCompleteMe.........................|syntastic-ycm| - 7.13.The zsh shell and MacVim..............|syntastic-zsh| + 7.1.airline................................|syntastic-airline| + 7.2.The csh and tcsh shells................|syntastic-csh| + 7.3.Eclim..................................|syntastic-eclim| + 7.4.ferret.................................|syntastic-ferret| + 7.5.The fish shell.........................|syntastic-fish| + 7.6.The fizsh shell........................|syntastic-fizsh| + 7.7.flagship...............................|syntastic-flagship| + 7.8.powerline..............................|syntastic-powerline| + 7.9.The PowerShell shell...................|syntastic-powershell| + 7.10.python-mode...........................|syntastic-pymode| + 7.11.vim-auto-save.........................|syntastic-vim-auto-save| + 7.12.vim-go................................|syntastic-vim-go| + 7.13.vim-virtualenv........................|syntastic-vim-virtualenv| + 7.14.YouCompleteMe.........................|syntastic-ycm| + 7.15.The zsh shell and MacVim..............|syntastic-zsh| 8.About........................................|syntastic-about| 9.License......................................|syntastic-license| @@ -158,12 +160,17 @@ Something like this could be more useful: > set statusline+=%* < When syntax errors are detected a flag will be shown. The content of the flag -is derived from the |syntastic_stl_format| option. +is derived from the |'syntastic_stl_format'| option. Please note that these settings might conflict with other Vim plugins that -change the way statusline works. Refer to these plugins' documentation for -possible solutions. See also |syntastic-powerline| below if you're using the -"powerline" Vim plugin (https://github.com/powerline/powerline). +change the way statusline works. Refer to the |syntastic-compatibility| notes +below and to the respective plugins' documentation for possible solutions. + +In particular see |syntastic-airline| below if you're using the "airline" Vim +plugin (https://github.com/vim-airline/vim-airline). See |syntastic-flagship| +if you're using "flagship" (https://github.com/tpope/vim-flagship). See also +|syntastic-powerline| if you're using the "powerline" Vim plugin +(https://github.com/powerline/powerline). ------------------------------------------------------------------------------ 2.2. Error signs *syntastic-error-signs* @@ -195,6 +202,10 @@ following highlight groups: Example: > highlight SyntasticErrorLine guibg=#2f0000 < +With Vim 8.0 or later you can ask Vim not to turn off the sign column when no +errors are found, by setting 'signcolumn' to "yes": > + set signcolumn=yes +< ------------------------------------------------------------------------------ 2.3. The error window *syntastic-error-window* @@ -248,7 +259,7 @@ grouped together, and sorting within each group is decided by the variables |'syntastic_<filetype>_<checker>_sort'|. ------------------------------------------------------------------------------ -2.6 Filtering errors *syntastic-filtering-errors* +2.6. Filtering errors *syntastic-filtering-errors* You can selectively disable some of the errors found by checkers either using |'syntastic_quiet_messages'|, or by specifying a list of patterns in @@ -732,7 +743,7 @@ filetypes. 5. Checker Options *syntastic-checker-options* ------------------------------------------------------------------------------ -5.1 Choosing which checkers to use *syntastic-filetype-checkers* +5.1. Choosing which checkers to use *syntastic-filetype-checkers* *'g:syntastic_<filetype>_checkers'* You can tell syntastic which checkers to run for a given filetype by setting a @@ -756,7 +767,7 @@ are supported by syntastic: |syntastic-checkers|. Use `:SyntasticInfo` to see which checkers are available for a given filetype. ------------------------------------------------------------------------------ -5.2 Choosing the executable *syntastic-config-exec* +5.2. Choosing the executable *syntastic-config-exec* *'syntastic_<filetype>_<checker>_exec'* The executable run by a checker is normally defined automatically, when the @@ -773,7 +784,7 @@ takes precedence over both 'b:syntastic_<filetype>_<checker>_exec' and 'g:syntastic_<filetype>_<checker>_exec' in the buffers where it is defined. ------------------------------------------------------------------------------ -5.3 Configuring specific checkers *syntastic-config-makeprg* +5.3. Configuring specific checkers *syntastic-config-makeprg* Checkers are run by constructing a command line and by passing it to a shell (see |'shell'| and |'syntastic_shell'|). In most cases this command line is @@ -797,7 +808,7 @@ The result is a command line of the form: > All fields above are optional, and can be overridden by setting global variables 'g:syntastic_<filetype>_<checker-name>_<option-name>' - even parameters not specified in the call to "makeprgBuild()". For example to -override the argguments and the tail: > +override the arguments and the tail: > let g:syntastic_c_pc_lint_args = "-w5 -Iz:/usr/include/linux" let g:syntastic_c_pc_lint_tail = "2>/dev/null" < @@ -849,7 +860,7 @@ options that can be set they are normally documented in this manual (see |syntastic-checkers|). ------------------------------------------------------------------------------ -5.4 Sorting errors *syntastic-config-sort* +5.4. Sorting errors *syntastic-config-sort* *'syntastic_<filetype>_<checker>_sort'* Syntastic may decide to group the errors produced by some checkers by file, @@ -868,7 +879,7 @@ For aggregated lists (see |syntastic-aggregating-errors|) these variables are ignored if |'syntastic_sort_aggregated_errors'| is set (which is the default). ------------------------------------------------------------------------------ -5.5 Filtering errors *syntastic-config-filtering* +5.5. Filtering errors *syntastic-config-filtering* *'syntastic_<filetype>_<checker>_quiet_messages'* Finally, variables 'g:syntastic_<filetype>_<checker-name>_quiet_messages' can @@ -882,7 +893,7 @@ from the corresponding checkers are filtered. Example: > The syntax is of course identical to that of |syntastic_quiet_messages|. ------------------------------------------------------------------------------ -5.6 Debugging *syntastic-config-debug* +5.6. Debugging *syntastic-config-debug* *syntastic-debug* Syntastic can log a trace of its working to Vim's |message-history|. To verify @@ -902,7 +913,7 @@ Debug logs can be saved to a file; see |'syntastic_debug_file'| for details. Setting |'syntastic_debug'| to 0 turns off logging. ------------------------------------------------------------------------------ -5.7 Profiling *syntastic-profiling* +5.7. Profiling *syntastic-profiling* A very useful tool for debugging performance problems is Vim's built-in |profiler|. In order to enable profiling for syntastic you need to add two lines @@ -932,7 +943,7 @@ composite filetypes to simple ones using |'syntastic_filetype_map'|, e.g.: > let g:syntastic_filetype_map = { "handlebars.html": "handlebars" } < ------------------------------------------------------------------------------ -6.2 Editing files over network *syntastic-netrw* +6.2. Editing files over network *syntastic-netrw* The standard plugin |netrw| allows Vim to transparently edit files over network and inside archives. Currently syntastic doesn't support this mode @@ -940,7 +951,7 @@ of operation. It can only check files that can be accessed directly by local checkers, without any translation or conversion. ------------------------------------------------------------------------------ -6.3 The 'shellslash' option *syntastic-shellslash* +6.3. The 'shellslash' option *syntastic-shellslash* The 'shellslash' option is relevant only on Windows systems. This option determines (among other things) the rules for quoting command lines, and there @@ -951,7 +962,7 @@ shell. It should be turned off if your 'shell' (or |'syntastic_shell'|) is value. ------------------------------------------------------------------------------ -6.4 Saving Vim sessions *syntastic-sessions* +6.4. Saving Vim sessions *syntastic-sessions* If you use `:mksession` to save Vim sessions you should probably make sure to remove option "blank" from 'sessionoptions': > @@ -961,7 +972,7 @@ This will prevent `:mksession` from saving |syntastic-error-window| as empty quickfix windows. ------------------------------------------------------------------------------ -6.5 The location list callback *syntastic-loclist-callback* +6.5. The location list callback *syntastic-loclist-callback* *SyntasticCheckHook()* Syntastic also gives you direct access to the list of errors. A function @@ -987,7 +998,17 @@ also affect window sizes.) 7. Compatibility with other software *syntastic-compatibility* ------------------------------------------------------------------------------ -7.1 The csh and tcsh shells *syntastic-csh* +7.1. airline *syntastic-airline* + +The "airline" Vim plugin (https://github.com/vim-airline/vim-airline) comes +packaged with a mechanism of showing flags on the |'statusline'| according +to your |'syntastic_stl_format'|. When using this plugin you do NOT need to +follow the recommendation outlined in the |syntastic-statusline-flag| section +above to modify your |'statusline'|; "airline" will make all necessary changes +automatically. + +------------------------------------------------------------------------------ +7.2. The csh and tcsh shells *syntastic-csh* The "csh" and "tcsh" shells are mostly compatible with syntastic. However, some checkers assume Bourne shell syntax for redirecting "stderr". For this @@ -996,7 +1017,7 @@ such as "zsh", "bash", "ksh", or even the original Bourne "sh": > let g:syntastic_shell = "/bin/sh" < ------------------------------------------------------------------------------ -7.2. Eclim *syntastic-eclim* +7.3. Eclim *syntastic-eclim* Syntastic can be used together with "Eclim" (see http://eclim.org/). However, by default Eclim disables syntastic's checks for the filetypes it supports, in @@ -1009,7 +1030,15 @@ run Eclim's validation for others. Please consult Eclim's documentation for details. ------------------------------------------------------------------------------ -7.3 The fish shell *syntastic-fish* +7.4. ferret *syntastic-ferret* + +At the time of this writing syntastic conflicts with the "ferret" Vim plugin +(https://github.com/wincent/ferret). The "ferret" plugin assumes control over +loclist windows even when configured to use |quickfix| lists. This interferes +with syntastic's functioning. + +------------------------------------------------------------------------------ +7.5. The fish shell *syntastic-fish* At the time of this writing the "fish" shell (see http://fishshell.com/) doesn't support the standard UNIX syntax for file redirections, and thus it @@ -1019,7 +1048,7 @@ original Bourne "sh": > let g:syntastic_shell = "/bin/sh" < ------------------------------------------------------------------------------ -7.4. The fizsh shell *syntastic-fizsh* +7.6. The fizsh shell *syntastic-fizsh* Using syntastic with the "fizsh" shell (see https://github.com/zsh-users/fizsh) is possible, but potentially problematic. In order to do it you'll need to set @@ -1032,7 +1061,7 @@ interactive features of "fizsh". Using a more traditional shell such as "zsh", let g:syntastic_shell = "/bin/sh" < ------------------------------------------------------------------------------ -7.5 flagship *syntastic-flagship* +7.7. flagship *syntastic-flagship* The "flagship" Vim plugin (https://github.com/tpope/vim-flagship) has its own mechanism of showing flags on the |'statusline'|. To allow "flagship" @@ -1042,7 +1071,7 @@ described in the |syntastic-statusline-flag| section above: > autocmd User Flags call Hoist("window", "SyntasticStatuslineFlag") < ------------------------------------------------------------------------------ -7.6. powerline *syntastic-powerline* +7.8. powerline *syntastic-powerline* The "powerline" Vim plugin (https://github.com/powerline/powerline) comes packaged with a syntastic segment. To customize this segment create a file @@ -1059,16 +1088,18 @@ packaged with a syntastic segment. To customize this segment create a file } < ------------------------------------------------------------------------------ -7.7. The PowerShell shell *syntastic-powershell* +7.9. The PowerShell shell *syntastic-powershell* -At the time of this writing, syntastic is not compatible with using "Windows -PowerShell" (http://technet.microsoft.com/en-us/library/bb978526.aspx) as Vim's -'shell'. You may still run Vim from 'PowerShell', but you do have to point -Vim's 'shell' to a more traditional program, such as "cmd.exe": > - set shell=cmd.exe +At the time of this writing syntastic is not compatible with using +"PowerShell" (https://msdn.microsoft.com/en-us/powershell) as Vim's 'shell'. +You may still run Vim from "PowerShell", but you do have to point Vim's +'shell' to a more traditional program, such as "cmd.exe" on Windows, or +"/bin/sh" on UNIX: > + set shell=c:\Windows\system32\cmd.exe + set shell=/bin/sh < ------------------------------------------------------------------------------ -7.8 python-mode *syntastic-pymode* +7.10. python-mode *syntastic-pymode* Syntastic can be used along with the "python-mode" Vim plugin (see https://github.com/klen/python-mode). However, they both run syntax checks by @@ -1079,14 +1110,14 @@ for python in syntastic (see |'syntastic_mode_map'|), or disable lint checks in let g:pymode_lint_on_write = 0 < ------------------------------------------------------------------------------ -7.9. vim-auto-save *syntastic-vim-auto-save* +7.11. vim-auto-save *syntastic-vim-auto-save* Syntastic can be used together with the "vim-auto-save" Vim plugin (see https://github.com/907th/vim-auto-save). However, syntastic checks in active mode only work with "vim-auto-save" version 0.1.7 or later. ------------------------------------------------------------------------------ -7.10. vim-go *syntastic-vim-go* +7.12. vim-go *syntastic-vim-go* Syntastic can be used along with the "vim-go" Vim plugin (see https://github.com/fatih/vim-go). However, both "vim-go" and syntastic run @@ -1103,7 +1134,7 @@ stick with |quickfix| lists: > let g:go_list_type = "quickfix" < ------------------------------------------------------------------------------ -7.11. vim-virtualenv *syntastic-vim-virtualenv* +7.13. vim-virtualenv *syntastic-vim-virtualenv* At the time of this writing, syntastic can't run checkers installed in Python virtual environments activated by "vim-virtualenv" (see @@ -1111,7 +1142,7 @@ https://github.com/jmcantrell/vim-virtualenv). This is a limitation of "vim-virtualenv". ------------------------------------------------------------------------------ -7.12 YouCompleteMe *syntastic-ycm* +7.14. YouCompleteMe *syntastic-ycm* Syntastic can be used together with the "YouCompleteMe" Vim plugin (see http://valloric.github.io/YouCompleteMe/). However, by default "YouCompleteMe" @@ -1122,7 +1153,7 @@ have to set |g:ycm_show_diagnostics_ui| to 0. E.g.: > let g:ycm_show_diagnostics_ui = 0 < ------------------------------------------------------------------------------ -7.13 The zsh shell and MacVim *syntastic-zsh* +7.15. The zsh shell and MacVim *syntastic-zsh* If you're running MacVim together with the "zsh" shell (http://www.zsh.org/) you need to be aware that MacVim does not source your .zshrc file, but will diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 3678990c..94b141ac 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.7.0-193' +let g:_SYNTASTIC_VERSION = '3.7.0-226' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 @@ -132,13 +132,19 @@ let s:_DEBUG_DUMP_OPTIONS = [ \ 'shellpipe', \ 'shellquote', \ 'shellredir', - \ 'shellslash', \ 'shelltemp', \ 'shellxquote' \ ] -if exists('+shellxescape') - call add(s:_DEBUG_DUMP_OPTIONS, 'shellxescape') -endif +for s:feature in [ + \ 'shellxescape', + \ 'shellslash', + \ 'autochdir', + \ ] + + if exists('+' . s:feature) + call add(s:_DEBUG_DUMP_OPTIONS, s:feature) + endif +endfor lockvar! s:_DEBUG_DUMP_OPTIONS " debug constants @@ -163,6 +169,7 @@ let s:registry = g:SyntasticRegistry.Instance() let s:notifiers = g:SyntasticNotifiers.Instance() let s:modemap = g:SyntasticModeMap.Instance() +let s:_check_stack = [] let s:_quit_pre = [] " Commands {{{1 @@ -207,7 +214,7 @@ command! SyntasticJavacEditConfig runtime! syntax_checkers/java/*.vim | Synta " Public API {{{1 function! SyntasticCheck(...) abort " {{{2 - call s:UpdateErrors(0, a:000) + call s:UpdateErrors(bufnr(''), 0, a:000) call syntastic#util#redraw(g:syntastic_full_redraws) endfunction " }}}2 @@ -215,6 +222,8 @@ function! SyntasticInfo(...) abort " {{{2 call s:modemap.modeInfo(a:000) call s:registry.echoInfoFor(s:_resolve_filetypes(a:000)) call s:_explain_skip(a:000) + call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, s:_DEBUG_DUMP_OPTIONS) + call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES) endfunction " }}}2 function! SyntasticErrors() abort " {{{2 @@ -222,19 +231,19 @@ function! SyntasticErrors() abort " {{{2 endfunction " }}}2 function! SyntasticReset() abort " {{{2 - call s:ClearCache() + call s:ClearCache(bufnr('')) call s:notifiers.refresh(g:SyntasticLoclist.New([])) endfunction " }}}2 function! SyntasticToggleMode() abort " {{{2 call s:modemap.toggleMode() - call s:ClearCache() + call s:ClearCache(bufnr('')) call s:notifiers.refresh(g:SyntasticLoclist.New([])) call s:modemap.echoMode() endfunction " }}}2 function! SyntasticSetLoclist() abort " {{{2 - call g:SyntasticLoclist.current().setloclist() + call g:SyntasticLoclist.current().setloclist(0) endfunction " }}}2 " }}}1 @@ -243,54 +252,68 @@ endfunction " }}}2 augroup syntastic autocmd! - autocmd BufEnter * call s:BufEnterHook() + autocmd VimEnter * call s:VimEnterHook() + autocmd BufEnter * call s:BufEnterHook(expand('<afile>', 1)) + autocmd BufWinEnter * call s:BufWinEnterHook(expand('<afile>', 1)) augroup END if g:syntastic_nested_autocommands augroup syntastic - autocmd BufReadPost * nested call s:BufReadPostHook() - autocmd BufWritePost * nested call s:BufWritePostHook() + autocmd BufReadPost * nested call s:BufReadPostHook(expand('<afile>', 1)) + autocmd BufWritePost * nested call s:BufWritePostHook(expand('<afile>', 1)) augroup END else augroup syntastic - autocmd BufReadPost * call s:BufReadPostHook() - autocmd BufWritePost * call s:BufWritePostHook() + autocmd BufReadPost * call s:BufReadPostHook(expand('<afile>', 1)) + autocmd BufWritePost * call s:BufWritePostHook(expand('<afile>', 1)) augroup END endif if exists('##QuitPre') " QuitPre was added in Vim 7.3.544 augroup syntastic - autocmd QuitPre * call s:QuitPreHook(expand('<amatch>', 1)) + autocmd QuitPre * call s:QuitPreHook(expand('<afile>', 1)) augroup END endif -function! s:BufReadPostHook() abort " {{{2 - if g:syntastic_check_on_open +function! s:BufReadPostHook(fname) abort " {{{2 + let buf = syntastic#util#fname2buf(a:fname) + if g:syntastic_check_on_open && buf > 0 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, - \ 'autocmd: BufReadPost, buffer ' . bufnr('') . ' = ' . string(bufname(str2nr(bufnr(''))))) - call s:UpdateErrors(1, []) + \ 'autocmd: BufReadPost, buffer ' . buf . ' = ' . string(a:fname)) + if index(s:_check_stack, buf) == -1 + call add(s:_check_stack, buf) + endif endif endfunction " }}}2 -function! s:BufWritePostHook() abort " {{{2 +function! s:BufWritePostHook(fname) abort " {{{2 + let buf = syntastic#util#fname2buf(a:fname) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, - \ 'autocmd: BufWritePost, buffer ' . bufnr('') . ' = ' . string(bufname(str2nr(bufnr(''))))) - call s:UpdateErrors(1, []) + \ 'autocmd: BufWritePost, buffer ' . buf . ' = ' . string(a:fname)) + call s:UpdateErrors(buf, 1, []) endfunction " }}}2 -function! s:BufEnterHook() abort " {{{2 +function! s:BufEnterHook(fname) abort " {{{2 + let buf = syntastic#util#fname2buf(a:fname) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, - \ 'autocmd: BufEnter, buffer ' . bufnr('') . ' = ' . string(bufname(str2nr(bufnr('')))) . - \ ', &buftype = ' . string(&buftype)) - if &buftype ==# '' - call s:notifiers.refresh(g:SyntasticLoclist.current()) + \ 'autocmd: BufEnter, buffer ' . buf . ' = ' . string(a:fname) . ', &buftype = ' . string(&buftype)) + if buf > 0 && getbufvar(buf, '&buftype') ==# '' + let idx = index(reverse(copy(s:_check_stack)), buf) + if idx >= 0 + if !has('vim_starting') + call remove(s:_check_stack, -idx - 1) + call s:UpdateErrors(buf, 1, []) + endif + elseif &buftype ==# '' + call s:notifiers.refresh(g:SyntasticLoclist.current()) + endif elseif &buftype ==# 'quickfix' " TODO: this is needed because in recent versions of Vim lclose " can no longer be called from BufWinLeave " TODO: at this point there is no b:syntastic_loclist let loclist = filter(copy(getloclist(0)), 'v:val["valid"] == 1') - let owner = str2nr(getbufvar(bufnr(''), 'syntastic_owner_buffer')) + let owner = str2nr(getbufvar(buf, 'syntastic_owner_buffer')) let buffers = syntastic#util#unique(map(loclist, 'v:val["bufnr"]') + (owner ? [owner] : [])) if !empty(get(w:, 'syntastic_loclist_set', [])) && !empty(loclist) && empty(filter( buffers, 'syntastic#util#bufIsActive(v:val)' )) call SyntasticLoclistHide() @@ -298,8 +321,39 @@ function! s:BufEnterHook() abort " {{{2 endif endfunction " }}}2 +function! s:BufWinEnterHook(fname) abort " {{{2 + let buf = syntastic#util#fname2buf(a:fname) + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, + \ 'autocmd: BufWinEnter, buffer ' . buf . ' = ' . string(a:fname) . ', &buftype = ' . string(&buftype)) + if buf > 0 && getbufvar(buf, '&buftype') ==# '' + let idx = index(reverse(copy(s:_check_stack)), buf) + if idx >= 0 && !has('vim_starting') + call remove(s:_check_stack, -idx - 1) + call s:UpdateErrors(buf, 1, []) + endif + endif +endfunction " }}}2 + +function! s:VimEnterHook() abort " {{{2 + let g:syntastic_version = + \ g:_SYNTASTIC_VERSION . + \ ' (Vim ' . v:version . (has('nvim') ? ', Neovim' : '') . ', ' . + \ g:_SYNTASTIC_UNAME . + \ (has('gui') ? ', GUI' : '') . ')' + lockvar g:syntastic_version + + let buf = bufnr('') + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, + \ 'autocmd: VimEnter, buffer ' . buf . ' = ' . string(bufname(buf)) . ', &buftype = ' . string(&buftype)) + let idx = index(reverse(copy(s:_check_stack)), buf) + if idx >= 0 && getbufvar(buf, '&buftype') ==# '' + call remove(s:_check_stack, -idx - 1) + call s:UpdateErrors(buf, 1, []) + endif +endfunction " }}}2 + function! s:QuitPreHook(fname) abort " {{{2 - let buf = bufnr(fnameescape(a:fname)) + let buf = syntastic#util#fname2buf(a:fname) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, 'autocmd: QuitPre, buffer ' . buf . ' = ' . string(a:fname)) if !syntastic#util#var('check_on_wq') @@ -317,7 +371,7 @@ endfunction " }}}2 " Main {{{1 "refresh and redraw all the error info for this buf when saving or reading -function! s:UpdateErrors(auto_invoked, checker_names) abort " {{{2 +function! s:UpdateErrors(buf, auto_invoked, checker_names) abort " {{{2 call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'version') call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, s:_DEBUG_DUMP_OPTIONS) call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES) @@ -326,21 +380,21 @@ function! s:UpdateErrors(auto_invoked, checker_names) abort " {{{2 call s:modemap.synch() - if s:_skip_file() + if s:_skip_file(a:buf) return endif let run_checks = !a:auto_invoked || s:modemap.doAutoChecking() if run_checks - call s:CacheErrors(a:checker_names) - call syntastic#util#setChangedtick() + call s:CacheErrors(a:buf, a:checker_names) + call syntastic#util#setLastTick(a:buf) else if a:auto_invoked return endif endif - let loclist = g:SyntasticLoclist.current() + let loclist = g:SyntasticLoclist.current(a:buf) if exists('*SyntasticCheckHook') call SyntasticCheckHook(loclist.getRaw()) @@ -356,14 +410,8 @@ function! s:UpdateErrors(auto_invoked, checker_names) abort " {{{2 let do_jump = 0 endif - let w:syntastic_loclist_set = [] if syntastic#util#var('always_populate_loc_list') || do_jump - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: setloclist (new)') - call setloclist(0, loclist.getRaw()) - if !exists('b:syntastic_changedtick') - call syntastic#util#setChangedtick() - endif - let w:syntastic_loclist_set = [bufnr(''), b:syntastic_changedtick] + call loclist.setloclist(1) if run_checks && do_jump && !loclist.isEmpty() call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: jump') execute 'silent! lrewind ' . do_jump @@ -383,21 +431,24 @@ function! s:UpdateErrors(auto_invoked, checker_names) abort " {{{2 endfunction " }}}2 "clear the loc list for the buffer -function! s:ClearCache() abort " {{{2 - call s:notifiers.reset(g:SyntasticLoclist.current()) - call b:syntastic_loclist.destroy() +function! s:ClearCache(buf) abort " {{{2 + let loclist = g:SyntasticLoclist.current(a:buf) + call s:notifiers.reset(loclist) + call loclist.destroy() endfunction " }}}2 "detect and cache all syntax errors in this buffer -function! s:CacheErrors(checker_names) abort " {{{2 +function! s:CacheErrors(buf, checker_names) abort " {{{2 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'CacheErrors: ' . \ (len(a:checker_names) ? join(a:checker_names) : 'default checkers')) - call s:ClearCache() + call s:ClearCache(a:buf) let newLoclist = g:SyntasticLoclist.New([]) + call newLoclist.setOwner(a:buf) - if !s:_skip_file() + if !s:_skip_file(a:buf) " debug logging {{{3 call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'aggregate_errors') + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM)) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$PATH = ' . string($PATH)) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd())) " }}}3 @@ -436,7 +487,7 @@ function! s:CacheErrors(checker_names) abort " {{{2 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'sorted:', loclist) endif - let newLoclist = newLoclist.extend(loclist) + call newLoclist.extend(loclist) if !aggregate_errors break @@ -556,7 +607,7 @@ function! SyntasticMake(options) abort " {{{2 let err_lines = call('syntastic#preprocess#' . a:options['preprocess'], [err_lines]) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'preprocess:', err_lines) endif - lgetexpr err_lines + noautocmd lgetexpr err_lines let errors = deepcopy(getloclist(0)) @@ -569,6 +620,12 @@ function! SyntasticMake(options) abort " {{{2 catch /\m^Vim\%((\a\+)\)\=:E380/ " E380: At bottom of quickfix stack call setloclist(0, [], 'r') + try + " Vim 7.4.2200 or later + call setloclist(0, [], 'r', { 'title': '' }) + catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/ + " do nothing + endtry catch /\m^Vim\%((\a\+)\)\=:E776/ " E776: No location list " do nothing @@ -660,10 +717,10 @@ function! s:_is_quitting(buf) abort " {{{2 endfunction " }}}2 " Skip running in special buffers -function! s:_skip_file() abort " {{{2 - let fname = expand('%', 1) - let skip = s:_is_quitting(bufnr('%')) || get(b:, 'syntastic_skip_checks', 0) || - \ (&buftype !=# '') || !filereadable(fname) || getwinvar(0, '&diff') || +function! s:_skip_file(buf) abort " {{{2 + let fname = bufname(a:buf) + let skip = s:_is_quitting(a:buf) || getbufvar(a:buf, 'syntastic_skip_checks') || + \ (getbufvar(a:buf, '&buftype') !=# '') || !filereadable(fname) || getwinvar(0, '&diff') || \ getwinvar(0, '&previewwindow') || s:_ignore_file(fname) || \ fnamemodify(fname, ':e') =~? g:syntastic_ignore_extensions if skip @@ -674,17 +731,19 @@ endfunction " }}}2 " Explain why checks will be skipped for the current file function! s:_explain_skip(filetypes) abort " {{{2 - if empty(a:filetypes) && s:_skip_file() + let buf = bufnr('') + if empty(a:filetypes) && s:_skip_file(buf) let why = [] - let fname = expand('%', 1) + let fname = bufname(buf) + let bt = getbufvar(buf, '&buftype') - if s:_is_quitting(bufnr('%')) + if s:_is_quitting(buf) call add(why, 'quitting buffer') endif - if get(b:, 'syntastic_skip_checks', 0) + if getbufvar(buf, 'syntastic_skip_checks') call add(why, 'b:syntastic_skip_checks set') endif - if &buftype !=# '' + if bt !=# '' call add(why, 'buftype = ' . string(&buftype)) endif if !filereadable(fname) diff --git a/sources_non_forked/syntastic/plugin/syntastic/autoloclist.vim b/sources_non_forked/syntastic/plugin/syntastic/autoloclist.vim index 153b0bc9..415d5ab9 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/autoloclist.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/autoloclist.vim @@ -25,10 +25,27 @@ function! g:SyntasticAutoloclistNotifier.AutoToggle(loclist) abort " {{{2 call a:loclist.show() endif else - if auto_loc_list == 1 || auto_loc_list == 2 - "TODO: this will close the loc list window if one was opened by - "something other than syntastic - lclose + if (auto_loc_list == 1 || auto_loc_list == 2) && !empty(get(w:, 'syntastic_loclist_set', [])) + try + " Vim 7.4.2200 or later + let title = get(getloclist(0, { 'title': 1 }), 'title', ':SyntasticCheck ') + catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/ + let title = ':SyntasticCheck ' + endtry + + if strpart(title, 0, 16) ==# ':SyntasticCheck ' + " TODO: this will close the loc list window if one was opened + " by something other than syntastic + call SyntasticLoclistHide() + + try + " Vim 7.4.2200 or later + call setloclist(0, [], 'r', { 'title': '' }) + catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/ + " do nothing + endtry + let w:syntastic_loclist_set = [] + endif endif endif endfunction " }}}2 diff --git a/sources_non_forked/syntastic/plugin/syntastic/loclist.vim b/sources_non_forked/syntastic/plugin/syntastic/loclist.vim index 3e9528b5..d4a20b98 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/loclist.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/loclist.vim @@ -27,17 +27,18 @@ function! g:SyntasticLoclist.New(rawLoclist) abort " {{{2 return newObj endfunction " }}}2 -function! g:SyntasticLoclist.current() abort " {{{2 - if !exists('b:syntastic_loclist') || empty(b:syntastic_loclist) - let b:syntastic_loclist = g:SyntasticLoclist.New([]) +function! g:SyntasticLoclist.current(...) abort " {{{2 + let buf = a:0 > 1 ? a:1 : bufnr('') + let loclist = getbufvar(buf, 'syntastic_loclist') + if type(loclist) != type({}) || empty(loclist) + unlet! loclist + let loclist = g:SyntasticLoclist.New([]) endif - return b:syntastic_loclist + return loclist endfunction " }}}2 function! g:SyntasticLoclist.extend(other) abort " {{{2 - let list = self.copyRaw() - call extend(list, a:other.copyRaw()) - return g:SyntasticLoclist.New(list) + call extend(self._rawLoclist, a:other.copyRaw()) endfunction " }}}2 function! g:SyntasticLoclist.sort() abort " {{{2 @@ -167,7 +168,6 @@ function! g:SyntasticLoclist.setOwner(buffer) abort " {{{2 endfunction " }}}2 function! g:SyntasticLoclist.deploy() abort " {{{2 - call self.setOwner(bufnr('')) let self._stamp = syntastic#util#stamp() for buf in self.getBuffers() call setbufvar(buf, 'syntastic_loclist', self) @@ -289,23 +289,29 @@ function! g:SyntasticLoclist.filter(filters) abort " {{{2 return filter(copy(self._rawLoclist), filter) endfunction " }}}2 -function! g:SyntasticLoclist.setloclist() abort " {{{2 +function! g:SyntasticLoclist.setloclist(new) abort " {{{2 if !exists('w:syntastic_loclist_set') let w:syntastic_loclist_set = [] endif - if empty(w:syntastic_loclist_set) || w:syntastic_loclist_set != [bufnr(''), b:changedtick] - let replace = g:syntastic_reuse_loc_lists && !empty(w:syntastic_loclist_set) + if a:new || empty(w:syntastic_loclist_set) || w:syntastic_loclist_set != [self._owner, getbufvar(self._owner, 'changedtick')] + let replace = !a:new && g:syntastic_reuse_loc_lists && !empty(w:syntastic_loclist_set) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: setloclist ' . (replace ? '(replace)' : '(new)')) call setloclist(0, self.getRaw(), replace ? 'r' : ' ') - call syntastic#util#setChangedtick() - let w:syntastic_loclist_set = [bufnr(''), b:syntastic_changedtick] + try + " Vim 7.4.2200 or later + call setloclist(0, [], 'r', { 'title': ':SyntasticCheck ' . self._name }) + catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/ + " do nothing + endtry + call syntastic#util#setLastTick(self._owner) + let w:syntastic_loclist_set = [self._owner, getbufvar(self._owner, 'syntastic_lasttick')] endif endfunction " }}}2 "display the cached errors for this buf in the location list function! g:SyntasticLoclist.show() abort " {{{2 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: show') - call self.setloclist() + call self.setloclist(0) if !self.isEmpty() let num = winnr() diff --git a/sources_non_forked/syntastic/plugin/syntastic/modemap.vim b/sources_non_forked/syntastic/plugin/syntastic/modemap.vim index 501c82b7..40445b6e 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/modemap.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/modemap.vim @@ -72,7 +72,7 @@ function! g:SyntasticModeMap.echoMode() abort " {{{2 endfunction " }}}2 function! g:SyntasticModeMap.modeInfo(filetypes) abort " {{{2 - echomsg 'Syntastic version: ' . g:_SYNTASTIC_VERSION . ' (Vim ' . v:version . ', ' . g:_SYNTASTIC_UNAME . ')' + echomsg 'Syntastic version: ' . g:syntastic_version let type = len(a:filetypes) ? a:filetypes[0] : &filetype echomsg 'Info for filetype: ' . type diff --git a/sources_non_forked/syntastic/plugin/syntastic/notifiers.vim b/sources_non_forked/syntastic/plugin/syntastic/notifiers.vim index fe158ca1..6a3b8239 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/notifiers.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/notifiers.vim @@ -23,7 +23,7 @@ function! g:SyntasticNotifiers.Instance() abort " {{{2 endfunction " }}}2 function! g:SyntasticNotifiers.refresh(loclist) abort " {{{2 - if !a:loclist.isEmpty() && !a:loclist.isNewerThan([]) + if !syntastic#util#bufIsActive(bufnr('')) || (!a:loclist.isEmpty() && !a:loclist.isNewerThan([])) " loclist not fully constructed yet return endif diff --git a/sources_non_forked/syntastic/plugin/syntastic/registry.vim b/sources_non_forked/syntastic/plugin/syntastic/registry.vim index bcfd5c63..a24e283a 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/registry.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/registry.vim @@ -339,7 +339,10 @@ endfunction " }}}2 " Check for obsolete variable g:syntastic_<filetype>_checker function! g:SyntasticRegistry._checkDeprecation(filetype) abort " {{{2 - if exists('g:syntastic_' . a:filetype . '_checker') && !exists('g:syntastic_' . a:filetype . '_checkers') + if exists('g:syntastic_' . a:filetype . '_checker') && + \ !exists('g:syntastic_' . a:filetype . '_checkers') && + \ type(g:syntastic_{a:filetype}_checker) == type('') + let g:syntastic_{a:filetype}_checkers = [g:syntastic_{a:filetype}_checker] call syntastic#log#oneTimeWarn('variable g:syntastic_' . a:filetype . '_checker is deprecated') endif diff --git a/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim b/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim index 4b0a80fb..f2313b3f 100644 --- a/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim +++ b/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim @@ -31,12 +31,12 @@ function! SyntaxCheckers_haskell_hdevtools_GetLocList() dict let errorformat = \ '%-Z %#,'. - \ '%W%f:%l:%v: Warning: %m,'. - \ '%W%f:%l:%v: Warning:,'. - \ '%E%f:%l:%v: %m,'. - \ '%E%>%f:%l:%v:,'. + \ '%W%\m%f:%l:%v%\%%(-%\d%\+%\)%\=: Warning: %m,'. + \ '%W%\m%f:%l:%v%\%%(-%\d%\+%\)%\=: Warning:,'. + \ '%E%\m%f:%l:%v%\%%(-%\d%\+%\)%\=: %m,'. + \ '%E%>%\m%f:%l:%v%\%%(-%\d%\+%\)%\=:,'. \ '%+C %#%m,'. - \ '%W%>%f:%l:%v:,'. + \ '%W%>%\m%f:%l:%v%\%%(-%\d%\+%\)%\=:,'. \ '%+C %#%tarning: %m,' return SyntasticMake({ diff --git a/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim b/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim index 13ee47a3..02826548 100644 --- a/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim +++ b/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim @@ -25,7 +25,7 @@ function! SyntaxCheckers_javascript_flow_IsAvailable() dict if !executable(self.getExec()) return 0 endif - return syntastic#util#versionIsAtLeast(self.getVersion(), [0, 6]) + return syntastic#util#versionIsAtLeast(self.getVersion(self.getExecEscaped() . ' version'), [0, 18, 1]) endfunction function! SyntaxCheckers_javascript_flow_GetLocList() dict diff --git a/sources_non_forked/syntastic/syntax_checkers/lua/luac.vim b/sources_non_forked/syntastic/syntax_checkers/lua/luac.vim index 178f76a5..f37e923e 100644 --- a/sources_non_forked/syntastic/syntax_checkers/lua/luac.vim +++ b/sources_non_forked/syntastic/syntax_checkers/lua/luac.vim @@ -47,7 +47,7 @@ endfunction function! SyntaxCheckers_lua_luac_GetLocList() dict let makeprg = self.makeprgBuild({ 'args_after': '-p' }) - let errorformat = 'luac: %#%f:%l: %m' + let errorformat = '%*\f: %#%f:%l: %m' return SyntasticMake({ \ 'makeprg': makeprg, diff --git a/sources_non_forked/vim-coffee-script/syntax/coffee.vim b/sources_non_forked/vim-coffee-script/syntax/coffee.vim index 662ab756..973bb547 100644 --- a/sources_non_forked/vim-coffee-script/syntax/coffee.vim +++ b/sources_non_forked/vim-coffee-script/syntax/coffee.vim @@ -32,7 +32,7 @@ hi def link coffeeConditional Conditional syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display hi def link coffeeException Exception -syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\)\>/ +syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\)\>/ \ display " The `own` keyword is only a keyword after `for`. syn match coffeeKeyword /\<for\s\+own\>/ contained containedin=coffeeRepeat @@ -107,7 +107,7 @@ hi def link coffeeFloat Float " An error for reserved keywords, taken from the RESERVED array: " http://coffeescript.org/documentation/docs/lexer.html#section-67 -syn match coffeeReservedError /\<\%(case\|default\|function\|var\|void\|with\|const\|let\|enum\|export\|import\|native\|__hasProp\|__extends\|__slice\|__bind\|__indexOf\|implements\|interface\|package\|private\|protected\|public\|static\)\>/ +syn match coffeeReservedError /\<\%(case\|default\|function\|var\|void\|with\|const\|let\|enum\|native\|implements\|interface\|package\|private\|protected\|public\|static\)\>/ \ display hi def link coffeeReservedError Error diff --git a/sources_non_forked/vim-go/.gitignore b/sources_non_forked/vim-go/.gitignore index 926ccaaf..bdeb2b82 100644 --- a/sources_non_forked/vim-go/.gitignore +++ b/sources_non_forked/vim-go/.gitignore @@ -1 +1,2 @@ doc/tags +.DS_Store diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 02d0e4d2..a6923af6 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -1,13 +1,26 @@ ## Unplanned +* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. + +BUG FIXES: + +* Change back nil and iota highlighting color to the old type [gh-1049] +* Fix passing arguments to `:GoBuild` while using NeoVim [gh-1062] + +## 1.9 (September 13, 2016) + IMPROVEMENTS: * **guru** uses now the `-modified` flag, which allows us use guru on modified buffers as well. This affects all commands where `guru` is used. Such as `:GoDef`, `:GoReferrers`, etc.. [gh-944] +* **:GoDoc** uses now the `-modified` flag under the hood (for `gogetdoc), which allows us to get documentation for the identifier under the cursor ina modified buffer. [gh-1014] * Cleanup and improve documentation [gh-987] * Add new `g:go_gocode_socket_type` setting to change the underlying socket type passed to `gocode`. Usefull to fallback to `tcp` on cases such as Bash on Windows [gh-1000] * `:GoSameIds` is now automatically re-evaluated in cases of buffer reloads (such as `:GoRename`) [gh-998] +* Improve docs about `go_auto_sameids` [gh-1017] +* Improve error message by printing the full path if an incompatible `goimports` is being used [gh-1006] +* `iota` and `nil` are now highlighted correctly and are not treated as booleans [gh-1030] BUG FIXES: @@ -15,7 +28,15 @@ BUG FIXES: * Fix :GoSameIds and :GoCoverage for light background and after changing color schemes [gh-983] * Fix TagBar and `GoCallers` for Windows user [gh-999] * Set updatetime for for `auto_sameids` feature as well [gh-1016] +* Update docs about missing `go_highlight_generate_tags` setting [gh-1023] +* Fix updating the jumplist if `:GoDef` is used [gh-1029] +* Fix highlighting literal percent sign (`%%`) in strings [gh-1011] +* Fix highlighting of nested fields [gh-1007] +* Fix checking for `exepath` feature for the upcoming vim 8.0 release [gh-1046] +BACKWARDS INCOMPATIBILITIES: + +* Rename `GoMetalinterAutoSaveToggle` to `GoMetaLinterAutoSaveToggle` to make it compatible with the existing `:GoMetaLinter` command [gh-1020] ## 1.8 (July 31, 2016) diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md index 47d8c416..1d886e90 100644 --- a/sources_non_forked/vim-go/README.md +++ b/sources_non_forked/vim-go/README.md @@ -1,5 +1,9 @@ # vim-go +<p align="center"> + <img style="float: right;" src="assets/vim-go.png" alt="Vim-go logo"/> +</p> + Go (golang) support for Vim, which comes with pre-defined sensible settings (like auto gofmt on save), with autocomplete, snippet support, improved syntax highlighting, go toolchain commands, and more. If needed vim-go installs all @@ -7,8 +11,6 @@ necessary binaries for providing seamless Vim integration with current commands. It's highly customizable and each individual feature can be disabled/enabled easily. -![vim-go](https://dl.dropboxusercontent.com/u/174404/vim-go-2.png) - ## Features * Improved Syntax highlighting with items such as Functions, Operators, Methods. @@ -50,9 +52,9 @@ disabled/enabled easily. in their own new terminal. (beta) * Alternate between implementation and test code with `:GoAlternate` -Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial) -that goes literally over all features and shows many tips and tricks. It shows -how to install vim-go and explains many unknown use cases. Recommended for +Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial) +that goes literally over all features and shows many tips and tricks. It shows +how to install vim-go and explains many unknown use cases. Recommended for beginners as well as advanced users: https://github.com/fatih/vim-go-tutorial ## Install @@ -290,7 +292,7 @@ other [various pieces](https://github.com/fatih/vim-go/wiki) of information. ## Donation People have asked for this for a long time, now you can be a fully supporter by -[being a patron](https://www.patreon.com/fatih)! +[being a patron](https://www.patreon.com/fatih)! By being a patron, you are enabling vim-go to grow and mature, helping me to invest in bug fixes, new documentation, and improving both current and future diff --git a/sources_non_forked/vim-go/assets/screenshot.png b/sources_non_forked/vim-go/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2923d7f67ce76b4a294ce1fdda2091188be49d GIT binary patch literal 764721 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"`gi`Y9&bi*7=ub;2Aup7MFjYe?Cgk^9 z)OaR)GTiOn?e-o++PLa$I}<){p(?tli|B@fH$|>DZ8m#BHwdJ18%cqq-9EQqQWfq{ zlAn91PG&NR=7D3gZQ0Q02<145Uc;onG~bB_l-@Q<7})inK`{8b5Fxe*^lhidJD`AX zq%`{7e7xamoh)k3m*_pn_uF$J*%>c;GCtq@h8=*k8h4G?yY5M~d>;2q6?mm&bMaR# zN$!@^W(xKZ6S2wuNn6<q0DNqc!Wpa{JRN@JcYDooj(li1$@xlGX@W|~XRAO=80~q> zTW6@i5AkVO0Wo7afEKW@qs)9m=n2lpT$_F~W<I}DC;)$5Z=iAJkgy282Tts7-PCtP zJ^dQ;^+^;hw*yO(Kn>dpSBQrN^H`r9DWgOB9_7wTK(o$Ha+cp?@OfpjAX$(LCwewj z*WrBi)<{?Tw|vP>J2-BiKDLhmm%F1|yaBJt`@5Tf10qV$x7bKv^-GvwR@CLik70RE z7$Qy8(|OokHw+SsIA>HhnCm($u=G!Wa3~W9c%8tZJ%s`hx~jd8@lkqRosEfzXrc3x z<C3joXt)blnmzD3MUX)8T~F=ay2&^F3br*{jy~Gu5ln6j+<v{wX@Zrj!u@6S{_nbt zgafs7j-3U07r%15$%JdQb0$#>M7sg}VTGy?x+)~*@$!JK{v!3a*jq}6of%8sw3e@F zv@(CK^qyD*z~>;eCR^;pNmhO=#nE4V95PZC*L6UtZrPE>-<If)N5jvo$l3_3h~?zF zLQ;plON=N6MqGKA&}i5~s+vaMiP5^y^~E3rgHKp%MVSxi<KWrK5WGMNa|Jck;Wnat zlsZGOQm?6Ja=0ooh3z^ktb%d}IFfLMsu=bkJ$?BUSkj|29sx-eVojhC)9Js->69|_ zOTp8KUXGM*`Q`)XUBiv^*v*RV^L&L^i0=U>dFefv^aI%YW0bF!#17xP=1J#lyaU;$ z)04;GUQ`@AY-lTdiVs<H`<~&q=GExWu`9<~#K*21!sK0S%SM?&RHh+$njM{1%+JR| zu4|ckJelDi0EuRV{3rTs<^<uy%04^o*>1U*ePyZl6&6ml3iH6h^wYu=v5P#R;9zq= zC+vAn)!+sBCzTlZD|w!kW)h~M1MJ<&P9P7U+4jpu^UU*;J<baaZn3an-k~oI30d|~ z_Y=-no6TTiL_Xo2Mu&aIviq37(NVz7nRplM(dXm$z70r;uTtq-^#B@VR~90(6}}ha zi9Ia2ACvpPG)SWldaM_g{c2n2SnkDz!5e&gA3Gd${pFZAl_MGSTt`6;MDPV}*X8q> zPe{X7?fF=;#lnm*A8f2i<;=|m*4llbfELH$>R9qKY><hOkh=Xb-~Myy=}0j~?>t#$ zi{=Fqb|GQ(i^lZ<@|3;{lhx(g6Wh8F--;OlbI8J-+jPC#Bl6UCvRf+>pH)&4LmG(_ zD1MPW!ar;}AeL-H2<4(jv7tE@ku1SO-mNrJnGTQ9lu}E!@SCt4OgMFN?UG;(k!Pj_ zjTvtsq?P)(s;;ct-MJ@>mjE{@1iJK|3RkO)I*csj$ifJlaDjw1hmAye_)BJKZ>3ta zje7f4jdcSWd1lq!()B`{Hv6Yt#zu=-9FWVACSqk#YvxAu#%q?^b6K;(?C&DNmZT?U z1w1QStW<HJug0>TPOg?|;9K9Dzcc4PYy5};skWXqkd8{Vt@&G(b|&DvWzM@g3(#0n z{n1!jiYerWfm4w~1+YNIAb`kH+|adyN(3_;kDr$=cf&%QzIg5*avd{7af_C~ouq%& zy5tU2Wf7!cLt8S>*RyA@MO9`-6W#94MAz$5ge)+vm|ZSn9w9mN8Z{HhGww!#lZG5p z&>=(7%VH8nsu)G&PbyC7xbRbe!grOPkWQXG-?}SSowv|UPGE3_jvtl|H2jT%LMFyP z_Z{2`^#~)R1ImuUj0jQYiQiB_j2de7?pr7;=1D;=DlF`cM%CtYR5aaBa;Ot%auTAE zmO#+W&gJd{<U0~=Uzob^t7Qw>oiApDDUnL*&^dlp>CSg7iwNW-`Ka~|ikw3v148(O zdsQUTu1`WzoP2oc*#)JqFBE;n^n&xG<=?m_eQ7`MGX>GER+py1BW1-b6OnmR#sypG zu!4gk{A987N-j}7QtH+bfP{=t4641s>yeSRNnR(SP&*lZh|b!7;ZWwD6I1t~rg>2d z44gBGDS}Nl=J1K?LSM9YV_Exyqx3`wQ8z<_Wt;l4?SbOSX@{PtfOR+T9eznd2|Pim zS*ViSC*?oa+W|rGcczdZv&>iaW3afjm|D9T6MM6BC95EeUXP@R#j(61p=debvyuht z&1?*?xBig*KvJCw6;T{P>!>dQHylPc@b2ZVXnX&T1Wp}+S@jh}>wAoR#zDz$l?z}0 zfXhepr`s8+O<rR<uk7>IeIK9QR3!WEGkcR|rNHk@^&5W)-#U))|L`|4Xdxpb7H8=+ z$lqUVTQ<L>&+4mJv~G19c~+BrrTZhPM4#mqM;iCmvGff(luU^N$?mR2zWqQ86HRAx zo{p9<Z3u-U1)^WEEWJ!jQu@kC%lV>p%Rq<^$Fw_if`&BCX%|Z-g&ql}LVG?0F?A~c z-Qkw2ih1{ghH7j*BxbBHHUZb)O!4)qwG8=oE6xO?JO#6sN_%>_rj-cAj6><dm&cu2 zT&;tq6DI23xkDM*f1p-_MjUW5{kTkpo1%gP7VSij=U>%M43>Xn0YG`h<r$#<{Nsfj z6y_U|{jlItnJf?q$b&s7Ve{+|P{B^(Qi%`&foC`au}YHF_#u%Up8EiHzKN;#y^q*~ z-i8Uzpq&g?L<ZRmTx>_#kuX|{S_;8m*NWCiUK#$QkkT&+)F&nnX@YrKJ1;F{i`_uN zHbY!+-#|T7N`ho39Rbv$jp9u5jZaOS8ApQXN0KznNUcY$#h%RWTqCq(S2(<L!RZAh z(q&?!(j@;(ozY_=aL|V0`3%d`M;(i;#$^xstIrpq=kA(aGFgE#@eSA&74yH*TRd5f zEqrGa>{2uzzN+!#4m@B}NOX$r7FFVP2O*^48eX6`+@WnXh-%y7kZvXvgY?&I-agGx zZEtXaiG5s3iDi7(C@lH-5sPN$V*oFEbPe7%M(oE#>nl4MZy;!ILPSz044U_NRqSmJ zA>q|X0@-xtj;7feI3cLX!9KOR+PK{APTM$WmHNI(bsW<jmBn{&2{RgUh9TP)4BG4U zT5B;F^`73dP`+e1RCN2zx&s%L?tG``?XLcOt6(E&4L$RcFZ(41>nO4nge`$UZLR~8 zP1`fZGZhqf=;3K7rB-k8v4-juid$O--|ZS${(tx%4XDe|0a2d1>25i-<kjuwly~S` ztxq3pVK1-Epx0eHvRG4>pYGQCmcokpOUJfb5CUkkP2b~Dwf!|WM76aKbb>N(zCZdO z>h|y8;g6?kCe%|jWA}85N3(_#bN<LNT~m%c))o6+Hsa48B1V@x^5b*Ie7AiqSQ0Jm zY5;}Ynk;H}i_NSCu<r%|Wn4N4ZV9_psDf72$*F}Wv6`)3A9mxqmP(DwpS$h{Luz50 zh~&-4^ljU&$BTq(Wf@m^O5iY(XCljPp#_7jIKK^J%&Ihr>WOg9+}#-*+#=Fp!RlzD z`j2QdBdN7XBAPzZapCdM+~lp~%7?h#j?|~neAoY%i_Pylh>%^Hz<>5GZPs#_FC~@L zjiM-$Ss;dl5E56@RHV*|S+kb_JH3Bg<MN1z)EcivZ^4?Zt>Zgyc0_DF+#Wx@$fUXT zfmcCDXcNbTL?TKSztN(dKr%#^$Te0YMhsIvD)0ZE8m*cMChh_)@N+j3qXcpH`=cI| zG``MKhnT<K3hNmj(mAZivB+4JICjn#lreuMd4=^tVF_`{HzB*p4snUEmFT~#J~CUu zUd3CgTAI5#zxQq5GW-C7B4?w@>#hDd3Y{&@7Zj(`4#D|4;8@1n>9Lgr2#kHldFRh6 z_(zM<7!DG0t2tXv{5Icz+)*;4&O}^7%-$b!sQF!mDaJ8Zt5elIrmkHyB<IdBTlK)v z3taI}?tAERQzuR~e2YI;JT0I-b4!rmN~3UENqtIb-kv|*saeUz&k*(N3@1dQEYG_t zNaVTVbUJ~S3VWC#A8&lJeJ8)@Uj`?;YiX7y?l|eXIc@%t_cN4O;I_N#XODk5Q>-S2 zEWAAVrcO81(h>c@;OCK~=WV|z4sQbl_UDI5M~!?Zff`lvc+1<x1ND_piB6dAmIE@{ zR58f2v386qFMf>2;nt!}6{#E_3iq&_u@e`s-K`W)nJNy!(X*N)*bV+a<|x2baYw9K zG3zp#|8+~O(1Pl{bEg5DdCeI)H%r4og3{d)*XLCDY_X&#)gafNueVgCx>Hida3Ij9 z_x)&00-WrH#<fh!^L<RFX`x)qIuLgfl6C?{T>q3kE%;dV!FD^UfRiRw@F7(3W&3Pl z)};lcQHQxfQjxK|bRW8-6{3Y#Jwg&aB-hn1sv*lS#+mc_&F(|ZrC@;fPrg7C;F@3g zCR?t&0_jkMiK%d!ZLPZ7?VFMsdq2{lh-ymwqUMq|;c)&n7OlX)G(*cS#|MQ@GDPGQ zi9C_j1yK(qqF-N+)0l21E{deWG51Xs(wBwD6~alFDxC~TmXkhtLO3?JSxYgfvmxz+ zs-%Nc;<R#8W-hW>R;g~EQ<KJn3d&%~Yct1Yvmw))kMf)3WFx^kKCb~@3ZZ&=5i)sa z1tDW4JZ#*+1)7HZgJU%7^CkmXl79e90L#Qg{7|j67Eq;ObKY*0Z0yVJTAb&KrTMkY z-8`#2uOKHimzX9gRE%u)-1Kk;%}Z17tZ2lS{I!`W74I)z4XM)yjHG$C3^d;29*-q4 z?>Grb<J{Hh{p@WYhRS{0wff*;(iSN$ns-gV9%tfC5^ufx9=yljEaAMLdZN@AtblJ! zw20oVIj^t|E8n6_PJX_%?KWTk;<+PcBJcKjgl}QCVmy>-)N`;?o4$kkwu3a4b+0U7 zmiAwXjd#cv6w|_67Vbnd(|B_SC}Yh)N=U-vg*bJ{^xZ{8*RlnkC3#gb!Ykaf7t@PO zJpuv73F8V7vLPNGM!p$+xB<m$|Kk21!3MT6_Tnr0OwcialZjfvX>d%0yo0m6vDOvl zg7TNV?6&F2;r=eLz9S|O<~su?(lhIuAr_<%^RN3uIm`VjYd4FoErjvR!tnUih|Ivo zB#7hqMXz>DMFYMI)FjF%`mtp_w+x#NJc{$Nrw`H8HzCn~Hy{>>3x)|Ql`$OBy|Ur1 zM4VtjMGrWGmc;z}hW)$ew~X%F11s|;Czv|=R%Ct%Us5Bk#Brm!1RY}I_E>XwU{fRi zEK4*~3&}9bUSx)!k{x8ST-<~0d!N>tFC;wHai^+!3O#Dbw$tu(GO?1%@UP?p^$Vyc z+@gCD9I!s}sp8M67l%+jzKFLh(=81tRdoj~;h~BTYO={O|L1b@n%gio;n@8KmW-K2 z2d*JBH2%4EkjAwo!j3&>k{@v@>}JKyi7mHsvtJ*7JK~O?Ud^BZAmIpjZLtIX15e9p z$hI5kGvWD$N42_4=TeG=P%DIY7e!*tA;^7UiEQ`+6J5T~W8dJQ!+z89YZ`+SQg}<* zTrTAYQq1QWH8&lSqL24m|8T9|Y*7o}E8<(2lmx{^y4ce8aEi&^lbFwd6MXxc<UsY? zGk#plk^I}q);VMA1GVMynoOVG3V2$)ST65YUH$jNXMZ>0k49<<(7wVL6H<u(Vjm`~ zz*u#U)Jn|x9^)-0UV)M;0VH+t*bKT(($rRt#*<+!L!#tfh8A(zhgl!9G<KH*n~Wgo zrfikDBjV(!857?r9pPe=O}XO-=MDv#SFS^1aGwH%(fmtn2x0e7xIP@D@V&QAvO%a@ zuaf>apngoKf2v;^GZ7<HHibp8f7UvnLwOL_e=~GP3p4(Qgfj<j_)cQkWt#zumQ0Ew z)!(iV$F!`BBunQ<?(OLE<pfhY=lYHmF~~!mo_R^aSsIl(dpoK2oDm_-qE=+9<Ah6F z147u)k}V2hl<9YH?+9F!yh>N->I=1C{K?d4ay~aOpI47>WYtf2#R<91?-@SgtZFQi zQ*s-PSd?x{`V%%*PZgvf)YZD6j5LJFJ_jKCTH_WGkNN3+WKx}Qvb=hOAqN`cX|k!E zHCPs?mF62p-0#&USItftab5dpG!k<HiuYh2DtP{g)aA>xSJ+A?grKIUIwBL-r?F{W zIQ2d@g3oIZdM^*s7%5hP^%p`)${vu?xFQ(Mrc__=Dh<_KS%`AfWc{sFGfd6JK~#N< zLMqR&{VNe^8?ItW&Jfo;Bp6ONoHt#B^p*pZT#WGDe|^~Axh)yYTB*$AE)iHC3Ojaw z5YH!9h&(r)GCcRKP`sS-$=y$KHaLkAdIS3LO$WX&d#}lM?7#INl(cp<==N_03=+CE zqFP*C&m^fO-)mcXE(D@~dVfh!RrtijhxS-_Rrs`9weDMG;S+?$WqAD1{2Wr<!Vxny zMyxX|1w_phv<0d;3YbVpJ|-thsT8KOvlgb`jI_H?AjA&M-}DBFQdP$L-^%%hOtzGW zjCZwYvc<>&iJCl5c%GmtPvFPrC<^O#C=oZd-3|1pr`I7JE%&keR2r$A8TT;9r`=dN zJ%fK_Gywt=N1|L$DHuHNH)CoYN|xPTEiTs0)sTBGr{x975N_ESgX}WgEiVo&0K5J! z(ziqv0(TSzGt4BS(y@gT-pT=YwqZS(UOfH5Q~hz+k`BkoT*dKqY!~;*Q-oe;9W$8n z2)oA765g^f`OUtBAw|q2RPGs_G`crL^>KG$7E;SQ4?F?(4pC;6*M5`mY3sC7oHgTm zQwOB0bhZ}*W<PMIBWgCqaXNFhAl%>OZ%;IH<WIFo`Te+Qsf~!W4wmsaI;-Lc2dCWI z$=b38d9{HCy!C+Ub%dROH&XE=k(Er!X~jxR^VWxGD{kLC0jt@tepi4fx)tDHvX>IN z-uz<V>NwLEUImUw=b_l1R5WUqsN)%u*mpgMLLn6%2+|VV4LZ$!A-&w3yXs~i_-p!# zqJX;My=0FP$(@P8>Yesx9!YPiP|FhDk6qCY+buy9&r>wc+~~>v)myyHxvAlJsSHQo z%=k3XS48joVVfO#KJ`$yrMW!Ks?geYm>>Ez7^)*8g{V6h5aA@<Mb=Ds8ZS&gi5Gkd zN2xaH4|wkQ&;#C~u<gzu9*Os_brTpozfHbg8&D28JAyoXT*<!(UztLlBRVdvA!G<* z$7}rVutkLEc4CXO3QnYOyjZ6>n5o%AAj{%|XfoVtIY(?CZOk|!7HP!(RZpGwfQ;k5 zqlmKEhybNpl^pblvfy0m8`%3g{g#m-f76rjD~$=yY|AI~ZYHQc-$OO2kcDQW?IU<7 z#$+_^j%~NQstvx_DQ0K(jr3{6P_l4*O_FygV9P7D0ls1ScxxD@TBaXYm9`I{MNRRp zy0NN!+NGD>!Ho)0@qb{5URwQ@hDLlA#bQ*nwvlWQxBsG>el_foLTobB9Lpj!IV>u8 zn1bJxWa-#`3$=U{;j%ON=?ZPba|^;5Y76FV&wDVZ67AK9nTj+^XO-q)_Y3_$X1AUa z(KM+gSc1iGGy_ob@mUw9iH&i%RcZ;=Ky9+a#SRP6{auE2j^0R%BQ8MYAZ;KuIanU+ zNXgrbzEw`p?z4#Vcz2KAGhJIPi&s2Di`aM^i%dFkYxk6ye-%k`6`!t!$bgfmRx&WR zxJJirY-`gCFZY#ff+Y2d-`dvn&c*?_kqLq{`1P#e;0GM?&4_RTgErwI@6-juHXV{0 zeQVEmK6!A7@N;L+k0fv#56@f4pno~CChWji<gNTpSE%Qhhhu+hH-AugAN;muf9Xf* z252`SHrGyqD*lFxsNPJKzZVu3c2c@uL~?&WN5e!3{~Hf`n2EL_V<4uW5TkI<2mu!w zM;v`QD8|CnB}ogOp3z(M=g|S#`L)l>kkWEyhG7#<KzK-aMyWzW+Fq7v*V<A@fXpM^ zUNb1xkrD4X$vxhcD!Q>LinCIui5ENKd^VP$JLEXw%vo{ioNBE5Jw5JVxvprPx~v7$ zSv|lW$J>{#@k_CtovjjTLA?emIV1ZLXe!-!klPv>5=sox(Rh%V3TIl0si2MBwO*J1 zU`)KZYaQXs?}l;LJC(DcL;Ec&!h4f^L@(PhG)~OE63L!35jXZayM)sMI|lj1`G{Ct ze9`w0iu>2PUeNEM)x6aMGmUx=q@g7uey|{}EA^VG&9U0O%yk<R|5A(n%N5*?6wci> zb>iDfgR$v#Diof-n&9ksLOcg{Y8|go8sr+S(&%XW9zhu;o%+%yCx(^XPLVacmdUOq zB)I>@LA}xOqa`e6UXOD{`^?P2Kr!U9^_dw7gFF`Dbq{Onn#d+@3RJ&4&UF*T_agd0 zzlE<1ikkCC_51(y0?2`WWbc^7cfpwiz#kJVVEE5nRq^lN{bx)AWl9pfH7cE_l>^;^ zVY-78nUid%JV>>)AYPIf{1SHm5^rMtq9@JeBdxUOyBbaJ1wll7Oop3Rc6tiGhGZ&e zty*k6*!a}jjnl)}gtLrQ$T_n&LdzI)F_ipb%`#E6TvN;ZB}gps5VFY<kOEnMlLS`i z#0z7_u-Uu`69cxn6i+<J+Pk_uTkx2^_~^P#&?jzdVtEPUlI~4c*rnue2aDj7wuGQk zxm$n@SVHKC7k}q~jGA8Ftdnm@X^(OLA;=~c!M1bU!>{}3{n8=WM$Ye}YWg(#pJf27 zpvOIIUZWT|YUi<VJ{INqLi3BSywAiKF&WV?(4Sk&-`yJ>q2GHf6d|D8iYPli>zot# zIWg#oa>)3eEB^E)yR%+CD+H@7P?Qo!T*-lo@O!)F`6~`AfCBhQF~y7QA+9qK0rlWG z1TJvOIpzO(3k<+Vz`)=upahi3S%i~*DSW`2L~|CR0W@k><+om*&zK5%h=#ZCHZRk5 z0~@i2(F~SEnah83r{X_)Nv6udNpSDR_N%?5F+>rxf>F0CZfuRj)Bl?;`8#>Si(qPH zDe9t2@$=_zuYu^v+!%P6E^Zdf4dCgSk?XRZpJy!~n?t*52%hG#M+yKit5*mBTUX-5 zqt9i6xvd@ZKMaIWIgtPQ?SEd~c8Ks_kT}vX1M^>CpFQHwx7F8Mv{(Qp@hYZgM@Rq` z>Q&Yg$slrQ2Y=cQX?d4siU^b}GsO#SA-MdH_~bv*Jb<2rM37fq!N>wpbN?T2{>M!O z6ZWL{ny3YQYyayqnKYpB^g8}>j=2W?s=VQ;5#tdVlo!4+>~O%IdkLO93W2G|JyQ1R zRfeU@O*y^)i`D%cApJ`FNC5|GN->|i!k@CKW+t&rrE|i@9S>w1*hI8tC&9`fhmVho z&#N-$FEQ;vKJ`cL#KJM4yRE!Tn>EGoSM`qoGN5VSOn;VQU$?=9lq<%uk~DsKv3*{{ z;9)r~v*tt{w8sS8CBqlM9D)BL+{!{qN-S!_FT3}RS(7{Jh#KXFg^m(;$DMi=%VHYS zcajTr>#uQVzyT#I*gkS0Cj5q$-o?r6^UUqs<z&l_sjym<`drc|K7ZM7l5m(mK;2xV z*5*a4P~dxrUfur!Xr(~?aMqC)VfHxbw`t%fU8ZMBv9Yv$TwndQ#_a+=$3nj0kUms# zwg45vW^^cJ?FD4{PXWZg9*7AC@VD!c(5O)V2_tqx^WVSPP}u0Cgx^i*_Y!Uhh(P{9 zt&uXka1rnlMPn$@vtmA{HeGtelz)8sm@tkMN->%xh`N&ofeJ#=I-&^BP~_$kSlFDt zIJ~#Fl}CJNY5SaB$Znvv1CLgPf5;)Co^(PJlJG-Ih+ih?kTZSWZYGXP6?X&z0dKxO zlU#OrOz}LfUwS!=xgBL;ACQVl+aO0P-EksN%SPs;1$&2B^8DIx0zGQ4xV*+yYZXz6 zN0i4%IEKH6bg|@-0~KppGzfx|QX1Y2z2ey0zJR+^$`*Y-(tWH>I$tQrjvQe5Wd0pN zhQh~)T!eZS;N&q~>ly4@fLOy+$JN%hGbOv161-+J?%OBLM^Gl8(2kz*ki~?kgT{u+ zCM)Y#g6JQGF0(s~A2ZD*kA?yK6)3oeR8VhSQtjq??<)D>Hb$cbdPI_M2!1S^Q9;3Y z_r>aTN4F6TTcu-J){?mRupv8NCjy4E*17_@eOb?z_QymEh#{Ufxa1mZPM_0qQ-4Ek z^7Y7IYx9;rc^iR@Zg8T6eH{`j?eN84KlVk)m#_z+WeD+DS=R~nZDY)*w{wK<xSbH; zB;wOr)jKI1rMw~d%-0F5oHl)X{#yr8ODoB6Z@8Y!oy>mRU>$a)Z5HZ|_*duPh`@TO zM!ND1a9t9=pSw74W1@xzj*!NY*1b&?<^7zCmm^bgjKq_r_b`ZVw^<ZVx0R*8To}JM zBcY<_-n}==M_7l>B@?g;!G(oPeqa8Mm^_Z42dRYx8mW|)QtV$IUQPzew!sVqZN^4t zgfAwO1UZ6<jF83+!sbGCeSVGA#euaYp~lS>#9MN~KQod*VI4={JdY6w_S6r8r2wwm z8g}rrF9T`}aM7<=e%Dh~yQsa=np*?4&20Jf=VXPvZ;-%%bIM%@`>5Bktv5t944I(k z)?jKrde_k`Wu}B}gTa+kRwsZc+b>-|(UiC|-G9)UuDP2sL#%p#P{Uc4`?Y7_RXR7M zQu+f~Jna)aR^oK!zO9@}V4j(P81ncy|A1rw{r8aDo*+yQgv&peed|LH2Dt}$tW599 z_(m-7`mjam&4_040f8;TisH3v|C(IMYRY^ASr`*5xS<ftW0FB9(63xtR=WG##t9L} zn3}krlAGLHS1~arn73s#06t9E+Je?P;cnQ_YrlJpn#w~BOUl)}^CogkG~fGZ(8q_C z|M18LTeIlYe#%ry)Y6VY`uV~&D!b5k6wOEI9ZWvWd&N<=9?nV8>^W`{X5=7_c@|QB zsT_8YT&on^vk?465ghwIb%-9tuaM1*dN~3gKKsaFH2k;S*gG2`yBjlijLku%H<Ph_ zxE`vE&nFaIq6PVoe?7TVW*}UkC~7?gV8$`fAja}u;nR2#fka)>4?o)AG5$L4dIF)* z@Zwor;_;Qv91DCRO?|i{4#mj$$_8((b}nLafrg{j04)-%ke1qP!=u%u5p0O()3bgs zw>=uuqrA^aAW^eB7sjTnod5fLfnt*Q(5;o?{YF`ccAF+-X&sC$3_D5@CI6y#w7^Af z08<8u6gr!Xl)8FcN?>R;CXSghy4m}@j3xm2BtZn%T_r75I(ZP$Tjp5t1ecUT{_aVQ zSe@zHZOA=j*(Z+4=rHklQ|)#WT>7DBrq?sx*{3x{6*c$H4&uP=jHH1l?)#y0;Us4H zpiGhQUiAIb@8<F-@nnO=lqmut+V3U{Yhg`q1r$$L>Nwbi)Uejfmx{(aeJ+|&Pp1Wf zS2J_|74nuLzqYFT2S{&sNSFBd)@+St?3r9}o7`%&g8yE#dVkHQ2SkLtIZY7hQmp(J zzwevBUeO3d^ZT-GVhl$oknQ?A%a)&NuhSr)x$hRa)L3ZIs+80f)iI6MpCQkOSYYyI zX2piUdcz(Tk7Q641-k{6kWeB3x#-dfj<5t#Yhscv`BV;G1X`1N+rkEzSXToh1rkhS zx88{~%}%rFO}VfFu?PsyS_|!G!r{OZiP%Oo{UfMKAdGLKvw@DnEiC$<*`6Tumsc2t z!{7pB3rosD$YN6oOf|iyK$DpiVguv0f#i|=7c*3bUmy@wx9{<N`quTxLx1`VRo-Uf zwF#>2L8(3xn767EJi^VuAW_!B1wGOW2FciIe{NFEcMs1zJZ5|v;uAQla2Bo?EGz{c zYUdE1=H%E4ll9InxeS3iKbsmLe$KqwejMtcxW2)iNS2tN3Zu4Wr}FWqS&e55VgfAg zo-VCWzc0THxir-a!B1gzkWMbggg6`QNf{|WetdG%-*pm*X92=>ka#?tsPf(&t0KDL z+JG<mS$y%kKrU*4yAwFBe9UMdyT8C5QEh>~_Yg;v(jPCkG1zZlW@kIfGuU#TUwY`J zeMTE!ziX4{pcg;blw0q@gHe?UXduO37_Oh*T;`xS4IHwcH1HqFj(S#mdNGe=_~{oD z-Zs5fA*@>OjHBqnmRFD${Xu1>zwUd%YUKx|Ybl6D>94&yCf9k1(Dv46N@$IfcwBZc zs&swO-X_sXqng^vapkXC%Erxz*XODLT7Cnc7p#*Twtp?|{gLEXhgr`SmXPnM`YqX~ z6$q2b|Cb;?*b)bQyuu^s#Y#8S4Cm_I6f}eWrdpjdo#6B2xvBZ1-{rmRcD7Hq!FF=P z!;gV@qL%7o1ZXxJVK-|QqwBdi=OrYNsA)*H-3a}O>Hq}Kzy*{Rcdn{}lxQ8i?@HG1 zXhj^bcW>jv6&u)*Z?G_XgQfqri9G<*ye#H>_HB)ZnjU>hg80<;_UTPlcMtd*mRCPF zvNOE*69?WQO0QKBd&4_}28upNVu+w=gVYA%nRGFz_C1C5sVarN+fOo1(df5?Ad!&t zd3;R#uWYsHi)*WfheWetgxPRSv5w98b@|{?xLB@FQ9bieASxqdo{=`pjPw-iS=)yO z72r;OY$Jy>PQ?#)<%0ZZ36W+ay|EmRxpjea$aiwugulikXD|sd98eK1e+vHyft=jz z+E=j*70B|{3vx!SmJcM5BQMvp&Q!SH$V$Ds(M4bkqptL4zSR-#d}AT=x$C|=U^;Q! zBkPIq1hx3ygo)Cd{6wv@9KPRrVoQ3ulg`66GkXF1oH@*3b`O&LtFjnsZx6_Xp2O3| z4I&{~ItT`{U_OgIXmY4Z;JmT|x|b0Hc!?c&s9=L-Q|WaAxv}xK#O;MddeG=VV1I#= z*lt&;5Y#@P99{IOOkU-3l3GeQ+;RO;&i!+M&5qH$-ly*qm!?)1vEYwEse%KI<_mbs z{2?x#7Jymrw~;AgH7*${Z5!0)TF@)_ux~LXh~foG&by@9SJh{=^69H<3BFqv`oX|D zNnVZInsD-Vfa}?I)=H=!`}vC)^2q=;UNnTrbq86k<_d`U^M)mw)<er8$ny-<GJT9v zOt&w*V|d4N2ivk^p@Pm_=*`q8R0Gan?Fo$Y^q{DP<yD*FYrP=c18t5$to++N-uff| zy6+(BrHR_lfgsf*!_!p<Zm+{BC-KNo0Xbl~UUm94*jG89CZyi_BjTtBd@YRH-R8S) z<k9!7{4_~|G{vEWab{MVjM5Z0phMiZuRDg9{Ki8Lo<6S6_M>Y$%-*jg&Ryl@+`P!% z&#&xs0nqCv7TJ<~10Z)L@T0Pq14AjTDPQ`oW>V_CwS&qchG(I09BsEsKLTF!x48W{ zZjB8RKU(W2eGmT6Uf+XI6VVgYX+)E|t*R_cE&5^1=$^YhTP!;7dS31lWlmX4E;$1L z@^GA1{fmmYu10sv0p*ZUQ}1fr(a}RzyuL|u_yTAqu;tm|uwtJ<C>vM`kg&Sn9%YFF zLh8Y-7Mwt|r5%;GJ%!lg-+&S6xnewJ)M=nZ6Js#ECX|Cgw&{$H@|QYclcJ1z217KY z+O1J2?Y%}k^R;3Jt3o~T98P%^otRkwvW5a-RGWKh@(4Zr*+^Eyt*I5xE)fc8so}(5 z{K6y9jf}qw5uD}oI+}11<1Vhq`GzVpFAsXbue~jwb|JGh5CUM<*wlD?rqE>N3Da+= z@>0LSLlrax0=e*t#>q6`tV?Zroox6{{%&t?Sf(P6I@1}5JXri4VtbZ7+z`B*&OG3C z^G$GwM&v2f1x)=EE;uH=O{+pK_jTWcz2n7;cxBvUmLfvrkHN+R>Tk-~5rDkg-yH_g zS7RncDw{(mNCFYr=%o(bm<}ES|Hho{x81#4RFUit=#u!!+~y@}aB-i2kjjZ#RuU1r zF$#_k#|dz^mw<so__kv9Q;rDj514wQmk@5J1*aqIl)P`9eQu+xf*AL#*5CGMo<t!q zX+VT=i$iMdLL$R{H_Zsx7>}-a%K#g^*7%%IoaNjz7;m*h@9gao;CrAS;z{;YT`ysx zOko_2(3^@(8d>S%%@Vt!BW10uMXswg_&tK_A7oU1L9Y}E<e<LLnO6+O$s$T^zcfFn zh=1Riz_f={00$YyPxIe%g_gYi0Oc44{lOj=``xUKpV1+|(ZtJw<Q8oopE$?mHlF}r zDE)}ojbhpJOBhr=;?2Ikg3eN2*%b;^mp4er&3$B`Zfjge$uawHbB~ch@Qv6nRtL0b zn9F^`20&iB<4PL>h2Jo`sj>G+kxI*mGeP=7^XJAjG<8G&Y;r*Vb~nDl0eym4PqQZo zfTX#rOq2>-S^I>pjWqhs0J+3HPKmPDo<Cs5q<mlmBj~=oC?oq}<KYHHSxoY?aK@ul z<W{dWS)lfIKpM#nQhsx?5GQ1IA7QCds4Nd-l{sK%KtWm5FVsaKG60E{4XJn@j8$fc zOF~t?Lv~>)=%)upCWq*er90Q<l5cPLzV1C65oWj8kN3u^8+<3_9!F2M;i~~_;$m$w zy`+0dKy7Aow0Z%is;Xh3S-aRYd=t{m6N>*~95d?feg3%_l-^A{)I#es?S-rwT+g;8 z1<{#CRYKaOqmp(<8hjgUpH<R)=kXOWOYk5JDR4Y0kS0xsNQt5{dCBB!a7?P@gYZ3< z?Yb~x#nC_&V0?UOK~ou*zh({1@$K|``UnTT3g-V726V<Fqj5tx+3YkW(2&>shNXN0 zDWBbw!sTcl{#$W50Xu+n&vVCGNZ&vOwf#?QPz4UkS|u=;a4UY|PMm+mgJdigue)K$ zUeL^0#47cY|D}Lka_xai>2f`EbOU0i?M9hI6wXplSCNu0`Rh2Q(deX0O~8k5QH%8w zcIa0L0SxuHLx;sNXa9(1h;F^}QtEmkN*YZeNxoI8RIr6F)CNrcK+Plg>tf-0b-#I( zzqn~2#V_&&>{09NovdqVyQVFiugU@rrc(ZX-Z@Vl9)B}^)qDPAG=(JPW{)bUDB8zn z1^3Bzb3uPS5(WP|0;<h^Y^w=m%5ZEf1Z)OAtTbtp;|5ImSS3C`ja30FJ<TJ+ekKTw z`DESwYZx2#0AREKw~gcv@g1(O@|4=67g*?`a^;cL(60yCN85@WpA+vN+B3fBY@jO~ z?*JqCQPVe^rTWykn0Q(bt`#(W3=?(?<_f>z`VvpcAGSD{#v9Wfjx~~{uF4<?9550k zh-}a&ez@t5qGF*ciz9v30wt~xdo5&x{&Q?pUU>y_DvmM~H*gCKR{g*}FNfO4;zrhn zXZ)Gu;-Yx!oqdqu{hqmb`t((Y8Gi6*irUkwVutC$I@7=nnV`-<)KvXrEK%yJUE7yB zd5O^HImY>}H+&E=IKrb`lCICPdk}x&pW5XvE~!-u3z_Zk(39DjYjCfl+r2mPY)Nsm zIbeX5rB?%ab=d^2d7NHyNtPo5_S`|F#$>>$;3Xo*G9L>Zq6q64;NeEDAWSg+3qK~s zGM8#UeK?FImhh^aUk_jA!!!7et5ENb%SV8qa!JF*+uSIt4FxEy5b|O<>Tx#V>bxI* zdl}sVDoygX%4+;nSO0~FI4brNm^4{NXOY&IrE?u=jrlH<W)FQ6ub>3`$1i@-GF3X^ z?%?Y=|7nN)%O`Uvb*RhAV2dH-{SN_Zg`*X79b<Kk?o((wasxr;cN>v_NuT;mE$OEN zpD+;kEnj-Zf-CPnA&N>u$+ec&)V#f-1IWUTR_yXR$=dy#?m2SUmT>LB*9>gAWd;9M z`{uG}-JWm_8N;RgvM2K$B~Pz_hnIuC=cj{EQZkw-Kx*RO)1+q_VLH&>oTtvb2xLDJ z<dTSJ6D0qJHkF4H)~rBmZcEFu97zBxMWTx6Wm+5}+fFj=>Uu6R+<m%tP~!(x3Ps?M zTxx~;+KHkMI{akYqQdb|tAe{aT{1BTDLAw}<;-`8#hG?T?JHql`Vz>hL6^0dJyRK| zQLNVLma|fhag^$Ox=IBNsl~2fg1B2cny-&P=_+UACimFwnXzBt=e7jSoi2CkOV1b^ z^H~z>k+1EEpBK(caShy}-}BLz_Ih^SpQa=u&gP9dG>JVh!W09hJ<g<!-cPJEH*{fB zu4CdYAkLYHsy2OBIZ>HE>f>BB!=Vy<+wqCojbZ15Sl%=?cz(o7bbYE#>is{?-Z?zd zrThDxWMbRa#5N~RCbrXYGRefYZQHi(iEZ1q{bu&_?EOAJoO7M){8`<1ci&xAchy?8 zK5Kn*QOEoe`z9?yR-&F%4aSlFEYoHXnnUHCEXfr*EmTG{8s4gko4rGBcCNzut4ZYY zM|Q*~T^=!^9fAZB<-}^JL79xeY^&}}5izMj9h=b@Y%%LbC6sak6(p*EnSnGQrplIH zHdlbGq&^Cnk*JsVLJ`<m(+6f+$fom1nVf=eU~-{i{HIiepw)=Uv@UYQy-f>I4OXn0 zXwrg%ujb@@N?_>fX@N3O+k2+04Nzo>U(0V(R_Tu5sNL$p`$&oWB&7vr3PY{!UL0mw zHhdA~9A~o4<<nLcBB~4>1-sj4h}N!j$iUoP!4!-LDC6XBVeZ@IeG2R^E|&_=0Wf#N zLTU3<f{~tn(CFs^n!WO6tEa)Ml{TC1E0zejg37c?e8-0wJw7ZlJ+<u+q#A6wjHMvk zRTR5S5qZcgIpPzcmAVw$hh8Yg!`B(^*iQ}~xf^`}!a#Ji)v<Kv0ZDU!9CHOkl$jp6 zr)kEtVOLO&!1MlI@!0CaNko*ljf0|}S0ab@67)ou%pNH%enuq!I=cJYGiL__vR1|y z=!E<-d{@d&voZK`B*7lCfAI!phf`Hi!})7TC8$|KuPVwG^{O&`&_dmN$l6hVMD$ZK zbzFK>s~(3UZHfU?vN={>R?{Fe0L_T=9k<9_u4iKaUpIy*E}7ydM^3|yp-Hfm!1pAd zb52>O3<c1Wkyx^1XlZQ>)T2PKdYEVi-OGdBqdi;6_n$Ok=?JlSf#W&SkAY1&jI9VP zB_eeX{l5kAB8Dii6dhWLBQzD7tn<b3hw%vtON6zRK&E})tlvhNQPSx|1tXyaehVUQ z7xa$v__w)=$3mU0gAgQf)7?hfTX*`bSP&`zUoW|>_$UsVNTt^4Ad+=n&SkxUg)Xmm zA9W^Xn_WC`Uj%fn37Va#GAkcuMsx0VJ|O#i*b%#_l=U>lUC3IuKwc+@B4E%82AbeU zly7(qPjew+dT^1o(+W;G8WU(V0cTHDOe$ImH+v^4yO}>U5#AmxOg*_HwiWv2ZiO4m z$%GtqUrzBs7Gza%eXgrrc)-tqMxGXcxCgqa+2IUmC4E>bFSddhBDGQ@f$M<CAC-yj z<w*}0CXe9?Fm3_*tLGC2(s(yD2j!j30!vx*q@>%~)8WtMNAnG$jDMZsc}(Gu=Y}U@ zAG6T}+NSdZwB0UCcsB$+%6h}*vG`inwj=ywbt5Szw3G{6{WxVt^|S2oS;xmq=hQ5< zkMXh_Nre*vL+q#0$nZoPAKlSI<p|RwNZ|S!e~T7A2%QUX?8ixCP#Qb9?$HgoBXk4z zjSTaYE&|?93HtkLB?vo8VIH-~kmVtPo{}$L`F?M|!q{d$ChsS$s~H+6SZAPgr*Yw# z4|X5fW8bmajdfR?;Pv?5NJaHeh(6nXz)wNG@6I@4J4`%=SFAb?KDmI?6yzfEn`hik ze-Q1wuWaq*3C%q>4mPG+4+=xqCqk$6Q|7w7{Cqaoe4hC=P}bP`H0LO*z5-f!*evFG z%<mVT3Y95K(|GENwllj9T;#rkXuARJ2JkO@%+8HN+iRdQX#Nk&ksbsr{Bwst-!+?4 z3}>|z0lp&4-&c8&dNltyC$NOY;j(ANT+QhH8u<ZTH!6I%*!SouQ`v<v1iGtu7tPgY zG;8ImOUNw35|>t4$VDMiVABtqAV3UdCN?9P-I_ftsk`dkrbqhRTM_g_vbSlM{&DiX zy&*ZS7mXQLi<GqJlz^}EnjkE@-9t4C*k)XX?q`kdwb`JWFT}g9od*JiPakZ2Q`T<W z*jq>7NUbzcqYu`_aq!}<kU>~5e^Ms&vIf`K{O`27d%?p)2rFqK%5Zmr6*{9IgyVt~ zTNC~rEk777=+9IX^iCYjKX+ch(0sP_1tGHDP&MC9*9jmiJWPvw+EU<k81?h?oaumX zP&-qi&c5mLFm^V<h*3E?Fk0pfU0~-en{wT|3>?6`U2a(VGyz^zl3Q;*`zy@t)dM77 zCV)DsRtOI#vxD}mR+osnRrk|;Iwc~QmaP&tq*!4elh@4b*Sho6#C>jhFChy&*|&Db za-93HW`1@805S>3^N%jVD>d6nL*2lXRCe+|Jl2(Os1L;35%MkrYD0JziYzv@ZPej7 zIg8>H7os-y)b_{Z|D172gnVCbCIY{i5E`Av2s(+((E)FcZ|Ws<x<_()X%$ogh}|XA zE=!fp50f63`Cqr<gOT$PTeJk0v71^aTvsG)rdNOIj)p4w5s|$K(fEji!H&h3v$d>c zQg6O1WAT$H4)6=dYvg-Gg!t5smRUC4mlb#WY9x}duntwUGVZ^k6aO*+fDy<k&Oa)? z+3ZuUaxg&Dce?pUdeG9xMTFT@QBi(97(o_KWe$vhuIPynEG$zd_Y0s(qqk;6a_cP` z=JnA>MU!+XpZ^pL{T;}4T2Y8Q%v!Fen5lnsOpzG-+zdW8mevT!C5ZmLArZpc>SlL$ zcb7Ak7Kq5DAtx@&y&n$gRnQEh0jFIhOi3W)End4VTXo|Vt<>nHCrDx~kq&~+#&(-v zDH@pEM>jD2QwYl-+e0>SCNTsxt!Bf;N+Mm#T`sWU^b`ncr~9&6`|F4<1PrV<dd7z( z2q@^(Rz!uBjm`E4y9%S`>f><V*o80=VrId_%my}KY-g3{VF1*9^-()>9Qn|My3aiS z=%$J4^AtX}d;3qgs1gilfXdgCWwJUzJ0F7H@KR~nTJqPw-L|G<ghv)~U)&W68_9Gg zsE%FarrSqCgE?!ooCS+0ay@!WP5NH<G4@B>dqcTR?N*bT1O^aVSm1>g#w6~Ms{gRR z{@&aEZMA##AX?2oQxSX?DlH?L40~&xAfV~Po-0o?yqMI)RW;-rWmNn@N_k9DG{iZ8 z(%n;LnZyp`4S)ug#C$b7`Z+KCk6-zZ8}L^ostkhs1Z#4gSlHQl%&`2Sq%;i9nk#-z zOb@UUqSFB=D*qPw@nhL#jweV`=kvdR1uB4fx4&gFBmIx5@*hi&rV&VrjE8TdwD$fF zHT!?wsPgvmXJR#%t)>3oZ{r`U^WX6?N<^LE&C;5cq{)B2;=f(;A59&rKcldD*|Ix3 zULoHk{>$|OLBMthbdM_Pw*qUMw7{j}BQc|<H-bO<R#7uI{p+zQrpKE_G4!gz`6*@< zNLYB?=F$x!hieHeRD!)VgaJ~A_*YdBW9si9x)X20MkMfqoi&gu0~c?@db>@_&DJ9d z``hdRiQY4p(aAieiP^1csDCB~0zy>b#DH(7J4mBc1dhOwSym7k+|Oc<#A-r$ArZ<= z2XWIlB5KA%q^k}wZ<cDS$ksG=KweuJ`)5~L2_sgO+qdQ9Xe|vJ@^@cGv*+fX17o$& zB_g|mG8&V0395yS1yYrLA@DQOkz)gRKDGu=E);slBG(tn_!m5j)RhD*vpPy9v7qtG z!yem2?#TXJ==wot7Q)ppDK40l7;V#13DoMr8#+HiIZ&^?WOd?b<}`Cd&w=|cJIxg3 z3d{SILhNNnP!{A_U{)bKz#V_Hx6!!Vn~>fei0t*k7$R<0$5Ec_8Z_bAKGsn0*0NAw zdJQ%n5285koJ#I>os;=+=J5oWn*AA5WY9Yx^1OH9<0h8Yk%Fw!6a7uXk#xKwsK0}l z%)fGSZ0_2%Q{a-lO?|D2)U>~&e2Liw*51RRNrx2!4n29P)-*R(741)__#<9k!3R_Z z;!q~vpeFQs+{x7@=-5<2x3snpk`j~Ju@E{wI1ZX(<iIAoz^pH|qQ$neJnoh6J&p}D z-}^U_LqUp2VTO{^F_^lfTIJ<D<TNFtCxiw4P7?Ag5^d5y@g`zVXmvLCZCc19+^UU4 z+y!MW2Lvks4q$TViT@lDc!YmWttz!jv)5^>mvBtkrlW7%ET%ROdNUoi-1#C25w7Pc zI(z0iY&EPNK|Qb{P~uGQ4HkyC334JJN~B84Lw=L0l-xwTc;dXztVa~gCMD#(>!;c2 zzo_P`X8?Da{($_vE?n5md!*A*tQ45%7K7+NAzuYG?^upGuTk{(it-*+$it?F6NV;D z6?e~*%EZ!j@4Ll**>W=BkSAiksG+$;#&c5Yr$=k2nP*M>9JC67>*>g=o|?iil&It; zj}@0kmGZs-RJvnvbM3h_5rx^6%EdbIF-C?RxG-lsOltEpH>d^O6*z^k-WE)iUwV(p zp|+NtpfYy+X&o>WvAb4VWInn`x1F|cbBfd}o%{;w4&Ok4&YJQIHa6$7Am$rPng+`} zMebA-+5%T<IahZXghSUDK0~i?B3UYDIsu6hYrkDRBVA*q&?viZO696{08MYj^@1gf zYK`yFO>kGGQZ>{bZ>jLns_zVF+#TZuFx|!aPQq5U;t@Tl-I{$RA-3$)*x|ubgh>o7 zper@U=EJreOf;2D;DkVGXantUyl$lnJA)%;;BryXjGsTOLj1Yt{aQ6kL0Gk$AtBFO zYl?Em;ZPzXF_!#pa1FD%THM<>U^WO<i3bYmZ*_Ds6Mrh0DS;4^>+U_S9tU$*PC*hB zd<ixyMP9b=q_GSEmCaxw>#143PqyKZMw0Ik8w+xtM=d1=5%>_K8b(_wsJx?tPJzqb z_J*)(B7bo@tv?0GtV*KV)gHGxX>|%u&+Oz<Di+w<BAT^btXG=+th+H#|90Iljrev> z9_+7cQnhHOSg(>a@o21a6|z}SZn?d<f<2Y!fGm&i0pi_(XB6|_qU0FIbW3p)hE2r& zkGK~bJ|Te$m1Usj8t_fg^=Aj2+g%M<O|3^O>k$cmtdkbd)S1sJ^V$4!i29{TIJ+JB z_3Kf5t~?aJZvk?Ai!bfaFR;gmIx4OZw>ni!)jSc2yq-;iZuLB+r;WBpnNrGMKOaRM zSRkn~48u$`VmDoOS<9A#Q{|~)HN{Ua;|)pLbr1n7JvjbhBiL^#a;sh~^>TFF$m|zQ zVW`Y@N3kseZaKf))TDzkmJ~`(?yjuevi6MWE}|Gdp?^z0jO#e7TEYNOalNw|`E6?0 z;wC!@`T|koliqy|)M!S0Kur3I)%x~3Age1!f!+0hI}JaZU#4%;Du4_LPuE7Qbxa!! z0>wM}&x}(+|1<Ej0IW_~kZGJ5<tlVOJno5uxT!q*{~Ih9Hj|-%J11wM1eI*M({8cs ziT+p#J0?saGBxOiuwKY2&G~&?m@Qx;3BuHz9jv|PThJiAuHI1Jj0!8wI4X1RU5Nja z9&067J;ZuuhJcbgxOSW&DP|L%g0In@&~bqw?ZQSFOYJ%!rWG<?z0>eac&i&Zt`Hz5 z#$bAFLeBX^Zt^@dP8EOMRC;YKq_#7y|H+8*04oeLwkN0&c}|QUFZjgRUrq=nxC#6K z4u9Z@RX5hu#FSIyX-5CFtbR-)CDz;N?mKUG@Q@hX!&F0{RS{jj2e$-TZ-7qg8G4&O z15+RRTDn(bB1*eCEV-q<pkfu*Y<u}2N1A^O>+kQ|!O`N;5YPmfed9P}SaocQ+lNzn z<?%I}4X%2#P3(SDtJ(ET7lNrZh@i&Ma`V)RhTr~gsJVTw9z+~@8gXmh@6GkvK4Iqm zIEJ%e!(KIzEaG>O6-Qce=v+I`A=v_{o(q4rDRp-QvQhwEH5Q^@b_FvJG$N#UP);Jt zDze@+j(T|(pWt(sXVq;m40A^(&PJ#6VAR%sG6|~(?^hD^XGfw446K+Ic&k;*q2sGG z>{TYHAu#!j43--%O>Xrt1KjUk%_D`~@%Y}QgEZe`bn*+3KZ>a2?(R)d4iInJG~+y; zO0v<c5_-(ei9ClamN!&pc~qTm;f5UpVugZz3dOyLsVEhqs_*qlq(XM8kN!py-pZO( zcP|!nw_~0zV@_7;VMWns*ldUi^Rzza#!0>V0VI4RfvQGHgoiDc{6W~<cBy=h^?-}p z-O8K@b>hF#gAhxu_8~!ycR3WdN9qXJ={2wis{ddQKB0&CrBCQ#H(B&UT_8ATU_kxU z(w9~ZuzG6RNjC}wbEMpLp*3k4h23)&PV*bIjxAt78Y2>-CbUxNg+O4df1-Dl-F<r! za~7jn@ER_X--X)UpLi~ELW$k_wr#4-%$0WYfYWt{`|bL4+}Ca92=w9*B@8CvYRAn{ z16<1R)}?zlRRLVrNzJffuF^&_Eg8bmCa}*FQOKrGXmCnd!9S&e7o;#u#3c&C_&)PH zLpcYnixknLT7L7|dF_^02ZkT_eTK6Jc`f%}cAXA35F+Q0xi6U_tX%sNdO4Q*MX`ER zY`VWfUK+Rk;g|bX5}gZVeFR=wphf4n1~zM_n?iWP_fw0ugD05v4oj#ud$Z*Sw6WhQ zHxy3s)Xv5fX_JPkAI#gK8`NDXM8(R?+gC*Ha$FVr8;e$iUnAG!$2|#4O@{|WCwPNc z0^?*w*CQ<#Xag&IQ4JV{PtG=UCe95}q9?H`5l`@%;mm5Z>R%5%4KxwP3MtdLlq4OE zT*X^&vb@8y29uHZf|4*JF8vS(dDKaZM!yq*YJXgP8-;c7DS9?u<-9oRrtlkzVGE#k z_I>NE8=t*^k1u-cA&OHzT$W*uwrq>^3Yd`7<iM+DE4(=|mXhEN0eGSq7Gh<?b)f5i z7-Q-lmuP8-mUrdJB*ru$d0faoANZ4xvAIfvu^P!zoHup^<q6+xZso55>@wH9nLM4~ zXk7f+hj9NZO(8HGD(k;3x^K4f%`YJD+Vk{l@A!{}gbOo)n~I63y9t@+J=DR%&M%=1 zAQiA6qas6QxpL?$A?xE69%wl~;#ej(kI8bygKB}8V8^X*qVNvG_HAFRYU~fKz+yrn zjBCJm;wI*O5U|V)?~YvTK^*BGCZ+pL>piZmd_reIfvR&ELfr^C9_n&h3Lwu6o=TP8 z?xPv&pwH6N4PaNLesIh0$9PJj$NDa(9bRG^5BliS2cUHG{8&z7a}=b$6S`hhO?M6F zy|sJDY1PoEY>7lM?yamXjdgm+8Zg<ZNL*R2uS}#`fj%?Nz9p-(CCCiAg%pb<5w-$w z4G)`6PM-jO462Sw!L#a_wVqYr*<mEt#-Vgeo0y*a)Q(1?bj$P7I@}9^nC~|uMDs#j z?V>0O3||a~U@<$GY;LguD|`!^oFgqe>&`_+6b{+U*at&Fi_fje#%9C^mEV4~cRL0A z%_aP<9Jd42+&nu2HZEq8x>!C~^3aMncI=|_W_^yf3F5+v2B?O^soOL~^D$Z*bET}b zp0R}#A_NeAOmdDOe(KX$gid6?9k<BDO>+){XE&}}3Z%I_gj*#R$#w>!bffgQJ(Gz@ zOZeK_;!)n4i@KZRuf|w*k4jZy$KUuUp2PN?om5-xF^l~~RCecvJ_}FxtpPEoKA^^R zi)v!PhXw#(-(n4m#Af~1jYwM#Ire;7S|M>^?Qd1Y>Bz7q*9!8}F8j#xqKOvs+hOKj z;Ic>PBp<f<QzzcwHQR9)rbg)L;7KVPJwm6`z)Tn1Mwi>W2M5Zd93ZogDi>_RP=;GW zs$WN72a^zm)=GU&($K|=U4b7?H~dVrvj2uug8m1jqLcdn2B|zyA>FK?OOXCyW~?f= zU$RP5QEqMeqE^2{oIp!3!mvsWUT7^^PQEV^NwU7^H+=&hv<wLZK!m5#nv@jtn@iB~ zNgErGVXSfv>BTV6a9}VV;3+0p*}B35$e5T!9^}1Z2ktey<QDM{{6~Gi-!|Ei*oJJb z!zrpTXDy7axt%}_=$cqs*rbi(h|K$9={;+!?q7^Ngi;e>4P8ZxLC$nQL0(?v*}@)5 ze)V{)SwN3)Rrcq`jyQtW?ZkbVXtVcIgZs<tMF{wEcFrz{M%Dc|8qa`u3rg+3j<-f6 zPwcxI7$$xGjDd}p0*pyv1&_<=U-B${Yc<R*hm2K9C8wt1zr4)J?9ejxF39gHbQTd~ zEW%AR$WFq1qsuKAvN^vh$eywBCD@T0@A)JXvFA)dXw5`!TEacwL8|mv{`%F_tTf1x zSbaGRHSQdufCsMSSngMM(ct^)m;~u70KL9a5X9IL;Bv>)n<f37o?^5)>l2Te^r`43 zGv?IKDy%?CuNyzLD9UeVp|EX#CA^}aS99v}y)UrX!52cJ@R<V*lmkd^Ou6(C?;jo1 z2M}k~(wSULO1V1FTDgK};Gf}gVq;CMSiEsmQ)I?V9<=gyJ-S+u^uQfYoTbXy7XVH7 zI%B-7Q`Pa!fy1-A4sE%Pa3$6KqSQ>ek#pQe;lyqYyO+BEi9+{F_<Gf@$pJmrXhOQK z&Q*~2fI(9I&8vf`W%)o~Xf)@O^#b#L-&kRp$;)OFnw^)v*Ud8$PYD?s_8ly>7uoJD z7K7Xc`$-pesW7uY<uq+Ay#Gi(TsjcFMrwz9{QW3+5kY>`K`D3g_pWdl1w{6gy!yLL ztj{8BHAD6x(HKRcD$EYGk2tQ1o3~lLvcvd8W^60U8Oy;~8FRCn%ghhoOAam2m`lYP z>U(;usCvw{kMD&RaX5Str<`YbnaqZidhG^w<oE~5IcVVUv(shhJ|_pFf~)f0?PQjU z{yVDn_sk_l%R$zdVhTaBZhpKg4CJxFkt7(zU+bZLwOYrIsCB96E%sIYKmrK+>!)?* zewCgvrgyX@mlZthziffUw3Z&C+-KbE@0|1QmS?V7X%3DHSGr<TV&6gC|HYKhc)5wY ztH9-VHMm}q<zmgE?`=u41nNT83qu*l%lcE?k#BXyGkXeW-(3ve6`&cv*mD$Zh~weo zkEe@rMO=)4a%gp{aq6DzhY>I*r1f7x?f64St3d-ZpoDUG@F-^rnw?5bNB$Q!iHn?V zpR|{(NkFS@N@vaay55*Dgx3c-Gjk3V;J;Gy0o18lqgaUYru!>RM!WEfr``KC9Iw`W znz)jH<u$%D2oRu*fBH}sgw72Z8jaU$AJEZXZ5U}*9u?W{BV`L9bfD7}Uf;3mxP)b0 zH&sTjC-kV}6QTjHHh%?9zq^)SO?jh52~g8TEuh7dK$!Nn$$f^83-!1G*&j^}mUH1Q zA|pIQ641x?buZ%62>v|LiB2fU$NA)uP>%d;J{mXq)bkwj!wMay9^1`xI<%naFE))K z@Lj<fnKE`>Mn@7|oo7P(Ei-$^9dGJJx0yaOrev`3dp*zD_M2}7xxafpXT9D^|8jf! z)-u-Jv8Ql5guqu1{=kF4rZdWnpc)Qw0bNQBVhr)v4*d$djIRL#L23e1h@OxZY4y#< zzwQh@?r7gDZ|D}Xa1~v5cbvR)B$e97eK0H)&iF;mlU)Px2l5O9DI<bhjlk~7K0w13 z=v(!gb%sgZ^<ok@q7R0=W^OB9tHber!7mxfc3RjD5#I(u`nFL<TMRY$^1LFIo()kE zaJLvGEWU4(FAn&}*eS@nxBhW0^+P(v=B;!%cV)w%JlJqY(1e}1{1a`L_Az%IIvjrv zt}0=@p<Rbmzjs$A6&>mAT9W00L(!U>3WYDUE2CS7&JmQkZFf!{Zu?BeNsdZE=Mz2y zvwEgT%`W@rgzT#?=y)pPdw?(S-QrD%zC`Y`&Td)4Z~PRCt$dE74%M#@(G#RR6MlSZ zLELz|GUD#c_n&aKn4wd}!u7Z7<V~Z~j*M@t2rPK;I306G85d5ia_V~#!KniTTtgyZ zavz?gG#qoz!2hzFy+1hbjwq#!TWBCAn#O&v>%^VTKHYv>yzE2dt|tIPZ?Np@25M!^ zEl>}e&pz#Il`R-i*r-8cQt3MmYkGz@IqOJ~eTrO>s}dbD_Ita5$mz)?NHm+&y2F&_ zyT{yeqa%B}gdoY^*y?5KXUC?Id|ra1Daa5+>prUM9PAtFbHt|hrowx{+S!*DHF3lL zVW&KpwyNh3y!LIQXKOBDuUa@adMz}mdbMK{A!6+Y<Lo=dB)_Y5rdwDPg9IY)ww5nw zJq@p*897xS0>(Q8M#EbVV0MIn5cUTj9z;(LMYLFY$CqNw_+vP2{!<YP0<5uDpi<&* z#Oo5i`>XnSl9;C;(;IlfL>TYVUe|8%eM6zSC;~GRQ}SU7YE49xywg!jD|0?Kg*LLq zE9|zIZNTNZSgxRM6&J%)D=?>$#O~$flN3J9VHMia9F+cPtb6g#jguBg9>d5Qyk~uJ zndw~LGQgX$3EulHn_0Ba+xk?n+mp{dd!(Q)j~)CbchB~ux^9M*b<GdTi%8X*mDYG> z8J07nvSGEx4lhHydWV26KXn{vXpS}^+OOj+L(&@(6K9FLzkSiwC({?QWJ^g&k=3>X zA`N%&!VtLEIcYicC=|{M>o_dQPJFdswCENKl~pN^agyC$>5k%cBkqg5JCHTe`k%m< z)wJ>_FUA*|YnDCggw6KB4&5=87T?Jl#3>1{zXRuhFlV0YyPk1E$91^KdkWx$dNJk+ zTY9L-k-7h$xY$RB(71Y-REc=xCJhj0Z6juLwMniphuo2WW-^q_`&C5uqt+6J%tT8H z#2-|vsP<#2fa|Z7hA7uRbth7?+nU=y-`UeAZGx^R*iZ4t45%skHxJkOMv=2+pI7}| zbW1!MrvZ{LqSvxjPhXIbjfi)Ldh*iB1r@d^6y4sy;Py^1Av<kGb~18yib~J&WsVL5 zKuo9>EKEk5L7E`kwsf_v5ZraOZ}l$B-`CGx!N9p1RAZDDF)FB*MD_Eh+?3U4q=$86 z9zmP<XAVK(J?Mx9UC7#Zvp56=&m+>-ngO<%M>nHm<_-J&**k6FSB1a((m!Au78bC^ zq}+FXg8ON5c@l}~cc+@e7&VSXcj}(Ou7w4Mb?^Z)H99r|#u99+-0c+Nurj8uuD%Yr z!|~RODZTx*!|uYwyGvH804vy9(g}ij8XT&BMdiI@L0;h}-3}$eV0Y2VOhsUQ9A5-i zrD>rg;hJ{bP(gS0m8f8UtsL84%~3__>H9it^caeX0Sz~^s=iOQ+8Mjz<B+jbVPPE6 ze#+pa`KXWNdhdgn03-1D>`u-V2H$KeO(HRdRiiQA<`W*!=M;wzYd{Gc@Jkq$=hfc; zSX{d2etrD(U)8&Y_jE<zdmYo8&qCJ9pI=DM$q<M;M(M`c$zWX$nle*U%S!3k&VQo^ zl}h@y0j-D4e&dIJRY^w+db>s0ZWSc5-MS%=y8;lidx6d+MQBFME6ni#k4Po=k)mo8 zo=L<Q=VSXs*GxVSDdn!qHJx)n2yKZ8CGNjc)|tU+xJjBBIDXnO;NI_uZ_7VtgzNLJ zZe<?nH}K`QI--g=<zzJjASLjGS{&(|iJ4*F-_st5SSUj#W|X*sQsg08L&I{sgQR2V zI49g)^qm<|1@v24ElkY2yYXeRm*(P^=l!K~rE0C0cx}Q)Xui_YMs2JE!7vL}1z~p? z$U=@w6L|p2x8kSXgkN0P_n3<Zj>6dj+j$|(xC&JZyBwQoE2Q}U@LAhs?JljdTFMb6 z!y--*lKiIxo%qKk;{yriN<r9|B4|g9kCebqogjvo4R{?{rDONPf}zZ`Nk7=D!ibNL z4@_G(Mn<rrcXuLplVcI4a(qTZ6U>ht(mHkCmM#u>;*!jrL9ADsz))qziStjwgML5Q zd5Mrb&G7^<xrEB=F&>2ihiy}vuawHR+Y(bc;`^Npt3+dPR0VVtOati;eWwJX;M(Yh zd;XfR-J)elz(@kBTRQ~h9Qam4yN>s|vm&Qrl%BMnVUmf9+Pp-tM@GTH!DiDg+<Y7Q zGrO<hr`%r;>ahK$);0J;G|?xJB!l`rBf&54ZesH>WWh;*O$EI}>)7GkEbu)`-t;10 zTP`jsFaX|S;G1iL&Twq$;I<)&+syu@C-KEQQs(NTjwe45gGH|e*ClsDo15yFI|OmC zC3L~EzO6nSh6V`ip7NmeLU*4zyUo&f2}qZaBc>lNC*4xPw+l0?0+p;TQ@>d8ms6nq zB5&pg@Qu;GX@j6Pv(}*EcoPnM*bM(F<<ZQj$woa^wP{C1600b9met4;GRdJ+JAAzE z1Q_NP@7QR#>sHbdJ_%&Pir)G2B>VB)yq%!AzN+&6<(f<qZ(dOs(&i^ejcXJytAJJ> zh*SM?@WScbMBdvfp6z4DM26>Z&j1)0A><z{%&CfO45+WS9{)TAq|-F1$--6<H4KOf zfk7J-e3bz(qLX8?i$G<9pUur?UR=mLPMtf@)55(-0M?TN9QIe&SMBDqYg%RO>f(qP zC+5y&e|k;{L2F8rKP#Z7XTO{ArzT54*(+dTDlWmzn~?0j$E;L*@_Fabvr@~h#uJEf zD<8niSokaTwVI!qPN82OZuGlxfS!NVHf3eV%!MUIC;~X?%PRs<*b8E{R3RSJ^y!|8 zS&ZqET>bB@2n{JHM;{+-5d~&s%sE7AW**?z6h-Nt4$kV;6ZfVQiRQA(m~li79@Q1g zd1jTbL3U-J9@;$4l*9<woJ%KVN9;3xcEV{vU27bTQ23Z#t=)Sd_mFsuSPsu=ucR9q zl+TMOmvb1)cA?+x!cRk9K?=2*LAqc60vO39I>_ys{&J>?zR8ruG~2_KOZ<6Kw&5Jz zhummVQu))nS1RPW#3pTwlGP3ASNm=kjw=QnHNz~*HTe4trr$=g&(y^$Xr8F>$wMZV zS_ZA~m#0NE`_q2cqed*sA<ZW?!PV$!hDuM+$}~RRiDg^P20+&Csi{2J%=QBNq4sx^ z!zkXHN!yw*0KIEihO`>sq{h%i(DBS&0k`uJsXnd0LKqq+w~H0spz2|&Qunov;1=hJ zs)GpBY8l)(n&Ax6=Hn9U;ypVS&VN^(N+MO@gO9~3G6_M-nv+@KU`I{5f{cW#qt`pI zb9RcludV$<z-d);bdbQ2Komwe`g-3YEE6;Qp68=0F|u<iQx^rf)hbjRJm5Y1$A}&K zJ*c?R1>0dzweTXwc=!Q|P+CAEpU_nB;wpP3$wpTede*9uzz>hh2ppb)3Fx;t&C&Oy zl6-XD@ziU!c7<pKO$&<{3OD}3@?*yILj)y-Qan+e!RBNnPPXJ9KV7~l8qLUmy$}lj zQCIA{#X}S{Pl{VaUhK_H7{psY*O6u}YeQ$|e?Rd3Jwg5#Zz*sl?7*$RGN;BhgzG+T zXe8;VD%PL4;u%pE<la8kvq1kbkPU7gF<N$ZQPjL=f$d5BcmGxB8-BwPEj+dNhMC(f znS(YMn22QXu_u@2skVHw&PL#S!+pcMhfr<J$ij+9k)w%^u5`NBOx~vuO_r9uxMj3) zlH}707BTH8uk{`L?cR+KCUQ05v%6PT#n}|!G(PVB$}vey_H$<i^!dvd;D<PI#Xbu` zmUsPJ^7WAY9`$RMu)k{oEZNy>x(7h1`Vm^i6LiIOli}`#sEsHSB+S-)litr=p~Bkf z7n&L=u`s}0l!;qyCB31abob-%FLzawglMJ)AO2BN76X}Gt?mSYiOxkbJ?&Ge<oZ4N z4mPx?9Q4efX-^7VB|LN{t4zr+ivSY~`bMt6k(2@CNh&1D_TxIiO32w?_gv^(8rKHY zMiRNuV4rN`)XzMl*v6^`Yz54L`uTpV>)%CUe9T3LL1B=-d=E$&D|gtSE9UUMpJf`H zZe!rLp$&fi$eiVz^0wEOj{s7uf^}Om?_DA<F%@#Pq~`uqmrWBm=V)0&M90qJkqow4 zxR3Nb&N21BZ5>rO@y#l1h9ix~;v^4p6AA$DDy~Mnvx|Av@iB+-A0n>nNSVXV(tJfH zH?kg{VchN5s5Bud=a~=@{6+(K82BbPgX~)*oJVjUALZku1KTe%+NH@wu_Ff5@?WsY z#3o5U8KQisp}Dr6BJO4f6VkIpz%;JvqbYodgb+k>nqPqo`p)6~S&>->IC0K-!Plic z_QpzF-I4PEAJ={{%YGRc|4M>`$+aZ*pNwd@oIW`pFE}hT>k#c0kRl)%{W1!PlVVHw zesvNMQhcJ&)j7sh7x75U<*tDf-1Z-OMJi<5b=uCZuf)$|tNu+v`KrxJ$jyMgu9t=l z0?q&rzyB4jq~`=p<pR@~4I<;A>j=mXN)-hEDxdIhx-$52gZ*Z~P95Y}EuQ|Ft=n7n zj%1!1l9hxPF`SsNrMSNNysfu~puT=@Imxd-qSJ3xjiXRVLX^3BI{4cp?SM7XyuQV{ z1I<|pQS94Cz`}%NE}ix8)Z~s&)TOLn6GgSH4B-XRj}3>DiIOVo^>ZgN@Kt6zQ35eM zZ?&CX@*;U+YF^-uRYu<utJ6m}4#NiCgOlpL4te?M#Y0l!<p`r1N;ChM069y#9D)a> zJ0s=g`Inr`-1ek1W2M1b#LXmUwQoh{&R~re)e8;@6Myl@qlgH`cZ9d8U$S1eMN~c7 zO~&029-gnyU)QIeUkS%~!=cn?$nw^MJ$ctc%Z2qM(=+_i;PHEmmtMhwP0uEu@*YH! z@&>Iuyp(ZtZ#D^pzD<7tnQ5C71z<$GpG^9=P+Dk2L16+#{~M)5cm-RjRNokpcCd1w z9OMV*-{Y~Nh&ewKwl9Y8Kt`HsxayS6zu6giT7}h!0vhkhJgIv@cz*)(-Ozf8nUrt6 zV?x1gMy9}wrGJY3$a1?;F)@wr@tik@fEnzYa{b5*zN@(_%;{t`W8OZ7EuwBmj^1k2 zpFUwkad!l(@uxz-I)jqBQ;t(PjGnr#=`ZXgL(_-Q)POh~*fc9u610%|BrM~C!io2G zZ|P~!?V)QN-2;2(_Cs`3oLXmAzPs2Oo%0Gf-68b`*wl&<L)m+nfhV8}FjdWVp~z2~ z+Sh%p9hFz4JS(g>8dA0ZXWVngn-={>#%uEwDLWdtXp}ZsENo=@ML<vgh#lA5s!%3k z*ojX>xuh;?b*5*@E%^aawCMNI*Fpk9Qq?3Gi2kroQO-~K#wlOnJav}%A@vod&s4Gs zS__8m`f%vmo1>HM4fc?s<rEFST~w+q!9WyYQnDBcpy6{9LOw}6h{^V;{U1Ml%Ny9X zf9cX75d$OeHwpC~hZMQWIyXe|IY~|Q-PdDtJh3EY;C%V061#>H&K#O7u0rqi&Lf$6 zn2<feQtxDIoUYwF2#b0I5%fG+nbeH)<#CpJ)&Nq`z>uG??O+4t2?Q?rjkSyGnue0g z|8K4|ami=(!qfZ0TpzJ{8&pVM89;*@<;V+cC$i<0b-w#cB@pBAd+WsqZBN-tLKl}g zFVak%+ic$A=u76_TZiq_u8h^;8fepb^%8{kEr_${OhCY@a~{mP56#3Yvc&s4`<0qc zb+72Gre8~n6}jeMjeuyX`-EPT`z3>X!BlY1L;Lq{T(;Th<(+Yu94b>t&_5FquxQv$ zJ|<33y46E)(zFxxh0=Vr7I?rC@!vy&9-qWKEqF5*6zX8XEg!=z%HH8P0ENVc>%W8$ zXc0s0`jmbsmU}|0iL82Q*3A}WVepqU_fv-IzjXn8AiqMhEl>3bfTaN3!Sio6zB}D& z=JEB()#Wh7(cZSf7SK^&bu=-XmDk;2;~X#Q(H3_xXtJ4e%!JnNDn29m2>`%x&s#3q zbkpc2I3bHUL4%18zt8Uqxm=Ba!roaIT1XxsKYGsZ1AjW0Z&!uB)N#-Zwt6saD7qNA zS*EQkQ;S=l`a^fq7opglIR4pH%|i@~5BerNB7nU*hZ%06z&RUQ6Y|+8vmo+ko4nTe z4Ch*(`Ip~eQJuKMwacI{69Ku;0(7<I8`29|^E56If04qUn5*w6=9)ll68zQCEA1{n zL>yJiK@&F_K|^PGXio6XKIwFT9U6;?H2u-|^?}c#tM$W@tboQ7c*ZX5Yt6JcW|~=1 z!LA!mOh2fOfhoeU^eo1-|M;2+=&6XHsHh2SOGua$@hKV;DZ)W^T?sseuJmDPDT(h_ zi}TJ!`l_2ICVnA5CXO*iz45c3Qq}=ZT;uLd&`0p&e%l2DT{KcnlXkS>aosI<tWT@u zJaRr>#nEws0A^>^RLAC+1i>Dv2ZE0yPa-2z?%&G1;AalS=x5(XoJ)0g<lSHKR@e=7 zRyn0`X}O<CG}qlQ39WDFuZx}Cbd|2)(%#oXZ-uaSy3J3T-?*VaF+X@<B3Mw3vHCdk zG$V=%nVpJfz6v;ZO;4p*pE2%#wIf9EFNilhpV=MfJ~78;Cl&OkU*#435+84E<@;*m zu`YySTd>ATT&AVilIzlHwDfg~;nYZMMgcjc+b|9WZ0ZI?e*JpgrId0%z=tL^);hH7 zSh#)zs`vW2W~d~aTm4W#&SbBDXpPvRXO@`Bz|ZL~EYCTta3mX&Fa?IkRAI_z34VDU zDr=gE;D#$6N$`sKGMa%6ud)aF>ehr-!Km(4<dSt2)*EKsJ;@B{O7JyoU{@Wg4bP4j z801nhpfL+NN)A%P`fB|qhjPl!B!u@n6m){jzp9f<@y=gy!vh<%-X@sSEc^955D024 zDD^!1>(w75whVlQyDYKQhGQKQ8Ud%+t7I1gD&p1>C5&|2<TWUur(n|bW$55xT8O-J zk^KvozIH^|$xGh6fG3dPMW|o&R0PUQP~zFAykkGwiGC9o*@So@x;E@$!y7e;4M%&) zNgl(@awz)BH5SXLh~hxcc$2BGH{nR^Zv3=ap9{8rn?8M88zVLrdl}LF^SU;#^Nd|@ z+pn%(2lx3*=dWMU{&2+s6u_i?Z$EwyCYM?r^b*XzU!(FqH+K<O8_YrorU`=(WCi!+ zEg{-PSmQ#$8LHi?`~huof76I4-6P_Z(!Vgr8fkb;I7izyl91!w^n*;U=ZD?XqJuzK zgbMx5&i36eQaTS^Ggn7R!4%$E^KjPI(iB|*ZJ;~o%`T$tuDjh#?xD#><}M#H6T#NV z@)eC7jSPjjh*lfARak>)JH2-vjocA%l1#^Um^f^I^zQn^hJH??rl<BG&9lRq=F<1| zM^n6m^JYHU!=3(zXS<B=qWTmTR8pA(TFH!y7~vy0@KO`sU9ysRr+B?yS!>yBIo13o zHI1r2F;VYq!cD9QP^KR5eW+6&bs<_9ldRY#VjBY-`J>zA@f6@+OwOTvb*6p^Hf@Zm zCSzd{gjR+KO?JbZR5Kax>T3+v<EkJ**wq&YX@pM%7YBWM|6rp{PM_I=kJ}75Sl~98 zEXF8q=`7?t9uR8wEi!=t{lC6b1QUVX3<e3WE`<5=8N+KKa(dm&#ctkgeiKX2{9z%| z@jF8l(Cz|a9K#3#7Ti@|0Yermh*p6D3~RVYP6A%lr~H`<pebNd5%*fA9nh79a7fv= zl=3|fB%*7yxgY@{9Ts)b6BD)DHzpO4>620F!2@D&yi8dFvgy$_AtU(9Y1e^x<wUTW z$9jumz=Tf3@%|LCbO-xMv0h}cr%9O90^GECtn@eA`%tO~QtImwXdn;r5dZ3@FGDYU z*~csMiEeNHAo_F>R1n_ATcFa4YiYa?uvTzXX$5s231scIF@_CnK%QK?=7Qm_PR>O1 zX`1QixdtsC#YRc~nu2`5xa<uN7|j8)(Y6o+7S92mE6INU?nU}lMA><ktaj0mYa4yO zh90fsQdM3~p%+E81D`9TGRUBZp`FB_2c<8~P0z46Z*NAoC~2Kgd4@!PXuJjlonak~ z!>T`oNY@s`Z3D{;koTB~8(p`+SP)m}pGy{af!pm41DlPz%sS`F{Qv!{RxAXQZr9jt z_Sc^RibI14Rgqs5Kvo8V<o?Rtq~<DV$09Li{PX#L2Kzst;6HHlKTR*4&q<(4uNW5f zpRfKm!us!~X8RwUnEr&zScPJhq@mprA{*0a42dKnbrd&)5uLvdUBZszq(xOt%{icJ zPk_Mb-c4vc!=<_81$91F{E-aS#L=oBSP0>M6<{E8?d6t0kKj$k5nyZIDt_42V#X=< zlNWDUT(k!}GrRF5<=kSP{j+B_V~7Z3G9$q~Umz?}ah%0ZFdIf$ti>emup73uT)Oju z!W6s4@`xyY6Zwu#OF~o}h8O<EkKTgvBX0{BN*O>3i10CSdhpLxA9|z*8U4c&GZ((2 zu8sKkY!O?Fh^~P$+iBeYEV;TBZCb@`PyeCFR>%1T_dm(vOJo84{KG0~hk>M_qf2xa z{f+rw<aGW$o`NrQ###YCJV_BD1&BnuCc*>I?AfqNN@bTu(|1RF^by7Qm+|p^h$hi< zGEA9IU%q_n;Bk#sqVDqhc!Tkd!8w&47J3)9d9g>C=snz!_Rnigji8+Y{r|)bYmofI z4KIa50;|}-EX+yO&Q@gFZUrT8<o)c~?#D$o3Kx!2^le$)VOLycfhZ1O;zggS;Q!tw z_E$Q!7bY<8d-vsClpv`s>j<Vt<KGPN5PD}^Slr~C-|E^1VX1BqtHCjYlkunS<o*0+ zVq?M%8~y=j$5h_0j<*UJG4Xv19>*B1WhMV|fTidg>6*$hRh>h;&TL$D&^1zSK_jFn zW!*O%F%cnM$sE2};??TA?^E=g4_^CM6h9$u7+nZg7rvWi)T&sG>0=6-1;MkrKi>E0 zX#76J1ojp5qVOHNoPNyTy2ob9vYL@`GM(K$?<;UW2qSN&znf2uMmp3LQ>c&A9az}N zT@2Y?{BA-_l-uabI9y3tT=Rp}uisRcA5%W%i%3slI|x@T?L}~-DGS9~pQ(I_s&WT3 z5`bW8uWY17ED`x&L^08f-bgak`)Zkxk`w8SrEk$SM-PL>hWcSpDVFp92TRPeINCkJ zw1`E^^%llOzdvPIRabvQp&4k-B}s~OVx(C;1dh<m{&25xDTLm8G!n%q4u@_*q|;6I z*LcpGE3}pJDwJseA5|8>*6<X<7`xq`O#!4<`u<fi>$5&rmWq2Y23N+}{|*vQ{tXgi z$=`Rpj|GZRe_%l40oc9=bjUUC92F-1w*L-?pb+JiSR-X_LldP{llM<$tt^OrN(H5~ z9^EAq$uPL?uuomP1SQWQ0}L2_H3OJRh;v2dO#^8bf*b!%vlCQBkgxOfIFhZurr;Jj zsz{ke^dZ=RKQkg&MdXluQY}(I{OhpMYa)pYfB5Z&K?X@?c&83MKdkJi@0sZI-+hAJ z)rTZ-Z}L#i)2fova6O|OxpHlLaSQ|ey`-PSF`3yg8H%!PLR<n$j(`c6T)wcp%3yoi z)_kE#fCfnmNH9;6+eqGsS|Upk?YHs7!ivLLF>S<ERe3K3Py^(nz0lrWjK}60-Tq|- z`ncQwhmu<_0O_Ak{r?o*N=4P~%CFzTE8}MMBmM6*vANXBglC_(Ig1tBDa-PdUI7GH zgO05WnGX|l5vSfS)L7ruMw`d};mrJI!<Y@yb8ze?Z5Fj2U6{h~RVCjA9niC`t+T*Q zk<|NfT8UhrDh|WPE&WO@-@f3fKU*P;cPaA!q>2w|D0?=}Js=Bt3?RbCdxu{xgnpk6 zTrQVMIT;z>Y+}*y2EP=H^V`*d2@4A<IGHlb1x3UNPW^P2qRP3$U^_tZe8GBuRlt3P zJ*kF^GtiJngs*@U%%2}5j^Y)7V!;eQ<5*$#k}}sugL)$)W@U#P>Z>0#??`%U1bOc` zH?jQ1f8dqk_wDhi6}cM9KQOcoZO$CkuHB{^FCZdjwAy`(ych#NpetY4>*vp~%ehB? zqNx3(2A}rFt4(L#!Z5OOjq^^(?xEZ*XE&-3WoqW$(Cg)>n;YG@=;?-E8xIf>?hsSx z*|*b!K8V{D{3^o!O6ZURCSfW1Xm`Cu*47XzO@c2|qWH^k;pFTZL5$~29^)mpHW+z& z-!5m$xRDknposDG#Cmzy9Us}p8>c`>uX+db#QZ>`J_w90uCn-D1xX|DXy)4);`C;B zr)2Hoa<bOYDXMwf=F(bPQH?!0!f(c0;^`<FL<@Bcs=^WrTg$(WkLM{*d2r;$uUTl} zB%|yU6!I%NAsMIZ)01{*E_dZS{tIm0Hb9X@R}uOSAtfnd(-heNXAgfYAz^(<-OjS- zi-TP7jelO<Fa28`9b8jOELk4$?{dhOhuvHyg7IqPeqx_r+-7sUL9$J9bO_Amu<X`{ zFs6!{sW>W$%J-okmGyPU{Pz4T>KvHZX4ZCqa!CD`Ga?)QH))v+Zj4xYfvpSDy(_r~ zhwPjtgl`iMbPa7i`cZfiXb<vlwd#NBTxq<8CqqcEO@qJt=F1plUA^r+zK;n8{Ceoa z*O@v#nd&$P`nApb5DD=4DZ}RzR6S&Mvl%d_ZMSdH?JZm?Yd{_!?EEs{vsY@!zJCQi zs>KVtOqd(83QPj2Y|43MRP;l!y&bF1xtE&`Js;3vS_GQ5cbU>U*qNAm--u%muZ-93 zd!4>TBA2uIQ$Fi_bMPOg*fW<W-q4E3y{0HP6BQl%-=)gpmHsJJW-nA)rL!S%N&A9; zozPw+A<<n|$wtT;wJIgqjw<Z4H-(CBcjXr-iZFVr3`1%@G8#?OS4Nk~FQgtfUebtc z{v;}QxmC-~D&~m28ar1w`rH4a0qgi8(m;<@%~<r2BRg_M^NRo9cyZ5qex|oL_4UIE zz4efr)6m_-A}fwsotrEz56Bx>vGPkNE|7lZ+D6US1L&Ia29AMbf}cks5y4EzThbOO zkCl32_el^O%cdo=GxLF)aZ_UONL!;GYbpY!3`9sV2&iXfh7q-a*^><#F>~xv?D#A0 zl)_l<s3^x|K0nGc3ti=$F8wU<@;O1r0Gvy-Sojf<UdECt>35-C4p;tk_fJ#eIuFT> zv=pBydw(+365;;?DURm)BK-xnoI#OhaA^ED#qvQ0r`?wqEu^Z4U<L^M#4o4ZKbZd~ zQ|w$WfV!^13~e@ExT#dLo1Skakf{4M6GZ1x`^7BeF`aB;r!O2|PjjrZdP@KdubnFW zLqK^hE;2I19l;EaB0HiDf1^SR4iHQ=Xb>{L(%GG{HbPF6ZU2*ap2r4v{xGgx^Dcc@ zf#d=+VwyZCOAZj|*!YgQg}y%E6F7f#jq<qDGQp5JUm7|7a`s_-!Lzy3Qu2Cr5oV+) zigmYMszkk1qq&Xts}K=c;JF|wL&~d4O=s!V3sBS=hfnP}Y=I=;6&00F5+&lr%vFus z$WB|cM^w6WY%Ze3lycAa&|W+}>gt#mP0exP&O6=qaPIt&_R{{gYCF*<CrYuqYb|W5 z;mGH4Lw*KFB}OI=QBiHt_V9b+sxR|>Oql3(KQV8Hdm&_IK>bK9DeKv<HZV4jE2@zc zz1dLBgnf~RIPJn8jEYt(P_tkl{jgi(f(5i3VZ5TE@7mx;xbo_Svh|XBoIK!s>MP0M zgl+N0{><0Qu^rWAQU)07Ozf1l%@GFwAN)ED1e={o>M$`{-!Z9U$>1H8(3io*)v)q& zrNvf1b=Q7#^B-4T$EJd2x<vG{4CZ-^>Dfr#^JLzv=SPP^&@A~f?Ad0829ixSVp0vu zeGl0z-r{Gjx63k{gwYa!D)|wUp1DYG*wFQ>pl;f*F`6;-l~yW+jDeTKpMoC<a(9ka zl!BvuHp-^4v=%)85?n8)rpj6>fhmKY(@q3hO9W9lhRA7H3~Ef5X%?}%NK@(5AqJqT z68fV6qCqmN&=w(~=nzvYkDIQa5oQZ<ON>U_yL{JCoQowSW1TQ8mL=AVbEId4qHR}3 z`wVM#KbB~bHRAqWJ52R=bQ&OR#Ei-B0;h#NPbiR(QWFD~V+Tsq&5gYdQ5}oA>bl3* zmRf!Y{JW$)*`6AEfQ#!Co1V9FqF;ULFbIs`fCS?ZKWM~c3AY%JO0_-g@$f5d5J4tw zf7G`P++fhh-e;n`&wGy<UTl{BN;VfgNTC$~e9$f3lJnzN#i*AwmwyGTa%3ThB%3*< z4ds`;SYuwdjQ&)}!O!IofBRU*6L<=X3hXoglU|Fe^Fe`nMf2;~C8pgu*@l5TtB{fh zl!o?m^n#;x(BuH|Uca&Rm{uwx!*o!Fpy*FfPeyVHSwV0Ghi_T0{vw(;xt70`ZdSt- z$y5Wv>0v|9lGeEWg1bGQPjdWI`I82OhFLt_AX)Mt;P5R)C(hmJN%z>%Lsl8G?;VY+ z_e+!vv{rp0a4q#sxPgLIczs$w9$JZ}5=`?7juBANPo9Dj7?6szrVfkKbu2mdu0ja9 zXeeeJ8@BKHcp~fZB?_O-g?9}%i1N>MSKALrQ8+te;*$?4GoIj4K8Itz241SN-76vh z@9+nm@E9%|_$KZnOX-}c?(=qJe^4=RfNNtEI2jYg;T=V-&DZGru|{i98p-}XjH$bR zDt1r3sNu!A#pm-I?e~DUq0P65O1SGe+@}VW4%)zq&Zvu>HtS1A%fOWT>f;z>e^%v0 zm7w8iH^sf6|HIci21ojR>)$i6ZBFcTY}>XuvDvY0+qN~q#GH6y+cuwke>neB=fzX2 zs{74d_ubul*Y35h{n_iHewh!_2nyC@9KgWRJS_NI_{FOqeDluY3GuRcq$t1S?snhX zukV#H&b=O$%)ew`H8)Iq(+_>cOB$Z@jdv#M4J}scj(RrQz6__(Z30(yjoJfTq+jlh zzfIUBvBP|MA;W-RLVUNZ8eU3h`5a%R_!#RH@gHH@#}nalo~DR19K-J!x<$0{i$QC9 zeZUuf{7qUS;Scv03659y=;TsNU!NZ?QIUmEDxb5!%2jMe5f9kzVPf|JM?fZeW!}$+ zXNea?-i?On{fSFybW5I$O(Mo5!VqDsRXIvIu(&90mT-s5z;vK!(x}PtN8p`&NUsa8 z8Jkfe+!#W4ay%zGp@B35ahNFMdM7@Vui5$;0)h9LK`oKEE!X7Zb@g?obo7g0?GAWN z?5xfxh!=DcNQ0OjgR211CGWEk0{=3-rn8!QhzOW8{f3V%dcm}G#L_nY)6mHmR%Dj| zvV`3G{+pMRd^aQX6pvhz9!`JUV>{7k<d(g989Ep}DaeLaB`no&!B#a6E~eTH3N@Qi zmjht(&O))<mZUw%0ACibA>ph@0VZ&JY23WZ2dX$d`Dvavx!~-9p!4lTu>*0f974{7 zHX@yEc|NejFB=?D)&PMq0J;Dal+Mh)A=G8Srf4t1Z^06SpXuK4^3`NevWBUqvjgcQ zUheEhGaGHrrKbCP$`PY8wn#DKbm$*-+EN6*_<3b~69>s#frD4}iKrIgP=!r^>kB$A zTLFihc<9Yci?T^USW*@PqQPOzT!E;AH!Yi<VxUNEw^B|jCF(9F2EJgoMdtP7wk;!X zpD#@5WO``oqWFg$RgS5JQE0bQsq#<f0^4zFlal>B$_Cg!MGR);_fi2!spGx{Td?V{ zW=bZoSTVaJ+Jpt`<zclN@~dHY;UoFgzoLnD_xal!fvaviU^pa|3Q{Q(>A{0{>H-mG z2zZ=p7fm>a5|~t4d$+tOl~xUsvIgSn{h=ItTx(@~8FHO2dD6e7<uQ7pi#$s~p*NlJ zC6)qi_nVjEazj9LQ3s-*nW%X0C~@T1LQcLMTI+3o|C%UhIa;Npj|}R%2XA#bj3@L0 zujm8ic!OLdvVGhNc_AbzPgDDQjJjxOJwaioVaY_!?*%fo{-BC|@DYg1|EgK^aqXZ| zH6k{|8f);%`Wdy2_!)(0``T$9{MPGsJ-feI{N<|0J>^BP;sn?YJ}tQ}U`eWx2(dH) zY-n|@TXcEB)>QhUP}S)9n^&lz!Z!!oRXfdC5373mhOVi82FY6WM69zYU$L*Dc_Ahm z`q%Lck;Hx$$$9?51ugA}t3S7#pAQq%bo+o^m+5OeM2E`60Gjaq=1Hp?4FC^O@Aku& zXS%iQkYXn)cW8D0f{E1*jqQLqpEABR<4<eV?%VuJLcP#u-QIzxtn>OFh>xF6k_uzK z*Snr|*CndI(KNLIk9ZgAPjmfkXBBiB7u1=ya{jjNCkCC?>lV%r$_X}r@E`iA!i)MN z4-Wo69C`?gMcKI%P@N@8l+Gm#4p^HIvINed?oT~d+KmbEQC>KjGm>A*e|u*oLkh<< zaj*K2ht88dV4`@_r}CJzJ3nE`absIJRyw$tM%iiZpY)U=!a?&H$y2Kj71<;AbIghc zIRW^I*`JvJG1`0kYLsYT|AbKN?{-}i+Bo8<G)hNS9DQy812kb{p@B>Oh{7O5<#F3- zJfIJWAm*$>wk>ODT_L;QYU(d)G>1Zy5+Qned{oZ6{MJ~g50MYekl5$zb^p}biBD<I zA!h?EJqG&VMJtOO+6yPB-up_k``JA*(OxCMJ51XgK{3-r*y*&f?X<&eyN<_C7d|(z zWuI)#`A}JpF-)!M3>?=fW$hg;X8ljj!0D25>-OZZypSlDHO56gMnCw+ons%TZ)&nx z9$u{Pxrb7VR^92L+xBgbW5;`e@QrQfPzWYu7l*lXSiWwpG4Hzwor~to40}xHn>pzm zkLHptmFNY#HCi+s#QffXK~rP4CuEVE%6e%`;GcrqlZ66u(clHpy}mwP1VusgQO2p_ z%l%<eo?DJm6DF*X?kRXtJ@>+jH5w>dTQHruk3qV9AxZYXemy<8fv4<yg)g(`Wk0>n zQ3C=vBG!bkvP#S7S6yMHEV%E@7d7ve5)|SRCA2AL>w&9|Z^!ub=!x<XEL7MM<lc?- z?c4@ty~4Yw$4#LzE#H&KiipkjJxnwwuyAmM#K$?CuuG7|EWk`lxTcS(OAKX5_YK!y zR7j6Wcv6C#83Lwy?OGJGT&M%EArphCVoCBSM1PvOv#fvL1@)FABPy($Sy0I!1zIU_ z0-;gmS5O+q#gQj=NJUlgC;;(1TfP{GryIlO!K;l*eEthL4kk*6_?Yt8N7r&l3<Pd| zc#~1nV$XXQLH@U0yG3v@qDs`774aK6uRGg=_~~f**rkZxVam?a0xncGZc-#xFHJnw z%N6|>_!Qt|5m(JB9cf1DY@4H6QSE5yM-P+%!C@35QUXb_)q2BFrjns6vPB|=H)na( zQ!C~rTlK)PY6<#h-%rAayc_-+p%2|ykjuAkqKLY}7+?a6<Da|F7hB8>HSdHvuaDId zv?gjFJH;7Syiw8kKT1w~BN03@OS0|<1{_*(J#95(c(wThZ64Q!wI8JN^j#q7Kl9+Y z)%Ca4cnay&%H*i&=!|4~EN_FjI5a;~QgI_0agtE;rQHh*TX)6vuM2?q(S&ia?UgWj z`kD}U83gqMjY&Kxxj;z#moo^XXR<ZNgU^IQG}q=`d(CEXID&M<tls6t4RPQyn~9Gh zKb6@l<GeFmw(ke@1FMJA?k}@J>xzA(msi@okU#>crg{ViA!go?d3)cA+hY}<oKX;N zwWI3DIuA2mH7k}n<)0SHPGRm$WjC|~^oo%95FZ^Re;;7HOimk^tBH;PZLb^@(!Ttl zfqNvuNxjhF^-!gW3>4xMVG+@#>aGJyVzGz~`*JuKb&`ci6HV?D>mL#Wb7Y3~tinFw z?p%TK!`Kc*dDGdwqFzLEr9mi!%S;#o0|K?6#WZO9;#;HI2cXbpo$5#mUy&vbmarKc zAS?|5&k}q7p#fmpkPY$RiJC;fh;|cMka0=(x4LW}ryE@o0M&cDIK1l16L-lY8Z53j zlwJFnP86Z&nojN~_wlE{)#SP5QdWp`fK%Fp6{m)2lt7^17njV+3s{IFQqGH%WLtBG z68EfPk<WvCvEmhf_oz!v;(0egt~NgQ=`V!(d7Y@ghpGQ)x)&COgwTYGQ+PL`v%4Eb zju6ixpVF|95>aw_CfVtt77+lTm6`s|k(U!lt7Ke6-*AwUIowW~JZMkwvZk;XEbX(e zE@)6svSl%Y`Kt()G<W-n|H|2z3C2;f*D8BpdBL@+{aJ8+NP8rZ=3aK2RYNzyZ}h?2 zeZxf~iv&@99Z2@vr0IXcdtb)xX~nV+J_V2<CPvlDSYE*W%%(z&Mx#)cC(-k*#3dVd z9O=^x9Y|u?uANwlVSmU?e3_@HYO{r>PE!Ruo1I%+3b>_yuOF{a;4#*Rea5<ZPT=JL zqam?zPs=N6n0-JkkIcoK%anUjExNr)NC*tJ=vN7tKoBfH&u@_p$C!<8a=geBME=zo zs!TA3w6;8ucFwl?cAF8{R>24wLs-JUa@OQH=eT#Y6E6o!K|-_fL0{`!Z?NIjI_Fv< zkQ$M6M68A2=q-dJr$%;cXPJgyVbEKbn!u}ocku||iJ1iGh)ONW=Y8`n24%S!t-XNc zIBuXM>y!R)#~4p9K6hvLaP9P~aeE}bskzMO*~E{09b$9VGnZZi{Pb+xh3*vgo%lRQ z=k^VFo1or{3pOWd)Jtja+cgFQ-x2Zk6c{TTvG*V1yYPey{!7UxK7bx4S@rZxtD5y4 zC=IUiapR)|mZ*AJ-#ERflDD%g?r=0o2$gF;8pVwDwjcfU$CKT-AM=7JGSyU~s$J$u z`{9^>n?2WEA>uuXVZkW2>k~`wGxnXiPv{{)EpOn)nyeM9$h-s^!Rgq{!Xhun7);pz z1f%wwo(scL2Wr{5X%+C4sWQvy93V6^j14Jn2q+P)nqYB^HxSm3L|)zxANeDNb`mi2 zn>@M3JI&t|0ipl*_0`W@2~3Whtv%=%D}$5iQ4-Z5kXuB0QndY0hdsb;?`Ww44HV^9 z1cCUc)rNVe1$y<nUS5cO9S}j!arMh$7*WXXO|7u&i!V?*3dNn-VF}Bi4;-DQCtzaZ z{ZVFCZN+hXpX?HXUay|Fsm&H+?(>-Wlse4)Gbj-fYTJkn@g}vCXJO`eL50~^b*A7Q ztt&>B^fs7{$u+($A(4vEJmt)BoKn!EHy|MM5P|@-4dn-GtkcYhAqS!Nh0+KtCf`_X zz;7MoG|tZqt0>I=$Gz^n`!l~d6!C@PGPxp9)fZ1mf8jYF-5>^w=BUVR5M-N7&NZH> zw-XJK#97!`u1O21;;>Ly?5V`L?<HziZr9UKuamcOl_c6jj13FC4k$YXhE?`gT0ezw zq)1k$De;<y(BR~POJ2WW%j3!1CT5JF^?JMC+r&ca2IpDamLzt!BE-up6VDWr2FRs5 zp@hb}G`C7w5CJ8}$A!KOf&wNOM~m9{cV{|HO6n(9BYL|f+qkME>?$pz^_GZ9&3n6+ zBzDh8Ri5do(e@a$C1|4dUfK3KDG#D<_BDE2Fq_$prl_6;W7HjkR<jzEL~t@XY5T-y zESln&+_jiV;^|wcCzXemFi2VPf2db*LoTMckc%YI<0VeG)&C{6hK&5-+YX74gK;yd zz9Hc9CsoR8C7Q%8N93YfRpWZVH{h-e>;2S8Z=s>}NAjC$CHcl6z_Qj!yzaP$u;Wq~ z*mxrjAify*9Q2%OV{`sQwkhqF95Ybk>!eRDSm+BW=w6(UcQy3GY1~nQd1_=<fMnuu z(NA<{AbwR+Z}k7*KlI6MEs47jXB>GWL#)CyFJRSM7#6ic9<La5Zb7+eBT4;5_4ZxO zPHuSK|8iGU>D%Jl4cdaOPmqq<n}GdtFB$XobYdm+A8y~i*WBmC#9g{J%SB(3);&ir zYr1w&B6XCS%9GMdqx%%0sGdjTx8qxWhpvZb)ljo%o~h^Fxq&c6_<PuWO;$%d?%GYh z$3d`iF06)*#yT4gJ3@+NcIrT6;|I6_vtrm^0bHvd`4pdrz~?HjOa^l_%+I17q&}gL zd|C>=0HpE$zrK=^7)HP%jq8x$g0~>cr~#Trq0%3DU%{XahPP}zDf;UGgy09eAeRw3 zgm#Ac#5Ol!I^9&e*P+@$#~Lm~m<(=?BoT9R@5v;x78hhfr|URp!bu$ZU1xR)mWcw2 z+6}Z<{tN&0CnsX9@eZ0AW`1#Z`g#PWW_8S59T8{9IYm<UPJwxrA%*YA<Z~NK^XGK? z<nG(>39z!DF@9+}$1LacdF(U$jA!yboirpL+pI&Q-A6bcv!*RcAKZU1#&2=nw?481 z=|<G()W)qKZN4EimZc9*J**=cyy%T}_vqDA;@gTCGlvWUNg1<d3p`;iR{)6_L>`Ss zh;&7|zM!N1<z4XzO?3?=s*K(2#sdBoDnW)HA?)|^rOt9R#uSGvZt;}JCUmwa1d_tW z)+1sX$=X4wze`X<qhNG72#FOm4td@x!FSI1aI(?nrKo>{X=o9~Zxb2J7m0c(AxEv_ z(=FVxG2!WgxUYY+@Jq2f7V(=;3U}}!YM;(?tlE?Y_T0ot<Y1)D&bv%!AceyLD8_&H zqtWa6m^h1`y^w|8;FGjdhK={`pZ3{z0MWul!AIsQ4NFl?w1X#C{T!qjjqcht^hLX^ z{>)HP$)O|uA(832jvHDYRjD2xg5NhM#U$*&+Zj}A9)1y;7*BrCK${^#(89SSJNQYo zJ#S$DQ9|6Ppqd6_V+hmm;yEn|DIqc|h}@1{6(>9W9g&{zjxwD-hl$O9u3A`v?yvE3 zNpqOh2^xZ)#Q3O?oDjz(;YwuTyEn&Nws@#0>FyXEtBK2|e{Z?H$-z$&=CLsROIA+7 zgV*EtgIk7;yIhIov82*-bN8`AykZ$-VuxwTadoeA*rRM}q2BwVA9C|w<nhlpCmf~4 zc#yjc8>pV2%uKaDu=v9($a)RX?Wu7$5qmg3!;ysTs90pEVMP(XeXN_ALROhD>8CUd zcWbg7PY<g{gx$EB;JIJiF|obJBZs5yD~pnb>x_i_5f;LG#7ZQ$LV_FYg$Er5JRnEl z4gRs9E{xjiannIZA+0-j=6XsQ_es8O8ya>c8c5k?n7Jhu*q(KJY(TnyouGZvvafjd zVT&8$^BN@Ja^|0D&{Mfa1>5!2^rUj><0%!Hdn2HQT~By%hONx$2+i6Ru4T-R2q4PP z*g@YOg#b~M_hiE!_j#D>zGg2m$~j&qx&4b0&HGj!%d;GuD)pe?bhUMRDgAP1pj+N} zo$S=%y&Kg0d7N;X8zuIP##T&i#o^6(_s_f)xP#<^;ByDb7}X7|P7d&-fdL(z_{Nsd zTdD7FNU6i41E0f`JC=X^iFH=YN@ciVgDVcYE6czza=rx^=p;UP!&ga*D7@_cbL8+d z*qSHn<|)?uK)d~eX8s0@-k8}ma~=1CF~RxG%T$jGflNhE;42J1kQE4<iC*_rW-}+N zgYU5q{|H$xKK6aL{T^LlUZvoRm(5Z`TiK1y|JeX;*Hl)2JqwfN{$lu6qn9=<<*1Im zA$qvfKSJA%KIJnN;RX+EJAbH_Fw|G<B=((ZW6k5)L)c06C3e$&q#s_Nx)9sG_3ic4 zrLOw*0->Xq9^~s~!%X1v!uRu*@R~NjWY1h{&FuFC8Vfo$%Vgcmh3E<t+qhNCEeAo3 zS`LtYxGly$K6g0$b-Rc$E0&KP4cH4>B2@UJjswZQxi?Zc1C~A*+Pg~(Ej5n#ZWd1w z=N0P2tvlkKS4LS9(<T$RU+dvzxeBwVYL~}<&3e8*81FWkTe2*DyblNSRw(GeX7vtl zj)LHFD?Tc`d&zz229afXA`H}{zKMuDp2Gf_E3{Zne)r<s-Ou4wfS6gK952~q?VYSU z(*$4UZ4F|k6)lk$*bXx`ZZXai&c_(gy^U4G)w;=`)%ysrv3$5DqP2E(HDnfC$dFxX zsDW~z;?x-RFuLV{LuLH3Kn*^t#lj~948`iIRaVX+<??<4-GODGo0<-9@5a+{Omq}P zs5GY{Qn&Vq2p2X)x*UniQK->fZB0z*qnyvqP{>`_XMLP5I8=_MyF|gv-bXSqDM=5> ze@&ugQf-XBLAtVsrlneu8K4vvff*iJF3TnsZ8+~I|JM4*El0g1m@%*sW!txacn{BA zviKf=FSXa=kt&O+-;KyhIPBvBu7*Lb#7XCzI>+efIem7gy6$iXMSP}8IaSb)Ni%K{ zAF7KGbtea-mQoPZ`AImOj>soJ*5<4s_kj*M<?j2)h4b-3gkq-={KnlA;|0@j&zjfD ziRj$26*bN`y71QwIOFf?`wqZw+3;oFv8oXRMq|Zhqh*?XY@QQrw)dTG8f+%6It=!& z#yPx`?7ho&Lg3aAn_iu|zt80E9(=y=3_3BZDe_coW86I+5R+xmVuQ`1E&&Jop*~k1 z<JCP_EqgqguUsqk>CWDty5vsh*E#NbF1IQmTZk-9y9~(w&R(%MnX?sA4s*eqQ2{@Q zV1}=Imdl|qB;~iB?Bw0O2T5)#Ij#@2RCJr+fkDz6_mflAV$S@p%yq^Byy~FIm^4Za z5~>zQ4_5Is^xnYkxSm2yaX+gkPx-C4zx;x>+xunjC?q(8CT#Btz{;Lia*_9&#j+Kh zh=SK1xl-%K@qih`)$%`ZI|<c+EbMRv7ZS}~u#5U&bHkE`qQ7{={><ym`4>&#L+W<z z;S~6J4P}Z`0kU$(9v!@}ZU%NusGj>#<r#n{h8She(vSN2DHQhDw-PvO>vzt<6>nGf z`n{tS|4ExC5J4FAp$+QC)NVl$RlR~3N88?Ri5^goNq2?cbRgTp?<V?2)FrExdcrT? zo_5`DHd_sD&tnZ5nRn(3n~UIVk#a~y)v^cWeVak$`5VAl340)|pLo2^?4B|YlytH$ zx2H&^{Byl=^uwRP3A#+_MsM=8Q(_SHe_wWa5i;kmWI!q?rbd|lJvQfGqZ#3R*MErM znPI3RD>Hq!n3-@OI7DBaM-!ecf4uUT;-1>a2ECft)u{qC#(LpnX8~>}=sc?;X}m#| z;W<l&9|M+NvwJ)jxgSnnjCph(YxKF>iPL;8J%)XBeWQk4>_~jeYdjxLJsv(xAIVXl zo6e7WTYGNPRBqlvMF)s@$q2MgIbJ*<BnJ;aBV-HCixjmq$fHecaNo3Ygi~YXt;a&j zZ%H@G*`G}Ngm)kNzX6)#XQoBxaQyy&?ABRXp2l(nAk5?^s}<mqZ~^-DiCsfvqZ9uo zIjK(Sqv3reeI5}uFreQ}H6`@$Kv1Fk738s2$SL2+`HxHc;S)yBR)&IO`Lhb^KN_@@ z$Pss{Tjd3Xu`DFu4e=fdMY5Oymn>G4QzVQ(u`*LOH&|{S6+1Krf-1jmKux&81Q}0% z!Biqx#Rq|G$QBhF*DzEIF!04n^f`Bq^fC%4SPCl8j>se62y48|f;$;sMl!P|3AT4+ zsRG^0*v;leQ4Dh|Cx12Yy0>FS%K+wfX3`SB*hln%=w4g3l92F&FSH=qKlpJRJ>=7^ z2i+u#lETWb6z^Y$yCEPpFe$G^k%!L?)>*)$`P_v2NOMN{dKp5vIw8s5D68k(J&ytm z9-flpecdivMB}D?*W=NA#J2icw%@$h-~<nkMJXBJip}$rD9{{&iDRa>Q8R9KWl$Hf zemFPKFj9S0ceM0iD_Xo`U2k-cTMI77N3U0+Zzq2mZ3S;(8`d7j;2}X`P;?sTVkalh zhnKy@10U4SB&df>S)bFeI0C%y1M%RBC6pALB;gYZj|8rbJwaYn>9t#P5FFGCe|>!8 zJG#qOw3?N6_&cV;5wd#yvf-pO!O<tg9Ghs0HovA!&z1wk(+rX}z@qLFF~1d}Uzd7P z65KkC^$v9%EuGtr`RX7Ci~2FYhmy4J`PuM#JVou;yz4RLqdT?HGk3Yn{A!$fy79Vv zulK`#_UTuu$03YyPXyBvZZvrJRE=)r3Ja^vjL+uqWqB(W56i~g*!!TL0Ly}I3rx8s zsA~_9n8OV|lIuB=MmJv_0$_QCzKsU<#kOLatrnQn1o-_Ye(wkgC_(^g-rDSE<5qjd zQ%Dp~f2g~@jwENdiApCb1y!Cf<+Z>YUuND5(zF0{Jm|s9KCwciP{_VK&GrT{rv|@Z zUR1^X4h1N<7Pq``yoVO4C+vg#c7+=nuS3M|tlTnoD@5|Q!#3MS-5PVv_E6MWXkZ5+ zeoBysA-Olr|MNivrlIPDIgf~qnf6~sh!~=HFLOj>Re3zbmSdD=PNpnb3L5nTHwsJ9 zMeD57uVVAh%(B3w^z1>3<8+;&D95&7(~1+{vpJRlbl(u8o#CX8W`zwv2+v;pbc8iV zIfFP1G(0S>D6R)H=zT3zH>jX!#lVud+OV8N<0b!<$Os5-?TGze;t#tnhjMm)dc^f~ zDAkk1Ke}o*7EhO!s0HG8aXXr?aD!L;{xU^nU~sV~lF|bUO%?K<`H@E%2*{{XL2+ax zGGI(U+-r5KH*%;iv8vyx9x498fd9Q1K~7u*sP-@I?qB+yK3GU>XH+hJx;}x_*}pd+ z|9S2G=T?D&()p@im$sQBQEIEX&lHJDhW*da^xtv&-|ycLK?*=g2&96={_{=#NzDHL z!eEs6>p7U33l=0KNX7ANO9%OyJfjf;RdSqkhSz(;gG7=^^cg46_ziCHx|qTpM#>5C zxtReINo{#IM@AB_edyxFy8FEu$>kcl9Eiu_QDRj5g!ORh36)=EqP;)z^rBug<mY~4 zo1ymyc*-6~y<1XV37180nz~&N^y9iGx9wUte6ZxhH!qU7+}wb&Z~15U*27IGiqwM4 zNKa+alEiU|x%8SBKLwf;0C<C8^qOrR9SWmLPhesKTBle~zasfWQgi&lqA^h44;joK z93L){9SLv%jxnof)+<UOSjIGZtDD$<IicjgOJP5_aI9Ktggk;k-{C{+E;}uH$+k?> zvg88&8Mv+4n%!q>qahFsEoBgJ85oA-d{k=&0|i*rYHCH9qL!Y2f{J0r8aO4Hd|5E< zZ7Kw2anueHuKw7cp^D+rI<d$#UVyxRp0!X9lu{cB&o-4}jas*xSGL;jAw=X{6(!79 z^1<-NpaP-(T8?y_p-4&1elUt5R?7W4`s%EC|FdceDl~oaYyXLaEG=aE>Y|c^i$fZh z=~arS{uH|^)@`dlcRj|_cb&l(3#pc{>t?g9^T$wszZVj#)#vgp?V3fMS3fn{K>3Un zcAvl8c+*vTltrm%F^|-bs~Oxx^9Go@1|IB(D)Y{3pYa_|k`cwghRt`JV~5|<jc(gZ zx$+WwnJCWn|4h2l{UVZb2zDPMI;8>~{2cr)_+MAE7jw2!1UT#tNbFo%WV6WLZrX0Y zYu(L3d?wJ51Yxq#C9v%JV+x)4uhq_jX70zy`T|e~3ye&$ciyj?5seRVhr5zA^9P3s z$G0}<*nk0vd<@Ob9cQjeXKfYcTM{WcVKllp43&q)#htVJn9vbhlExG<Sx4WU!zE(y z?kl)wmyuVRq*DnkBr$x;DtTSrU!*1yT?ueDHBxsHHA>Fv=<7RJHZ^{YMV~IFZi*LL zKb2?#mHsV|n}N~#S1BK+U(y!z9CZ8kdneDi{^fa)&GJ6%aoA1GNf(XsTPSy!7MXNZ zC)C9FJlZc++_<)~{(Q3o9aFep2EasY^(NMC@%MaUa!9ci(4X(Yy+oZP2N1irod*$$ zGQb-ia+GBE+HdI7nrz~0>DAPSow{x0cl?H{$}X+fZv{DpVZN?MCviVL`VF2k(yw=3 zReECacT<?iNjznc?DG~4#WQEn|I=M8L<3q6?rRA%xYV&X*-6ap1fxR!nN`Ujgt|_x zQllIAHWs_RB1xjhDKe%=fOE;we#uHXM&eTB4JFGvf$}$(I4m?I)9_oL#L;e37%}W} zyFTjD=L4UJ;xNC3*2F?{AxFa_2QfqN$OO~;!70O<D^BPy+AyfhjFJf$GCn79EDh_M zAYxfsgl=a|;X&K@LE{_kPt5eVxdBP3m=bn1mUFw_Z;8HDi9UfnLW!>3H>jP?k=wBC zuE`YVJS>q!)lTt-Fw$lxys6F*uQrrp@^w7u9^l{q75;-keuWy*4~JUup0e}|Tik~% z+7`~$mcxkr?>2a`Gep1aQ7=5U)RJsGvG|u>Pzcr;@pP2t#qB?b#uYS<1f<8U#X?x# zUD5LD1Y(mU8&p!-)E4&@k0^b7PZzIZBIfb#hwF@Sx`cB>SE|087+0=0%JVJqcZ|!1 zntVudQ&V9%YhcL$?Tn+HelEQv=iE+cvXZBYS&9K;3w$haQ=*p%0XEuJ(=EGnEK{Z* zWn3Z3t$M)+w2&oSX6o|WBjPeK1jq-=mWcrO1+P6Yg`{3R%?pV!F`RowV>7qyOV7;U zIM<UVzWd)4@rvyr^`RTTp&<WQw^VaGV~<3+{+?gPw&$inj8=CnSsyY2>Owmz7ZBO* zv=~m9|6W#>H76t&wK0L<YvF@LK4DObm@S?fPS$oh5`&NSfGK?>6uQN-DkD~Kvw&BT z6}Okt4uUrwy@P-K9TbvHn751;j?+Lp8Kcx|=_Wf!XTIW@)~6E~4MnTp144y*=-|qO ztU3s7kXdqepqTY?#gP%JyZL>2f4rVY9g*(3PP@dQg)<Lf?zg3RKX)jowgPi_K)YCI zD0s1*NkCasi+r@9^U|IonA2{5zbb+-a_Q3=@jOOivpblltASS?ZYUyK<bI%Z4p>!t z6G+Dl#u>+1!_7jTku2R!K}g+Umzdeh-d_0L1R$Mh2ozquBMW)??+8t$fS{q#?;DbE zqF5f4js5WoJ&eQAJ7Vi{sURRqSZt)9sWlRQp(5o-ScxNV1nO&Sfz1S!f(FZ%F*iKK zUsbi{2@y}{P02eg-TTm;IBHxW7DwPoxHLk@*^QLS0eRT{8eg#g?P2{Rn&t;r?b(SI zZ6Tut`G0!>$d}ZJ(AaucwOP|iQQ3K|!ecg1)QYSW&PLX^lOuNx$84F$nsF22&g<9H zgZ8u3aV;hOUXHmo;8?t=8t$Om4<m2o@1uv6rKNj1W?Wc})^p@dRBQ%mKBmrEbHb{g zx1DU)-7n`}s6yKAR|c5etf0%Z(N>O#%TYh4Ep)7O(Btteo!I8?o&Jc7!jM*1G1Lr^ zJKCKvMpYpl1sPRV(ZMVB75;&!u4$9#l-UF|9?Jl+Rn9$&^h-#1F6O$~#qm7tZ7HPZ zk8`p7R|WG=CZW*@RmLD`i;K7HS_aX%=E>-f&r;GDvnBGbh)1$NTkm~oEbor(%G-d_ z?qd2oCQw8<AopX}qRjWv;*I!0@onlI7YSgF-f<my+PZUnK<yPv3v4Y3>K#ZL?=$^P zc)1=ktR0kIf;8N!=Z@pj^%;3MRXuokQHJh1q7{mBU0KT$HvEWfIOY4TmdA-3g*AQ$ zVRF{<dgE8CqBV|)CEU}wS?%xL`}nqdalr027gNRT41rt6g|9E-McvCR)b~3;4{7!g zv|1M5f|Pt8=>j^~2IINTYm(FTAl@y=iQC=~DUUI~+2*;N$#2|r2LL;u-3MrK0%LMZ z{G;XrRF2?6U?W9mFU2%}d&~MuyLg(}{PZ7Z?#nv?qAu#*?{A^?nT%?Sq;z6SS}s); zAb=HF9KG=`?s}Cr+9Jt*$ma;1Y!ObcG~)~|E(DZ&;FCm~zt0>_`%HZE9P-w<|FkXS z!lnw!-;&e0S)&sv7EBuoyWMPqIK(Y&X8thT_QCaDZ&h%3R}Bj{hK~h5P`=#S`+TMr z(}8hF_;sf)FZg=n&4GJcTh?Vtg8f{7^lRp2xpMICdfHyPi3QqQ`*(4ANSw4y`dvm* zdB-%LL^6q#cy^qb6)d7GL%_eNO>2X(Ljg=g**rUDwWLD7Bx&XTKy%AufyF%RjvzFZ zWKwSadc!dp^wBewkQG{!KUO6@l2P(<hGW%XFv9L497>Vu1~kvVX5^v^O5LD#O`d5g z>}`s!m}b}$`yPMdQl*j*BV9Nxsbk@v6b925LeWSf^O)j^Y}R3)glVYMP`h%g$WxP; zN_G>RK!f6BdN2t7kw$y2QId}_c3;DzEO+t%L>UKRm9T4cK3&zN_Qwq|i6$@Uq<_zL zh0(RCf|Da6r$WtSLx+x#SI~?f2SCDyDHZf1p<hU%L-jvB*_)Fz&GY;kYs}*DdM48! za<7Y*Pep>IvDV_1l0>#fQ1IDf+>00IJLlmLADZ@eTY*vn3pEVGz;5awRRR--dbG5m zy^-+Wm&2sWQ&#R{oL`OXMsAR!SotD9*X{!Vx{koHMAsj+uJC^amB3bqW;Qk=k)=5j zZX+FlHX+;~nZeEI7-6fw%vpi6`oFfx5xq!Qe)!Mvak3zApKFiNjbDcc!k?t8=jQuE zdrYbOxHDvV0$YS-Ux{5t!-Y1EZ(tNPGh!>UC<Q;h7{wcT+rhZ$^^tu{`Cng;CBVsf z5bxG|GD#Q^);o7h`gxq6Klr<5QV)w9Z+^kla5sbYP~EE&#^QT%0#yJV>d`S?5Sf&Y zOuWH4J0;r9RkCW&S(hID&`tlB1xLb<FV76fQHP!h_dv$D(rt@j_nml&7?h%aZO+tz zA?NuoYHS75+wGPl1H*-0XiaEIbP(|GpiST$hHJ0igmLpoz%RPJho^ZNBwuN%<o++d z_$iV9oXer@JQyzy!M~iz7byNU6;|pHLvbMU!vTZBo1YL7OFW{cLt!&efr?p~+OlFq z-QC?^j&6SOj1JvD2?+Ba#lp<$v>6vR#izPi3btlO@_<M(pyv05r2E)&AqDc=*_b1- zl21b}Mk~di<FTGV;OPB0kFi#F{ie_f%-*dK&L(y~c?BUVwfQb8GB-)wZEzPHcGFfL zy|@(l?3$D3<mItWbomFpOhRuuurBsaplBjmI)r?vn8e_E;77>Nv0^2m2sl;1x!I#} zUh;$AP;$Z1cx<>>5JNwgbx`^p=UGE$=)e<%<{E^?5NIoNAEe;N+{U$ZRrf1uSa|-! z*7@SJw<8krzPjOGK)3V@{31H2O%_3Tt_Mi!S_|@afAkT*7hEC)>K_bUOvLEOhn=_k zEf<FpK$%MU(2!t=r$pIO*!@r!$6TrCb4PTUlyNdGf~GT$#VaM`pDkz6f-J0h%E=;C zC1u2nH)olhMIILa=K+z1Dp!NNeK@&?x|p_T3@hTiX0GIl623F<o>&PchyB073bD>c zsZ-R+r6|n&QHC?fSeG_AKeNZp&5M(%S1dY=Q^{L#)YXUFRk^OazF_hH0+9%C)NIxw z4p}h>7bLAHMP70e2CI|94(4v49u@`;mPl=`He7Hv!wzM0zv5ALvlc%ExB5v!SwcJ- zpyYmZVc>h+m7H!BVq^ho2SeUi(2g>uImmPMD<qQh@^ZU(NM2@4I0rLJ=gXK0yO^HI zw1?dNwg)t;e?Ie*Df;YiGGxU>`F;n^PD)+fEqU3yK5+G$DE3q`LKBv9{j}r^(JkE# zemw&FIm#ddqbil^jVHdr8RdEiA~Wc*B32|Xg3zvQ!E#+1d5x$e|6cm{u$mlne0Jdb z?PPXowpvDZ*=hq!x&<d?#2HG}`!9L?QdTu3yv1r!*$9|wNb}P~&+8H8A+Mc>+aI|P zwk!_^1>|(_$uH!GDHS4Gd&H3@mbEy+Ey~?`(=CuS4UCUBJW^v`|8RfKOGKKRQ0Lgy zG~^2FB^{-u**_j;h#uvTj^B37)!R?x%C5GpP~S{$qtp*ia1Fu<gj0K2Sx);8Xj0~i z7?Gimet2=X6QPPW`GMSibG@)n`TL?_-B|z;K1Xu^2koUFBtn2HuX(@EeQUv(LfGBG z%uF}8c{NO;3m9-Gv*1`|#7H#ZnM=&$`8T6LD+o4u&eWH*<9M4Vwrh15tP&KvtXS8f zAQK-!3+$hDSR~O8BI3bYR?V~r%Cf=hPHs0Jo`j335NcRdVg5fda61^H5%=sX@ph_w z&Hl(a9BF9NP(k~(IjbXr1;DvFS*#f}u8oBv()T|8YQn4Gw?c}Wp`APU)j9(<bpQLA z<r7{L9bmhJJNG6+a4q>E)ov}kXL{8$XCv6RT6ufwQ9pDTa*&~c;CkBXAKXv)3-|M3 zM;MK<5S}kRYC8bm-D^?$88yKAa7(IxBImk>3kEp;NHUg@4rt)mJIH}8r-}OmTMKMP zo6KRL;d&X0PbG{tne~q9IFuuRS?0bc;Q1T|eVTnB&hmT(o@F!QCP(HIo^N)5p35=4 zmge-Pct)7DX*R;{yFlskcO#o^8k0EvI6Q<@NYnn-wej8Q@zVZndsC6O3o-TWym30q z7d@2lzNS<VVJQ3N>AhZG45PQX2*Uh#d?w#{3)qF%(^T27HzkwQmFa^fp`VVG%1Q=& zH?U`)CB8s+^S3dF_)e9i-VJQY;FHVC!>t$i=dx~R?h4H`Zy^OFaYHzWZ8X)dYE5GQ zlJy^^@V&miebsJwz-TK!erJA$&95OyWv@ynmNpVwSXlVToHLZIzp1u>MTof|<!XnX z(uUllF0x-%xG1kFbEyB`9CuK&lsK)6NmD}_^*b+BSH~L7UlUDC=)2hf`=l6n`jHk^ zB^4A{MA-LOP(p(EA_kL`5=NoSa^dq5)%l3>?H{SQE9NP-nRVbRe~iEHIou|U0xp;i zVib17$aR~_qw}D2e7G#GLvV$m8P^0+Iy-cJZLSUY+nrSn6E%XTbgA7Y*-w?}-pfj) z8p8<dfd>4SJ+wr_gZOZkOs@Zp;vt0RFw=JhjH=?|Ss+3+KgSj)hu7KJDW5^XNExu} z3t|ggYg2enZeY2#zv@bq=AO(fbGj4~)ygrzU$d`EM0gr0$SQfrukL4O3cu;s?h#VV zfrJ><O8*y4*ECBIGK$PxV6=Ojj9;$;H3T{M9UYY~?JdDtoox03LNXu(laPqM++*9e ze_iK&GcANMJ}K1YR5`vV_NvLwc`4>GAlbwlF&2XsbqMmMbF3m-2VIdH`Rs`q?56G` z@>kW1xTyQDr7?L0Q(<D=-hr<SzQ{blVz}sk|IL~pN%-UrC9Fs+8JjoW4SU32+cM4X zHVv*F`f(rVQ-LmSIHhvy8iT^SU;oPOhYck7>mP!qVQuwtj>s$NJRAARX>yBp#gse9 zT+0mJj5YitI(bV%)DUBId+(4k993l+hsh+Nqc1q|#5!!G;JQT{`|P<-kXyz=D?FdE zlrf27<dA+kjcwjLVy*LAr!h*nL-tqNOwcymh1VHyEKfGvq_aB#K8t>J5DYdn7dRB0 zJ?RjZwZ9fV_}EIwC*eD1oU`s^0><2O<6B;mVZTuh^%G6mctVRGyMu-M{0ak}2%ocF zh)!*MUilO6X=6pILI5|{B0mplU%p#N&xWNgkp@TB5}_;W4*MbTQQ0x@76IXzGQj)! zYWm5?!GRa3b@!z>H_Ao-559+*UoW>~ZN<H?_V&Yam+nWu%Jxn^w3y#p04XthesQ`@ z*Y#%l&9uZd%RS4^eQSqe18pd6mWzapB<jal)VaIyCuh0*d&u(0vqfDEmYJA{kEmIv zb6a&7_X>QOgoN0BigX;i5gEI}ym#VXliT*+9Dl-Wk$a$m@*~jv3#wVFo6;rcMv}1a z*jagmWV68g^&*7I_c+bthUgjTsiYWb<9Koa#kVx`rW5__)4B#gq2T;bCj-6SowG^g z{LQ@){7ebs=4B-7j=kIY#J*#<6^3MmJG?&PXo`8ZK@6LbKOCBob*@%=fZ8TzzKVL+ zCM+ifF?!{O5lfa{;L%TG3aSOrrtG=>-9ZMl{bddg7*ED_tT7o9H%_*@W~@;}4`Rng z6!7BGncq6v?ltXusT3*g>(@IZj?g*)_hQN#?Le5Hf2|nvOS?eVbs+}mD}}D3c%A%# z7XAG}4VGk>WKLZ|M2Lw*Xr?ap$+=r&Vp~~IYy>$T$YJD5uCxj~{>p_x|G;iv8zT5% zM%{fX`9)U6jRYNTZX_3svoP}90&;als{apov+#6@G(ciy&L$WB<!*j8k@sW6{M|aS zb+V2afw<4Fh*}A!9@*HsAct)ff<GiXmv4|0^NJa;MVJUC!{jDFIn=c=AvBi@LGa3` z_qD30#db=_mAr^&AjWdb*@0m$b_F)E$=L03&$c+8VhbhX{N-3ZousFk5H_h92rA&W z8kekCCBe!(Na*96mrI)cO0%5dq}iQI=xvWn$ea`A)aDi%3oiBk&BFChf3a}bXT@dv z`P&JU;6O>kI_#;!Ic}d^JD|B2U)puv-+0wyEKQ{xj_^hy^D27-#eYL@=CAE(Y^_G) z-cPGhWf*6oc$(x55RQ3nU>RjlaL#U9^D}CXEtYnIOh<X`=$wpLHg*F!%5#6RyQqpU zWhb3iZMtQ%Pb<NDhb>WXs-bRLowl|t_@&(BIg=8^O;I3u;y2VbaJuSv$EqFN$Y{ZO zI!&WOlT|w0yTy^P90w@`(Hyf>yGx?LovCR~uR=!c?u1Ilxwy!Zy3$Ovs<?LVki`?e zSUUem^g!>4@|aTE+5R;^c@sA<+xAR!bOkQyuUcGlCn)MUGvay@Eq|6N3EIA<DTC2O zj{j4Yvtg>FnKt0g^tg#kMx_W5C*6p*2}`PEJzY3~CF^N|w^0+WUP9I+VvDcy#kG)o z3`Vf|)F-K{K4JH(VNkg=QErHtMG~csp>vp_0W2iNOjGXk$ZkYZX;p{$`#XKd4QfRL za)tYwKil~_xW#bEXdcf$0{7PhWBWqHs(g#GL%$=&W&XgghY6&UW%<0vPt^-+ii<Sb zZummPCe@%CF7Qh8)tR#Q88fX6U(r4o!}r=^nDaY#Hx#aR&?Hl6v2+EM6u~WFozu=N zdUH_yr_67rlK25{zL%diI%v`U=X;L}<)PQ|WbY3zcD#`QUCpptyAP~ZpLf9Qz%Aa1 zfwD-)8PmOr+wgALnjXY>eyPJ#j}O3S;8~xQ??)M<N+E^)&L_{A_>AZFD$QgOEew+= z_E{o){F29NHYIuU*)~Zu!!UY*t?73<wls$%IWjU&=a=35>u{ADLG>g_+jjp4wgZ>B z&q3kcPwB-~73&R^2rSrV0<Ohqf|U+Du~4N!Xl|R4*?B8N6;`$Y2d%s)`7uG=@IWup z%D9}G!2ELLbG=ocL#;pNPef1@1V#t?*aea3-aNAKkA>Caf}wQrxqsGFg0SJRuu!W} z2hoNK!VrE;Cn$usYfAh$>>J8MqjiSy1`_S`jerNrSq~P>Nh_e51)G*(QcOkiRbc`2 zyhPfIJ|PFDS3;TBfn{X;I_kFNM3L7BU!W%mGdpg&qS%>xt)#s!F(CH)Zi>;skyCwl zgpOTWp`ub2HGzm2kO%+O?*@tF`E3VaJX;o)Kg;1Xf(jPmcr#M6P957=i{8aPyYV>b zTz<dQmX8;`w<4OV>c_+Ojht|%x=+Br$GXn>d5AuB)?(YaPH<R)9%jeU{<(u8%a%aY z2zj(ny`N8vqJGkFizzzsigJrK-SwI#c^j`;6njM4n47v}dV1i&`l*Fzc0UxdUm^Jr z8Ef>3T~7Q)7B2CAf-<T|J=Uz7PKE?4?dLv!=^M)Swq@Z#45B!`^BBqduJv&LP8|<F zbf7E#O{8Po1YBw-b+k2pQJ?|DAE3nIp`leaj@hsC5vo7J#HS76gLf_TbuvT=!=rws zRS+q`!L%)3MYmg#GHDRRGT-fdq#ui5i}Cl}ZHW}2f`1p>DoFnUpO~t%v@6-wMFUP> z%?<UAxKnP2lytwiCzB0zHE$Z94^!9;b4BCbVswt{yZ$HLuBKC{OLudI1D+`&Y|adf z$7j5578Lp0*;4mI|3}`<v>-_u-Wu4bN{ZsQT|GU$4XW#_?Vd#ZS4EY#4v-AcIk_{+ z8%+FU<*<ShpY1hNAB(5k0RBl8lWDKtV%)x?-7c=F-Xyk5dhqzFMG@zV#_x;zS;3nI zz=fJlxWw{OLo<1UfV>EOS6J$c#=OH$7)h%!#)m%4ne)3{SaEpAmRj)J7wq<DpS_Q5 zVAiFxLtLsT>kD@iUK_fq6`=QJ^Nj$%wks@OkvE}r!>?%`0<ZIO)4M7aD8-K$-Dx77 z*!LF#AbTuK-~7K&Dn{4;qEvkw@E*foecRF?2A8YQ8S+NQA4@L3%HVGO2`{EC6=lM) zTcvn)9T{Iam{+t8IacV<MqoGg&^D^~l1g@jOu-*#2$4CqJl9_KsHZ+l7h8*KFG>gY zIWFm|eF<DxFE1e&TzH<p4(>_rq!#g-S_dipgI_&b!8W*=_q?(OD5-Q%BrSfj%O<#) z$>Y&`9B<kenG_Qxb3rYlC&vZxxK1jIk*-V;K3Wz%UpWkt+|vXb4$qK;)v4$6L?R$m z(UyY4xN<Vga&y{%%V_1Gnur1|OsNx`ZbmB+ZO-$Qd8f+fBzigUJsa+mMwFl5U`nE( z!{eVRlIatYpFxtT_}{RkB8jKQ;W)FZ<szLD!{N!X9?l957Js6&RF=yYkaheX7XsoX z28~&koRKDkf5%%|m+4@v*MUr=FXurgPJJ^Qync)oZ0rW%gihDcq(I3G^|ZIQi_|7i zM^jd&RjqNIy-)c}r8qaTR>R|656$XO;Sloxg*zx3i-o?y3aQ{p1ivp!Kf%Rsvp~a4 z_84Uq`F`%f5F68h>7qjko~oboFm~VdM3em`UID$HPV#DXK61$IOa6v|aWORJb>e}G z7-i<6_J$hAoiu?M>5ne<La&I<1ks&FAf+Y*CR5$T1Mxz_vA6^#g}T`6a*?QkY4c}0 zRF%ZVpP!MnZ&yk1pBC5NxH3FE_rwgc_U9T~?q2)qIsZNcm%{Zgun2z~Ar2L?qCt`c zd_TwHXHnuA`gP{jap|&UU9F=;u@CCz^Y!rcUXNYx!75?z&r*|eaVtsewXGB<leBY_ zNJswHUlvvb0^rd^sj8)g@AkF)C}0G0AtmzLnV476k^^8@QSWc$f1jDs8~}v1TQ76z z##+zyg!o;5s%g@Y5UiyC7@6ut+xI3DUoOQ7qRHrS5G6m4>cvywfVDV}DM*1;PHlO$ z!mDyNjd%9IM)TcE>~N3frQauYRtkvTC*fguc#j@5b>E|%v^u;TXP0@~!z%GTGc4I> z=?a%xNnm>kc`4uvZ*H>{*-n(2tqfu^Ghd4K{r-gP@npy8d2>Rup%tCf)ekOfZZvq4 z7>@cg#de6tZEtPOb>S=CHqVYJoi-+zs$%p8?%8we_8(Fy^mOCiiUNG}?ms9KON}S) z^B?E+M*YRcN5C)k^pQ^kdBpDb?BSw>Lw;Ifgk!4fX|3UzMdqW%j;#;B&>`8g&!PPB zVG1_W{&^tE<vi{i%GbexcZT26baeek1?ebbAiE5!2lz)3dBU+@%G1$M*yOkb%`{}b zcdg`L%eXYM1y3mZ<0FxhcyzQ2Ow5v(R~0>I%(j!ex7{yHdH7M>aK`>6kkJl>r>mRz zJQ9kFQ4<K;OdN_zkp=sy%fT=8cP~x?bLtR8mU3sy0K+KD_})VaQ(lSJbmPyPE^HFL z(VrU?`STE)fU&r|=?4n=qm9vG-sTF7Q^$fCUEgnn&Qi^Cj##6?krszm%)+T3(*vZr zY_0~S&fEY@0vyS8$Dq7uBU6fi6b%T{S9Z?!>|+Ffo;OofxsqUn)N#*tdp)2qdMr;* zu<h_3nbN;bX43!s2O^Tn`9BcRg~=hNN&96oE&>=HS(}MAK{o2&*v8kG$rXKv<&Jyj zx{eHEJZz1U;8W!Q?8J#K`TgACKiTRA&YVI43+UgLo2?WxfA;$K_;UQgiV4gWK#|b{ zi&0M0i>OpfP#m}CK4zW-C*OmS>?PBdws#$VZLC4mu?`?|L=$eM$E+CrF0-)ss;e#a z_JTmG&l(V7Rh!+lhUXQ4yh?b!Ncf6yo*-W;{6TDy>XCLejNoJTxY2Xw^U@fhbKbV` zuL*H^=lL-4v9#au=;PXj36;h2aZ$X{-nRs>08h4p069Rub9UDOoq#d}e2E=CN5FLD z46#!pwx(9N>2V7h8aXBc9QmjlH;g$jDyO~UG*A1&ZIGG-bK>ARz5InAO2&PZPKx>A zVm=vi0+zEZx`IE+fXkLwLb|ZQhyX%puA5cnIzQm(*NERp5$p2g!m{Lt1qNz{IS}Cg zq@a=hXRJ~D_m97+{~{s-_@;d}S;eI!2eh@BB*hbB?X|uK6%nUhC-zIw>&S5HXO8A} z2j?frYg1l9%WAos?C%bYO;)w8wrftP<}4?vvfqk2l7#x}aM&>k{h!hOXW0o55^%wI zb!|&J-cXAW91LK7#f@`Zb~I6`?Tsk+=2#(|h*6JU?7OGxy-Vz!ei@GPC17{c`yku$ z!Y!)#QE1Ic70~=8MNcRpPwZuQX0TF;1`uo5;0|qc*`OVsjWZ@f9hGv;$oDu!i-*y& ze5%M|aZjT$)C58L3P%`lp_cAeFVh5Qo-uiWz~q6oA%E>L+frhD{EU;6vm*}esy6;W z@0B4Y$OumL`p%ItxvOG_Q!(36x9_;AdOO-HcLrToZT6j1S>vDlTL%h^xUs&2OIri3 zVa{kRzN>V^)&m*diyn*|W@<3pPe~2ateaBlA2{yoVoI>3UUKJn#&kzI7_gA~!}Y|n z@(A%M%2n3#C<;u`7BCVKhK_&{ohs`2ex|ixw?pf2+^9Hai)t|vu2<G0UJno3i0O1i zKsfuuov-Nr-@kRu@1TS{H(g{zw}Z4r1#sPd?cB?o;fdBn;yXL}@lRfokj;1>-_E&s zXA_N)u*E{vG$$DD?&D1xXAJ?zQK~`eNNMo@A75`77Du;q4F`AE;2zu|gS)%CySrO( zAKcv~cnAb{m*6geL4&))NABb2Iq&yx=9=!Ao~qr|wQH?f1zyV8{;e&p>6@li*@xAS z`R`iGfl3eNV5o|tzrnv$)%`&|-*HcFSllNV7JjTiAo3f(b(*|1Bbn6Uhl6*rR+hLK zZ;Pr+iq3n>J;=lT&QLjBK=;?2atn|1L6Oes9G^f>Pk;}SibWQaqd4{PNAM_CO&XYJ zJg~7PW<uTl4n6(DIvlq!nqC^%adPk^6IbP8=Xbss7-VuoD<rEFn$lm~D#JijT>eW| ze|OWsbQ)VsNPc11^WX5;p=9^u$xO;pYVUIt59n<*4c{OU=)!yD{(t#c|Ke&H68-W2 z6>JUqznF3VPWAfl*WJcKf9QLu*^Z+Hu`z<l;wwHdC=+Bd3liGd)Ozg3Zd*8z5Q99@ zAlM)e$oIforbAD`^o9x<7x(7LnA(h>r7qG#$4U9|p@n8xHWHyBn`w_g=fE2+@c9{2 z^g$3kF#Gx1>dY4wd%e$hVOKGEUJOPP7D^k}*W7?<@0+b`xD%<D+&;q_uMgrb=x?p; z#i;*A|LVkC9>CwD7Ls$D2`Z`eev<ofwz292y0xR0ZD7LPY+=#%2GtLIM!pL#aHyf@ z&+yxA1LP)O3@VRESXG0Rr3QG1KjtO}Hc~UtCv_ZrWPjT2{==dD!lY7XCG*iZrrOgk zz~TcfQRas{+FGU$;M1Bdo!BFlM#ug|M1!b=%BU&n5j*9~OSXlDpXp<KX;zQxl%9=@ zkYjF;yDekU-ZA1F2Tns(&YNk?Z*EvK<OBx}fDpfZxdwyrTtiYXsKl9!&ujOPQTxVT z0s?090^BaUVw(=-Lh{**y`gsTqYpGd=Tn2i<@Q)<*;4Ov^xp-VFx9wt%!YH^I-7e4 zdQ9w^okm#j+j9rs5w`@(#J&h6seMV=9jUVr1I6CykaXrC2_xK0yxX=Vbw0HBm+*xa ztnZ%kU$!0c{mZs@yf}!v+v>eo@1bf3RZ?<N&^U%jJx3jQ9TbjZ+wt*;t=EV%15HR= zni;8JYhA<1)iIUR^ftxQc#%z$_^dlzppEeEwbkf#MzY=idNcrZ8H9_1awW9({T7VC zEqQy8XMrqeW;b_P<&jKw-4pcF!GuKAg&hTCc$&K68S~gC#*BO?wj>ZnlsQ2CO`<h= zU;d*5eM$Rs1Wm9?ov$6&WrNFbB0YBM2FiI>8h>_z!B>8NI`#d-^)rc8f$r$qfP+H- zbx8OiA=rK_kiOnkbanl`rwZXuPnAI<7}^|ZwP3F&zB_@QZ`t+ANinYSsu9u_3Au+B z<>+-Fga1h%!~M|)X+--2oBj#GevAJ@7h>+rK;I3%FCwpjWLm7@#nu+U1J5dBpD5rL z?p{$9^fo7se(N)t5E`%5aeo2^-xnaZ1ervzD&$YX{i+#dRSMZW0xssc<q*A_Z#L1o zH$6A_uwC6}53?ys9m<N3D9t&J?-99uVRCk<RwvLcG~<3L3a#DEm4vws3L!y$@sGQb z=b?i4!CAFoegB+)l(iO0kB=}i_BqAH&)I1IF~`Pt^zIL(Q;5V+i*})+o8#^U|MY8i zQ_)4e!}c-HTP%LpwJd7nZM=039*msnua@ZWm7j$F$wYfWji{~Ue-eBDBc7L7&--_8 z;1VO^b0s<bN}0jSshbf@0T0-sj}NT}wjVq7&e|kKQI^{~w6#Gjc<$k*1Vq{Z2&04T z23#}uk-aw!@Aj>?tmRH52Bt+o-wlsWMe^AmabR3B>rw%o;K?Yw=+a3#zn_OtPRA>@ z5Ss0&K=ey^TSBWb$Eb@s=us~C{^gW2FeZEui}<Y;TFmR>%O3(7=i_*u*+fuZPd z)^}|ThC<sw=NsWtSNJQIXPXLvs2)dJa!v#?mr<oGjM%NFS-_f^5Tq9LYH7M!ZJD=D z3rTwSYx5mx6tr~`l{)nPl{U4$uURlk-a~&Mk3D}zM;GkG%X6~YTf;=GhO#ren2p%% zEB17v$same#~$$8`Xm(x2+;7v9@fhqK~>_arNy}YEvmk-h*$!tXW><G4x!VP>)NY) zBI=7@G2vMbUM86SW=4^vw07Kf47zI5ZGq9faC5EiA-tbnu8vj?*s<81G3j~2R~!T_ zPV7VtYJ_Nlu!5bE{*w1?f87$ABj(rXS6w>i+7T#d-~DWJx|`xk_viE3&A|&?!UlxT zTQxBDV#`h87s1s`ThoMnJ(LQ5karI4h@qj#jg623+9u-!KyXa#g9KKo)KT=s->tmx zgac;|FL)bD)4b)cxbA>MH4_zfXGm>>2e8hIIRBO9-6%_NyPH?l{+jcL7rmv6bm)=D zY242-hR(<%@Dl)EWN_IhRb&zI&Lz{_R7in1Ul5W2@#MA|wHFO2R?D;->Z!koq1BL# zp1@>&N$B}@B)Fd$dG)LdDT7V3EWeaK&=pb7Go>jSF;Vzd)keVeZtY9<wlu|weThc} z0eff8Z$wUieZW5%ZBr@l6zjb5_1bNhXhj{_g&{Oqewaa+Hm7^TZ%GD_skH`y$&pt8 zp4^DaZOFP<S@$byc|T8ri9Vu|Fp<1KnaYL)0vuB6`4emmZk;U0;^iX6Va8ffGkb8d z^w;ix^0&_6(uiyrtH0PcLh&HCRqeBvYpO)Imy;fQ)h4t$A$yUro!8%R^^?bxAI|K9 zMyt78i^9bDLT8^)3cO@h4JFHR{0IVDWo+`Txr0<z$ZV-)u+75Zkaz?Hze$a&Ja|eP zbrr&ovAP=KFHM+WOj%1AVQ%{^q}D4nU(&G(#jNpjgiRYIrMVS<^IrWsbFDCsH&zfy zOU+_d-Gh!HF(M60&IhG!mcBE3;Ib8cr&JW-kc@$SFa|oCZ$9MKNPpl0{BoNXe{x59 zn|x+?zm1J?g!m(3i)ra)RpdZJl<!V)VxDgGS4NMmUp?v;8!mH%Lh`@{+OcS{eiaXZ zr<Cz0XmgE4V=vYeo9Z7E4ciUhsY{++=I>lu(f=^!GQ@ve%<*dtLQk{cg$Bh~E-@4V z>ffkWs!UHtm+gn6MekLfIN3RA3<bD(qk5PLYieW#ZP6!K5kUm^qRw+dK;B&jfl1Nb zv|<&#rtRx`b#IWtw9lm@%w^LKSu;HX5)8zd=0$iCRfi-$(;#3)t;Us$@>luTj2}j{ zMU9zSoSV)ln%rq_NDi%Pc$8(?w5G#n?;+daa_ztsS1kEct{8QdV&ASlC79^NDsiG% z`Nw0pVVOvD=cJUEz9;#@#lwb>@URm7&T1WMUp&-i>k`*Z%<YDr8RBzz7ACK32<dH% zc)d=7F_)VuWvr%m#v;|ClC^ev1K!H{q*1W#YM~U<U{j{(bq*kiT>djlOdwVL2Oae? zqn$Y=0>{>v#MF$U*vkZ6uRj^%kGg+n%IVs(6cDgaHUNJ?e#|8(YB~QerW|snOj60I z!rKM=T-Ou3KiU)Z>;5ZJ1Wqa8`u)I-&V{E7R;NU2yN*h)q4B8M7VEFLJNqFJgM29C zz(qAquDIUW+xCNt%|#23btqxOLV@`6Z#tCi3qSFtE8=dtpKCx-If`LZc<K(Evko8p zbxYI=mS4?z9pG_EWOob19WmiY5yCj199!RB_<r>Lmgxgek4PFcNiIzS&)Ls|M}ETc zyo_}qxm#0NdYy8}5u&+Yad`XkbyohDi^fazFKc0WbB*jKw>!}1xK|8yYzhS5YLj)( zv(P+Hw7^T&`@+aMyGReu_?sr7xdO{{aPx)@yf!KQXJiK=8Q2MeO&a#N$-o3@BWk8^ z0O(X=V(FhAlLI(cu|B(lZn_|(H<0@$TYUl2OrO!o8)5b|Cuv5$COCWkZK%O<otF0W zhXJv>ux1K9Q#hQI^jVDEsa=wk$FlkbXhiM?#b$pFXF+VGYLntKNi2e?t0~#Iw0*8v zT~SM^o(0Bw<53Zeh_sq=^ej5I{8{;euhj@A!733_qy43FVnIQu#n=&)0_v?XWK|Sm z=gA3FseR_<<i<)Zl}mo{@xfHEd71_xs>+SB=o9}g=O<+5_1#7>OCic|6|l1E!(t34 z;q1@CSUZ8*@1iJ?gH9M$?r1dk3zLiB;$mw`+_Iw2bitkX@^6ZW*eMC_4T(7v0*Xnc zf1}rN!KEtjV37Vx$&gOvA4-OyRWf3u7z##u473?!ORRyplR}z>g%IUh*(1n3aWDf` z!Ccs%G4#Jm(9i@;_+QP5N4@KUa?luBG$k1Gk%4c`BIk^0DgnWjAr+8N3M)z=^mZh4 z(&B?E6L(0I>+0G)N5gpe*=v%kd3;faO@=jcudLIG*kw?V80K8vZhM)x@>{b*V{IC; zgU;s&-|N|<SH|?aN608lM3{Ei>O%~u&4gUc9EUoa<R%B*qIQrpL4C}k2;|y&@6)Tv zLwvq-Vtc86UKWPdSpJ1JECtHktCR4H0gTkI>P1sH-=EJR<nkg>>AjP?Zm~<j8o6=C zpQ#q-LTli#8ZROvZe&pJDGl_`=a?p4N1EKe=x+8av)wgF^Tb&SR55ZX9ej543N5Ff zkWd3!1|?^r%J{F3G&lZA)T^;&&e;9!L$3@X4|#1Tp(GIL=s3Wyhcyd0DP^_ToDk_t z!a<0P%PDez*IS0wP1GYT0AW?~Q&z-aV_)99cg0OD%>~1S%uc>H2*|&a6SKYglO1%b zL>iq-ktO7fn&=989sI4J3x_-A1@kO<sF>Ik@OS%!{}vm5!72_N>L%ZOin`Mxr@KOj zLPz+R3!5ea;|KonZtcQ`_iYOLKr*n+VUxubMb<d##9j@lXG+8*;?@58=BAJNqu5nD zW~NQ6xf&+IJAW=(>;J`{^Huyie~x#k-<lQv;^xLpWeqweCenrY>K?Y^voLS)dQ|-@ zzxQp4k@L3;yb1T^lbEr8=mBD2je-aA;ZvGPvF}HUuqTB}m_JT6?BWBicltEtqJH^H zFK%vb#PQ2PH?3b`t>x|5k+Q#mSQLbd@?Aa(N{A=4A#!dapC;mmhuZ@c6kQGoL=Q_? zl9Mt9df51rv(C<eKD$G1*&rlf6~g>`3)=}V2nib|u13n=wlBd^9{r*HSBxcGlGnAQ z3;?YFLr-KNIi{u6yY3j{Eu@t|`6rdaue(oHJmU@QpWer}8&XDzIZ@G|%JNyl16cM8 z;QBS*mF-L~Y>Pz3H(Uvg7yeDz4zI!i=lL}>W7_=y_4m`jWUFzXIOfn{yx?e$lnsUY zqA7;ByDNupgh&m<;P0Xlm~RkzvJcXP>kaHmBXutOR%Io|pME!037cypN0GHn$-2_t z9@3#P=EX5?wl-X*Ki1v7@c(A`7nd&X2Jag;NUDt*?vE5;;Khb{L;2w?coG|t3U-tw zEAn5=t<nyDZ2a1Cq3!E_?*ab2cRBc@gEETCWO|7A$yiopsF`cl4c0LQG{t9F7$ceR zFwokQzf4iaIygs<U@fap$#H!J&Yv2;wEq}|P7%`b-RAm@Y_K<KJWO-d@(8V2I5cJE zxT{ReX;7aHy&Nei2&47rGH14e)1#uk>s8-MdWoRvQ7-pui&B*0s`hElsV*}^qZyln zhPIK2L<4$KjCfC5Vn4(*o&MQ_gK7&j$C$1SG+I3L+~UuKz5=XHOxq8`ZX=gImH>sF zlsILJ3(OHHxW>uS=UA)v)6qjAh~F86N-!d`MBGq|2dE-E*n{4WW}FO~|4?XCAx53+ z@#OUqk_ou<!%*P)sgzbRK6WSPd()fq;_o0X_0dMcIS6@V&YT-P9S#{aMbM8q1%~hB zLqi;Li^m74JDxATgvC%YdujYJYbotFq$@c$1;%_W_fwz9!q;Be8^q+a@PJK>6n+Fu z{OY*7zo9I$Xf`LKZ&ZiN1>b}RqapUcfCLS;&_fzHfFf=9Q!-{pb0m%@E3UXJK#*b? zU?j~>M>fZjXk1K88Bf}6f*rf~HD=`){4&%Y|J3~yb^D`)(>2d&)5>SU(WLhly6#?5 zNBcCiQq0Un_%yuO+8mtI-l1b^O+D&P^@LG&dO{DrOEKKuz68DRaA~v8D3varCoSHE zX!9`Ym9q&SM-G<XAZvUNaJHL`ZLhnC1)j&NPdy%ea>>WGjg^#+{bfeA3iOzN&DZKh z59t%533p2GKddQB)(|GyTH5<zzl#{q6Qsh_ecf`IYHAP3I`ti;gLW!gGU#;r^eXId z=H-p^`dvO$U^9S_h}e~IVgC^;rH9f(Ak@Uerx0*EXZPdkB1v&tS5p<+r*|obgj|ee zi(qzSlvfcr)aA}cqr<RtbJceKV8DekUetH;m-^niv(gR%3z5qwi+7d1MiYup&_y{X zr%n+(=^$}?f|@AAX@We7{a=Y1&>~zJEv`6|guTipoHbmqEvZR_i%!7Lx+7_iNb_q+ z7xB_OU%47UNEQU~a~u`jY)uK$F3d&^URzaHJ^d|nmRM$W9>5mgT?|?ia@$?DK>u(< z_d<#)zRM}kp%JHAsS!a|F?-un<iACNsOp&k*hgAI>(AB3-^^FwO~N@d<&^D$z}H@? z?JzBJq6}{*O^w(dVGpc?m&Lx;ZjJBuh&D^0(fa~~zJBXPdS{vim0aLfL;9#EOR>zb z0cDk``v+8n`8Fu}<BDHpMnT!#Vpfm?4J&bJmxeQpvba{O<BY^&b!>VBxDAbOZ^wQx zzL-NdZ+G%#{=cDafP$EC%xciKQFK4Hu)7JL_QOv4fj0gC_iVsT-rh68Y7ZsuHU(9^ z35*Bx4@Fx<Nmo^&jyva>^^>=W)0-xr87bKG2j5e7clW)CtTTDPr#+;|>*?7wOBHvB z3<DB=v1dLkSJT|-Jtpsg+>MGCGJqr|ko!tmZ#f1|=|VC`KVnCSaAkE>NzWfWrFzmS zB`ii-pXfI<NCi0$kCmqA$H_3JE=w3IZ&4RS2g_l)4sKj}grLn+NuSg>v9hQ-Z~I;5 zhfp^)BYmRPN!UgNf%@uMcgx>tx>nyKv|EaadNXtMKMN+=RbVt9k?%OBdgaZS+!|59 zX0&`vT?&55p{C=0zYW<!y?cier*@nc8T*HbHms_(+9ZTpAZLh7M@diCFNs~eMUna( zAzOM@5(0*N6wZ3HUO%$#Cfbdu?k_t}%`Q<OQrqGHLtTG3*dLZ0LimZsB8z;ms<?Ce zjY@zmB_tlARB~)(lxIuvN#`?WlMrsXK@(b2j`ablkt440_93XBM#Y?H8@Bq=FQ;}8 z;Bd|Y+Nsw={ARDY0_0*-STx$(9b*wQPHLR0VEG(Bqg$t*nGX$F-$KZyWOBA<q^Z0T z63GH5`7?3|j+>s9DyuPw#!AgAR<ir6du4H4gGKbF6C?n<C_?afu?O`z*buP<VvNaF zaQjxX+~+yJf#(;{s)lO2a@FCx<HEWxZdP6wu|u<_7!2N{WL4!G<kvH=$nE9YPxNqd zxvEWq&ik&Eo+bzwiZbllmg6CUJkCjxC@TKF_l`=C)udvW3XFoh6_a1OO|`pL;PvDp zaqkE}-EIqZ<SsP2igZOKv77rG@m{QnYR_tiO$@0EF&8N`C4F|N|7pp-Z$iI6m`Hx# z*q<9-ur@N$hc$f-&>tQn826$cm?HccWr|ZsmMnGA9b45s9#`g7iz{*1E^ppxH2HIO z-oi#<RMfrGx-X*bAq;l_<n#HCd~~0abJ_b$?UAv)%y+Q3?)Ja}ag2QU;EO)ypm>RC z;bULGuM(z`b}Id*5MI-0yDzlm`6R$JdUMl3#VG&eG#0SN7PKV{CG;Ww&>ML%1W~D< z8YD^Z*Aq!nk_VrsdSZr93j55#Mu-3!@Z9m^(!k@HWqXHuFG2kPffPx7)X?Dti!iWA z;rAKr*p`>w+5JfzK$|>Xftp#Vf{m1%ol;ZVIkm&&sf)$ONVCP+g`4`_uy9g3nSd8K z+lNME(5F%|F7fDtA5Pm2!a7*|8-6oo1B4Up6oc!aqMZ&phW6Ug6gC%5Di$QyhIu^$ zwb<4b^$@x2Ac8W#=hLxW;{2)_+Mi>7t4f(^$^<DxY&Xo;FH%+xMcGYUR7bKr^;dml zu8>edMQ3G%m^Dw19)8goi49+$JSyosFlEGUpCm<rbqBD@muXG<tun;;GIZj2VB_W< zYXesVr;mE~4SrG&Z9@_xOFIgA>Pz^9_QV?tGf*Z#>;x&$@G%f9cGpgFBwAeCx$*v@ zw0hou>#)M!a~Aq!BT%S!&C<|>i7o}f0z+b??R*}0pMjqdKr9^p)XD;B%qq3EUjk|I zaXWQrUadME6DxWodXKb2MWK{ciq`g6Xj$scMM}mPKd$mS{LPE2{lE`VR+w3!?F?R@ zAseAN{XFTJr@MiB7JW+^c{dtB4mO0JW*H9k;5oFF=?JwGxYE`K=3E$}>P8T^V-WYU z+!ApB2)x8z1W5|q5Kq`I)Qm<Sob_U2WtIKNRiG(5B1o!s8fy{=hB2se_m;#a5glp_ z-p%3t`N-%Mn=zdiH<D%xVDar3yrXbozB)t-+hcFipu7^HDr4bMaN%?z7;Ehtz%w1b z;-+&N;5Vq|oA^je*T&V<_I2MYsCJL@)VUdnc*4Ud>rC^KXY6GV-Gh8ES{_{#@3_rJ z&4b4J$$VB600Rez@aBX~fD4KoDK?wd2%KT$2pt}}0G<Gfhwgi(+~GOwVfZMWcz2}1 z;nimZ^>}W5UB*M}R2~e+nqbQhKeXtcNLld|(CCyV%nZp}o#3G!h7Trwc>?IfOEOv! zU{D`S3*YXK=eWmLQ`J%luQl0za^rj_Wokncje%Km!uhJXQ@RerQeaTnfQD<-Bem#; z;*gsYLpC{eBR533@6GU5D^=XU4G2^6m;t546Fvb9-@&*WYj&p4B#D#z`h(*V3oUJ| z6e;aQ)b+!6?r+WXiH^bu$d6kR?`lGj2b8oKfAS`s{IsNkweR=I%c<Mp9m%O1Lhsus z(oofqU}N%m6$eeSO{ydFHmg+Lnc{0o_}!5#(-FI_hU*;0HYzB!9LRX0jKG?V3^rsV zpp-tEQ{emY+k#SgJ1h;NM$Jf%kCj+C53L%`<cLqRqcIDu?L?Yc&=N-ALiCudY4K56 z0@<0^()Y{-v{%x<s7vJ?is7p+GtIH7NKGl2*yHD*kT4z}66bDHd*MVqBBdr+?DO~* z`-bU!=5?`ob6xVH=~?ENY4+G^JPPtFx3WJ7p#q>zxXlB+^NnG30^9)Zl^9YjXz9F^ z_$-YORbSgjTl+@BdD|Ee1G>?E!N$;n3&ZPVP01@Yzt6i&jL{5Dy;SDTo%8qos3tC# zp#}L}KcmcLq9Q;LozD>)`l}81;T3;5imA!>osjelNh$_|%mc68bQ-v>i?NH~=e#Ws z*Y2EUvt5g#_8;TEGAcpSIdNXOv)apel?wArH2C+%u}q&_>dp_K!cy5eiQd<%nF}X= zp?$~bzFS|e11d_VmQO3gcm(gcxjjY_9~>L&_k*uYLmJ_k9Xk>aZRd&SAF*Dt(V^qA zxN*E#z;JP4OI4&s2$W@!u`y?i48XjTPgY`S^*%+#agh0VgQspf!nq$;iCS;@QYfzN zk%!A-m{2+;FM`>*qo=1gRyIu9kx@FWQJJG$#{%@z<i#&coJI=4X9R1+#{@ql&M3!Y zu7%n06wiuUNs}ZdAUnEzS3DW0k8<yy4Kmse;(}$WMnl2DOUsOzEB}za(uM((X|1%L z5jK9Vs>{BJGBnzXnv)ZG4a*VZ8f6_yt!OFs(-2vhd`1xvI<9aa%$(cwDQf5_o-8W4 z3m}%TCE+W}nae#ba!6*P%;M7irIHZ~9lg<#fiJMq-pnkGx@A63Im{@4P22TQGD31_ zJHwh)&bm1GW(IAd6Mkl8lSqTxXu}oU(^Z?baCpfei)`ylhKiZSgGXhEJTErmu-E~~ zG8ea2xc3V9i3E(x^v9qb$!}|q^{Q|z8Gz1-F_(2k#Uacl!VKYQlil6RaW)LHge!!h zxft9=-0#D~@?!K^7AxhAW1SviZfaWkWCGXw?iKmeOd9W_Y%UdRn+TR4DZO)@IIlo$ z?!U(aJ$4iQ%BY-2N9S!CZ1AI1<yr<NtJowiBoWI_qumoUCtd+Vi75399kH9yx4SL6 z@GGo@VV?vzy=KFGXx%=oNIrblmANTz4sI-Mof6*^Cx?@X|CnG7bK-<AN)X{a4Ly&R z9^g+TA1_60M;qHB+ZQ<~U^UK>aDyw+qj~tP>6nloIUlf&+-46@awTRyZf`HYI&F#1 zwd`9WvS=Fn3YYR7oKRMhvto98YjGuN&t7Fcp>XuoBTcP<%>sQ}1w?JnByDwSuJug2 zqh&=*IffYb*F6IO{|y0M+>Wons&q#lk4_avC&^rfgJN-2hpdc4EQ(~sDK~5oi9<x# zKeTH--eri6Tx}2?JCG|ULH!PX7g?_ZGf%%u;&q|p`_~NJF1S`{ci>iOm};w`$Jz3I z;%eqi;)>{c{)YSQG(BpS(>Jn8?rjjLjkTxm&%l^T5FF><h#Hr5O#bavo!i2Yeb1yb zYc`X_vGc(1`=ADyOT2q6_0Uv?9*gMo^Hip~R&;%=*^vf+?G^7PbFE61FV~ar_uIxj zGadB(=N*ycag5}jc9Q<0ZAZa}5bloF*bO5)Y8e_)bfcT0z9W-sxO=b1;|zf~*=0Mj zB@m{fettA+h6Ggm-x&47bI;rpm^DMg_}&I<BJf$5=n!O5Eg~;g#ypI!<VW1`5ERiR zWT~IZgyi9MteUl(KwO{R(;BW66Um#v7g%<AA$?Xt(a&5cT*i=KIY@rCz8E={tEsM~ zC&$1j?zsi|{ElN1_phIfyw%wgof{4$iALN$s};yLa@h9w)JEsiWQ&4tzXOake2Z># zpsbu-stGPa<Q&Uxs3Z_tR;Ez+@f5yg#emceK)YM}N~1SUv;*P^nZsDfpZ6l!WQ!)G ziBZk%PDE;%lAC?uXaXXdtKU1NY*r?7u|$*oGyaxSMLMH;HBsYj*bJC+a50McK!WPT zv{-MDrFI?u)6<mQ-FRjhdfrAc8s9I&%-|9=V1b=HFmt>bpuG~&e(l*nlP)5lq6_+9 z9hVvfv$#}xJ1H>Z<yDD4dY%w)CM|u86qf6GI&cxiDLNe(pW)>-TwI0J;Tq&DLA@=v zx{CYx@=Q-kPc1dA<@$6LnAkq9nyd#iT#O>spF@_lDl9;lF2*o6*F4Q^aey;HRxahU z_?vgj_O+LEQNH4pTiwV8+MWOIeo2gN9e|M%P-f08Ju0?9I-1F1WzI{r_bK1nAegIu zox@DK^}2q>lxOa=U_5rlqoCc-i#9EhyH<ml^P#e4hB2LyFxJAA#45{`L>?j|Y?wk$ zUQYw(=Jj^cZ(VT-TCOiuz^^zf`{%fPy??<+pH6zV*cQxuR;$9~e`o=a0H50ceD@Jh z=x^Dpq1U!Q-1;(u+a2z`MnLpGp`xd!#h5q-^Vq#VY3}juB@^z3*MWX~g}_@glDwLN zCZs`vobj!iJcLL<&rP{gGG}~9`IBJfyeC+P<{qd#f|KolWTU!Gx>?Uj(I-vRT?_tf zxly3i=cVWz)!z!|YYt3(GI0#Oz4ItW1(CJ)5NwjTzDuqWVQt(?HL6M-!|3KmPJ7*Z z6_t<yo^JRH0*$axY3o36?>VJwF#ajsFJo*~ytG?hKZzX%lLDDQ7x??AT^>63)vu>^ z?Pey#8N2*5S1dMgyL*ib>CXHfSB_LF7xQ=q`g?}E%5Y()Uh1p@jeEQHlclyBUmf*7 zneSV58tIp5J~-b#Sf5x;jOi`sT$z(jULjFlLGHR_>0iVj-J34NRiKe%l73J5{$p<x z@ApJoT`BjfFKu9UnQ)7@E&kr91G0(6Rot%8ZC0%~x-r+|gwe6}YdyfcEAV(T<K@`8 zv$=ycAV6SwwyJhWAy;R=!qYwvs-Gf=^C`)OQch9_EQljA5wNf{$uE=@xQlRr`It$* zq<y?1`y~-DnamdoIa9!S4K>dkaf-Zn>%>>m#6L?yPlg%j4}I-Av%MfR8#!=QCL&8F z%-%?SB9uj)U0;gr=L#!GUy+6febADoO^=)`+w5$X<a3%?=~B*{Qx^dXnRs83!R&s< ze$5y(wZ3Bab?%V=5!bVKqat;K=Bt1m(HN(%xnEY=Gf&d~5)ON@djX<|!b3*xL;lI| z;{5cu%qzn^f7qvNEqe=no)qRpIvlH|afaex()n__jbH~GTh%eG3Jhnb!)s4iLbaua zt71`S(YM_PHEl*NPO~8@GLlWk9p{T(7X>?J$WR%JDT#S(-^XPoOUvWw_#Z9R!5QJq zJd{r3PRnYqdNB;X<LzTtc0jJ@uS}PC&`5H;sk+J0`AtdprXJ)$jTC@s6hYXr?oc+2 ziuK%LcO8yrV{Ro}=%4b9o*yKB9gF8T^j1nH*B`i7WoLaEJmUn-D@fBr{T!BUx^IyH z1Ml@5*GZJ;=8&UacI$?@jmo*gwA??R2|~Q)JR7Rn#@>h35A827)CV&TK4iWrtX*5t zC+c`uqMoqwYaL8W<EqoxejgNAD?9S6NW<{+Le`|B&~5E}NN?BX_tySy%NnafICHa9 z1`7<^Ad>OV@J%Eop^2+DPw#b?Mi6fx@(gkzp{D<K9HHdobCbrNN4rKs1)&R|E%VH- z7U=K((|<hUrRi?ZktK)*NY_=ye8uKYS%K_PgNjQs5#g<YV%wYCUmtn8BR4@P(P{_H zUEh+CyBq+<A)$^wM4+*(7T%=3*lTBYI8lFn@cV$-j?n!D%e*e{SWZiTDg#5i*7UAo z`BQtk)M$#_X-fuhO)VFQg|E;!oJ$TD^pj#}!z!!H<9A>0JtxzH2i4D3Cd+sZm;qex z(Vw$y4~a{I@wH!zGSV0<igwfJHZvCGDR*{8#mv_|h{e}tDkR7AVyz(BhR5TI`70yG zu%UXaMPS@dt0<gno;)`@Nxl42Qe}Wl%k`14!_5dSy1ox<Y@Fh^{+5X!MYVD5*cscL zrMER_y(Z%Z@OAFfxzhGm30&?q40bpW@iIxgH+SanAgvy!=jGf4F@j>8w4FGY7ag8h z4DU<6E59!Qb+Wag_vG3UGA!(a)!FHaId*B>_?qava#Z!IbogMNN+lKM$>TWYZ|~}# zM8FMS+vL4Qem&6G7y+-5CAh(~*t<*7NS7ryVoEmp-E!(37IJH>p4jKcTI9AvDkxxY z!|T8KM+6xTzMNm&&_EZ-#vlYsd~{qr)~>8nl7`lxYh6b{mfl{P+3^Q{kofW*Eq}pM zi{wKX*a-v$(Ik|g8JBVtho*E^BXP*#u@e9|$+SO@dV=bc$@0y^ler0y_tVv-2!`07 z{SnEh0^lX^2aQI5n9{cn>wl}OErB*@VR>N<lj+w2!Dg?+-pknVDN})f<iEhd_=#P> zqSAzFSgsRc<NUeN{$%mVVOI@g%u7nqCq)gx7p~xJ&R#A?=fg&HGA*?g&=Q%v5-R9J zY*4Sse_f{Id)3GuHNTHP3YnQrj1!L&vnilfBt2_~_uiF!D%zpzKDEi~a0C!C!P96W zBSp{#`MifHnD4vUTs|XCLduCL<nJnZmXBN=8{6nJq{jz<fFID>fz2*~ZRGf#Z$W}O zKVM^aomVojH*g94e!W-F42w>BMhDzfD1=3@)VZtizdVo9ZVrx!DsmJ}FiD8N4TSda zLnkMJ-rWfRCjk4)pv>B^h%-GA!K@iHk>nyl0z|>Ei0&R!LM=_DLO)165j&|S(Iq|* zK5Y&V-?@<d{WL*juo4%1M%Yvl<<}OUC&)`HFT{Vk=ik2kkGKBgEkFeISMM*j9Wf_P zu76y?|2gQN=X5*%IeIJqGq}}DFgRM(g>8q3R5qHS9K}Zh%phjFx@&~(GLjg~$!x~I zFO7fuF~>b}R2Go)+RHD$A5F}lai(!aX_6QTA^&kjWm@T^6pq+~EPt)~s2S>L%!rtn z_gM|m$7WT6#pV<-sCG<RPBDx-B&N^99ZW;V_k8bP@92$sPVdIc#~T}|3t^1T!ni~n z?1xnDFdd7o;G|h+2`;=!d;WTg_t}d!5=3=a7u?5eqXb6A;0o<{f5k@)3Qy5Q-6Hy5 zRx%VPq2)xIE<l^Id6^J0xy@|3hsLCW7L>R>fRK`cdpQBLzwi-Qek?@JaN>S_9>AxL z!8~6l)&Kz)k)N852OsVSy52(Iuq*96y~IfM=|63R@3N<Rzj_TLY7`mO5&Br~R9*R` zWl(Wp%w8EA$s+d*8KjM^yxsvHnT-*k((5ibC_*4k@a@H>yO5EBaTP}YY^Tj2Cs~Xf z2}&nNM7*VG6SsSrm(CgV1NM2!?p!v^=ve6ZdeJx3ZWuTn9+1@&>R7q4!QuI|AGym* zez>K$*{e`Tf;cbgh_AOioj&^Y%=HN{B6&r=!cM`8rVwkg+FEk`ZT<a+_kSIW7*2T( zCLcy|2=r%;fZaaV_&`(YyoDSQdG+z@Zsl}IZRf)o9}SWMX6Roh+Kv)5Uhq=+&NY0% ze}k6Jk8qfQ>c3aGHv0$>$Sq-x&M)N0^BCcScxX``bWz9Q^J}@n)>o|3vr<A3%G|bR zAtr8jxnn)7XP=aLR3QfF6U;B}-+Z8^Z}98(%N(fX2g#lPRDPqoxhN5_8#B^b{LsN; z#eY0CWhi?VQNu29q!`|Ha`!7_g|^RWY1ZdMIrwSObP`g!wg<%GnU*C@R@W1j+(1j8 zN_SUM0Pncy6bd9nVkydzFBM3P96#Wet^KJi|NTb%H$!wUNeB)r75$!oFV;(dW?!x4 za`Wb65czt3lob#ZT%cWS%FtcyQQaRxX>&0)aQ5rMj&K7@v4hxS(jcme9&C441j7?v zn5u!59CdMDdbJtuZT-4(SVen@k^&Lf^JUDf(YYx!!gX8{Ii&s@JP)vmPT|08d=Lbq zh^G>f-G7m;I~~zScuIjO4Lf8svJI|k|AcAQN7GdaE1{tu)nEz+!6D*ffXa%Ri5Doi zu2?c6Jvs*ZbL;hq{d%uxd~NOOF)(-xV@4Qi;L#u*f$IQZ%0?6_xPA9LGsr6l<(?_R zlAGG_XHa&bBHtT>XOYbXVi+xd5Xy=uMg@D};IMR=4Wx?%(U6mpp<R_0lW_7XVus<v zJSnLtMZK6U2r*JRuu_$Yk;cc04T7=fafjwe9OVp;su6f`2c~-ofvJ`}In4>+?<+*4 zT#5>0<ld)d<vI#y!~9!x_@}i4x5)B^i8Jg_m17h+c(TFBr)U*6BSi*a6h&=j3iS*? zU%$ZJZx<X&W^sWniQ8Ds%)RtU92IPMvgsrH5WIQpKSW^Sgu9s*8nNipX9eXYQJrlA z1g_b(8V<BC;&@WECO)IaT5RgaWgrFgl_t43zR9um6E-~FVtC$+v|Vi1aN@F^_6BTd z##+k7o0c-)As;VwMwMHk7F!J%oVDRHVZ&q`e8cL*FC$@EP5ubN_$9$(6o;jzSQq?7 z9V09<i8cOxlB;0=l_bv8ta7wNXN6!I16t@S`BP;=CpD54MxxU_{#{!zUs80R1OGED z4&|ee+8bO=%eB%OWN-0EmRx3gB#SlfwYgd?=NxZ6c$u~AZW-WXR{+!nLx6<X3H^>P z2ZZb#oolY(fWxVTni5@1q>bZ7t@?Bu9C{w<752E#m3UN1U|uOwnZGZTe2!zeLoNc< z6Z=l41&h@{2`rKYmLqCwk&e?&WZ9HeY8mQgOKm6ko5x~4#r0FV6UY}bihizOyK}7M zk|t7Q&SdcwiYwYe@(}6d;NF)Ux&6E~MIzL-3hqbTdkjW%JXn`!Vk=5(qd;^USC}d# z%jE~SYY>P>$H!!Zev5~Hl-8I=f*d5L8+00rwBZK2rmV%0W1zhjTj=a=MOP#OPA}05 z+3MSw@h>P~Pi<^^Ml#i}D}v)QdC)QnD_}_c25rZONrdVOVARx*4hRqhZN-rpGZPMg zRb!53uFt5bxL@wGtu$qC6Q5yP6*s4Vx&9CYO70nOC_Df8sQdd<ERd8$kgmqwr`k}5 ztSM;X@Njy&s0U0NgYA<g8X8vM^5>2)xw~u>1~^BL6Ix+Cm%QSXuhtSaehk)Gzo(X# zLKZp=Ma2h~vm8k94z186wH%p<J_$K4Zt1<xj)%$|)?K@bCMM4csZu<gT3!fSX!2*# z@e9b3tgWvHS~eGc(<v}ilF~OuK4yZ9OrY31b`Te9{#H)mH>kQpB_UXJBy1-Kq3r_| zGDu<adTfdSRm=MlqEZY0nlKG}MOz?e3WB6a{FTE+$`~nY?r8-SnGXys)xQ2dC$u;N zn*$7K*{YukS($+oqfX)RTv$&R4Kg$tv1iv{7s1MnK9*P%nps{D+MI^g3pdrBEw@QK zNT_SCEx`)rJ3Y#hv%>Uwad<>9UvDBPC{ShM_aSzZ&_+%7pqcb}@In{J(xZOvBS-bS z$zySt_l0!L7M$%QyZ(N=dhD1QhjDj3l<qr?2zf|5RcC_F?L&rE@5->pcO|eFb3m&w zM8$gN3@Oh8zTob>qV*90aY}>ExafNm5k^`7%6mbY7k@Rn893#h9tjeU?_u7dP{LU; zh*QQ11}4|PFA+_|{;D8M+AOs1;az<jDl=cAwow~$==0ST2)|J!L{TI8<^}kVUz>e{ zX2Zz|FLtUJMy^yVtv-T!7a@e|iWj_QPd1{<*s0^*M8;Ha{d)%eUy**24^rNLI_wqj zEdz!_zCA!1k~DucVq8lLorHE~=SHTx8ig-r;me0&S*<V8mV|KgQtfZ%ECUJsFy7h% z(3FFP{&#s!BYaG&Uq-IQvd)iuG_-rk>;sb6qg}GcKQrSsUJm*Qw89@Xxkg>&6<+z; zkCV*;S)h~EY`d!$ZND&k;&cLh1)j$?dv2QBjSCQzOO$_`URkq5im_{lJR%&_I5>Ni zua0c@;UXT2+kMpvZbCy~%9ZXtwG=H_IYBnK^Zl)~z7%{NgW8`Mq@ETL`Lx8CSKifI z8gSf0KGxuL`Au%=uzcc}HNnmhqcXPxPOX##H1A+IeZnOVuPt6bd{X{$;zqqZO*JU* zXN1x)!-|GRDyY$n2D4~ieD@vtivI^nrplSoCaCFbOzVgJSg3|SNO=Y}7YvbL@b$={ z$r60A>IKJK-xW;R8L6Dzij=K$-pOg|B;aFPp3_8J86e0Vso`gIXr&!aXNMhwH*S&Z z)W-dyfym4?enRSVqFC?>24U^!5V;GaI2afsViQzGtll^p?Rw7fm<6WZVRR}SW#}f6 z82ZMu)iyesO#kZWZ(U^WnAG<Laz(+Qi#Io=V}S)3o#1o$wK7>676mPQ*8VZb<^_E% zI_i;#V)_>*krd*>*wL}Kh(xtH?>q>BN2u;e`TW!Wed7Pw+Wg`JuQz}ZIY$X%Nk*pc zssoE$H7PhHodtJ?SwlkK64iBks!m00%|bD`y1E0|ed|unwUl%mkwvfS+^1~4sv1tB zt%%h=SoZoCz|1Z6RW+ZmWu!lxM!?AT2X)YbB`;b-(eFobDSe?p!>~^)ZImbKpM+ls z4`QW;)_OhrMIoc2OpOV86`6vAF&I<?6;Q_L2!xKm@S&`%oX&hZNAdUj{K7k+_)1S5 zfA0uVg(v}-p+kP7hFF&!p~qfv5@&apoIxk$kQEi?Tf5s0gTc1N6@Vh8=jo!~>9{6_ z#Y2iQO%%n*lMeKA-*)5}P~mVG(C2wav5nnww{b6L`X3iP9HS{<%}0itoKHHXDfE)T zPIhqf#nFL2g(efRPXKTeh(FHqLxJ#C!o^QXjQoxA7MRwVOeEiK3+Dx$kAKcPwVZf4 zn3o_$2)jJWz+?h$x#&e5NuE~b6pwUTlhc(aeas#zbfqCrlWQc{ic-kb7bC&7&p;Sl z^RxPcE+f-x_CNP;|KX_}G+007hFZFQYsEV=!rsLM)upWuTuQ6z|H47@?QV7%YB;!` zbiN9Pf$y;0;`VKZdO>z1Vb@EbM-h+imyiW+f0#yy27aK;S?uIuvoKL6sE$57&Uvh~ zo||tXv)#trL0le$h*UN?<cpsU3M{aMqGN1xAcLpCHUp>dQEJ(cieCEM(o$APcB3n0 zS{+`Kqq>Z%ay^^&E~K{@X%CZxIe1HpzTo42x@|e!NSVZQ<o$FEi@RFl^TupWCW;RI z4fgb4iE{5VK_JVQZZ2BH1u4SRo=zD>x3t102hIi+m-sKi<rcwN@gb2Tq}PEJ;3axM zhyok#jgG~CgGyE2q0;?PS=PTJquF&VVrW%Jf(CaVuJs@a6*<{c-)Bh3-R4J_&Hy+8 zhto5|+&nnJ9ew#6rrbnJ3gcN(Ruu&YmE3`~z$WjA5#s-y34h^%48f!lSMdP|)})#C z(>5lj&1@Y4j|@CiB^a}1U!&w}n{k9%C!8WyzLW9IJfD#2l`ko3zwxv%_e-z|Ig)QY z9f#~578@C363Md1n%*^S4rs3?MqB)hviSTfL8ig+chaWu?(EwwfmcW#ysWR_B=uEi z<L8cukufSm$20HarvL}3NX*x--kD-qU6nN=fa`v3oFM(pc^wn0;QK%l(^1}S`?k=& zr7PBv%~0U_xNp?i<u}uAK7v5BcTJuD!uPB+g#O@r)>}CF63aE~<uh)D_nPDlWuFWm zkkSl?CZ&t9CndlK?D(CBjroOgftNtttQ^tO!N5vsovfBy2R$i*CrqG62S9xqc)tcK ztIG_tRl-qN@aR-AA{h(cUD3hg^d)9c!=sdxjTZ}N;-;^@fl<`Lf{afX$>eiR(;+iJ z%Gg!F^e1jy=OuqX6;wgf4@@Le$W46i%XM?yhC@fNfGFIY)R^)j29dgfod}q&{r{EL z>=XSRI6_e!tL^74VAB-};_{0q2OavqR59{L;A#8H|1aQ3eHJZoe#=nzEn1-Pf;c6; zo*ioS?M|tElY$1=&@j9!#)&w+WF=~=O0UeZTi&4J%X*T3^B=IC$`AK0utkiJYkH!{ ztzw+DX{!W|VG2io+w3@-v|SOIFY?+=;Gqf*L_zC@77aksy_M}xSDnw&$OUQnQQ4m4 zRMj6vUudw5&G!qQPQsNe8bD*Vr=^Tp!6b<-FbwS&Rsox)^=(J#wO@VI7R8g#v?6I- z_6p8#niXGO%^N+$NZc>J<KhJ1ZdQ4X%lj<*oir$W;7I6o!F?}NCnG=M9)F6(-aR7> zyp7U{PsD;Ocr{U7OixI#Y$-CCi2Pghav|pB{PEF<QQ5h4hSW-SWOL`eL!L_jXzzOP zV2=YAtY*1%<!~JJ1MRAzq0ZDR6}P^_7l-q#ilr<FojY}yh!1b4xNf5htHl1~;=R_u zf^lKwvn+J1uF!j3Wl6DXN;;BU+*Sc^CO3{<hX&Kd7*y(r4i}Nc>{p5@w5Sy4;GQ~r zZ@yW5qoH2N=|`JLhR*EA9sN~8K@kqG^+tbs`e^qU^{(J+8f4G4*wWHwxIGL%1>=Lj z|1Gin*+fwbkz7k@WY#7p5|UVSc`Y!syz+-;wvs_v6#CIeTpoSb*<`7x40e=zfy;e5 zG4njE7t{RlNJ`J{gc)E64Ht}(b^1kxsWaw8<3&I>-3N_GXDFymF-JBdo>|jMpI*&O zi;Zd`W~l!eQuV~fP>5<V8iZvRF&Zgsu1~~DGdHy=)#NOK<}jnrIi%_>myyay6PBW5 zh9o_!y<HIpQq2KVQMPJkq4CVA>zhR%lZm@}B16DaoPJ_mnzjIUe!7FYu>dr^x{Uwu zLEEm;MWC`Xs(H}_d%rHJ&!#TT3AU$$KY!-?2v`cQuhOKV1Kyf>1MuZ}AHf^;_sMP+ z%HnCoKZ^c*wN|oO;tVY?=&Wgtn+-|2d;0(ua8HvsXb=?{r%Ri-pkX`Eb0#1&F`zHM zoeN};So?_vc!4d4bk1FJyjkKLPuV0Gtl1+T>pT8z5G!6pIez>Od31p~dJIwf#($3A zy;rr*&OY(*-`w1fxNJ-Qs)%6xgMg4}`_4o?Vn0mwQKDrC{sn$0PZ_vC>O|}44Zatz z&4il+@j}Ex$fkaN$(>}x!#&|)N*&MRpB4+Tv~)ZY(h)fNwchpz&6pXC1R`6kc5O^K z<w5uq3aPrHw(7KnzfRA)KtI#`FV~;Lfu~@pZ|M&fuGTx-gX49r#%Ku8)KC2!Hf<7b zQHlA&Omvl6oMhSzN7;t_<GY3~vjYvG)j|jviqp<zHghv7M&aDwpbmn0e+Vl(X}l4L zM)lL%cJ<rjI4V+{H2JvjDWy;b9tH2H%3oRpdkjQziFO8U17cuko8oBB`8iq8Y6fhN zQPFz-CK3ML_@%jvk$oC^9Il;MJD{&Y50p59S?CZZZY-_VnSNravmc9Kc{@(IC@3hV zwtzzCS63JT*56kSM|*AiG7Q8@-N(27U<B@N*I9kI1m*&Np$ECo#^8@^WgMG4`afwV z42ODsT8S+y$g_ILkCa`8rahP;Do3>>w$H^TlD{VcHk>LXG$g{U@T0zwq)+1=f8tS^ zyuH*jH!0bDUc%>|tgsWgwj>u~_V|yq;-C8hM`W^m+MXIabEDQHH+qp0%S8(+$F-pZ zk+b{Lz6c#|tjLFNEOv%C8LExz6O~2Z56_ba*qxRONi^*ax+il|`X{HnQbuP)m*U~C z>kcL7d@pNh#qM&In~Mui{c|9DTony&%0zG=*?zM={4g_wMM2~cJE-&D{|FA18$!<P z{-@YFd(WtS068-Q^jBRXIM^EoCIWy~f7L(#Suy!n-7W?Ua%t<+j%0mI8yj>WvhVj7 zSol)W!p>-`H)IV>8v{o_9enFdc1wVxt!I#;PlLsH4$Ib4x~~^MVhZurYPi4u;Q7SI zUD#|nSVyCCE8i?XISxQC|1U2`>1|KR$^S=A&}}80UtIyk2N76a)AU`yCo_F(nN~t@ zGpZ0`Jh{jLs)r0h)aPvjt+2X1q>Q1o_4V$4FZ|3TzxcTEqML0GHv8z$ueInycs~5^ z8nmG(>cP?*<Li$AQAw9Vf<QKGFh*E@69YnvXL_OT?*%L0iXGc=|F;kS%St4q-Jw10 zRR62+^e;31^=Y8XhxfFWNQ8+C|3VW8z$CLpbfWBwVkWXV)r+--Wknmh1yxm9Q4fE9 zX)u;Z)#|mq>9853Husmzw)D|H9TpD!R{XkD*eIGF;WjMP^KpS{GUQbvB2q+F9og7~ zcWyet+Mq~HBa|Q{Ca%6(c`cxcj9J<3#&#e&E&8u?H@g5<bo>W_hkz$>4Z}D<M21<m z$*P@hn7E~7qPzwa1~+h?2t!6rj@;ue3Z9Ue@C(%(XRC1|WMF`doB>(NX$y8C2Ffdt z4$%*4ddVNBla{i~<(8z|4!X@N4U8oc7w0&xrxSXv`9OCtN=i}`mUL-VH5z-}5phfc z1ceS}VA$wI_?vqzW}O-jF8GE~hAp`pz<YHnuAB5RVmZfP`&6zhOt}A(72<=&b^@I_ zsSrYAE^V((fWOYeNYy`U;PNZymr=s)nnadx7bTyZZ|*LZ*7y4yrLY-0A8B@dxtY<_ zaKBV}l0#Q`KVp2P%|YX6yDqmO{{5K<sq?N08-om5slF2n|CNh%w;9{yc#fD(q3;^b z>z-@Am?Tk6zjUTRQH?`3s3^fV=0;%f@P1-%6I8ecTYuh~_?hMD@$J*&*~3YIqk&Mw z!CCn;rh@JZtb1=~=ToKMGP!`Xn;La@NNg=BDS_ptBVE+1+i)(DzlS>MudCMI1t-~R z-50%oTMTT7f#pl0qT%9#wKv39*%pkQV4;y<Q#VJbxS}?JukHjJuSCd=OFx@2aY6=5 z1p+Rh;mM(V?}p}ofWG%dCDBG5jJXlORoAvzA%j;Or_Ku)p)MJO$GzPw$1mDOjgsO^ z1y}6ng^xRO;6bm}mzgWd7D!F@U$<-GCW)M1Ebhh&n?=S7hoH&|bbYAU@?U62WVnA$ zDmrKgi)r}D5!PvJeB6m(kP<)3wTfDoz@KX;=AxDhkj+U7zfM+t<i-l?33Ir3<k{pB z<2`FgNl#&fBU|dLseI@5j(MaCk#e7b>o$>~7^SjIN0cV!+%GN^Fs#+~(MzFL&47}p z!Wh*6gVWz7IS9bMsnq)t)om|ki3&N6_$cJ63!RVVISgW??Jgys!B^>bz%#8iBOXO# z!LrW})o(2_84`3Don)VF0YlMXXT7I*8%M0DH*UMu<36#yhURV7A-?%;kzfm)-xb97 z%&BS9kA9a`qrekDReTfsr2l$2mD!Yc7+r19t=P5pXf)u>kZ6;6(Hr;wG4_t(m95(r zZbcQ_wvCEy+qPL@#kOrb6}w{F72C#)ots*FoxRuD=RWtjKgaYO<3sPgy}b<{IkzFn zH%z2QJfvfpsc|)U1sy)5I)L6hNg&3UeaAC{rs!k9wEC&f?1hIq3MhKVn-urWLNosm zWUs`DwO;2Pm1jDt-!Zj!V2Rx?2zXB)D3|y5P~7NFOT8vxvHGfV85uQP{V_ju?^znW z51(p+U)~`1ueY%DNY|wWQNGou<t0tbD<->7f2T>lu)qPt%~drc1LPaj3$F-PWL(mM z3p@ewl|H@BG3|_n+^;f@*fP@yi|8bUZ~qiZ@H{^~6Qw)gVtCz&{m&c`F6*Sow#WzW zIa}%SqtxXM-<=c?))amW6G51!9a}{kG`nCOn38VyT4X)m^5294wqOlxM4Ko+OQ#h* z??QLJtXQ=IIwcASFfD!48Q*_|bE$3yk!L^EJ7W9gNkmS{kAvEfnM&sb@)yhqq>O9k zCiY^B2-H-Sfwn!&6MC=E>=jM+hJ(?%osLOD0D-lf_;Z7vXxh7d5dJ=G7|!6pmDoMp zy<UOxv~L)al+KGO4P%ViWk!0xrIvPfFE~Er4I82l56QdEX}LIt7fZx68q|5z-$i}g zN|wrOa6aUIbp0Gt)P2}|Pp}(n>wyuM-dGQMvQ)k6l0nBZkC(-215AZMI)c4h7%-7F zUoHX;s|Ok^JnVP<Luza{D%@<<N*6IsL@bQ(o45&bIhBJ-8~DfdaD5Adwp)s8a4*lC zQin$la)*koI1#d_avMkIS;UjSh+GMIrUPxiMRGj!Zq5AUlWe)yz?oOj_H&`hhv&*E zh#RJ=3~0i6B-FeLP{j=shqA5pVgY`yUHFJqq-mu)^Eri0j97U}uC_(l5H^sZ(E7l| z>$KopSK@Nr_MGV)Hx_HGDi61J+AsR-PG{i9R}S6_gb6GboyOR=dBIn-{k*Fo;+2Wc z-I`1A2!-6_-y*CTEU;iSmWrJ!!Ff1K?y`4Pxe+wX%JTjHhp4ojyAi{6NH3zA%<tHe zH(>)xh^&!@7<%ehw71*loLTPi#TrZrkfXOVg#V3jf#~I2!~`I}D7w+JPt}AF7mYdM z$Kay+X@%!fLJ>6tpUYB=!10-{wB{p*a9JNt%FdVovxG*$3CLNIKN}mmyW=2_xm+JB z{A$ylExoA9J3V&%j`1AMy!pA*I1C)ygK87o%YLRu>ziBE^j<>Zfkw+&6|sAP5;#y~ z!U|m~5fA3n5Oc#^nlqs1=Zi$&%$N*2fAWv<Bfj4_pev)Apha~ct5B^u&%uBOefHNX z8rVa4`#q(a+zKU1uw+F;*Upy;)|BI811NQc$u<OeXBA>RR6Ix%5F4g_u$35PRU*K< zdj-QLgVZTlwp3<GbV*4FWpjb}=OaG0sDBnzEDsQ%cM(_CQVM=qiddYhe`EI_GVgv+ zeYvXQqA#c})^XcCE(wdj*)mV{AlLPI^+?Ueq~4#`3Bk4N@(ua8@=L>|ui6&>O*W(D z_?Rxe>VMHe7<0t36ZDy4Kch)JJ~kiP^=xLF?N#>1s!VkTx1~(*7pmLO{@SPmYJPom zCdVrrXi%yl<xht5YJLANl}a(Ylz0v~;yiGf&+9Bl{r+O2<!l2#mf;aq3QzZkd9SLY zw#c_Y@0VwJG=xy{OJzc`%`Yo_a+C0jb})YKj?BD^gWCrxzztZ$L8n(w>E50SsG-yn z39gcncp&-qX+@a*Z14}W%#IIRAtv-egcW(1dW#}P$56z}MM(Nb(*{FRFMxes*udWi zYcE=;f|Oy&9VI`_U$1Of5fupenM3Jwj(SptCT_pT-HC-}#|&jZ<7;!eA{jRBKnr=z zpmBSj&apF)Y*SIsiE}O_qZ<->8J{%I9CY#Dfi)`Ju!Ii))@17gH6EGs^YZQ~!`Xu{ z+M}h8ZAvS>{3UzsA<xO&V8X;%m?B}7+hn&j(yg_m$zojqZG}28XMKIfA+J;72|Mwz z?%=$=Amv}4-a|h9>Y?yZ$zl;R<b~_JMaC<FuUD)lA_S9eY3sO=ac974T*j&5g*@1J zOwkDyHDOvl*1kLzdMW7Io>Dd5{ZsJcivl|9I9`?8nkT;;jA&cIsJM=P-m{+FlZjO5 z%Pn!C{`I%+hH<d>sX1Tj33!feDkyM4bEr)qc(CQ&fKquo@|A~c8c1sg+;}%a38WL0 z9gekw-E6eSAz5veSoD?Q>-i~>TQ{AA1%^DZ9Y*IEuG6Lvshp^nWqJFX*?IM9vL)Vz zNbXP=Gyg}GJ2(E1DtEyKF|?+p=l9WOC6Dy%HQwUD3oIgjBJZ%dkF+7VgK)Rh=p!(> zgQ@5)#Kp<G845zb6iEqnT$BHaRSF8M8az4tixOf7KI8<Zx{X`@N;m+aQs1}6pUbHH zmz>()Xf{(-4N&O@^#n{i6;5P+u`XzASX<Iz1>+-^*%)x}K1yj&gSb+C-HkR`XpHs$ zfuaQQJcV6>__>i46Zoxh)fl}{U7MSC&V_evxH9TCAkO~M8KNAHh%<|xAb4I0mv0#R z%w@FZAO<4<vqOBMD<f((XL$9&-*LQe7rS<^9YX9sir{yAV=LUeOPxA08F~Fwo!oJ# z%Ly)|9fbyeMsd|uV;x7##<CJ(hIEzH|JaFA3$Q>R7r{!{y<ga!!!1fqid3Ycd}3z! zmMnjpVtSmAJSjj|sm5{wgtOX#ZnCbB>eWMH-ZolmqZbhN^J{|X6u-MYSLcd@KM9Oq zswO+ELr01HEOHbjheCdMoWf#I!6vS-2DsLkq->~oe>){*C@efm93$L)L2*9H%h*}a z0UqP;K!cq^n8LvX9V4H62Vs6WDca7bVngxt@y;LU2T0e{V)}as_Ujpu+TKQib-y*( znTXAm5apPHFQ8V^X-SMsw`mIFa{=}uYzP=JG;?_(m8kpoy>p@ZwKob}kwwwB=a=6| zBH>6GWpde%YRm)#W8JDr6|_>rK?$j7A^qR-RKOIa6ZC~qBaN}(h$ypA29H4F*GN#| zF_lOJ7>LONx2VQ@z6&7HF$m0+3`(SuLHWayG%&?aQw9o4KDErCgpexj4d2f_Art3X zE(fvcq#9so-x{5HS<srs5wsj%(Rn^D+p<_9)$ZMsJD5cZN{L#>1K#1RH9oj6G*RUG za_|5tYawQfT@kqWZ$NXY3`{<7g9+W@YS(ch2xs9Rs~_#KF$q^BbzL|)UM)#q^UP7S z?+}_goSG|+Z2M4V5F0{6!@JKibo+`uCPR`zh1y(D^Qu~>Bv#dRT7kGu#C<spveogL zF~_)TzM;g$6M3z(!K5P33<W`;)>TLJb~IxktS!gHcZfDL*HMB+Sn<mh0NK!fb!x(x zsk{*~55)Hul)jT85$fGHCeA+;*$PMfdL$b=-MR+vjp(QTS{UA+LR0122?x|sOh5DW z(<AK28EKvM*ZrNOXV{+c$rNta8?CKodQ5K9?h;^G6{nn;Aa9GRy=9w_@oDMB$c7;m z)Q>O})!)Xu3D@6~3$~ysOZ<4Z)JrP5(a}Zje07a{I$*z7@pUql2Fms2xKE)g9PX_E zUW{G=yBTLsym!NGmTr;=yCEYAlPs@RxKVQe^f%NqKGhVn@XdEZX%x_h3U$5SYstQx zz%nGpXSLa8ik)R)KzBCN47&cs4GqV#$CB}zIY9M=KZ7f$fnLrzX~o@L6I2mxEn-Ll zVNJwqeFK?xTKHfmTkm!0na<kn`>~3%zVF%O!#{N5TSVI5O|Zd4EF8c+^%sLACu5PM zZ8O?4Fe+|zb@)1B-vT*sZ*gs=XT-1$B7eDr;mMf3XlgPp8O?ni!03C)xZXN-+wa*I zpKmf4^4S<F5uyDpOFty_@y1~|aVaa|Q%VvItok20*~a|!%<DI<g@FD>5&Px-A*~UO z`R`l!82;ONpTTyO8$^CG@$`Gtyz0grcftCEzx8B9uP+NKxdub5PWQq@hR2%Y9tS?- z!hiH+oMm$7q)<v5t^?1%nC(C6{-g=0c<zA#dQqj$;-{`pBp(3MKxQgyd#2i0(AbIA zDC2ByZ7pb}$3R59dp2=JnI<;#gq>w$V{Vh+GI{c15lQa;>3AyKhMKj0z)|0yyy`>x zBMnK)16!mKhWz{BYguZX`00Z^b}e&d*N|MOA1hU+=_HG*QfkWe-FFBiVu_xzE=<&Q zJYlxCK(@-}SK@*Y2Na%4vvE#cfu6z(6E1XT|2`961A7Fox581PPdAPAXD6r4knBz% zMQ$R$U#vI|gx(Nv`piG-p>v-R`OUT-=Q5-AkHwsWj0wV)Q)T_P{F=~MW?xltF@i@9 z_ovInzY98%C8N(GE`72S1?=QjnlmMEf|eJ;#w)n0hnRi0m`ZU{H`cI_8CF(U(<{^j zEM%BBX5<-|w-+Y~uG>1v+^k~y6c9^Iy?KRvW3#beQIkslEy}+cgq{y*iJ5ba_dD2* zVnvhQI!i@)E9V&NZKJ?R7FIYxZ{)>z%q;mrGfYrywS<ogmr4iFyu6Ee<!NZt59KfK z;h3UTvlgK6$>R%uGu;tFf&*7j<46na{3s&aW}Lk;%Ch3K0OAX?t5qoy^|NHEBF>sc zw@Dtgg|a}W>6aE^f;6b;Tp_c0sqvB&TtoM1@W00EN2gy42iN_Ei^MOObXvurU;o*g zz#1miRSqf=V#)YWHwM^}rW}lK!zYo$kGA$o85OVlj;t(WvQH;b!%uiZx5i4J4!X$Y zFc$AYI-$6;55Kz69pu;*@>2J1{w8>y9Pa9L%Q6l24?SPL(UMBaPv+5Bjx<>(%Rj9! z&4Ztkl@%oqvir%kbQ+aka5+pMl`~Aj&w1&?PJ+8XA1f69!wr@5zG?SCuC}`20E>8j zzEaM)k46!?g)o#Q0$j%5Fj@0^<X7OkrH2UF_O7Uzi~fPr0>&6=r9u(7SdB2=*E?A> zHk24o!KbXVZt6|8DKhnzMjf}Gd?+{bW<G&cKRcG%Rc3#FUW?851GQ8J16GSttV+$0 z$g@=YgC-ir8xR9bTl7q4)rrzJyAnNu95UIU76f`si4TGGP!I98&HQufd&uQSze2W1 zI~A>3(ShO<fSZ&vFBx>0y2#}{M=`qP1=rFLz9mJ5vffULGCh=dSEr`+rD-<LE#J|= zr7}5#c<*SAzzR=|b|b<RwuDC-jde9zcvzKxXHY{TDnObvY$QD<!<IVMtAb?;ZT;-j z$G>-Uv3731sc*ZPzV+AW3g?{Dk4rH%gY{(DxRR1#xVKN6vv`U@-#Ro>A?rVkLKs4F zCg6mv=I9=${P=#7LXvt_;brwyzD~#zyNv!!Kvk2Bi0G(5eO(ksyA82-3v2vki`QJX zBg89a^@9DX#<yll@;<t8q{NPp8TXe^i|Ztn6mG{=+Q$~W8vWqJ6X)w>VOc>TpEA-A zvC?2sAtE;j27Bb&;->WsXqCnb{doHkaN!=7yv1y|DSP?uPVVXllMCN27QUPV=sA{g z4mz~TDxIgts-^`!f|nEK$Fr4qx;OD`yk4ET)2BSHm%Y8HQe-p4tLOdia105Uyvtn3 zCv$l`0E>Ksj}(pXZ^{IvAp*u5vgIx>WCjbtH<1$BUO@ngwq17TjV*#Qnxz@Q?ZURb z_)yirkL~c1QK*r*TZlo-6;r<Ct5v<s@0ihcHL(4%t@jRB)ivO9=8|ov#pHZ7d|;AZ zU)%WbxT-5KW1|WzQvI`+mL3mrG5f65sEWu2>g-$PqREZr<mVl<7R(V(=yTgTN9z3R zznh-U75u6NKgKM~6!f2_bBMNl(GKf^CLh&Oh{X!8N~dZ_+lQBoPv7~C%OlQ(=69Rs zD34GgIDp4wV6ZI$rV=Zexyv~z8P&j*Zm}paDp~lu`{K>1bgd12KxX!*+w9X#9CDQi zN>a5PexQaj{adK!`SxYaL*l0mi33CyENSjSJUJtA!1jN5mv6a$@h-q8<|{oqJfJw9 z0J`=sSz`MTFo-~;)boV#ydVi_CeDG9uH*?UqBBVi719(M0~!l;s5EU@t=qty(OzNe zcU6Y!yT9&_X>qx*wS&);L6)TRCy5+<tGXFguq=S)R#FjB6dA%KLd@+yQj^cMB<50E ziExT@9wt+9#8z^<0ZOx=z0trD7DVFmpJoC}R1l_!=Fl$(v@VP$cDf$lNp(qy-#>V6 zNsfu)3nYf+Zc=t_W&;bcrJifpGpg&8<wpu~k_p2n%R7sd>?bTjQ(QaC`-9X<h|NT4 z<ZWNhSN(jC7qB_8uyU2}a`f+b=oKufbE+uRGOdfY+-BR0nlBp}Qa31%K_?%x)0iwg z6M|RSe9ngaTuxa;xKXNVk*h!1eMjxZMR7Usp<{Qz9jha89xD;l?i(UsG>gn?5uuK_ zN|>P@U)0NYkDq+~$-j1#l+k(p)INR?7VnX%N5$U4Xp(7Ewc=yv6_<rtnQ}KODTU)< zGv@9S$EKx+^8#uXWo^stc{>qEG6R-mfmaq%rZkJ6s39YSpE@d^eL;I>J*bHo)4Z~7 z*FF+=LGO^}0BT4sMaz&a0kMMk=_q%!P(QK-@4ML68RHyaRfb&JE$h$aU>croxEg@; zST_A54l4(9K02^SecGTG-@@TC9PRt8^jHw@elMoo%qDF`(OMgjc0?r0&W@v+lS?p# zeV{@HOavBM$>$z}t%66mmisAYGC}%lbn~-S*wju(Gsh1Gvb;l-84!_MM%@L(rY?o} zNHdeAMMb1rbHDLApJDkN-335MNf&kVmfI{aQ5?f3^#l4l4PH@V;~{CW>S7;eeM%|K z^$Tsv(%r)FSHZwndkQQ!!aH32^*v7hg~=#1U2dUOC{WbhX}47)NubZTF>`z^jSIZX zK3X~yzlRKAM01;S!MWLg_*<v2zaT((`G)C!1MeS4gT0`$<lBE<EC28)VB*@1tE4C1 zuhP6}2~^zn#K6ku!?)3tw&=#}QsSN-PmwAHx!X5TtH!+68s*=<bX&aJuZvT<D7BDc zE}`NuYw0or9G*F(q$@MJI3_5c+k$3!ne5{IW3;IxWB^hOfva>XV4;~DD~eR?$|9@; zV>J6Ith@*Kci$FRFkNCQXb;Wey8ziwSYgnapQM#nUy$MpnkT6s&@@g-D;;Kxo)QLX z{x&ZWxB9;FL^V-L$<YX1Z@(faoi~JjDQKX|jU}c(43XNODJ1LTLP}ClX8jl;IU;-) z^3g4&CpnPewv2QQ!_THqzeUw@MmA2YRrV{`%gxH;IMk3ZEl~d{qf4E`j66LVA)pc% z50D&KLXtxwX8J{(*sVo&ew}h<YGgP^q!8zvQsVcWj`T2xr|bFULM(xLOrM9Ge($(M z%Z*$G;2y-M8Nn3zwsdb~r^$GQ#RihiV<%wQ1^HyGZF#}1;?yeXg19d&^{M904?CyX z=~=5Hv$0rbnl3X-Ht+4|y5W3Cgp)EfsTtf(M_O~G%vh~yEOfyI%@h?hBjIHAjzqi> z#^ykuzM5*z#p%U(11|pi-C@sNA%HUhl*-u5eK8~hFkjLZ>oRrI!nn%2$$U3y!=<83 zU^!OoMskt=J}T$A`X-3~Y%!~Hxx`nhd6gaUoJ&ESF5O8$(*p+Vj7OqOr>3$?aL&{s z8H$h)@z>NDb>nS0_5s*02en);tU4H6{BT(*ihjjnwiPg-S-vS>@>65$47qH&%%hm} zTD@99N7WM08(PsyB@Xy)7S&If2;AXy|9+kV;+`=DE*lvs{^ezZz^natL1PkcF=KJ* z>M^%>APlv0Zu_dXRMA<|pBhCAb!2(S-sO%EkJCAscPN<G6QVnO){zTCoPl*U6W}tM zC@R@@#~c`>KU;axim&)DvZ=<Hhzc?Q)7jMt#}Q9f=dSpi{b20!Z+UNP?GK}1v6#)z zs&m@;Q|OU19*PTxfE@0qeAkWS!~JY(QUo+jnaa)~+lcXZFtdx60)EGj#CQ(ujGjar zpRe$p>NX}bd(4;82?zYLF}T2cV@1XtKl5W&ttWBOWNt1cW2neOqlz9Rtbk0T4SsS8 zAW2eWw#8Q(l=#P%iDxhnrxnG1mNE~<GovIN3fYD3gHJ2U71UP4Yr>Rbce#5~#zwDS zrQOicOj{2#MY^4*ychcN5;zG0yws{r=tO8M5B(J#WAzuT^Ffx$$P!TRI=?2mXl!%Z zVM6-PHKMe`S9b{o--`7r@X@*W3X&wJCRbHRut?s&>u@Tt?_NuQ$kqi^nvXq_3TDeh zx~+6(89P>wSI})nSYkyGNtj=Z)>bll@22d6Kiz|<s&=~0aua^1#cQR&qt$!=T5+Kr zwCTAL8VCj-X8|sO(tAeZEpu-i6c_=h=PF*Rtvktk5l#T66~pRAQJ*u-wtMg#@f`F( zhqK)@L$_^pcueOs=0x+a;z@&KslleQ$Y@j9U2v9W%X2TFNWH8;lJ?hU1Bg<p>pLQR z|JsouDLKWxfX|6yKZt?^`d}^A^EzffmB2SJXro1$bffIMU(jFamV7dDQGK-_r`i&A zQNeD@T=QeAGiyZ{sl$@#*S2rLwA~3L%%kQVV{$29zaZd&v8o506?`Gh0`?GupGpI_ z<aLA&AVs3sso9tUS7_}Z&muqFOtGi&r>jkC!RTC$H;>8ktU+p`sJ6qBVqrmVJxuMR zF-iKT`ito*d!LOS-f6jwsL`;UZGdP;$M90zfCzl2f2E$ykXD!a@uT>??);1}e#)>j z%5IOAn&JG3in=q%+mZX*i3h-?^#+_$Bfl>+_rwAX{p-JovI+Jpp=U3>Ul%XiZ{|N8 zbohefi)tGLv=f7*)67!1@3}3ckC$|;(W`Dv*`4QCn+g)i@nZgl6endr5joZ_<p}U$ zjwE^Re{*ubP(ithuzS8lAgG$!8X5E$;F>|I9Rc9&J9t$Wox(lNSl$<$GZ2`SSaM2Z z8%Wc4?wBkp?_+P72@<nT4wi$!k@W`gSnlV3`GnFj+ELN9xzQaQ&e--L+LwDvv{WWX zLP>F$6A3F}Y?uy7OZ<faRvL@;X7Z|AdGQ&hiox_D;L8BOu>l)q9)O8FN#(}6ti-+y zuIC+{)Um#59KSe0{UfC0xE*uQ<LG~SU|5J*{QqR+#8H0LR-)fjcYIaaNj?6~gA0Qe z2%SQc<U}W-|2jVz0H>*S4fegw8tvDNq*v<#hVQ8Z>A@W9xiI`n7TkKa%wXjbiPQEE zrc?xK=^kF=+{mWSp7|bm>qF7x6I|}@zyV3zG>s)SR^Q`<sUaETQ<s8?WI|K89r_QN z!Jk~kJ58{9L{@WMwFRm{ttomD5#}#vVtksRLo!X@_Un`yKOkdXk4Pk&+r<=A+)iia zk2G2FK4{r4zghMcbUi~zc{js2;;#j|n!SNv`m9E$scDDwj>{*O@(xXI+I5$pR@loN zz%DgOM5ukZfGVl3M~^vz7?i#v*l|J_Xe`3lHG00$zlRR`C>svWqF8@yiUD{bvpez% z3JoBiwQ30FV&J;DjK3KW9$db3ZNr+WD*SxmBm?~9W%XsP+fHPm1ZLY{_T5Q%AI_=} zoY-`)d1!$|mAe~i2XNX0XSY3Q;!H;kp;lB4-Kry5#^2{GMhA{9(v5{A*JU?YgF)qN zSl8NF=IvLoqxom^e8)h8lp(Q?Dt5t-;4`3%Ms9WDM7R)|_i&SS2DVGkxmcBey#e0F z@)Qu$P@NTUz$_ORF2{0U?j)O|zqeWbRnh%T@8Tr~Poax34zB4n+Y%CO+L;O0o}6=3 zkSZj;bAT%w8tpJF--lyDlZ;_9tsY`&|Jf*0ZY5>tm!%E*jvpahOPi?2QQiUT8M!w> zjn7b%@>?n2agm77UOzUY#RS2L+ze1`{mt~-eP1c_@<fmWr|KpHc&+g)`Tguik5_ej z-muFr4t$l>uhx${WZbn^o}RDEt8Nc=AN}vq5ZZ40u<Gnp5Z0pt)&JuKKuzz3V#4b7 zSNz6!c<H9%Y$N=Xos`OCh6knR13iCfC+eXFYKX2E;Q$B$Or#H;4VpY0X;8LB6jW^n zt|(E*#kt@fyop9!KSc9;4A6>?<Qu6Db1OCmY%SyBTFKsKEr=QU%{Ccjust~bt5K}G zHN^MX7l`t55M=&fd0?6WV{&QYJ4;DQhFDnye15P~3)x<EKXeS-&hGbb2XkpWAq&+5 zq8WYT>s7nM*1ogt+=O}m$F$=ap)(cEgG}sIVqZQsMeTH7m&FAO5gYZ>=7ghs&GK!K zm@yOOJ7*zod-mw|yT%_%)YzvSZN_3Glyij%)T8yHEJE(K@(6Q04`giak0A`try&e4 zdA922o_H}eE&;iBIYNQdLzSu0e}StzK<>MW32|7czDgdhJH7+`f#fhU?t|Xjsp*IT zXa#7P%VnV^lDF5ALqsu?KAmpplgd9J#JU$DVC+DzzOfNY)03J}k;!HTzP?J&wh*IZ zgp3%!#0HV3S{JdNJ+ZkYH47kT1(A-S6Q^{dG^Skk9%OwZa`ks18jSGQcc~Cq*po<Q z=LO$gruTs>p34*1;NVF^j_ovcF2$LhHL&X{=nE4T^T!~A;H@g}H%Rf<Dk!Zq&S}1* zUiLY*|D{*1DN@M`>!q8eZ|tuRg6US>-4?wPaxbjC(b0Nr1r^hW%cr$_>-m@4LdJcr z4t_{b#pU2Hu@5m6P&J<i)(s>ZD^5}e>>7`;m%x}GU(9=bn$H>{PCuSv?2nZ`x+xVu zCNf=7@jS0o6%e%F)<wDBJxqJ^A*VhI+`K$9eyJlVyR|uQ2q_8jzjpge)Z1Pyuvd_l z|H3JqIRg)L1BVvYgNkm3<$3B4Pf4@9IXP4&E8PKP3iK}(KJ7&4^KXtJRJ(LLxut`L z7iFJhfDAXpSC2~7VwJ6<uUB}eB{6|X$ZCOG!T66xE1&kgs7uTzP4CltN7We*1$qgg z)R(#;CHSv+WUzRB8^|P(tW!HU^|wydywOU9Jd>GuWyv&K>8J5BM0x|Ygd^<%RoD4V zwlRbe7B(ekaODMV*(+2P&REZnENR}FmLHh0<IJzJcaXYju3=NeK^W2?kp5+~IY^v3 z=1AD$!58`ChN5RvN*_vLKIv!hVo(bC1T7l#fl5220{aXd-lSd;Y}~HS%XVGOH77+w z<mVCBPFiZm8u%U(4PH~8`l0<hv1ZYV-vK#@O|FTs$_*I<`VYM4t4XPXZ<x`QADJf_ zB%cUqM48p4*zDOrXpW{nsrb3|=>^nW$Kbn@ofS<?XEPp&$3#w2{K$^B_QTf4j@c<* zE{Lh2yq1PcFwt37{JXpajz{^uEA7-~FtT1!H%3;(Z>=1pu`G7VuU-x7Q;4KOU7jCj zyt2r$8y_IQlU)h)UyD*7hx?rPb!cu;3-i1m>J8f(_Q!c}t!VV-RrDHhsm=b~KV(J? zoF^9?3+sjMDD2{!dBf6A3bPTlJ}I0uS@17=5WbT2Y=wp<Pw`Ag?IwFjw5d#kp_CWr z%xjJe<`h<qQpu|jwdOcKK3FKaHeC2P0`}Y^5KsG5i=XO;0g|Kp6Yi~bKhuuD4Gq2h zVVUnY5-pDNJqwz&<29D}R6bJ-y1De3rA;xnwo-g33E0>tnMK(UA#$w#Cu?iVuh*ZX zg>Biu2rH{r{mRjNJ;+|<f=5{LTYA|a@0*k+K{FU(MOie{_{b1Q|F(>Bc~eACDav)D zr9VV3Luo*4T1rS-f)b+1Sz$eUXb$1$jn!}Hv<rrWIDk8a`AK7Mgs10?RvFa19WmO{ zeQ4n8H$A^8g1CO-noIMqMh@fN0X_PFdWM^h^Q5PjmyrW0FCOpfHBPw!#}^s`G6imu zs4Nt{O`<M)C#hj__}&p|VFE}x?5u|OcJj*@U@UPX31t-tllu9M>*NJ^i7k(tJ$_HX zDK((GScxuv=wI#?9tsM#^PzUkRH?4K`>2rzqcIA~7wtT}WL8+kCjI%<*I&|1^aIL0 z)IMQXgWrMqI^db0gP%-oiqKy8rori4gg(U+xvAbqdz-nLeGC39RGHN=TYegiLrc8K zXMLpbjnhtovuy8=X-2Za4noL}h@k@G)kWFMS;-|eho2}RmkBF88X#onTe7o2E}5}G zv6LwH8e{7>+l~YZ`ks%7E|pAgG4Y)u*@sS?4$mDS*H<%+i#q_HEGLc7(lMXlscgOA zaJF~w#kUO&=B35+F(V!4k!=hJlz;NHRi~<*k6_vCU9cZg;EtX2c;g(Pof9^V)sUog z&tru0IJ!t+`*^xv7k+z>fK3<ocdP42m)LsXDg7)v^XmLrA-NLmb@3YgcYrDi<u?jd zAx~#CbFR+81{AevGgy(6s9rbzKkgw=hd9{_4p86YqKKw1c8b6-kM3qTMMm6z^sWg? zhbk6Sxxsf<)~az&lkDxx9s>|K%WF(ZPFw4(^JoxRLc`$%U9BFbQH^LDxZREzx|i%% z%DDKs5ZiG1Rz1WIuMsI(g+Br4m_&WfHgSzUhY1qW>p()}CNYt@i(P~3-Bs7^x*BeK z6vRJvBI4q?Am;)8TZf0_@2O$P2mhk5!%^5Lw*RuB;e1}^d0{lWU){*)8-OTguX@ey z9iLiCf)22m+48PNK!`-&wd3-MqFfPR`lwN_eFCp$;(#X30Mo!)C*)@GK;^yZ$@4ZN zl5T&`470P@`+=5k+rx#=8)<zUiOeMRLWH(KWHGfV69T<41cz=sDIct-=R?Yx{37*G z{1IoaXJ(|M1Ni;*^)c8JgX$v;Q!OV7zwoSlAhjLftaJC<Wsu}cCgooq1NLadpXjL> zV2p=WB%=GZND1+rKK9e84-FY2y~SFalNs@kkBGP8nE+tFfq`d`$vG;oI(6@|S4}(` zm(#3`!HojDdT4TWJ2O)ibSXJYMeXZu%2Z}Z^+<87+w+;l{?YhwyYmCvQYRZs8-7;| zXwRW7^4{IycxiRP1Zllko8d)>dfk~INhGxJ;RZYnjpuc9%FNr3FHYyqOP%}7=~pYz z{u=#%{*#u@H&bqZ{7*HwWDjJ`^KA;^+aeYU+E%NXFv8Vee@nFROD4tN5ITjBFQx&h z*r@Sm^L%h9KX~VgHz=4Ak;3Kxi$zgu#=o6F2ElsjhJOvpv!?Yzyy{SZhKpe{L)cGj zG2T$I6aO3D#lQuvyRKKz)n?^P18DyT#f~P_ufW7%e6w8p#SU4NW8Du9USu?hfwLyv z&!I}`=I~is@MDGos>1XX?Vy{a`3E5X9l~Cq21oFf<KK^Y2JjEPy8?#ZI`am~{^C3T zu)p2t5HNs9VLjssi+?}%FMpH&_rq@UKP+)U5X)4^-xKTKzxKbN<3ER)qM$7dk1YOE z^>{#_fdF;KOG{&+8l;k%`G=}n_<G)b-v2iz3I?KoGQb#!&t~v5{Km%pgiBTYe&Q42 z_7L?E_6r-JB<KXjo}IT+(L7dTBhZ6?z7G$SrG$L7HphxznrIO0#i*tl=#G{%1;z>) z2~h;%-sN|GQAEz5ExaO*VW%rL(QdwP&sV35mC)jRv=<8Au82P7%XgpqNf7Sv)03AE zoyzC(YOE7npm>B(vUDJ$xg97Mios&`ujokRpQ7cuVM&L}4m=k<ox=bE`PWr_@YPhL za$zwff^c~tmEU9KKO0uwCdXYYNGth$K@WMSEHBnt9WPtEmh)e7m=CLlIuN5Vbh_YU zY+6X}w_2~%-0o`u=3UH4u4^}3x)zO7t&RcGzK{$+WZj^tUy${IKM&N2w~8PFn=8P7 zfA_Eoc`-<%ztC$%kpN<ev7+r8(K)SQ?0Cjnr4;IYj0?3-+4-(T3y0bq_BP^A6pK^s zOEwI)3b!Yq<{l+;TyXGh#u35Y14>)_(`-`$<?WQZ)W$|DA^frNvU^Uw3+*XJuBXWG zexI3W8|L%N)kL<?kOREp7|8GpdI&N0PDQcy5k0RbYGuEOO=iX@7~l<F2lo;$HQZsq z#M|5VDof)bL$fivPoQ!<PN{LpgP{d|^BZIMKCx@>%0dKcN*8?6Z^r&Sy4v&s0aapE zfOzAB-`!@73)k^prV)@;|Ikq@fa34isbhoUAEep%;R#&P*VUVYml{RC$q`m2_f~N; zqTT!N6Z1c3>BtJ$CcV=Zklt7V>4TE-aR-{8DXp`{bBRd9_sED=r9Q`1g5}P6Gckcr z)Olny?tQ|n6rlRuFKi?qL0ip!lmZlb{`Y{HgFG*e5i$67)Arp`wt~g}*}K}_&21OM zSrZ0xpLg(8+adAczK4S6#^lfTh@ULrDZGz-i3z}jGVWhyjJOFLzj<6YM$EOO{<(Vk z)P7ng3-PLWeuyJN48udHI<VaAcLE9!s&OrCW~;iHt!psNu?j7AhAr7;T){=L2$5Ks zJnmmsU5W{-^ARUI8B@K)+AG)WPTc(}&>{rw`=Yyck9N2m9^rlZ_7zEub+0#Kw6Nh8 z5#ZU~Ih;JI+|Mkz+1BCD!SoC-r1+f5U*7O9hq|UJwwM7aZVuW;CA-@H8Bzap;#!s= z%?pZJ61@@SozT$LI)4eH_}4f8?CG1c9TMt#r=Eqv-aeRn`H`uL?Kcbo|M;Bh0pVO+ zaR<>CN+4!_0$qD3ZBqiZf5>E?Ckt}ejRAAlqG_;>K3BZqJ--bCc36@~&q~ZvTF)~X zv2YrwufhxU{!DUD@BO8uYf7+!p-xl_cZf>9{>~`TcHK8#yN6mUc#_9iZ~*MDDUbn~ z`qZ@IIq6$Tp@27Nc8N>&vd-x71PpV+f}}?>Ftf{Wg5+88aLtpT2lN#Gf{4U}!uxVP za?^~*_kNROuRM><6Ld2rb#*oBU~lhu`Fn?-+8n<PCx`pNkwlE*h&)7|LaNqmm+SHF z)2<6IT-j4?KL7i=nE6lQ<+rP^nMG<td*3fBFurfXwETi5ZxC=cC9li*z(q{vzomQM z1hbFl5J>bRMl)JFgjeLjJTv~*a(g{xKXO)eQZQ!L3kmypTa;27y<BNsFRSNsFEzgL zieOshiB(<Xqwf+}|KGEm!B5N27jz<9(>&l?tg@zi8RsadU(45*jrT8@Dkuwvi-+nG z^g2wCX-3JN(dg(?{Glc6M#35ga&C9qhjF5GYW}W(WI6QSi~|S5)PSX;rFsvbZ-fP{ zI^TFbUg3UDFikA>8UgEzO+{x<jF)gO=rq;Epc7h4QV8z)+dtcvZDeoQdIApM`3&82 zaY;=0wl^@R2p%MJPUe60jF9qY(rc*;Y~vD{LBkoMwp<-~QJ@|4CQ@zc3DOgqVdd<M z_z<|CK(Irl<aVGrf9S+Sy7D4YX%uGrN8B#K@mOHL%z)Qyw!?5#b@hgVlOH_`QwC+H z4&;&3nBTx5w>U$jc1GD|G0utOPILy#fGmy*ZHckbB|ViW6u}Bgo=^l%_hFXYBsqoS z6M5Y}?2ZTOgXhRgrzQ}5ZLFrHV)(}T#nDDdcW~w*yPpEdpIWwLHv|`4feyOAfwZD_ zZRj3CCW^EdS4U3xb(b7Qqc+goRrWsO-A^HA+^@n4cGT4~WcG}TeQ>IK_~E1ULqSDA zM-4<Ji;g`+R0UcEm4`w}#s8q(vLS6#WuC<7RUclwd=~H{xpBkkO$vI!K&}k5%3+sb z&C{=S^1uP|U(5FYOtQ~4e2a{f|3<S&V(lBub+3p4-eJ&C)5RbceQZii631MPO3qe* ziX#G1bx$_!rU6$aG;%Bp^yS;3oIJ!GDb?@A-?_hvMXXiV1#dd8q1==53-ht=BprcP z!2GiJp63+9JWbeUg{2@R(@AO`Zi~sCsu?VH5RNKNwNAMp-c<(|Y{vXcpEu|tz2D$5 zSY+9?V28rS5CG3=;%`T^Ewdx%j0M}WjQ)*at5JeAjjUdJE5UhlV%=fwA@rBaLC>Oc zZfox(gB{n<R`YE%^_944OKl$AFWIh)wmqQizq7;!0MaaK&AA<8$xnZFEH*BnnUEV( z{KE5H;%cRGZ5_qn9!Kx!L<Elp>hvoS7hHy=&3w#CPnKl5e6AnQiYgMEthiLorOdf5 z6vcBZ=oiE}E39W;hX&ktGZtA-Bn^{q8eFW9uE93acRnw$-#b3SOZ)X7Cq3hJ$8xzl zG0pV6kPUsmPMq%{a{Ch<=M0AZfDg;=7MvT9^A1WpPC&$2jrPAeb+{h6n{J}*Yq`V^ zIh$=}f6r`Xt3J*FtCR!w-_u07*qj%_sepQQD*aM_2`L&Lqv_hbI>_ko?H?QQzpiLE zKdHTg9jvCOg)TK2<)n|R#5f1Vw@?gJ%7ZSwH)@zW59kO*e@2T9`r|w3J)Bpp>gq>5 z<5=`cRY!1L%}kh5S%dvluzd0w`yHEV>z;Iv;+;HU)QwTikdR9qv6~jL+J{@@nyHts zH)t7CyW<B*OdQ(hjq=GVw>9jUSR(sT5YVoE{_QE)zq5j@9lor;#a#>q`{4K5nTl=i zM8k@%ws8&Yr0xM*P9=3eG+~BHP2&PGK1fW`6>{#g9)H&e<44ImOI&?#%5Jze3B@Y& zEhNJg!~3Dg#<xI5c#sgoNbw{9#RJHe+4$9AAtqE_{d+NG;pzuIxE^B{S}{kXvsG&% zB!gc@(wB&y1GNQ&<m6I{(-G{{i*Tyb5n>g&kypIpKvmTVUJsy+iwy{jJ=h@uBm0L` zDr*j9<Bgr}5v%<x0s$4prU?>I=mjac>75@PIA7o7(K_7N=w_hG6`;`#rb97?#isK; zPmSz7XXxdTnPKRFrQ5{&yPCl?F$ee+D+q6(^LkC8t8HvTGaj#^l}%&UxmNQbuY=f7 zbJ_}DLW&(>l_cIp2oK`%J^jsT7j+@liqY7I{!i$Dp$>`yo|)I^>L0AFE@jsi*}V=W zj!kLo{{-wBkJDc33HP4qhOVpEiorZMW4K|2zEjUrtIqKQ^PV&wIhuhjS!BED(mbA` zK16f<Ycu~k_hirbsw(y_9WQ|L)D*A8`8x{8>pT^#RHN%eL#;yTE*v@eHE+|-{Mubw zG4W;>0Hf2VuVHgl`$;Rp{weB*`0_KilR_f2!@)({v4)|PgXY1y^W*USqx>h{Hd4t+ zsLmi59~Qq0hQY#vbDhV#N2)ScVDWjKBpvM}_GLB4*R>%oYN4w>_xf%bX?}Xgjeg>@ ziD}LG9bAd(EeMpiE4%h)IoIp0v^k17D3yxk6wgyqoRvy+{6>WqvtuVvvPj>lJi%~k zYt?GDw}*gVCtn3<&NE0luJHG|B<aJmP;Pp#F;Li1!qs6dPmgCXYoWg>H^K@&QUHo3 z$H+$S<kLfZYkE+^>az2}K(@mQj_h2T%?hL83U+DDk1iMsZMC-kPk_td=l7{SHqyyf zs}c$wcPh4YiI>|K-TkQ0S!j0qLE6EBe08wUW#~T4AWc%e`Nk4MoPs53sjPN-=&*OB z<wKVNI>Wg~=|N5}K1^7er0IBb{{_m)fVBUh@>PMNpC87&1F2e{`dr5%Zt+A+9Ku#; zeFSG1Ihf$Y2QByYjy`e%@<#i`mv9F~ZD`a@e0&%Ox4$G#MP>pGoTc%Xmq#-J)ujf^ zg$-Bwir`yg{ZX>(XJp<Y0=bqy1y<@*;n1Yz%_EhFE-$#*BTF~~!LT;}8?JYY0P1zl z6B8W^R9iL_leeEqHI4-Rj_R2(Nz&kcdd$~Ds_Zyqp3W35TejhqFj_kDgeCb!S0@An z{9!j@b93=H)o=hCB10M)fEmvMn=+NA8l1$U8V(2}fi1B=c?yXIXt}>hHuJo%lFRE_ zyK7l~N~Mxm&Wo-QML)z8gvmVOLpPPeA##0KR-j{(&Fn!gk70Nx|Iheu;eap?0BcpG zq9a&z5Qf%$#LmtZx*-+HpN8U+!xEH=b+ym|OAj=1)=<B@@}yC3`2vlXi*9pBs~r~g zqj;Ht$Bl~2neB$X;dfq~AO?HOtY=%u-i7oHn+)-&)=%gqo=iHt3tKp=u_w(Z$$mKq z{?$*@gvXo^ds81w98n&DJX|L$Xo)e_+;&0ON<*xjOMKIr!c8IS;c5-&iJ-CkFBeSK znF9_3;s$i9zP|!A(Dnzj;NX<h)}m_#CO_9>dursP^~yFN*-<_NnjJ5k>6H`diVVd> z;2d*l>7>3%fvC0H0E*A1sk+HzVk(X=j(9D|9<xvg@ti<F%FRqKiAP?R_<X2ygTcTO z0Culu?olk0Pz-LExQp8YO+BH9tE$(b<KUeldxVciCg_4>vaLAh7lhVrt24?t{j;Ah zj9GXpPk<l^H(Tm;C^V#X!cHF-qP>2T;j@?6=UFnNaZ;Hr$^P+7sE{<|Z7whJQ90CE zC1GR)c1~Yen!xM!M2JeUjl3reR#O~Bz9(RjO&dX*0B{tg%aE>33mo11pBRo3N27Fy zDCtM|pi@2YhQoENi8}G!W=`CR*gjFSH@EE(vBUSft(D?<oOlrwXjjivr*>AA?u=xj zO9CP`P>j{=jQ>m~|JuWBNr7i0T|n*bLBgfs*n1zpZOiS1{ZJyzVS`M#T#jBJg4#yq zLu4jX&>0cgGvVYX(g<<(K;M3n*sZl0619FmOkr0z^jp1f|B~>^%;+=7JUl;DU#LN@ zAl<3v5OxEYWVTsKCLahK5wbt&Bd^_PIdVlFJ^d!{Mu|W)CS;JJ+vN>WI1GL6{EJ+$ z`pDgxIi#_XC+u1$^VNz_^Zs3oyXYiJ%>G)Qr95g<8kPOyJqF@6hvQ236;m<TD`F?1 z@hbH@{;SZwdHh*loHMrkcMINLp+m#9jPHA18L&@NXvFNZkeX1->c-YmW=Xb~u4bTo zH)QD_3E)$JywYc%3I&N?N4u5n<?2ecv{ObutpMM3>O|Y$@{O9?RfTkz*9TgJb~c;x z8|$hvF_{!el4r{=dP3+J+}>pIy>Hu>mtZsW$_G$<K0XvE8|K5j(MV7rGwPmSZ8j7j zuvsADY7ws-nuKh0IXl;~h?@$^#sw;c2>ks)5ZEbD;<kIP;<=_RGk-iD>v1XY_=*hf z2yJe~YcVMX_Y>K=L6ODahf(mMqu{QFezUU`OEa*JH;sH=7VLKupV7_s`)Ky&S|?n1 zYZp%xQ_wtyoN~L)hKmYP>lJsCm)2w1-`&X=Qy^-&QncJ?#;qhY+CoK#p4vv<=5uFR z^TeHTy7(gLia-0q78;fG2MNkhFFh&Vg+qb!oj;MjT5|N5nKbl$mK~<QSTXFt7CS2M zi(Ik2X-UJ@rJcTMD)oK)3rUj+G(3re;h)OHKSEqz$Xi-JO+u7x-XEeQ#Dwb6gR|C| z!{35FGw2h}s-N3yR*lX}7Vr`YMcfo+Jdry4*%(<YpmA{y;<A`wJq9c>N(Tn(H&Ry$ zezxyUCn5NLN6L{nXhM@b2@E#Z7{Xxec~`%AtzV}I=h|blvw12a`*3%65fj)|f1)F! zL6-D7S#u~D;AnP?VloDBZ&BKb=voxiu5lwv%N+!_j>vnGVVg)M1ncXT40*CSF5yjm ztC)5Nv|Ch37T9#E8@nXFCQ7;#)GQ%~Z}$<vM+Hn>kqq;Q)3e`!)orW@$_=yT*;=vU z3`U2T-7-)p4)v@Lft|c&4ZB~1X$lNo|JpJJ!zqyq@{p%NF%lKTJBm4Ih*8j*w>IJe zy7JhvWlzTMEz%jHvEIl13@3k)G5la!$4M9?EcjMchyup%CP5M}tCct2zE<N?q}4-o z;|Tk5uzGRb%SZ@m<CH=|QtI+zV|iZlBdxJLPkISU*B>#s-JoK|Jklh%{YiD$b<NJs z4t)$}2<GK;;BL;&`q$Mly}mc1w_*FF4B>bJ4~UHLU)yRVH6nn?UO`^@Lv!S@&L`!T z=Xp%)xcsJve<ZTdMnajC8J=2;X{Q=%8{|yzVzjk{`R;<tZ!&~W^OkyMq`18!6M>?v zCoCjebr)w@Ku9iUCE-Y#USIbs+Q?X_W7C%X^X9mmhL_l`+hwpRG|xBfm$YY|7EmjW zo&85Yd>YsXx&C{|F!*&6$;awhTT^+CB8}r?`(7JmT+PUFf)j7+y9FX(H~AEY_5(td z*$c{;@Q*cgCUy-OY&9`{JSh{9^AwD65H|2EMqp=zv(r;b*28U!*G{4@@Qb1$L|~41 zPcNVvTCIo(0Z?r{vio!m`c&l{WpTj4&CD85&-s<WWAwH`+X#@t1H5u6M+Jo(iso5i zf+oY}wnCvOD#z12=A!d>Hkg3Org{8QbUk5#fPfmzi;&OG&iYdbAfSKTR0>eACT2to z1{?V^Sn1j#c)*$jdl^uZSiJ;)ul4VYZuE3D2{!6Y9?*Bh%EX@rZAj<3nrdKUklqkA zpe@Gg({!77261_HU^OmRdYm`{TOzC_vxPs(s|Wn|S-M3A2GN1(e8=En*uDpKTeWgH zHs@rba$<Bd=~PIKLxQmIz@7CT{cK+DeE;eg^ZE9*Jy2U0#wB<A`Ha{6>nmGXV5DO? zb^8?N_v=w{9Cjs<fZw$G@?KXAF8I!UJ%@PYgsGd?Y=`rQ3jcer@beb$);$aroHWk- zMIs;a)>a?KGLCEl+n^u$KBD9-0~=0l+>+^#9JEEZ4ESr8;lG5eVOsDo^%UhJBPiSO zKUA|JgqERRhBE2Wpi2a-cHrxAvPS*yg=5VL)RL-vdg&xIKYxsEed*bW|HRVR6oN5n zqL*HAIjjJ8^tnOFHuBHA?5&XWozE89FSsrLPh$2NlnsKO$XXAsl2<v9f6o2Cs;3No zx(HiaWgWf)DrtWgRR7nq^`8TfKN$_k-DvIle_w(Byynj{pC72t*n(cua*~7?>W_cW zjb3KoR`>Ohh95h?gc_X)N)s8DN~`62nn~I*#o_-{asTHtT6#daMaO%MD)5Hh%C^~- z;=R{+CamI-yq;_Q7FSrr0z+PUm-Dg30t3OFDC$e?g<RJ>Q6b>(1_<<A*~i8YO4-J# ztYBV7Q{TO4-EsD5Kb}tFrfD_&jJ~=$EaQ3tZ(mx+G#!jlR46(toRZNm3=+dS#7ap5 z5a5XBxKq1igdPUDNPy%PQadIJ)mD;aa5XDg?%qXW_g;OoG*kw65tZ=y%hgbuyc&(Z z{FFY8P-CtBXVE&k&vCo@>da_&#@meKqUF#PL?1`=HPhgKZwJkwK=dL6?K(WU$r)%Z z7n>jt18>wRM3mjo=6{#0b=3RMu}Ec@Hr8J#6?q!j@9za^-X5JcU4;#o)<lf9mh$}_ zOfUDuUy9!Jc`5#@w!NDICPKiW3nUW@-Gn<FP}OibbK5C`P7)(07}}O~{QI8j^`V5> zoFPg3Fw;5M%S8C21C2HE%H6ZmnjxU#mJisJO6P;Q>XP<aq&L+q5G-UGmxirDhu2@O zlVhPQBaZpdNI5m6wmt6(g4Kq{^m&^B4~S(uq1IZI8%Kq7>2U;2`A(DJo7GQz)A@WE z7kgA5#R*lH#-4>%j3Q)zQcLaGg<OFhIG+_$N%zHQSRH4bpw8Fijz=w$JvTy!4X#0V zJ}m%u^1wd9N5wgtsBn>w_{Q2R;Z6ka;8_Xpr`-ar<0dw?Fd_Tl>bxkSda2sW6nPEj zEA{KK-}2*iRzm9Y@2;O&lP3Q?PS+?t3*p%Fj@2*ofqdZ;AMU^kvc*c5*$)uO_^%ky zYCl^|Z^%44s0bZ@3Bu3e9jKl|Is(R-;d`ys2Z2QQ`?nu7l6hMP0~QI9Q$Kt9dYr*Z zA_Z%vD}O!Gz>S6&S?>|7v9{x_GE-FteB*H?gpWZA+B!%#%w$*jI^2<GZ`tA}$S{rC zmn~+b6?N)O>+Z(4YT8(~pyJahE#q)OMr1D))}#3YRFnkXuRt`QYR3q)gqH%Ur#u`7 zhg%n_Yr6mep9$(g=4UVZ3lt4~2P+(3S3sct*ldP*^*np>AT>fOtns7)_<@90q>av{ zG`92l?6zuod6==SGje*BzP6V^*WZ<DR@aXUg&3Wv!{V2`jxDKiuj3F|9iNY(7e>!V zLT>gyHSskuH`?_^C0x3HEffC?k|97FW)xApvty=nf`F5fWjU$!bcmpOmbDhP=<R&K zWoD&+db)$fd+sg5W#57(%eCOf#cA&C>!fWh&#g)3TL*3JC3fx8yFCp-QADoTAw$*u zl;~fyZ8@N|;^}1|8b(Zi7Chrnvho%mPsthU2Fp<v1|QTn_vVmYbS^S<;+&WCgMqR` zXHi`&SRPf-itt3CQ&x$B2ETD)15X@i=x`__{~XmCo4OGfl_$q<Yj4ZA(f2)v6+#j1 z9tj97Mg96=*9^QKmkc_buH(9$UjjIFg#TSJm)ZsarQc+JLXD+w#V4E*+ODVH9KTt_ zRYI2yYHmQBzmv_qoX;R=-Tij1KECjaUv#4#_5UI49fLGkwg%jpp0;h<wr$%srfp5z zwr$(p)3$BfcK7Xl^qsx;x%d98h&Q6*t<1`mxt{f`Qm5h!kW>4J`en9v{YnV{R}AMB zz9JVY;gZm4I3pOc4&*%m7(TPqEkV-~w9R}rC%Q#x*6n6Fs2*}*wdlz)SI-QdMkGLL zkJ(k2+<S?yxJa_x2*R^Nw(=mB%VAyh^9`0P=`#chWpFD*hyeGkEw7R*DoU9ru;G}g z_2<{||75VMKRn*%U2EU?YlrFU{r+xL&N7#i`hU4_T4|;cdhebx7#^A%xQj;XX9v7? zBWd==ny(c9BS0yMUtBqQ7MB;uLh8G~&CyNDoXQVw&tsxegLj;S#jJPuIu;)P6pAcj zx~CtdgCTzoP+v>8Zp2q^9x;{=queKd=1k7J^n`T4tD?KJiHBDhDWGBLo=tg1BFQ1H zM=8sy*Alb0yHRjV46INMGMiGeHw)((sIzQl6oRo!{dPAfy3!l;vW+X~Q-d3OXD-+{ z@^X^}$-+KpTjnl)Pf>@Xz8K2B)%?x<*s^?lmSc2@R^)ViO}x6ig%}~_c=_cTl^NcY z$$6{8iiY5B2PC<p=W4EyM*HbZCwbo+TxLu)0Me@5%3j#K(eupC<7RC#1~Uitxj5mA z2wY>mxs5*tO7~m2NPasr?Q~&g$a<)N=vW>MgJmW{%(3NT^=zKo@mO^>MCEp+<Odqh zErDEp)I4gy#Y|@f00Yl8t%7i--+Q17CgS2Hw(4K@6NxFi>p2=0z_lLgt=vtzFC3;d zyaV-TTh#x|yk#tN6y!g#d1BV$m(F7e6msV?mC7^!onk-|qhWHByXXd}zgDeFx`ri0 zkA8DSKGF3Hp(QcbwF%PbCn_f)CY~4K;*z$@r}?z1l5cO&ZPifRb7_?jjGOQH<>Bew z^NfxlrHdn0W^x87o0eBYEpP+Xc{JPbwA~59TFZ{70MiCEEx<yTE$|Yqn|0*{M8U4B zx-010QIklDH@eaaZhn3wKj;y(W@oGy+B@vA!HXR_^DTB?tA(7$7Kh<{z4QJ0dQF&D zyLHr}XnltUtnaWmljr_RsLpsI@#OSIWD_G_F6k=&&d;#ENW*Q=_9CnTogqnK{5Fb= zQ_@C)^z(d2_{V+3j}56@_q(D)rz63TA8++e!E?lVam1Q5+^1(`v6|!Wl3Ex8UFvK- z{9Le{wnUi(c+J}m?2(yOzGDo?6d!N3wmyySo6lSqczCL=+*lYaUIAPwMxbcyU{N$( zqf2vt!3XZfNC2_M+Z~^8VBmOjfr0@qspyJ}N1O%oR7|8aRoN<J;^d`rRgAAe;ryE6 zIA`C*l-Ri^PgeX?)vKZ1#ffYpFoL%ASz+?n{u<Q3qKyOY7soIHiNYzh-Ok0Wcipb3 zXuF<(*dtoA{mG}l5X|ar>t!z!3Nuk~`8(!~eMmt5I*8`;XQ|9B1q=;Lxb__#b2%yu z8{2Yzkx6cSEn0<dQA|Gayb%%OCmGTq|NQvG)!kh{+8X0#AeDW+_E-hr@UphU^YJfV zC#DcER5($4RcGf}J}FxL9S__`yP&Y&-N^1oXN_buyGQOa`iNlNNQ_l)dV_rNqX2YP z!{(Habl#ftUz`N`4%C9^CSiSuo~o}z4B+cqz-6kD>u7d<Ix%q!EvUx_dxhN(=@!-& z0t{R~DUhV*a~srzUdK%>e+reQ0y?&Ecxat%o#7UP1@7@K&VPT1e8`6a^<0@|DlCIV z4KRfF)vzd))h_a#n}!k)5yn6noplq@l_sYWkm0vsm~T<lj4&=i;MWHs=+Uofy+8|$ z5aqRu1~DXLPD0cXc8o)=<mOAJWgpVjy=+u*rE;4?u=M27shUKYPPu8Tx>{Qgsixub zg~IR>1oPw}MFd|`+1v4u6S{n|J@*p&{T8=U1=&V7Fm!YZR!mLSyT!&MA|A}Of+Y2X z-v*6(X3aRvacq(dd*GWGcKmc<2o;Op`h3HjIlsvuK&Nqe>@H~cZIp0cG&a1OB$YR> zn8M|RyW;aZ7yh!Cqd)Am*AqWIwm^fADzDzTjsO?(E(ZKyM-6lwon~G?8(2U{baXZ~ zaqFXr0>@piXcx+kr+&o`S8|FPzFHXXoS|{Cy=5)KTJg<`d8@g*AHpiwo1Hc++H2}G z%nux)B=5R}0m#>8BGl{q&~m{aJwtCdYVDn3DA+ou2vD1)n59*1d2cg2hP;m86oZsg z?&3e1I%<I|E>c2+;FVk`EWY{^Ib+pZMd@E2ljvqWLLE>sKOW4ln;}6?y%6GxRtjx@ zXmRx&mj0Fr0;he=)Xje?c67e(hr7c0`}yJj7wZh|I?uH0%$%YOu{|+q>s)sY!Q!A; z`LkNbB5p;L)YWKTg1xoTkXdS-iLN0nhc?}1cJOl*@dAxNcdmB3M<2Kr|Hhy=4D$r{ z=1la6?C1(#0P7!+Plb436d7&u{7E!MVSxSoEhQ?Medta1J95={Ag$7TNPnRLzw}vF zp-JGBFV~6!T2uqgnuxvy#zW^VZRU$;7b-T}^VmNa*~UU3VO;OLHiVIy5KLHaiJam_ zaJ3BzsVJxwYziuRjpORCTUW*|7+WC$TRd}i?w7CWUSJ{}tHT1DNDnO53BQMv3yUnQ zK^V;{hAaAvl>i6Dg-3~4dhZ$f>O_u+$rV}-p7F$E_y#E0Ho7geYoW}crzlT*OphL) z&K;PSbhk}hr)j!QLM0yVDR06>+n(%*ZbdB~uNZfmnLI*w90>?t+#xnY*$M!y;!Nc> zgOK0h%7YMO@$sBH>D)8*m6f%-UP&)_lGYF6!HmIw{ap8n)8Ps%TEJk$=F;APBn6-Z zPSc^@cK&MPC!|KxUejT!0g;dyi;HOCH?VzS>p&91FLt)(h#VPtk&U4hpKs%A&#&ZX z>nWdO^E;mqTpbr$LESH^ub4;Pa7N!+Tr8V9-G>%F1R?#N1rDKpw??I`E$xiZ<<;Cs z)SqRZ&I7MFg2y~J+d?{5<s9_AQ9p0b9p2Xwg)|P(gq+d3#`>ld)1y`C2}EqsNr_8K zg38q&WExBJ1^?}#?1w6=19;*4Bsb=(63|4(cweRW2M+gIK^e`O95g)cNbc2)vxb?4 z%qMSsH&t{e?=c@HNF7J@3aWEVljK6fU={I@3T~)<lEY`QT;piGx18$sA`Ca5;Obje zIQ8V#kH78x$^S#L5>d%I&glW1DR8ao{rWt7IK-egRJlRCrQ0E@sx-sVc5~qvobb3; z5yBGUl49z@xEmCA6%&p_2CN?s<4`$K!I~nz-8cXghx>DhEz8tjt+_kMKiW4%R~8BG zna;jrN>vXfwj|I>m2r3@q8XX9g5Em2?dw>=OJ8c8Ok{%J1QVNJi!C$9!BW;s;~}w3 z-%W9vWnlK>{%RP>y!RUr&WYqm_Xm0?cX3E-T2<=gB*9n(!YM41bjr1;MxH6F20Dit znuh51Wuvn4RXqiTF|YH_jCaJ1!IUZ>##60t3E>>>55Ja)g48&f+CvDeDPfd(utCK7 z?29|*vW6{+h*(Z;Nwt`c%haXqE_}RoeDmNtjf^IpLAyDF#li!I4`|~DJ#<~trMCvb z{oXOg_Km6wnYif$Q1br>+2ZiO2^k<+6VVBBcpOyE8Ii<TIq2^Uh@|YBqs1kM`n7V8 zY{UDgJ=5bxt)#AbCt+_*wDl5;yefrl=X#;laO4*`(!8hc#scj|f|8ylWq#$Q1r?Nr z@&Sy-rkkUP6_=pat<xepw@1LYlawG+p+#0msTM5{s)-NyIOMl!7ZJ7QOEoR2%-)`& zuy6BOqlLNzjzbC$7rVrA3t=_kJqRLl0$2tbYLOI<4yZ`=**R?@;gmAlTz_5Je!>A% zmO0u2)FVDNIOveA=@2S4_X5}fBRZ*V?(8Sr<yOO5|9qz?41(+xbQ__g>XpswZA?fv zA#Ir6eL5&9Xsr$+!5p`6PPp`nT$oqG8VyKMy|_@RHn)-+6yOI0rE|2?KT%X5JzB<g z^xG<)^^BD*-%~E#IXM50c+{cO#wwJPZ6RcDg@-BNEu{`m5@3jYl!u`}wqR3~rw+ly zC!j~>CeB3{E{zs}*SRMvd>uFn9ww_U57pG&3wyqxFsg;q^^ftKa;#d2(u|s1Oso*8 zwmfp-e7M&e8?hD?75vtLWPg2s*i(@+p)%cCpt*wch38ac3SMK)o8DTJNNKY3T^V!v zbK!o)5&oP>s&Ik@29e9ZKk(2rjqdq);;x_7A`&oHX&}J$nYjMhee5?F9Y+BuaoMFa z1Kh^(6C+%wLmE}URgbP&^d`IzBdu`TRHJXu#2+X32Yl-)8C}F|P`h>j(4(bz$In5B z#pS|>3PrncbidUGi)sOWeHN}l2I^2R+4+aoCmH1v4T>8vOlYwM?sByb91DN&yUFQP zD+`;|=wlc58>6?1LSJk=0M66e>XYrkinm<?(Zg25w;+M_`wU&P4LQW=PauM$13?)w z{9hj-rjz{YnG^1<MK2!de>t}JXhi*DR!!a#tDweh+6w6E=DAgBzsK=p1v~aS<5UyT zw*k2i&-}$GV{ZbX?F+@4M%|p5dN6X}SZTEJ^@2}zb@bxCtg1mKA}@wbX1*+?9muO^ zA<`M*2$7vB!SjnP^^bMWhInVg`ULWJ@EYnP-qhMjS;Z`x6Fke4X^L4K;k9tYX`!oI z6!s51Hzqs)>>|)=f+EPdV82e@Q7UVg<*wq3g-NeD%>W@S%qO@8=g@}B3p7zBLxblK z=GXtyEPunFNMqw*8^xL`M<jIcJW0&Kcxw;Q&|vFax81M-4g{s6sKnPAZ#WW@q4ig- zxqtUS>aBjB%c<#BY(hgjKHP@iiU{vWyZR{IjMH`q6AxjIJN-nmE}=NeqD8*uhBmcw z3}lH|i`?mu{y$o%I8ShD$(9@YgZ9veqlTp78(s+lEUzO)olJ;!>d<82P;H_ZIs>p= zs+*x<dJenF2awhB$^H7M0Q7{|J8Y3{H~d<J*<A!ysbeD}za2J)+5QNT1B*lLgZ3HG zbJH(m7l<U69tHWxAe(O~#=A{#DBa~HUn@lVF?pbBGeF~==tL&MyeKvcr1#r30px0O zM6>%Lev0BntHEl7ttS)?psnq<Iy%(yg;ErQ_f{Q)XnGhP%V(GeoHoG0D@8%K7+I<7 z1e(1O+?ev-){d~NxBTm+Mgs!o&s&M~;@jU=&RoC5K2nl-cG31uRuhdg1nJhpf+f<U zoHNaO8#&2{r%uX>xIN%cp~CuO&Ij!^VkDh+kmV?K1th8cqyj5+SNlLY+<Z^sxf7GN zL9PFuR3-iwTqKa1lSiEO=LsP>kP7hFAe8Jh;c&vC@K<>g97`5-BtnTvGJ_Y_V}Z2j zaz)9q78f`wCrU=*-zE-y*tvy{BnxCqEP346hdgv<5@Dz}o?RP}T^>=E@4)CEA)zBR z=3aOgi&&r6Q?0fkr}C8!Ik0T~kn)PwS`oNy^7cpxkdr{T8fx_nUb|v?h!>@GT6j<9 zo&(|Oqy?KiUMzychf7+t$i9-t6-*53q3-Z{hdq+^;&E&(60S(L7Kp*fHSKnAZ{6F- z;k#m2a0I%xb3YQ+iWq1#ZFcj=cSQYSJuSGzD>6-_m@N>e$k7Pa0>Mzn4;AB=X*SGV z$X+$rsGPQtYcz;q5J%5JfOvhQ-;*K>@p@79b2$QEiW1M)Vqh=)$RjYf<?v)dUpywI z2elv{Mydj++<f^0tMA_}pFAA&ETj4ZZ`(Y06d>?ks$uU<oOjx=tZeeHh_5AZd~c_5 zY8c8&2f3U1KZ$gkKi(I6xa%od*?ks#7;fnu@A{_%w<)v(1`Lh~fhBC7rxryYU0`?d z3Fxe(^OxMe=p=IilCuGrXPX)6!&Cxz;(EQuJ9L5p(8O+5EGpoPuT{=mjl8_b<1bDJ z9$z<sjo3HAPe{og0dy7@b5B}L(#6JI_;m?KBz+K!&h8_XI{CY<#BAvqHV^;v^P?4O z##?^m)-$P>y_!wkqr%Ui<C?r`!vt8n@1~SXk%vj1{A}wyeB-`xtO1d<l+d_y)9>O( zkrIYHTfI=d*GKCLboSfiZpY@lT7Dgu?^=+B)bSoQ=6IYN9w<>8*kLVYA0YPq=H`1i zl)1ccg@iF5{)->X2$x(OKyk=3JCH8|UT6fOkla?~PtU;WW0z41)pszX)n5H319rD# zz71ixYr7lImoQ^tY?FVhiZ~Md?dWJ?t!UQ0S#$Mh_hvP(DOfNjC>VOd$i&v`@iHT? z-WzZ*-QysW%pzw8CDtEmBH!O$N(t4K){&YkeRLqLkN0k7b`hab(W%!vTz_sBX<TeR zx>jm`8dzs0Q4_o9Q4fLhVFw;-Oq~NXO4ey}@c5+7j8@kpWiP04#&-80pnCqqo#}1^ zIev@HFmW3iY1N1F)u{%w17%NHUo;d4m;^Zcs`<*__7IViGaNJTS5N!JUGT)AS|Vef z54PTYp$%$kqA_WNz0;_A<5`2esgzw=oxD<j!Xb^pjVuo-e@{*}dTA-VX8a3*<j>IQ zGGyd<f{fqv#x%!d#?12vnSFf6u!JIR2C@$MtcytOipq%ii(hrpMC){xJuPqOE<)~j z_}tiVicK9Q*!zx^SF=Gta2QAZS!FHAjVEBfY>n+%0d9-Cw~o|V+`VGh$@P0`yY6a7 z7%sqUY03r{r#wea&zHXlaHr)@Cd@5@#z)Kdp^SPKuHav2_n<T)gbgSe_Qsp|J9oX@ z-P=@+S&f%iHo>10kwYOAlmj=r9`v1iPj8a_WU`xGP=;Wd%S%~!^tG7Tc%hdFlr-t3 z#kA|j*O$)t@BOn1kkbk9mJVRyGStt?oY<MxN`8~rat2bQPb<0t9IM!(jFQ-~>h~TW zR<r;dAE#uzz(EZ8xvkaH)<{dc1tvtpz06t`KdwRrT}{b~oO$k2b2e<p3VCNfb_8V5 zNb$K(B%yL$Mj;Qn1pPJqp2}q7ZW68q$f)@~8~l*<vP9s15d+Q3me_{l3$*N76`pD* zlTT;apKT{wG{gy5ePujXAe4aK?Ythv!(qv2H@-EMjyEZ_C$MK8t7v7Ak&uDj%tZ8> zzZKHL=@dmz0t~Q6xM6rCs2Y(cWm$q_VMemmmX9~a>WR^pNK#Vcr8Fjd<<n3Jt}sJ^ zD$?9m2BxtlAuUT#xj?m$n5^e*?OBIAuZSp?b8-T&D*#i#LR;h1+%{c|9C!h4Wy1v> z&QNfM45%j3-au^KBR@YLwa|;p#D%;i-<-@4yRQ^HZ9wJucwD?1){auUZNeoDxx+Dn ztM|(qAn{I@Lhn1w=X+~#j)2Zyq3L)+2LJ#t-4-TUT3!yJAq(Jx`=i8S(^iLnB0SJe z&*E!voyH(udn81^fOcn&W_fm%0oA5f%64*fM**kbILL-VXG3YcKJaE}Nrd1QI0o>B z;JrU+3xDlLK{?05>}IEVQIXfL(()fm%k~Y}7K-~u*@K_XM;CT4)V)0J>sK{78yL4b zf_5ty$#-LmPZH;fyLm#|bsxX52mwbGi>}tz76UZCQYI5ff8}+$0PAo=MXm~7C`f`Z z8Yz$;d&KF9oq1vEEX7NKElSRbVx`o&hm{cPO2_>*;D+eW4qP%E&R2{c)-t@hJEoA< zQY?YI(a*vm{MGdx&}L>pbJi^O;%Vjbd4c|07MZ3}=_4ndc7+OgIhE2Vm33*?&i%41 z%19BfCuhf}|9Il4-U*k7WgQFZFgh82`5l<uq4q;VxvIMx!>Y`5@`&)KrQ}tO5Zs@@ z@VazQz&(eRDZi)y{Rah+*Y?A^+UemzNIT=IeJi3%VXy}-@_w>Dt?ky+VtdC6k-q(9 z%HELx@MkNF?@2l-5T=A<Q(jd6T9cxy#$XO+KikZR$k)pxwSeU`bIh%3Ed=gIqSu^Y zUA<Q*WEng7Sg82}wCz{8QRM@9_YWRBZ(Z9yZq;Qxs&18!toe$lc!(RRxX1P6s%^AH z0;=-0Mpm~_5Ze?063%N}y_Hfqv`T{_ufUCX)oGIMM%DcGL-=zQ^^x^|ATj<ao!)C& z$NGu@ME<*Rx2C#MVWO{q!}<A&6^2JO!*_KLDh2`7!VO8)yjlbij(A7zI0;C=aymxL zwv}@#52_6vR}y9->A~=8x+_N;|I!@Hlr|m#^~`L(<PM#xM7k{Rb+GDChxHiypuZln zzes=$1#B@#4VraUv#YRrg0s&;*mmDnv1J8+Hn{}{^VDd(sxV^>YBO7B28&G<md4*p z?*4?Es#Ct0GjrZf=>NFWfB70dJ`%tBw|v~sm+byH+)XPbfB$zcfWI*9qrv~i%kN7g z7?!Ebz+xfXi{rt4%eU2*$NXa%Tu?FGsizB<^NxGLS2jAV8jL%^(O18qjgXOk9z~{A z0c_`Ve%U_ICVJc57@6gC^^B#T%a&%F<28q%EYDK4xd-1maWT*G!om)>5J0_6-0PWi zgw+yC!_+m${uWHX{_k)0|H8q(joNix@h>|c2@)}gTR`=R+k2IcOUcxfhE5T&#Aufn z?}#Ot>X`2Cc!^#fFX)bf<MKMzKc6`YMVeDzWU&T%4X}j*nUU>LB76+Ozz3GQ;t0-@ z^jE)hBUb^G(O5jaH&MZ63EP$m<e<=1!B-<bIMGNIUW7egE0CLP3MQ!Yfql(rPHr%~ z3u9j$cchQkSv1Bq+PrcG#*|qcD`qw4+dWNMw-Zr7R&zPq7t$G;hBZzB3|)ej{ytqD z!tf9gRU6Rt3_F3<eS)XGG=mK4<)M^YI`Xkz)eTt}z_dneh7VE~l660j0U*>U4EmMO zU6;?Y-axHCib?)!NdIy1yFxPCD%&M9RvG<+l=<@%Opq;wdTIR@yZgou$6z~@X;Bik zVX+LJzKG%un`m-}g~dDgDL0DlwPaFqz<CJD{cZ6}VM^!#@_xEqoEnhi4fSTG7d^6) zNe(l~bcHn*V9CTvKnU72QG3}#htUp_)YY#g1zbc*rw8xmZ#vnjV<p9jtcmfnS-o<z zoGfmKUbtHe;N%oX^i8t}wcSxf!+i|wDcJ@F@8(s3gvvXPV#ctn>vSaS_GE2Ghp495 zt-UArR9<QF6uZ9$gIwiih{HHR^3f27To@ss#dih8WI}g9!Xfyl`J}YBwRJ831ceju z^bhk1sdGt1_xq#WhMHodIPS(}ZJmI-Qb@n;#$SpF{`qQ5>41K@N~CX`I5|8JK;%To z#uXlpA*6sN)@puT?eAEOVhlAm$4H_#F&cBHvslMqlvy?$_yi3@qiytb3S|+zhW;QP zX;^JcR*K@NSk}K$ZgqZ3gNfm(r7RWj2z)Wy)SG9G58ov3@?Sm0@60*4qp5;xRw|xO zvZru?aD0(db13?gDJ#<FiGL%u4*#FT7WUu7*4OBL{2<eet-E&}d*WQhzQg@ONF|Tv z)x4)0>)56cgJ+!Tyb=BPedYH*o?s#=%x>Ky;H1{S2=4cLA$d$L=sfD~raMwmq%W!W zPuf#I{kj?X-p8Ge;ri59KQE|X5PuJ3Uk}oOkJr~2d^j6wfmhz_0hMRo330b|L3eW% z2RARYNB!&tlj68Qf_>X%-ei>)W6-9W3eH~M7Y`JCq=)hCIYwuzjl83sH?!5k>kW41 z9%kFK>F~;Xbg)-}Q!(`MGA*>BrT2>DW-sH!A_%zww;Q|!{ZpGA!{YYNm%8ElWB?|{ z?m278#uhSDl@Y*~u;TwPZ!XF0ANG>Q0iaAy$Up5RBSV{5rQN#0%irqoc86UpXflPe zP%Uk;5Th_>gZK?bSUH-sHUEU7J(X&)yk#vvF0I_ra!`1FpCJKX8tAlNEqBq5ej;Wj z*N8(hO~;J~3a<`Q50Xs2V-CZC*XT6VBDyno`sq|XZ^#O*1r7p6-=?6OFx;ALwq7N9 zwu9;^@WY{__|FDOP)#&>iUe-Q4dN?K*`|$Ddrk&uL-cfq5JYF=hCZ}LlM4LA@l%aJ zq&K6Oz~&6qEI<*K!3J;@z;?o7aj6^mFC<Dh&w-EU$m)?sjaM{{(VN?WTVE*0v^7=} zH&nskx?;fvK=)IX7V#nyA5BUFBJ`GKOR%!QbOWn5(`tbZCK4w!Cr8@`(TS;|xZMHF z%w*_vIT<sCo((J(g2ZNk8+>;cv9;B-`}h;PTWHc$672vAspKrv&^oOaTnK6+7}UY1 zu;P0Wv~f1CSQcFh1~3emNH9*nS|bX#y*gv;?Dlr=Gy9}@5${?eI=|H_9GN)wcC)=X zsL>dkhIba|JXIV9yu3c_$!V^=jUY!n)BF&d{r3Pz!nu_-l}Cd~D_eeeS2_?5iEQFQ zNiFl<fco7bt7*@wsivs$MJ`tE?_fFD)kS*dE9yDsi~Qy!eyy$FIEHiL;;aC_8rUu^ zto$k|c&$A$tyIPa;Q3O-Ze{YsG5q7_<Uqf#YmKVRxX(_aYHsu^J+a#fj$t+JMlRda z+OG)qfv`GQMn3*M6Y(|S?-&3Ghd_H2f*ihpW$yn0OG*BCp&7~FU&IoSaJ+|$jGHy7 z^M}aIDK3myKThXcTS=!f^nW8uu;#C`0cnM$aM_k5QHhYF8kjh_xSY1O&xx^#i`&ag zt~_u~uv-ChkLVRxW;6U`4D6Z>JC?|#3f}=*7?QV_+G5hbQS44+sfKyq!^o&a$+`I) zg`<8`X-(#c1ug=R8B;vce!aDt2x<|o#A;Y<UA0LH;~(7f2wcZGBbyR?9*}@|0>qBS zxf!(FvL;2^GVO*wvh$HpI0jaeZ};U-;4|v&)R$Lg22Gtjrs_<%)eJ9D3VzAmt#^Fp zO#6&Y;HS+mC%Zx$G_1-FD5{30hL|Q342P&si|Li}+;?L}=B8XFDPQ)G>rQGX8z)#A z|4t#0)(7Zn=Xw%3&7;}K4G;$;fV^l)ej5uZq>)p_X!cgUqao8>eOL8M&@r(HUmUQq zam7P@Tc*?kY0wa?aL};+lU9?ZxN+YYJpy3^K~}Kt^9WMP_V5>G5YnDJI#0oDFUXz& zXy{1jt1#@y62!sf&W7(sNfy(h8&y4RE5q{veOe;$zUQ(UivaE|Fks!0`r77~fz`Yj zkDg1xfPKKOyuv%qV%J8BEN0s$2>xJses`V?c}nxZ3F3!JWo9VJ8g>gRXSN8eoY-)L zfK3ZZ+x*&a;-(dpElD(i{iJToUsD()WUTZ6*$sy=tg&=OY{<#M->=`X_Pq7A530yw z`@5L}(}WJG00QRFX!2dhf$$s?dY<Pat5aom+jBo=IH2JUR?JB(J!IyseZK!vp4PNK zP3`Hg?vDZWkB=Qsktbo{?l3Pp!&+Vcen_FaY3r+Xxn3-41IIs9hQIC&zRDT(0I4r3 z_`+z$E&2)jpD(FH*gy(^;qvhN-yX}n19H5q_269Jq*EUy+};7$K)MD_DLz!f%ODu} zrE;+efm{quEXx<&0X{EA1zc#I2roh{`!(DqwR18RvH^@hHv2OuHWnSrPGdflw;~d5 zBaE;mxCb|MgirnT4ah?3_;vQ^-p(PMcl#^ucVafDQ+Z&7<)1{doc0c?dV3!${Tk2Z z&bZzI&u%-r+xu~n8?tX@-(U9opHjt>JepCu#ACL~_8;{tww@`8dzDFm2RU!P)8kCz z<VqcYKvcU}F%$0L6e5I44f>~>5-?5Yd+Rrgq*3hFJOsRoT3YpPIAaee;2fij<@KK* ze3WCQg*(aZ{!bMSun{;WtssNzl4;9Bn<<uGb6Qq2IF-T$p!IG{4Ad({kIW!?kAm+5 z4_r^LUI-v0P7qO;V`K##O3Q>?@$?n(@m!IV)eTV%sTBiIU_geqz712GvD3H#L6`_A z&MA*?_}GBeT-Bd)G+-fcCbw_NWD?T77L9NQ=3x=+=JWkhEyI~QG=|=Y5coMrRy6@W z&$&#uDI<&ko#xQ#N;ZMFGAdYBB(v9j@>TbsT(o}ANdHnzhVGJ|1<`+UvA=xQ)Lt$( zU)>vkjYPVYzz5LYx>ZWSKQ+-VAB(gI1IEvWqyevjW<VRl+Gd-<K*P=vUeJ|_{B{Db zO>#?<_mWLysq8-2oaW`^=UGnzmpdnd$-VI~KLVXaF@;!PV#(ntwNFygR_jJ^-mCO3 zeTUA3;&<mLFkZ)QF-)q9cPK~+h@TZ)w;J?K3qutV3tMXvit+b%Rx&s&MxIoPZsLJK zrjZv*U}EuD(#CtiVI#u?1KS%Maj=XYgdUMUnIMStDiEj*{#^d~&mEi1J18kMtANEN zU<8G%+o}=Zg);AoDM-lwQ0s&UjL-Nz8cC2TNN5C7yVnxU(@W{cB7Ob@BzFqK1v&l= zB$Xcllt8&MR*mHMw`MDRgDWiZN;Cb*skj<21hMPg=+wU)yg>EnnCN*eJ6M%ciy#Bo zVcCP+vJXPN6&>dfQu>iO8(2pDKe**drP%3UYh8<Pd*MDnn$;I#G!4)vv0gD>PEX{- z1~OS!FVIe}<Fu?<By|&N?G;n?pA21W656MB8nLgf;VKIA>mY4J(DFN;e*X`<<X`+^ zmkvk&V3(YoSfYd?3MFEo$mbULQ8si2Zw3^-m6i*wZNYlv@q7Inx|R)K&qfibf;(+( zB%aWMcnQ=wiq$2M?rmU7+0#?3Lqb}xee<QtbTo_<Oyz|O@<GH|wBb_seo;YrN9CkW z5?Km<s?--8rz^CXB*+gJGID%GJMC|<vFV}N%t+=I7IN{<a6t1|D>XSZ8UsH~=f$?> zlujO6F*-#Ib5UN6+;D%ZRU%wtraR!<s*KyYn*71p8O)TzoY&fY31shjyRJ95*SotJ zisS<IW2W?N`D10n)AG>tmEZElWJDhJ@lf|KBXC)$O3@*$<rT0d{#-`>ueGfi4p39& zRR5bPS)s+hEx#b3JxHfzBhRoTm6@;}{`Qvps$^_>NCX5WQHHc17$>2t%37v=%x?AT zoDGU7C&;i2G-r+*8{$Vl97$+)v{@|n0r@b8*WbaFE2vH!;_-Qdhhevy6@bEgGp&?a z92D0m(P5nl5oJ>L_?unbqh|}L5rq%cTj2wID@mT!!M9OgEM`u60g{1!91kdl`m7!o zFZ84-{sTyM=$TefxpRb&u9*wbttjSoC><`I?BNE-6k5zm^ZB?pip%h}XX%R(up2Q3 zKFOycem0j^gBB3Y+hA})POD&l_8K|_X-X`+TCQt{CU@h3<_h6=c)s_mXiDKVVzn>j zI8C-SMsyT8wRT+y1<a%F6#Skd+l5uGDx}@I>nJo6yb$V6sr&4FbVt9BVBMG&_!M5U z`SGF{5=D}|ep9BI+x`n4{OBAJKH{4|IHp|}4yK?pS}M&hzu&J>FuLm+2bmF0xibv) zVK{W65j9X|kY3mS5o3->0PDMbRWcPdc`Nh8{v`nR<l%`u8XSrVn1Tu5SsD4RmXnQV zaQQo-+c0;)tcgpFucR}8Hv|r@T5;Fe3%LjJWk8e&s%ygF$p(yRABK=B&b;K~2Df{- zr}@jmJJH!+Ipm57BCZ5WhSyq#whLm2**j#r)Nv6xo79F0*4XX(YI0>vKfB;kjWOLu z)+EDTu0QMI#EYss>@)_jl#K~M228IW1VjVKtMgJXa858X>0co-H7-H~4%m;;p9Ct) ztvM<^B`5gu3xe*np)2hZ;@+#-`DHcX0w(RQVu{#3DSihp3vkvlS)L#*$3QVW?SOl* zyKz&F19>R1Jln8G-Ta6at0@}(Tp7iw@l|Q!z8BI7Y^-!TmCju0k%}4_y%)@CED&01 zI&U^Ih4m!imJ^_Tf0$0D9fSSxZ0_FGGI8lqw|{`1)o=QSFo3@?_`RZHqJD=o;OQY` zpihzQ40CQsiYJ&~iR=GOLwr*G<@u&4nT822bpx9|!W{&jfN3iRR!{%+VOBChw9SZW z-HE^JGhcQJ52z@^3S9d#3~4Q5GUNZJ$CoN7y9Cv{V!hFSm^K5;ZUJT-Aln?0+wsIX zSq=^LXx<Op`@FMbxjt4`@Q2FhrTr(Bk5T9IO00ac)?v4GrtC}Yh|u4ULq%l3IsM2V zxHzGuRAoi#<oBCvnh>5%ZmUn};d|R1r3_b3{Ux$+F0dC^RZ}GBTT^#2c$dTd^oKAh zjf0~WEU2kn<>SkVCt&DGdNy;q2;+lj*Vs|HK^f0yEpie_s$M;rxq<u#gUi(|SAl0~ zUe%tTH?<54EE6G>50YyJNr2GLeRl}!iSaA{`JL@rIbbRL=Voe?3Bts|Vh_#24?mJf zpVt6=+wWYT(YXFDY+EzajE1NJl1n4i5Tj<cow+Zvg3Up?FRC2r<5s_%6#;uV^Y<WB zL*Jlx+V+b|!<ec1v~C$3HU_HgMfjUxN*V3^MFM#7Snr)}SQ1H3r$xs&J^7>I^Mvr& zh=2iy<UF@I!L7g%c7ntZ47OK<Z9{1ibIVJ?oa&3QDh5fMge}(4;wn5-qWWCyXz0Iy zbou(dBgo#*Rt&icM<i0x>7Gc=CNBPWT@|ee@q)~(CGd_Wd=JxUZmM(vd^pFP9@Nzq z6yo(cC8*6RmU~<%KZr=_?5)jQn$F6hX%qp3fGTSw^r(V3RLbss0Ud(%UB2+J@V<Js z82yfwb_Yvw3glZW6DPecePCfIDBhi=Z(1C8O*wmvo$n9Hwpk4SjN5<Nh`wNaU!2e2 zk}3f59_-m1y>3#nhfAPGfFolsn;+r)1BO|~PjRYGncu-Iwg%?w_cN5}6Dg^od$G7P z31w8r`>Ch8M><;Q8$8cd%5G31ip>r5FFQB_DUH?Qgxry|KQyJdTrQI(*GD6F&MNuq z41mJ>Insp(<i4<P%h}!RoZve){w~iY1hL>=34rlt0}^9M!VQ6*H}Z<QG>W66SToF{ zV#aZM#VdF6z?tM?4LtK4Gqs+siFoRv<gT4^=le+%nE#|_qyG&&N<*id+r<SHkY~P! zGs74!eercJ9QX$O-?*#|ZqwboEuqIc_B12GoIIV~8!ayAg%1uMx?4v<Ny#@%-rGMW zs0xp`Qe9OxGIO8#>=Yfohb-BDdu1(-l@!Z&Pt+PRG}6C2OG8aASThf{oMRR_P;0e( zVE9K$bOAJ8jw@{JeHMh078-QXevGh1t=N%N1@hTh`kWigMj|p_HR1p<VeIaTMxQM1 z4Dxo}jKBRe(^cpLzn}*vesTVPSQ{DK#7qG@CXbTzw#J+3+w{P7o2+Rfe?dyDMe&B2 zMg#-O2prBq5G^|orMeE^Y-lV4N?-r7WYJgsk%|FJgFz;PD>jC>Rm+7VRNvwtwx9lP zxB+vzPLeaY`^5Z-b6TGe(z}1r+wp4;AEcbVYX#)tdZ|W8qP(+TlhacBnEHk+u_Y8u z4vfG?_52h_uED>qBk?vjHhzvle3@{!717paIj9syMo;e+G)^q-)KP3tfc%d(f=uf~ zH4g*_fLY&Ynx_t%N^${}2np@~?vs8s#7X1j>lBNJ$f^ar9S$jeTO#(jiz5r?cM+8B z3P6lu#f||tVN^OG;G$SGEFwnBD)bCB9M)T7@nYNCEsPVf#GaYGm2~`RD2?G~JKG~F zRLLvtCXCZZalwg7#iixpF3(!S#%Ec|u5zRlLK8bc#J4R85o>fIqMcAMWMxYJ(~_L( zj!4LC0S}X`(E%<2s83(G7N_1ZU@6sU+GYglr_t4olW(p1@-*B%`0D8nqxz8yA9e8` zNUi4T;4Igxsh_^twYg`y5-Z{!%Hc<MEA=c^@6R+A4pW)1c-QD}a~pzAVY!vd-Q45s zGmf|@T4_&5r;SZ~Y9<oxI}?H6yRi^G$PID=Rt_1JomG{qjoZOvFtde&JtYVDUhJyS zBy67Aa}`sq0lSUyyf2WN`IEdkLIT|c1G@g+7|`!F<$k}d<i<}XBxpK?Hx|Cvljb3~ z;;x3!;Pr(>|3OnDU*W+5=%$k(G<rLq8x6FVP_+5!_r@Qg_Vs~0u`Hf1Mj!|MskCgR z7eMQkW6IhaehkziD<&lHKi*rvLky}W{O<(=_?ypL`H!K?9_i^kIbuJa7O<j%%cI-{ zD01S<^*b%#?)R0kX(A<*YWu|iZggEB`UuDhh;Dw7L+H%F%X2VLNz91tisJ!TQ2I?$ zIncz$MLepCU*_89$@9f{cu%P$q34=vR^!_j;%>@+Kr<ZdywfjeR?WiI*ua=GgIu(_ z!D!x48CvOA;o+vRXl_!ktc4J=x)7z7sO_nfcz$mub0A3JA{RTdMQFk22MaB5;A`XE z@>I@iA6C7VO9nJR6b)+$Bju@96`-p?!D1cRzm@j5ax?Tl5~^Fm@UXts^7tmTY52qb zgB2W<xXucY<vK9A(67!W1ZK%3Bk2CLKiH=gv=sbyz|p8p(mRN?r{2-Usv_zpsu#zv zz*r)AM~Tu~&Z6`__>$?@Z-zq;O7+iJVDfelLt|pFP0J{{FUlU0yKDtI6S?Y8J*bZD zR{zI3Z8HjATvE($P(~0MT0ZEGC97+CUAIY@3;{DIZxdX}r3NyW3>;ch|D<j#%%o;< z@Gfpd66r*WLAu)l=cI1nLU6XlU6stcaZNxP?~cp64Nk(L-d80RaB^dJW6Aug30e_n z({8VWmYR^b(WA0<E#-nA*3Gglw2${c_WHjgNMxP$88*0Wch8R~AWCnjj|7Mwl)~1a z|A2bGodB#x*wqQECeHk!`Kv!bA-au&%MG8MGLc9%zgXH|h}NHYS@SYzHL6FQmK-+B zpZVaQe)Y#qz`rB=Rq$@(6GyYUV<%E+1-H}{;mwHHpMIMb?j;&He2Gx`r>+^QOmM)+ z3pT~1*=&cV)BD}+dCBrW8|AGP_$yR8h^PuT%*UcYoz+NSyVJW*L;0PCG(SOM=%R=F zD$#yk;(5RGNKlx^fI1<n|1EApgduEP8Aj;opv`wx2}R|#4`j_^zaD~nivRi&H+^Qi zNnk%F9!xDd!)wWvP#V5v{gQ1ST9MU|^94@0S0&QQ90Pg5`TnI#uH86GM%gee7qW*3 z4RVG;-s-*=<}DJ7<d*ACpe{9(;+CUO5QB)U&<M>xXvt!Xyx5gV@vpr^!EHg$Rl1|5 z=wzIXE>zU-|HbPxEEV8kgvfkngYVGFDd&!&*?0nNS&Zu%hM&0S{rwl^vpv=pru~Wb zKLcQ60e2-2*t0tS!@TAF8(Q<f`V(sNTA)c^s0T$H_uv~Xl1{&!u6JbN&ntu(Skv^) zM9Dl_iKK#kaVu|;^qP6}c5fZ>g#$Kp3CoEoOrwijIvY#5?qXP0wiz$7FBx?g_!Ecn zFB)iX?4LEzxdS+z-cV{$>@0s+XAT9NbET(C8Ivhp@|Fp<(=TN<_`{vb5_P-bBYowo zx8bn{KvOd6S(rcFH7Eph4u{N7(>4#lED!r~gz3K-pglzdH_2el?l-i}DR6I}XBi+K zibe~c-V7;*^28|)GZ;C6ia+>C<tafcf#i?{wGe@7DlSf2PfAbKH$0uSnwrD*qoCxR zk+g*1AgbpG?+9lU@H!sphYb(BFEUz&#|-IH5cvTPpFNB(?6cf5FFWiHxeqhlGgIvc ztF2aj!d$LT;GcIy?hLLYEa^2JTbiZ3e38*mu|jXiPO(vty5~u{dPcpU0NmIoh7F`2 zWZ)!Oz^c4jzQ=`b^zQ`mpib2sg=_nQJ<|9MAJ5NAU$+46r87Oxo{gY+2>v{iy<q&^ zC>p|bk!9W6W=R0ue%CoJocMN3AP1M;u}{VzR84(D?eRRki+W0_q!YZFNIh`+)zTNr z^&Qa?G%|otC~I~5tV~8Pu!?tm5N4+&c=EcdiDsav>eK%j=F{Sd{V?;t-fG$zFo*EW zCP+uP$L>k-k=rxB`nrilUt+kp5YZS@lW7Bj$(sU40H1kt#O)p@K&pY;kDNAj~ z{Yl$NOr|xZ9~{IPH4@i-2%}R>Qgm#O1I9AHFYCsv?4)XGTo`Go<rD!IQ7|v%0U<KX z!(<4w5`G=a@g=8C{lZ}=rEaEtaL5itr6B)ucEW7WT+ql=+qX~GT;v?dI_T<6I3MEC z9t`wOo%N!ABO3v~b2OMnInz*ow`eU4qnHLd)2a#;l;1HVb!5Lgz#$+sN+||iP&6iZ zHzj*RDAbofQlw1Lija9g4xTygFxhGZQpgsBxQWCP@bUwgt_cCXe+<CrxY%G7N6bQj zWnw!2X5H~a(N4x?M*BYC+;T`gD-~1PifJcqe^NIn+zb1QPA*R_+`oMJ4yD_R?7xb} z2RaSM&tZScsXMiY?zWL{?cuMZHsqcIkon?`_Lb~I#9)+*xL<#>hQEWeflv}Csi~-+ zm;UkswRfW?d}V6xTC9lu->+UiUy;^-oy2sUSE;_HRWx6FZ~o2;%e@}@)QI||cB$7v z?h&x1l=QDd!<y){1h<2u@ABMNCM3lCUAr8$vy67R)z649`Vxi<<2?M|E4FUNFK+e7 z9++FWhdSEqku}{z9~9+~(5*O~cc{<D$EuvLE^HXi#;@92^3w<?q0%>0<;hlbIXSnz zeJD$4{a5aG_)U+yNK&)pSI2zF2fo*Dho`lLPS;T5Z&e>Klin&|o7C&p5MM%VNpKK= z?55Sx{I)2#GXJ7%@OsgSn_@9*oDXIeq9915fTS0Y^xR`1)Un*WxGzBGMx|+`8E;vF zrhA-+hgL~3GTX6hU=XC#mrm=FLlY=Kv^<3ku`0j(p|w=GO5hCYRm8Qj=N~4%RVxoX znhL$+#{vUy14F6Z0l>#K^@`^O&;gxC)s5^nE>LaEm7oJQU#bCzj`bs}<5_<t;TBM+ z8kxuQ7W)AOjgqlW28*H5_#<c~FDxdVccEP;mWjp&F{&5F8W+-s{UtBjtOjFqTW<wi z?|b3SA}Hft41%A0`XGdZttb(ad%PF<{B0orCE#@;-=*JUb+oofOs~*FpwtuGDO`vQ zY>-X-_V;ByLvZhbe8D%!8dL&`?%wE`m)Jot@86nZ(@DEnDUcL*d{?s&H;r2qXT5dx z4J?%2_Y$1(lI9jj&!XAYZlB!cbL3m)#oZvMmHi~s-UA1NMLC7?f!8sersR_S4{x|@ zoFo7%g$ynR>*FqM+jt)LA6Qq)tYP3b;awnY&K21Ut*dIAQE7nNH0mlz0Sn~_%Aclw zAI=m#hG=)_Q;2|r0nslR((5yf>8>|?U#&SO1#0K8J||Xf-fpxF+uq^DMveK%GHVNl zbecd9!v+i})oy@ahNeprFy-fRpI9VpI#r{80W`o}FE(xKywmI@NebObiNPv%yad(_ zdEfIP8ZYpoxX@HS?Sk*@Qy%z~yPJ44hl`VKWf%89A9@Gg5{sX`D(lF|%wb%A*iXu( zTwst?3CZXtR$-@F%ER;Ab7M(ttrsQraCq=sgr@|6B)M(X$e3)6UuKCcwKUbZoP#Lp zfO@$c_<8G1C-1u0Y!k4e+jeOU?!>@!4(em_xrt!@6orPPstGW74boYQswzX8I<3U2 z?S!<0{?NGOg6Q&k@uE!UM(ZTshOZP-J5c6yeYAhC)5U2gHKuC6JC&(<8s)Hk{}B~K z|72Ci`R6JKR5CzAQ=%lu7g#Jqr2}gWa-pn>hNaiXrWiS?pHxm>!5~Klpn=aqI**h3 zYPF(otIim>n+_x!cHZ!xnp_B(xd%D%nv7$EFKc8^I&N`xomoFt>SKSjqrbgo_OD-H z6i1+Num0M*iMpO{p}5`}A++@>so)56&Q$liH*0{UOnGJaq#wI0#{}Vci8Tl7HLVyI zG+q%S8*WZmW^x{yin_Gdl<&=$RoU$z@s1Qs^$vA@mnv9#Up{qtv)&XJ>a*%={+0@1 zZp;2<97ou**1`WC&JzO7LJ6z}>t?mBp2J_<&;o+5OpT=Fi&~Wr#Bn}U%_v$iry`^V ztLbD!7x7z-A6C%`xz4wj9a^<zf2XxeYo|Rg9hPM}&^w&AGf)7R%uMvRNn$@+^-MI5 z5$`J`{9U!rS)0~DN3;ULZ^14_AdU45)^guU4R?3KJC+O&paWAND!e!yxbudIIm)Dx zx@uT#GuSr_XZR-K6@eA7>4QB!PsHj%n`L<Hje1vuyGTOQ{>r18jH#C{)|7kIhxc}h zGijjU?S;~N$B_V9;i5-?t%(Vu2VQ1XDx{@Bf;d55kL3-sSm7x_KCr5Xulp`eCz+ws z{u2@fVD#g@RQ4&3&P0K`g=q?efX#@UpHF7uChc26mn|M0Px!UnuTJ_f#BS|mLF8^Q zFx%iev}UB@0!$PuodZDc+JgxE&6+evIANnIzEu2_?Uqfbm$GXVt?J}O;gNOblpiGl z1lPo5J^@0%*Nmt^=h~vprCV!kaQlm^tMYlQQAS80R8m3_yCY?X<8z4`mVV4b6tZV3 zN>^7h=id`W`69l|RdORno$y13>gMEbAhB$VuVp92rv)BZdRnAn$jZq<1YFTbc;`zc zAl2)H#*UyfGP2>a5{4sMd*y>F@0=~u7xOEK!f^_RQz#--+iX*!Cjmn>G!&OuA+*gj z&dXyY7@sf2cGJr|LBwGwo+PT>$s_?()qIzgRu86Cx6FAyl2$}o5P)O-q44pbl8X<- z!s=GM?RkrlT%(VielnSRV@j-Uu>#o{Y;<o*;=NcgUofSp!kdR@R0*<f*^CzDvlNc8 z<~whb(h3|W23I~REu!RwWQd(F>b0Y0po4CDYLQdI;xaj7b^>`mon>g@2*sWX#S*1& zzh`ZFAjo7mZ}vo6rXi0<!^$q(KF!wgDN$2=cYnOW8A=X|N)OiBtV#&f+CAC3=M)+F z*$l=l>+1SjiPigz4f&2Fl~E58U<YOUzz`>0Y&BBg`F^Ly^Lf@g`0zIRo(ReiwDGb1 z0bN-e3*>NxVX4CtBr?fq2K8spOGFej-{}u)e(h?wHVGq}G}<3vGuAF!<F-=&Ig$L) zfCfVNmod5&@#Eoum)!&yI6Y1Iaw|j?kAQMd;-iDp8c&$iv68HN37yq`+mq?JWU;7E zT4G|zOsTS;Qe`<b)0b|&NRD(U!Bj#0rCT#NZ}M9C2bI9lzkcTw3*8z(Fk|&-L<gU| zR(%aRgsNS(pR|S%aDSn1Bq**lBerNzYCC{-dYGrXbj9?##gilwvLTA_Tzzm*Bn7C^ zomWsjH#m7-MDocrES*&jcq7I*$za}D$M?%CVp*#Yx0cC;P>jWjs)HcImpTl8m;+(w zV4qqMF4WI0z7sYt3w+R+UR#NDq9U6cW*wcJ|4uEv)3>%%jF5pNZKKFO6E1r+>obAG z4(?+RBO1E(uwt$_#i>~7ATowDtrfO^+(BR~FrxYthu@qql1@>{SGI<hvrB?MV_Cz# z3fUW{PnUVn3oieqT_@!g3c;{s>5io$TW)4kNkHAGuHC#`nth=A6xNwNoz+d&aMVHO z(Aii2ypIUXJbTxgYGI}9QiwI*n9bT9PTSd1bpyrmyu%VdV&6SIg%}*sOs6WXC+vIe z<^6q!!VI|{aYsEA8Y5UvM%LSh;T5?jE8_6dxD^+7|GSS4cw20mG(P5;Nbi1yP|lXf zSW<>hXu<gjzu~v+Pe!j<M<owx3FQuOH3aV1^Zw5m>jIbBd}?@M@x<OJw9hB#VW%za zlq<|JoU9>Zd|{kmB*V{F{0H1f>NB$BFcwEcGm5I;>a{aS<$+K>nag7Dvix;-p^+8! z8+$n~Gn=|dc2~)7B(V%=tD<aYlHT9x=&?HCq7rK?Fw$r;yC8IAKT4t8uSN~gxOF@s z79eDL`?rG0&I45+1|JQMN9&^9cK8&3dI3sg$-wUNDZt}>?yfe!CPqv-uLW_%UnW1| ztT`o>1mw?U)+}=~_iU!0R-D?-SF8hJd^oa1dh$cG4X5THIIah<x-UwRGN}UueHig{ z=qCjK*2Mx3Pwe1lYstc49Ngf4xs=?8ixeXQ*HI1OH$Z7k+Z=3Hn$8Uiz0ekWq<l~c zid{^^cXzHxMtXVqE*K!hUqLLfF(dVKoFm2f;7+%@>L{DO>6<5`{$OM(cZm?Dn}GdQ zUEo87<z2!MV^0xz&M8hdlL0Jyr3IY2Fc4aBG>15;Ad#xx>I#bu)+C#D^A_QR8D<>p zXbAK)`_{iCnE0FD<we2Hnf3#G4Rt<}2S!ate^%h;ega}Lo9={``H~hBq}%Pe&d<Bg zA8hu>xrpJp0!qyJ-83Jb2b1*oPMSdUSss&W++7|siqU^V^X9Lwx}TQ_rQv+ldf*N& zS51b|6%k|M7YT=4TW7rx>A!vYCfp6IrLSTaOui3Ee*(}{yysm*)puTIed=o_OEv#L zjJ;!HW?j~`U9oN3tXLJ>sn|&+so1t{+cqjTDz<Ig)_Y#veRp5oPkng*z=^&0T6@l8 zjxpAx6a1Zs`U?)aigzz}P~y`p$Y?)rAj5qbLha%75&i|vZ+FKzy-{ZN?d3|iAJ4_6 z<Jm?Edmq!qC@oIwx6Y0R%rnNi11)}xy7-UbO|j467Y9t6I=*cS*#X~fQFB$YJ(Xp8 zUyPHcEJ{G!b-Hj6x(u|Gq9e?bJ}OYs+YU<SQUt-+#lEGDP`4cntjDDe)Kiw3h`I#O zct{|vP>yB3;9=XcRfAvWTA9$&3s>%IO+-CN%DoF)ql0V@s}gU>1-*gn_2x;TV;N2` z+0s*+A{3B2a>XShHw^IhdqTiL!xM<A6!svy+>EJ*JjnNi4=k2B4$Qf1pR40Z%HsBH z--7$o8Me&4D7Ym!+)I4B>$$@1C|%uN35dfUUaA1LuZkoCYhW*B2?y`iw;3d!Q+2`2 z6*(yG8jwndYaDjVHhEGuR&4FC*9TGG)@tACQhYi8JrEFQ(&BO*<bKsK2E;%Rx4WlX z-7lA2-P4zDGBd8f1PD7@LT$O~A_dKxnIp`I(Wxhc5hEcJfU0mN0BNx8B6?+XI(vn} zt`2QJXvM-rVTZBh+b1fYzL_Co;R^Gsz{?))BonCt5+@Jf(`kJg5$~rqp``kKV*Dd| z;|gMjR_*l!ZSSckeFW2MsGy7mwcwII&{|cJkECOmgjMJ{{rG`YQEB{ex1JUjiZrf7 zHDP3_#Syt9&sh*l8pCatPu<`>>H+-do#%I!hPfmauh^IZWh<T5{Vwctk*SlDwTg63 z`8c27iKLqyb%uSxkp*3?jpwvZB=|5HC>j-aoZQHkguGld2rnOfBSkTas!9V$@HlGE z50z*J<HGANk3+d^EA}=UC6MTKtLXuJO1dQjM@JGBSEo6%gmc<&?n&uah|JQR4n1DI zsea6dlj#L%qS{BMl?2b`Y;UztoV@XacQ<eA^*WQy+JkwO;DhCGH!yS-%gKN*4h_jn z7p@+-xA@hB+V*l%X~#FS|IC+1xzFx$INOrK#G9jOw6R7+-TOK{7lSd*rz&Lm(npbE z6<_)071S<d74vsHPB%Sp=c{&(vqMl+k`ra7W>mL!XAC<x|IgO$Oj;ao4Ns5{L}wBm zw=H_w41sVVxh@cbGyG_Xs@CKP_=ui`cl#^>+fu^7jEXY|4VMd<GQ$*h$$7e_+;v5& zQQDYKj`l8P`5!ndC004?NcVROR*b1&SZMV^P6SqBy1n%kA7}c838vemYQ<9&pBeqQ zm4}pWMN22;akOm1E}|+Ao=wDRCcawCRvTs;2^;EE6A&k9u+}DNhiR9r>@Y?=TeP%u z#{Eod?e+H^VQ2AA3R9f$OdKIaJ#Iq~L@-=9v6f1pFgx{*kRuvob8|nTI@V8xCGF}H zoM`++QZ<K&wIdun?}uwD@#%QCQ?dkaaU1GZ*CM>Q<Lp|?zjBlKbE0eVZbozeIMDC0 ze%u*ips_t*skFbl=Bw2&e!d*b+U&Rakj;JMKT=DhIN&7Yii3rqa(RNbk_1z&!VOCI zQK;lxTaTLhSZUaqWvPx4N40!q-&iw`vER9ep`3x2;r>=?HX;_u1|`rSc6}Vx7X)mS zy5#wT)=KUns9f=Kq#lXuB<sg;S*^&E>M0VgFj+}V1)-5Ogf@8KcS|>oxd{3LBk)0x zZ)VGqjLiXv^cpjYY&3=LiN$RdM_z(!thjv_8M)EJLmC>e4i#;HJk>}Osdc+8w2Y5} z?u!MZyOl^phqRx+xLR8Ur_&Z_YqPoCxK4V(`rg=t%<~?ass+>){f{)Mh^?rVYpxoM zJP1)lItyxComKsJkq4amk1f%^hNzrrmkME;vNN9LEc(#9=z<`=#=;pU%30Cz^Y+a& zS`Ks)%px{EpwXU+viPV37fFuP+nANWMK<av;G|VGqy1L}=Y?qFK615?nf2C?bU_z5 z_^SY|QH@{LY=X!fCd=E0cMpAMzS4VuHCK_5Th@OLwltuBVeey^rMR-F<}lr-2<$A3 zTf^2o=UiXJLRHZd{iKaSpEsfH)Y-+*Qz3fch28n6jlnWs&qSYlXy~v`4|M;cvS^Vi za-q6I>H5CVK=#(E2d_^Y&Mp5n$ZD2JGcK-r8-Ll2dE9S;gYQCNj1+)GriW)4m!rwc z_N@OYY+<#@<^Y=pd2AA(M+Wzzh3<5Lopl04G-fxW*rSjWl0TbW+b<5weKqc<At(98 zz=hj2TiuA?+wqmT_8{C}EnzcaYUm3Wz^C6I+)GlFB{t1F+%l&J8DWRA;0v#9Ag||` zRvvFC!%0cB*gTOt4H@&cIhALK;y*0pX3l9R9Igu&0Aa?|WphKZR{3-<zwDO5DbLBE z@(tn??{qZ+x?lDz*)tmK#xjM(t8<X<DGA++`3a4!n)dPmh}LMzJNn6f(S7EJLy&<D z1f7c5DdrurTkK%L9e;(7Oc{b{{V6%Wc@<m3nIROX{APA1LiU?isFBKI=i2m9Rsl^v zaUP@U3d96jRt0O`wOW-(&-U^>%%>@;1KR-oBzFXHtK4-#Fntn{`6!T^DQt+=70mR$ zZ;Bjy?kT#6VgmZFr8<n89q?%t?QN4eT*asj3U!BXL`m$=b*E}-j9RTr-B%784^xjK zb>r@PmTvia7`)GYb|@0(5zt;MMKQ$9t{6MU+R+Vi9RV`j&hkd5-Z>8$213fBm;#1h z)&rc-30bROmzFr0=m-AJ;}~H<?}&N}r0D4hjhENMjCJ}9*r(nzQ1@PIb}5D%0usbE zaULhh3xnv)7Qc0svVhcwC8pUpK*#0%T>ThR9HZ7)M$*}I#&ib34`)`r675%4^NE=^ zV_sI~Y>A!7i{9E6d^~FXsZ<ZAg@wyOg}$iEjrWTj>e3C~Go}G6Vb#uGQC|oGy5R^q zzpDePigd5uXU!$C#cWx`=&Ne&@D$$1hEiufux2B{K+i51WrZoB0(h|`&RFeLXny~# z*~5-?easHs;-rYjn$VKS=}-xUuK!?Ot0Ut3hxQ$Y4d2LM1VZji<&ZeH)MowqFDwKt zTNqwujmO7)Dtazq&<b<Jppxs@g|U>S<CMMKfCncGm)Rk_q3V${R5aX-`XL!9vD_jc z^<o-Ewy$5<*SzqYiqQ#KjL?BgEar!I^H@p5;T#F`F?Wr@cVD=zdj;%Jrm;AXhU*E@ z>&Ylf@Yh823m8uumsn%PozSzV!{W<_@SmvP>GtrNvBB!Mv;xLZvg)AMLf`kwdaefJ zN~;Ul<=S&+o_7eEv5iYoZ8UPM(k)<g=Gb$C!b%-vo8j1hByGf^=l-g^YM_n|H9=3d zj|XgQCy`P`P;}`7g;{&*e7PwOYbZNOyZ01aSDsn8zf45tc5(1~$xVA$zMrg{X-U}M z?2w7OTHSVgbc`6pTt$2DtTif89&QB25Q6O)y($>qVbBh<Ty?n%!OW=3NKt$jysYFj zBoKpHk8qLI3L1WN$~kL?<((zZJ^nSQ;I`lraeQBt-*PTqK;cg_+*Gkwu6iV)bA{mH z@PvM|nh~<t<n4pNH_@B0Y67P1CR6q?M6q+y%k)l<%Kj}N$9A;#+Ph&%86^tMd8}9j znhMd`7Kk%Hf-O4GaCwUn?DX>%oOdlFtVX1~hB84XnP$ZwK_Zva(9;p`QFzVvHL)Hu z7rztca<H{&^HS%ldQ8`(Uj37bY<D=qS{Up&$D2jJrT86L<H5j|L%#7KC!3OyxK+mk z{aBPk4*PQyj_1fdCno)WX<8V^K=-gRA)jXmDB~`!;DC>a@q7K7#)D59Ih#)o2x?Eo ziQ37>2YNY`RGi>lQ^}d>0c)hF538b1pv>CM+j^xFwaImoVLez;Umy@dL-U}K?+p*_ zlb(NOo@nWQmEww3J%4F6c}bW-w+`F=fXeAk<hJnh(G<OC10`J7VlBKRy0iNN8LNn) z6>ahN(^i}D!Infmf{}iILKrxnM~4Se*^rQawMy3q<Q-vKq+6e6S_f=yw4rlEp~yS# z@!T~$OweNK3DDE%c|MFKTpD-Yb`iYL2&&y<j%|OliFaR~O~EWHEg=Q(1R@U8nPz%+ z<CcRL-rHdLSKEigt05|Mj42!x><D=ViVVJtun2k#lt#>%JrziJ{E)~ifd<*YklNfU zG}v=EhJ>)?_gCzvTEqjbbT;0ooFX2J*AtvGZae&u5L98;X%Bf7{|qgz_(%>wgDigN z^*J!5tx;xu>WppX05fgl2GO~(0Yuiqp6W1}X~X%3=VYkt%sx=7PeO>-q<?z#!wD4` zPwKQgl@c$}D<l*}N!;+<ois9`hbe*J3E1?+C<O^E5R6?obZ23|P~YCnHu-3r&olCJ z&3d50Rv^VIbGtOBssXli(?g;PdF)fEjXJU@q!VSF$s9vzi=mF-Xom^H`DAT4ZV>{i zx4Goa^~Kx~#REc06@QtkUGSu3^R(mG@7x!&7FXO>TGC#f=)+I^WolNqgPF>2*t?>_ z=guWI$WBmwR!<0D=xgSaS%fLtOhD@8O3R`=!xN9wu|lhYL5*HjSy?fX*^!6~QOPg{ zpjB7Qtw29hhZ7+G1Y+oP`nK_Q&okEIkFLX5^lD5Bz`FtZa$ewv$H(ia-+7!=lC~;- zkE^LH-Eji@i_3$`3@*JEhqF2=n+|E*vedHhd1YFz%R$Pt9+8<@ERiN}@cKy?6{=cE zucCcm(oHx&J7sKK>5^8aLUiE}Fj1P6Dy<*8d<Vzzz=Rq1dYblHdmZ6fyS?dHs(%0> zDy3;}dO5sWuL(u368~K$hTMO5QXyyi+F`Ab@j{{d)7#ycf{lj@;d-$;4-9_TTJ@mm zNyQcoUBqPk?O=rm-H&OBL#b&BwZfBF<V;F2DXbWSPsDnBdMT)^x@y-8mV4&*>-`Dj ziIjflkGdsy0$m4#r=A0YlzJv4_A1vT{KBdE@;lJV3S8ekoA6er3<JzErn&pDdm17w zIOn%lOBex{<iFSLdZb7;?q$VjrFsdrgO|!K=dp#D=^o#R<Kd9aC64bt>>sDnm{_9G zi`+fe`O;zQD;;g@V^ne(()=M|gq<M-K#X}IYX7-bD{oIXd#lnvB3gE<d#bb1G%SQ; zYZky{_Rr2oIXrUhCiM>2da^p<-`-_;3O!)t=-c8B63kl<5=6v!`zXkH6Tpa|?aCQB zmkCgIf#qH5+l#dlkmC?#t<Qi1UDw^<%E2tj8}nk<NZjLBd9^iZ(#E2~$HTrctqzM& zn5wxKz_h0B8jsp4NAP(Fk(dNxOP132a6V%O#0OThOwL2Yj7&$UuduU_j^(sXCbq6+ z$Ixd-{HC-96%h-yN6XbxG$OKVL+uGl>tMF%Nqy7!D}ljohIB?PMzEvMcVW!dziZkv zHy7-+3&Nh(FwAo4N&)zy&6KyQYZvJS^L2jV$7K2^B8G81Y3-x)S3qsX{Omv%qG~Wv z2Cx>5f^%l`KO7X-+!b2JEw$s312cUC)AUpyWs~`Zo;(v!d5828vooVoJnL8}VLMxi z*tB+ec7{4zz+<}UK=XTbWhh%p9n0%8&n2;mRk++$me+TOST$!}YP8J#8ATDGFQ1J6 zKr}C{7A-&5Y7MQr!|u9ro)J~)f-@vp^PFZS_yy78CqEPZWnl#Crc8d?NWntKIpH!E z?LGpmAlJN7*hwP@&0F0o<*PSto%2Og+~VNU{dLImV%t?bp6JTtB0qkUk5c%v$=Jwg z{tlzjX?|`RKDfF$n#QlX0(a406Q76qAkEC8q2Ih)kr2EcHfZIRu0thrRNdB&4lY@k zDtYKoRirz(c!BAZ2V;JcZB_`F5BjO>dh*?Sl8(Ut7#^FKA8!t-2)m6*T8Q7yd1XQY zSL^gb@M8Xj-WA!_bB3^*r*_#k<MM*r_U&+KYt)7Q8ODi+9U*f$`^So9^&LI?;omGi zTTF!VF`Jb(;VDhfqs0(8J3~L)Z-tx|k4T99+jdCkkg?cN6guf0vNPo#ms{3%?sq?0 z+GZFB3f%W}4t2rRcZ{`UBnKo7H8S(zbT+)k@m|g*5U!bbwohmL-o`wKPWNT@pk@^r zd!(XfDnK}tXer0q{E78=(8*tfbag{2OAlL_!BG{vM^~|ASY<%iBN~czHDcBlg+eDD ze$KH$iHiF}83yD#`Oo-9Y+z$cTw7~9>xbvoFlHvRw}9gn@Cdom{(iOtEge1fkdqoc z!;8u63g5uN)QZ|TrT2K;9Nf0ILqVtegzmX65Hq9p^V%_RxlHV534V(?i1EhPqQJ;` zu%GM<@%f@rv%ZW44-da1W}{2|Tc$~H%}$q`1cPkAL7(P4-HL9vxAO|g50!mAd8QwD zfN5c;ai)Mr-(6iDJRQEh+Qr?GO8xl(X{b_IJ$BnDo>x-GZ<%gy!3Q5EtmmbFE@sgO zZ{T~8-0|40#r$O%&kOOLA%|tLL!Yr_gv0cPM0BpZa=|Ko-PM}nWll~P**EOER;tx1 zR_T^HTo$~c+U4c!B);(9bA0*}D7sspCkN^6Cx#^|naRE^ICMj0_B95@=e(_Dk9M>H zhtu+uj6s-1MV6P;R#;eJods;kJRL|~64(63AI>0(pfGT$kz!`cD+^in7B)uh=p7N~ zfI*2#)b4O0L#)L?681vD4$FV_h_O<HeCB+qscHxh8+@A8p1z9X7qOM&U9j)QPV0}4 zIzJiX9?UO<b7t%QFAHGGSj=xmBdz$(E8CO&9rUd#N<?psg|xodv4vm$DH08>=VrpK zpa@;w+8^&1dP4zZ=a%n6PHEY3KV|i1runp*uC>GK^6Qhkfyt4q&@O%kkC5kIH(HLn zD9hpOP5Z8bgN4eiA-iX4Mj;S!lX+-}ID3C1wAtAy0no5lS7E0`H79x@=^5E{+1Ton zGulB81vZ({qFZBf&fL?5UagFT;b>oZceMe(4sW6kVcgq51lDMrGcwJIyg^T{;Rhd_ zS=%03GR)ezcVS^!p@W=PlfM%>;W>%D#Glq^4|r37><``lTT0?9mEg0bmk5j%uZ^tV ze3{JvWzxqK;&!&`h<vTcqp(1!HiLbDwX&jts!A=NW!w5`oev+rMpBA$3L7lhJ9@7+ z1oIK$JX_V@ip9R`kH?<AT`}<n{aERlJtO+rzGR`7uNS;79O38xo0tj692D1YFfO^! ztsdhxp2ghbOyV{)jC^v^acC5WH>el7+qI~Ab(w@R`M=!jn5>}E>%t`{)&uLe{xP?G z<Q}hzkD7%f%Q69UQy9A+%Sk*LfK$o3j|jI=oZ-+Xa3T08$XFuxs2vs|#K&=3287SZ ze>h~Q(vqPxpFujHAI|t$;ere0a4`hGX(L$ciCkUX9BlmiiU8s%zCz6rydrz^IejI= zT<K&Oc)y*B^3ensw6=aAmQ1`L5lk0zM`(%IG({v^RRH*O@<ocP;U5Hrf2){%N29*b z_%pN#O@RFTJG1^@&E1wAY4^xhxXau<uNR^R{qxHaeIDu>>%Vnk|M^HQNZ^wK5w+VP zuC+8|TcWhC9LoW^PPoSndx#`@9iI{@vxzcc;Q#`yu_G!ZY$UzdpDJ57OVeU~jv15t zUsdn{S0e(dCO%3BzB68qaG;qZFTVlTXg*Cx5{};W++0^*yS;o#+_NY8X?(m(kXnt8 zkE2X0{qKdvKMt>9WP)^g2Jc;!fvX&`HH0*bMr{>tf0^gAktxu0HXRpO^W66w@~Pmq zR2o1H$#exH{<cSXS<>gb18<8Owk1v~dlN{%gtmD(=}+XS1aGq?c)I&lf3^+s>dOh+ zM&#IJG(tOF6+j=;9YSuCO6C8K=)O-H5F9`}G>M0|AAGgp9d*aSud3CBtJpWMeH<AW zT;qC*1WB#mK@HWV##xz65rl2%(Fk-r53lWLDYDV}O8$mfD7q78e6==Wes#rAOn6^S zVX3^$^Y?w@Uv4W*I#4drP0bv|g>UrKe&v9(5R*Tz!0vW`61k2I$Cg7bME8~JT6GuX zIoCdIBUof%`Pzo&5jS^kxg-;-mE_RzMmi`17m0!CTM2@Ajg{0bPlODUN^RJFdf;pr z;n;2!K0?qXt(6ePal^GzS^YJYM3VkXD|4zGD=wJ<TPV9&{%$Eg!lZyyQ9362GX4FD zLb|_Ts#J}s4Lkdc&ZnXSdU=`C=H!e8e?iuP3yhF_1jnS3U%=6u)}1CcSv7PGPVDMw zMA%G@)lUu${eR93`NzwY-Vs<azRxry^2zX-d5MT5Q9y;<DQZjL^gcEuOsTJ0*;G-o zg9}%pNAd_8y7pB`JGu_dm?>sA-tVZ}He|TEJM`sa?3^zBw$JbRnsVux#EzkWwSgDd zD%XsXRVb$;(P(GxCU6LDA-}^VfwGUT_Ldj$EIT1JS0wb*75P7Hjr)TRfP|}7^UEU$ zdxd0gi9~}*)$HG%mlTCRl)g!psH}%g9brD5jf*+Hx)xk;SgY8t&^^w0p}>1wvyQka zGp8$mU7dEv{-_t74j1})12_uxf7g@`RD>1qsO~#50-1YUB=R%V|EhIfXpO&m_QPEM z7~dgvfnEW%q+@Eb`mH_LMR5?SYgqc)bjilwc`Vz$|3UiE;#QPPD|x*T_xwb<t!&}t zfo(=@gh_B5Uev2(F^SMSZcm(J$>q<!upR-YE_u{pyuB#5867xF(Wgr06jV1>>2h;% zC`@Cd{oC{D<eht~(gs`t?q32Rak<pMvk+S#8z1yyK!n0%Yu@ADG;zQrjL=emUIvF6 zwGs~hRbTmPXCJFCd`#lIk0v_rw0B?)Jy>k@8?-<z5(_p_eID5>BQ&2!ET)pszr;LT zY!is{-LcO41Hq#u8Nl#i8X4Xn#vI;B8*1dE+t-)vaDxn&B8{sIvGo?{2|M9qe^U^l zL;OQQ1iN9T@Rm--p=)6%Y$^P9Z~3J93G+;*h~%jlw^ZD@O?#v3i5Qs5nitTUd?|FP zzxKw#p+L}@#8uzq$bWGL|DK8v^U>DSHewq9c*?`2x?j+)c1BoWJ7_9(Uj8BD&}pRl z1TDMo5tmI3lb=HAc_ZgPww^cb+-(jN$KDNjnRU0Vu-)Pagn28i!0Tgly72pdwj#jZ z=)(ylV-G@2ZI+AJ5Us(YtTN>V$Z9vAnj$qrtUZa$bcsvw&9Zb|>a>Iah+mMrXY-ey z57I6M?x;&T=29AOv_0yb$dw$8WB)npuaEChwh_mqa()*_s`$P9%Sb*Dz!6;{FjY&) z^|pJ}e`x-{A_QW>5Aur5r;=QT)c;d!JT_Q1kXjodq{0PiBOOVY%{Ef+u`j1IH6`X0 zh=7a9SvTWQKYVJk1NnM^>$r6hM)-DaT9$af^7M)$t)*s1-L7`>FPGYBELpPUS%0S1 z(!tf=H%!gpEU*Kl7dfR>IdV`M<>ph<w9igX{`tY!8|+=aSTsL-N<V0+qkrZ#6v5@4 zsH#LiNao6x=5_`pjN*67H>ZxAfj8-~Y86%W7;-(do;fJ(1A-O=!uBY#0(<J=Y&35f zerusXi1Z_&T0G;^0XDgZ2mf|11h{<*)3wWZ9~yv$LcIGb<`~$Cu{Euz*o4$ZMgog` z<I0{im@99#2`oFK0)jlMmI>8(EDKxWSec`y+^2B{Y*A7HN8(PGD#*0y9iIy9l87~$ zA%V@t7X1(Fc1eam+BwXe@mK6YLsHK$)M&n+ZNx#HE{``xXU>~4&cjynFq22;3wlL$ z(uS^Mz{V->+m9f2!}-!?^Bxdzg5LV2wN0na=$2XUC`SeF!51EXGx_qw9?mHYqhsr> z)&}d;yORLGRDS&|`f_k4*_i15w|~jn8)Oo1HsOGO5hOh-!geM`mVm*WzQu+DjS4`H z)^7~)83Kh;L<GiFaA5s=y~!e=bC>rlmksy!!+-UHsew1qu=oTTZ4LL{gu499z?Oq9 zj5-Yoe;Zmi5I>S7$_wI|*W>OI<Y|7VmZRxCABYb5@`Q{MifiiX+&cEtU;nLm-e6lT zn<k8eVLc!le?{1!3xl~+8>0W2j^m}^c&QC-gKOqx<ozv&^C2nFu}Z!OIgp`3IM+7j zU$cGTMIK1YsX9AKS4*loXPiAK&-X8Ry~MdHrwR%T{$dW4rNTEhX6K#-M6pEdQbAx{ z9q4eI-y-5S?;J+;H$W}{ZUn{*P&F(INlm+7LP}}aL)e%)^@S7`qLM+z?(1j{NK}}Y zxnl33LPIz?fT7#?_LJyYX)Da)L^FuBhb=@MUnhdpr%Op2Nz@;V4PQ_&5rMFnzO7H4 zZA&M$9P~(#pMD3G<dlu-1#Lzd(VO|=MCCtBA}kotJR-B5OSc|AJRH5v_X^GUcwi$; z@eJ%5`GXnydjT{(@`c(f`MIWQiBmm0|K%Z3tAI%*RpAq^fwsS(de$dN*mo~~XWq<k zs$CF0o9_Z5Y1~66^=&fm96~tIfrk0iYz7a7&MIN|r)jWB^*>Y5xyQ!^u@E@8;~gy& zo%zuFEiSxXi&>u@<k-TO#wwoZ;S_ccdoFv<Q##6!BU|`#cTU;m?Yi63c;~c9iJHDT zaZ)iEDs$T`!L!3nNGgWw-F6zDb8=V%#)_QhGJYbB3`zzL1+Z*pQg;_NWZ8X`Nj+4; zbZlFD-+UX<{lYol`T<o=KXLbnp5o29#x+&0syJy_<2#P^1*@TKyBCniO0FsUC&|@4 z8V|~`d`7mE=5GI_e4*}UYe-wnPPv%<hgJJ8Q<$hTWcq}4xto`HOpHI4ntFm;msZ+k zO7U|aBJbL`BK?+PiskD43)p>~#bTI+*+(Ph<y5G2!fnVE!iJ30#+l--wEdC$_{%jQ zkL0g0f{m!At850F(Wa1^uh2=64Kwlt5=@mUN&#)|@qTsPTPk@?)SaDH3G<;3zG`5P z3nqNC+|F+Z4|tLSM<<C_**r)mOV2wLOo#SopYt^D7LoPnj)8l0t~LU4V!HB#spYc` z+A6>IKfgs>?-~=?z2iqvSp=Dze9<2h+g3eR8r4c>;*e-&18f)mWHza0xU4}iD#g$H z@(T(6$S(x;@R6cEdy8TO0iiurd(|Ddoans1LjLU`-ViI}pD+*((x?um8`p#LE{C^x zLnWQk2%|njwq$>({+g#i%jA+~>yG)=Zlr%zp^t?Xyo<iopO&b<<TyF}ieU*v?HO-F z<U4h%@H`>2SZVQ3J2RamZ_%DJ8=p`3`Q9|2p9-6qxn^RuDRyO(s~Y4uUSfjN3~WCP zgHy}rNx=L39>?qUD~pZ*17a{p3ALjUUQBgz@FM$L#Ec{z>NE@@(%SiN0fwVWsw0cY zb@@F%@A5psl4zAV{BKe#kt%a|Z@7a=Yt*eV&0CrF5P<&UE}Vao#<Z&}x~kXUN3lU% zG|I}Vwn@K2-Tr;(!2hpl&E4ZqI+om@kO@r=>SA|^w?6g$3tZd()l>gFWd$SBr(KW4 zYfRTylh}H2B3jAia5p}s?gyaIRL%Qkg2Ou&|3;53TrakqbE)A4YZzs8a*(?`6=Dah z<FTb;Xfm*EOk*XK$IuaLJ{HG6^vg@|>$0m%h-TDc_EGnvtKC?u8B>(C3uJm-0h^}$ zbdG;@GJ_x*z~nrCvPj^IZ#bo~IW_vGdon+egu2{BALSqRMOvpFlxouQB6(A<!-=fQ z<^F4P!(P6_tBMjH9|UM&_qsoJ!hBAs7Nd9%(JP0B`0zQWEf)Fas&Cyb)01?1K+z<= z*zxj3Q*xWRIO}Uu;@CW{a6ad0WeX_GfZd)fsWpb=_f?6>ynxlX#F)=Jypy`}*F~aa zz%twNL#{b|@elyRoEQ+wGcd(#zJMW40Py%*5+oKA-Z;?_J**J~4_}shrm>K)UO${X z;p>x|nHtW9B|#-)m)4nVyl=j{qiJB+8~>$g`e!Zct00k+t5fsoSWE0q=H)z_FK_9E zwfLL1w^~<+G^v#DmBh>b)qW3I@H-ZES!07n)12iT=EhWISs8}55M~Bj$#AtL8Fooo zU29xBIes5RdbIw`i11qTf%=;GaoP+DhX)(*@OIEcp>^sTMEldqz02+5E#qO7nEn+H z?9*Soy?NDAM8FD-oZ{8shZevEoFp|r-be(sjTm7Gb4z>p`Lo~Ra%ghP!<3>ZfGg)$ z9jNi^F|k0=6Ml;>ncf-eEuzh?(A`(3MfKnjxrOw$jTq~}W4KR|8SEPdX(O=nAjA{d z!FZ;pX8qt!?$ru{@G9V+NVn`IfwVVuK&jGF6U@?RJq3YmoClHp4x|+2+f8?>+IE;} zp19+i-@^N>J<ON(tpRJ8o(m{7%a4w#!YI8+JzUDPSLFrLQ{2|HeD=6?rl9#)B}DVW z*~ux)^m|slbt~GArKKe$4Nc#ruE)Z{mD{-e4OBo=il%?v$%ht)yJg)XY_$l3!7EL8 z>?dz!(Ti#$>;)RC@!u%qKU&~!P*DzFzc(w9AHUm`)p);sK@(%!%_OL6BaIG$y$FjQ z2$53)Mke-{)`;<)YcGRg2Yu%lQ{!LREHe-vJ?Vp$qF&VqJ*$VcFDzB){X279(<g8G zFXT9O^U}2&jCDIm<bLQ?Znw0WC1k^+CFntDUMXmxqH;NZH!UxNfHK<fy(Q~pZKE7s zBx=KxtjN+0mY$P<<o>#PizRE#wmyL$<DN0@^ALOphIb%K?2`vo+ZIP!PYsgi@hlt? zGAEEGGjn@ui_mM&&NaF+=4TrHZ=-s~;smQ!hC&$4(dGnlSlKWbO#rtxr=eHLVJNMt zw{GdEp!KJNur}}NXhk(@goYK^z_ttNlC=q82$<0FXffgw!R^=n_=86oP;DSXDIFT= ziES{7laGq7Ojwb%j^mGyq-oSREpo+s0eh(q5;Iz1Bd^THD41S#m0#fioJaea_u?{i zInWEI&P{Ww6>)pyFoyz-v+5ZVRzxo+Qb*(vG7xrWlrH*VN9!I$Tu=%nId@~C_KmP^ z(Jm1Z_%Pe+XHhG>sLvRpv{s3LrbGv_hN&5Yu`l+mZ_qmTxJ!0wF7e0W!uj3r7_^?g zp3K+(x2=SQ0TS~+1!bb$Wh922GuW((56RvMtrP7T_Z2uUudEcYEd<`jDuyr`<|Ynu zK?;aTen)E&tLh1$u@b%!9j*=(h<Q-dw7GM>)CDbVmI6G#ZX^KuvoQoK<n}Qk7rQw> zsh7>;#QGcQ53eUoAW$=!^69lIVTD*nf(8=)-=lJ%mT*kWW+rRo_BN8-PD{k+Hzdp@ zNXhSBU#SP^d@j*;a~zZeH?;y^KnU_`m)4T+a=5lf051+$C?FL;j-99#pga5b{{C;E z<-_UwVxYToIXE`!5)GwQ2I{cPEiaIL(H*vBg^p_gOcMO%lSyo%R!`z@5bZyp>OY@| z5%CuT!_=@!`P0|@$FmB6o;6G^d$=%3fBHT2M1KcgP?3Pp1TrRiple$LOIYF15J<k} zCCaZ;v>3*!&E;CK1jah*Q*2^nwkN|wBKy!7fg4Wq`s2#PEW}%W84P_~uoq`_MBTjp z?woUgi3{fLPDs>(U4pWCMbb>$E3x#sq>)*vbpAY3#?aq2A^-Y!$rL~goBS?qrMb$S zI$2*tcS;;XT|UkqV~$*K5wvQ7OKa+56$zaV&_eEF^4s&_A;P$WY)~&!xES!WwCNgm ze|sYkHjNv8ZL4b6kK!mtI=Kv32!mFN1a;jCGrg_m_xT<@f)X6-)Hx3M8!ePd;!1?> z<FyYe0#qh~m;*U9-Xj;rssHiymNCJ2j4>N*ZQV$4i%AjumFQta0uljABqp1iYXkvs zkQwf=ZAo>r7iUpWdD{#Q41)gc0?CmIl)K&n9lQPrW>Xc@N|4~$(;Lp7xoEdYyA*ZQ zf9~49pM!1@lBwJ_6K(s!4wNY~(+&Dlei*ljO^{t=5fK~Do@*i%P?($g9cdMM^%%45 zBa9#k-zXboIxY8+>9#uzatbaY@c53ssX&h1^f^JAOv+deW+0t$u%%Q5D>7a2x?*Vt z<x0}gNH;fA8no%-5R82)LNy44r1dSM1@vsuR%)Qxd_P9^Tp+%mN)mZDNl+2uz)8{F zq6INRWC=QGp#{H(A#ZF?ug~O8{_QC=czkrXDQic&$W^R0bP7-cHK=Nr1vne`@cI@e zJ9|4(L}J_ner(J`X&Z6${^14#{(A%?@J*f$9sB)>4JjB+E{Q=kz$HiTv!#)Mk(`&) zj2!5AKGzAGiIJ21!G0Wx*dXwYRP~iuO{q?!aR;^`m_#eXvNZOL%3#^b`jt+6Gb@PT zGd<`XEKa$`b-7W1#xL+8Nc13#8EdF?v4_kC_s85D;?SG;^@cc!4PZp`FWcPA*Q@TG zc^bsIU6UswFF%YNx}K!Tru;N|+Tt6UTn$GW!F+?QU+lWlFi<x+X)+uiLR`?L(%T!> zh?pJd3KPj_6Zm%=zJFMCq7=SjyifSywxGv&w#`JG0TuM73z{imd~Z8m9@>@}rzeBk z)|-|-9<!M)qwf-L_V>~*Vd{l0=EEKplZs*fT{l_DS7+KVNYp>g6q24nbedn;wdt|W zPQo?nmf?qQdW~^nv_8J_aygUXYo&ss%}+06_H)Zs_Po?<D4=&En16nNtBi+|HxS6H zszD}((MqOAE|aJK1;Gf**Jo3o6ILqklt6_I1lrlDqX_!GqBJ2vUy6^VbAiJZGuiOl z807rJaI|OD1419=*I)K8!%<f-xBo^1gqd`k8Iw|^>yoQdUAMB{O+9Hq+noO9#V>73 z*Puv|?+#y-BulFSp|B}Z@Tf1wbf>uJUl3aG0V-$6kSkHO6qqowCfEtzlyqe1!ZqJB zFRBs}oAo#O*l59xsM+J-*mAgwHtG0o#n8R-9imarAjK$yul9Zn4Kyq(q8Ci?v2C!% zzvJ(1L&9M-G7IF-`DIV0v#MBdwUDx<FNoi?`bi2+%S1(200A8;n>GHq-*%CWz|ZzQ zZcLDR4+DuT1Q}&<Y0<z3eE)jZ*HxR4s5SzTB~9(rFE50up#%A}*VAs~ax@4c_7X}V zMZjeD*r!=X2^4sP!WF!9Se3sMT@P^PePVY!vVbadM6p>q8vwTJf3N4iZMfKwM?Z;7 zdoe+OGxUxR^K!&D;sxKF=0eN#jAnm;7?4RRbU>Rie6O$cz#yp1ghHdznVn%$(3lT% z$_KU^A-UW>7qj9oDMN4Tdco%VsS<wP`8@s^m#zA}cV$^M`#gqrTi+~T%<GF>9C7ot zFgAR4Wl*m@&%(#{Gkxl!#S;cTB5IG!VQk|!JUFl1yu7wUeOr;7Vw7XD@)&C+U`eBT z$I1d6CqWaXkOWdIk^zWbkt!i&uzf{Hxv>5xJyz5-(S*OdQD_fVZwpmjyZ_;RDLVN< z;Sy&NB`KC~4mu+q5!sWG!e4^BDiNyb*L&i0LIe5BI9kN}n^G_YluiUrtb19?*v6M^ zL_QP+?&+#yA5nuE{RKy-oCX=8Y!#NK#(Zt1&J{&blNlgcNs1>i3O(NEB}WTuVRcu$ zv{f$ssYVCE*%i_A#xPG4E(xGYC2Vceln_#MmEO%sD98Q%5|bmJ@B98V#&U=lw!flt zJ((WE?KPn!H4JU;?t<Dvn{kbRNg{oY=Zy-6osjkvrV61-{$zjAzL_)h3jJkk{*{*! zoV_~iYr*Nr)&2r3AVU~ROEn+&zh-FvSGzFof!?_kH-j_dnCh5gWn|RwP-6}bNiS@P zHGT0;>%vTrNa~jJcKb3qpzDj1zjBR{KVL0B@i$yne+1fbp~2&<N}QA1zg%^ulVN#r z+1a~kl@-ms%km^8y6M@Gbj!@WLPVpdfTZqEH@OyI+{6}A$0KtJOczd!5zCu7H2uwI zRlFtg<-Pf}%y9_u;Its(<7kVIvHv?xo_x=^LUd8xNR}1pN?5EWUeGYF0i#Z0_%FXY zHKY*no7z=%-4&w-H~LdhF0FL=?<AbwCEXe31`@HSa15x+Mzu8gU!huMrAEIE%T=k& zah41dr)-#AR19tq)J2>hY`+zdjzwVliz`P7h{os7y3Zl>utY_jNSYPnAC_}}?GK)@ z!S5H;wL}wN*A)<*5NNhiK;47uUo!Z4PkqD>*vDh|F@ycfk;nI2mTc$d+*C}0E9#<u z?$j%&iKyYC_c!0$6cSO;{5(ptwHQ=D4Lkh8$Vmn^ZDt+7b!xkSALJBS-j&htf4+`k z42OILwp|;SK2T9upwZFI5Tvs_NI?XketrOV3pmu*sju`O5SNfgh0)*fGs2WJA7o83 z%&(Y*h|S%Q9|B=C7NF%_w_TGD>H1@Iua*Nalc8H{?s8vhh4Z+7e8d`l8hOL~mP-T6 zEm-5(D236L@b3v3;2YTxGPHudIKWJSd!bX})epFu`)KC}675(vn!)wjqNeGoIP@xf zGX%61n1;Z~&P6ZV%S_8dKAsHQ#wImoD_ort`_#;(o7*q;W)O{R$h3J7qu?eSfX(4@ z+ypJb0sY{Yn{i=Jq_E=S%=LON@G@s&$`Ojsm5FyoAy}`+K%6oo8s!+x1^t3bG<vp; zwA^)Yv<4M+dT45WOpZY4s<s2;*PfesnK|_G7?xM)8Qf6`q-y{CavIjv<@IX3Opf5^ z&<j?sM4gb#EnxOSn>TGFbb%^jY0vvsN@1{uH9J=JS>7{B5^6imk(xniB#RYs=QVZt z7Y!(`ZMD-?1>-!6Z@L@OBYMtHPqPX{>kaEYL1Q4>YiqO_eE2rxg)C`f-ULpgzrj+w z!N~t2blm_#2bJ>&LYFLXi5gwH+did{5)|F|6C3)dulB0y6!9xPknL+-Oku4@knsxC z;2-Z6EP-!V8`Op!1mX(!Z%Mqphi;bodDOfSK_uF}(V?P|EgpsNH0&}G6I}7*6`KRn z<HM8KMMEJl{TbEI72En7$xamq&F#Z|>aZy_9YgBQ`DSUFIiR(Ud7o0`IW-MY1A229 z;i(k<lWKSap<%&_d}vN1a0m#&+M_+w6zM9Mp<vRHf1DZz@))X!xQ>tw<o3N0Cbv!5 zcJWNA4j<hE*_=gKOI~2AxTDio=>o5WT_G+_xxNksUvRf@E9ZtheCGmqL*UNIp{L~{ zfGEPz43sLE!vQ<Ql$%>0;D2-@fHc<C<zf&gvbM?Amt)Whf`a7(!cpDX#`yW<Hit=H zk$J%DWdx9~n`Vk)+?#-IQ6z-QrTZ~{P06ZiI3OvGt*Y9Pyq+w`Zz<E%TIR$ZuM`u` z;MM{YyIUY2bxJ<O{KE`^(KlAqht^f5Z>B%qv<azrw$4-vX8#V!@IKKbmnrLB-DU5> zQ3VhhcD{O4u6w=|QyPSRhrIC&m(CU3iGU^5+S6ZR!&)w>(lNfb-m@rEQ`LaZ!r|Eo zB(OUllFEe6yZ1fsYjutJSN88DeVdx{psISK55KhGq%XFwa%n~pYvtEQOz4OOsLn0S ze9Ps->1kWv$V^s+3){Xc27^GzX)08#n8!+95Y8Dwttt6gy5B~eQ^wfL!v>UssUm@a zt0IxgCHpm)>$8X3E~yt8R{|9cjYVD&3xO3jqTlavtA9URH8eR}IA{j%UhWH=0Me$T zUOD>)4uZ?4Y5?p{XroT$KlodAkd%O;zNxJ{UG!oLC32aHnuEhMHa#gyPzIz<R#ng9 z#}}*Scdj#8I)0N8T2T4rviQON@b-$<jV*c49bm0ZS(?zSQa@@t;-9~v7_#T`270I8 z2&3Rs|3Iq%4ZQ~_Zjs)*_eOVcx*}4e2^xAJ7r#n91i^s>FB)9lU6FXqyw&f4Z#38G zoXpqn50h8>gV{T39oY8P?RfSBhCiNrDPm|M2Sjz5mKLK(gUgS+@``U{vYJrT9i54c z)-sn~qL_I%mcz_d)_tk`a#^r!Qy0y11BV>0?r%g&h^t32DoLwqEJx^sh3*WWf}vq5 z8VD&=Yf_S4SYM!=uJ|ni5Xu~>g(KhstEZCDnAQAE(?ABuBZbU$XgvHg6yg&7?fxbT z{wB#%g(+4=1)7ZNr<^W`S>6b2EZG+;+?igTjuG9yMy%AtO+-lxDnQ?`)WRK18}JH0 zq5qK=9`aIWhl12VNoy{whB|D$LoK*4=kxPqbCv>ic=wLdB7umIKQJxh7bQ!pP)%_J zVPXq*lQk!uRE#35nQ){!GsU(A(6ON(2@<^;E4wnGu2Szx&y>rW#ps&u1VGn}sKv>i z!b4h<koB0_-A_TN&CSqB+D9lL?m$}!Lh;n~6}*t($4)?aGx)gJj5rpp(6cW?Op#6y zmV$zsjZlJG4Lt)~x?-f4kD>9^JiFOiJ0Z}vE%UK~g%luPsI75_wxQ=wEkjCo39+7s z?E)POn0dB1lE`90;m&ctT<%CO^smZ>$3=ZU*FE?WT~Cll?Qi%}1kZFyVRWXk**d~e z#1TDFooA-S$|hn(WDOO^JX%xj*z=J$2F;(_-dpAD_`jEEtoo{lJLpetY%)+wYh~{# z*~`Urkp8Y2U8AfxE&}J=$Nt_+om)!ZAdlI!CGADmZld2bBoU7&G0&xmEw6A1?v3&Y z^WEGM42%*gS|o<+OK7NI8T$CdG9^WJ|KMcOZW*TcQ;=wPvK<Q`p@4!w2zt_LvrhzT zFlSDtr$EnHcu-ofeyIi@Zoe{bzNUF~P*whmDg7{fONo3<_Qg*%Wvxi~@8IsBPl%}b z^Z`*D)4OOXc!$wBM<$?Ht4?H(Sb;K@1K-?7ro<b-li>#>JuP6Zn5AJ%O_8`9ra0C; z#EXTPz8_hX_WE|T6wILy=o1Ll{vg;rK{$*Fuz{2%9(xnV;o7z)XUu~fx<j>)Fr-^$ z8Q0K~L}{E6I}!?$(!}e~(Zl+uu5?8FTK49XxIeJ+Ur=)|zqkUn%llegv+tC3a+m^f z<A)X8NLl6Qbc-UE9EMmc`22UQ?NCC9KX9ey3@Fq+sS#$v9~;!P+4w$TB<a@^2!7>Y zLLnirNqHm&<x;<2OD{<joDijcRt1?2uo|+a2iMoP`;Hb91Y^PU4)6aUtD9wN)fT;L zs@_;RE;hVot|IR@BXcUiTKqUJ{0KOvO4%Y4GhG0}rEdH&vnthbVMx|K)IqwEuCQuY zkA5+6hGef=J`5zreR4|oc0`?UbuXXyYtkv=9Z-f3*G1xYz=`;MdtX-kNoh!Qi2GYk zz-g-C-p?K`T#sESS4Wp=bwU+1Vz5`(`{)#=mi0a(kg%P5<sWp@@EM;U28gS#r$^uo zGMobXpF-T^>E4X*tu=`cGEGUg`npe$0%7SFQpZ1l46w{?H36`=<}bP_1F@mno|$!% zc&|_rJ5mGPj3Ayd{s(A4lI3GkQ7*3s+u@g;*64Y4Gg24ZsQBFnCjs|+{`<+ODED{w z2MgwN+}YGSl&dx_bYI)qn5nFwh>;JqTIe_vc};`$oUycw$ou<+duR=~vNN+{?|1e1 zTyN8dJ7c-jkNXu(Q(xWc9;+Zh7|-D~_s(AHiW0~q=LHhh2A>rszRkb|PQYtV*e9`v z<k+N!_75GO%`u`4OEV3jK^+nSYHywydU&fgWp41V>W}DL{8y(;;Wt#d1Xk#zj*6vI zzP{1&pvFe@{zT{m<BW?&pRRVqD-$s+05goP0~y%))1f>^gz}o|kq1s>fGEA^Y&-!2 z!p+t$japQ*xmf#<9{S7q!RDY})x5&Ttm){sqhlqx7Al~RBO%PKP*cx#XN=hl>--#S zGXQU}O925<QuLq51=+u-q-gNbyenr3KDh$m=j&r5JNNx{PXMYx`YVzyg+5=fKfa>= z!zZ<70JCln2?8B_+&`5M|KXwC{C{20Gie(KmEJ%Vn+7yMH&FgDwNJHOh25Emxc2UW zgme&0$cOMlI2;F-5muQS<SeUPn-G|uT9u0+)6LY=WpZ980P}wMZ54|uc&hWZ<#N|Z zmz%_B?me;Zfi<_Q60Yd2aNL#AP}FXHo5ve)g<{7tj0}L2sev44h$~zT@vLM*o0WoH zu%e~@K{`{A<N+kJn|QpUd%re6I_Q)md(@zUN0OWo8fs~QE2<X=E^+9;xh7jVG-Loq zW#h_sSNQp~TpQZU;N@HL?n*WS-C_*QbCjB5>B%zsjm|5_*xX-=2oMl)4T|BdW!Nlc z5Y$aHMdMw-K$736<#0t;o*T0=;nl-vkc|gO=K6%M*VH3FKWv~Q-%kumR*qGRwOrI7 zr)p&+{HiPP-Mc0QE0+Zk`dq8vNA(y4DHgoBHILYb^qZlU?0Gf$bPg7!-B++KYT=B$ z8>^s%mgRIUwNEl$u|G}52_|lhIbN|V2mSYd0_UguBwG`<ug^`D;fg)-tGU4dL;s#= z2ad(JOK_gs=C=(_sfLUa-XYaJ^3%S4|KP#=PFJRL()Qvay>v$p%;VD<=}dBayPNzH z;_4x-H;2?bmeAuB(qV_(D<nAFI`<z{p~?TM3dI4cLOGtK4I8pIEz&+Syb-yx9`A>& zi!$bzkgzPmvXURB0;bjT=Trujc2`f=DQ9HEG>KFBRU8oRb>NM4m1|2G^@$n{-sPlZ z*1+v)Fg48i&R9xF1^{|$ZuvC|j{!t!<I2(Mte7~Z3{HXjA=<iz?0lDbNryi1g$wW7 zQp{-%t0E|lC`D%e%)?Hks{{V*h8H(Rw1MuoXxRzRNXe1p2?JA_LaEh_sO0@V=F-mk z#1ma=P0huCZQT6dsw-)a-)1J1lf<}q`&>U@jdf?9#+v$E*MfgB+$!AQqcod<ayejB znqNHiB0)w-p`!KNgAD@w5`xw%JG0`dWO{B&hzH~>TZ0j0FciP#8>N%lcR!xl+DF-T zx}`1=T8&y1W=Sv4`^N<yyWs%*m=O~=Igv^2-(hcRWg=uDL{y`~A~i)!ILBgA+u4k0 z@q)!ahR@7A>YBbxL2M7;7<bE+_Ow*=ap+JBjU~<^A~9pIH!SRw_jS;)7V=hDqhaD) zKpmaLC@x5dRH&b=C=R%ta%FC*<YEnq>uVq8_|Q-(QAk7j8{4oThf&8W%x<P9pch!n z`G^0)ue9`Q2Z5T9cjxFW{MD4NZ!$Z$m`JR#S8$jsxizCCz4{THYgYXE4WT~B(*u0v zrBJyVuOquh$hHa|t#aB``nic&Y0#T;<@nX3@zUjfeL`N`{d%RwQ3g}C^ks)<rV5HS zdixCXACK$F`5M8*E^mhCJ)4fK@n6slHp)i_FRDO~%mFTN$+N6V%;0~Nly0lH>-caf zWKa4%Z!V~3Z%8dFj-WpSAv*J;eKbq3CC3p>tc_AR8a#;X{O?T|@Q21cxB9ly03W?1 z_V<W2tbawUVLtzbijVRBPfvON-+IbKImiJ@34+uPh}G}*{pirQWj42-?8J=ZKo`MX zmrea;Qz1HNA%v>mR>H#RbZjrtXR?^q3+W6Bgy$Rbt4fs<s%txu=HaPn!>;|>qG9A` zrO^_^JE`&OG7LEOInbFYo&>2rtQ)ogLk^;*aja{@VI08=^7;aK_5k?30{lWA3D-(t z3rXNNjR}&rWgJDoIZo|}g|jR>bFtYmnsWCUAYa+Z5>}jY@c%_!!-jHWnsyyt^!M0? zk&u%E)O5K-@ZhSIWIA6YBNkJWk;)#?&MYYmzr+6MZHF}=S5ZEkB)LabCw2x~^_XxK zHP}G4Hqii*Lm=ZyD^r*|@*Cn;J>tT)<@p8zCi7cjJ1R7u1o1?!Ga3)f%8f-ed26f3 zqp!t)f}k6(c6b-@;1Jp$BvO`Teu3~+2_E|NH8<x{3V-+M{$Ej8*y%PJM_elaWsbi= z%Q`zhAOw-txUWSNK@_=2??;X#Zd*}lpe%~p*7QAolAXzf^6rulc|S3mG@KZAb5%Yb zwp|l(aWM5t8t_?8u&5_^TQt?x=khE3RdX55=VpW`c4Dk(hepS;T`b+`z!00BA_yrd zDGs`z9@MZPBvGKu5IIr7rB~bAvWz+*EvYYmoD3w+(2V8my3L^S`iVBSDd~7b(c7e_ zb?eWKHj>Cdi_KS0=F5&(E6zjbSJ%U=@~CJts}siv5-9Y&HA`-uFC|UY0CAMOG)cb? zGhDwq)b}>M^N;ST-J?h5o_GzVs8;Be=iJBoM;+XyRphBfnkKxgmoY^hDBN?w0nyB# z`yW&6<RyBQE1xzIRNv9fJpG{Y7=QF78HtlJ%go54<&|eRL8iXCPg^??TKAjH?VH)W zt%I24*V=3t7=e2Fxv7^dDzjd=4jLuND!ouPT!&+12UhTvxqfwUS?TvUr5+V?8ZpxU z{St1jmtxW%1%fXEhG(|0n9HFLd)YZ30wtR<|Jr)AzrQV`1qKZ4ivR_5NdC69_!&@s zB8A8h%NRLfaJd`Z<?%)C68j$6vFFe$;?=qZI<QnaLr-jTd-2L&vnw$3|6}YNgCy&s zHQin4vTdu&wrzFUwr$(C*<D7LZC7R4wrxy)-;I0c4q{?{X2dy}Cv&gdd*NB{(oLzL zS%0|`w_g)QQ{p<D5`Na_L7--q+m%+^2nw2_zB#Ty$UnX}YB`*u*f=rW;g<hIQai#; z>BDt|;X}J~RM~~_^TmDm=pJS+qwh(xtxj@XT^+{08Q|Xv2>UR1wSMODb=ul8lC>Zw z{WIC=em33Rv*h=v1m-;|DE-sP0?u%FwBKeQNpr^QT>vAp8MUCi?c4C9V<kq%ujeh} zo!&IP-UAQDnfuOAdF_Xo5%9jLAIYEhy8AUW3C}-D85bH6a=PD;Qq~x<J(`U!x;KK| zb$Cb_?N4Z1uHD!Xk+=qq#Q--w;sAg|h3qVDwdXG5z~_T23z-j^3%hlou4eFK;YD=? z0H6}$I7>4%K9eXaHLdB4y0O)UkGEkPO&OE;<qf;i?<b-)&Gk!LjpE=0+fHOHNKfc! z2Z{bJ!|m%wik2Et?5(|AOs{E102?1xwX(e7(-Xm6C<;5s_kf;tM92-NN!qFg%2b*O zX!2zfN)a}c`zE~p+KO)vaA&~L-ib@5r7u2gV@y0C3W=PuZ!04U_xVogTpeJbN|Lqg z7-_=f#D+WHP-w!OcntamAD-8E*_~O*B@5L#a&o7*emJ~x7^_tdsn$E8T4f37ePNPI z-l-j~3kJ%;ke8K7;w(#nFd`qGK7_+?OwfkH-$aHG)!<r5AX?*)2}X=USMgzuFR8Y` zop9?nO!Zi%+_`X>7T=fB&Lua&u{9$OGWNg!o=dZ&@=?idnsw60<ah1cye(GNZpL>Z zBZYL8DQsvU*kg7Wq50i&;NszX@^cR*FIl2bhZic)h{3d;a4}vmP`}f;CPr3_5sEH@ zx>_sZ4+x1fDdE-0<?u){j3gHLa${Fd4h8|AM@3peGFUI$97Cp7`;2f?6`X~Jx?;wO zT-a5i974>;Nl8mn0qzPZWNs-CvE&W3u;GEONG+V#`Q$Mu3}D{-Q`rSSo<Znt3hlGe zpDrl@n;9xvQ4NB%KnnJgQHYy0aOjXv29Qh^0Pi_3C*Q|%!iZlK%Bq)fyHk{kA&;jl z9~8o&wg!*zbb3LJwes83vi)Tqeve^sD=y#$>-UCUZR@I+d3b?0C!J<4gm5Js?}c?` zt)v5+9bFn<GNb1F8oa#EAr*a>v%C2Z+JNL?82n_9)1TAneRCA$0AcP>Ll*|)QfU)2 zO1l2rKggAo#c?J3^>c}%n|v#)X`#NXn;!OuXDIGtLY>urZl*Tx04P;_QaPr&p7TR< z#|s3xb%|v<<#BpE2ZO7zw;h8f5`wCRu*kdb4}81vnb=|KJ~Xs9E8Zy(W)EF-o*p+h zbV5*IU?67j0rKy=Vb2^;fs--q*GK$c;C6VI!aKK7_De_nhm+2OyxqM<PufvJ{gj)Y zpLXs!V3DnV)%E~iZy3gHOMPxUpW@yLz?<=w|JtyN&8qJ89dI_PN(vH(I8<v!v~`dg zm&7Y-#5vIknz)3r!``V*j++QDQd!fiyo;`j2X03gwb#}-V7ATwTz{!S$X}P8o=AnL zy#ln?#e($)p&ptPS_q_tN!z`ddGiS`k}FP*3sX46i~CT~2%D3Dm)1_r2IW%087j}6 zpd91oG+=vZ)UU=-QxkC7`Vvb{KI<U2B@r$InsD&w`NO(UKAdaUOn-U57F`-w)@F$r zl(2F;$(><V_JiJ^_1<4Ynv!QQfjUWs%Q6yw?8R;OWw8-W&4>4bhB5LQ765{Ab2bcd zj2%1=o>h_Q%Hp?qNA>s;gGn_ZC@R}QS%C)6b}^)YbMYZdBzVhynT9r~F6Z`+G)}Jv zzR}~`*nR!8s#^&uFBkm6o_gr5e_R?9tM8vh@P>SzMtm{Mo+~&$!?<CeoeL{j`s6)@ zk>ttZ4B^LR|1RxBI>mY@`I`Epc)?nz|5z>?JAAMnE~}O}Y*0q<J5)4x*a5s&WY0rd zbfh=(gy!oEuB*TfR8caPOW!KkuVngwkm3p%bM+CHz~5Fj+>;!M+#aUQbmWS0qo1jS zG2)N8UA{_TS9Q^q)S9B1gOZL%S80EZ-{^)SAAR2JjTO*ImaNx<BT+%|T81a2VD*o@ zKuN!k4yUN4336}7G=p}fjy2xrK7Z>>wsrUbFQ1&vw?VLJzOh{M_(9ek-M{{)R2U_o zg!9(_a|nlGBXeV;e5)S)g)@XQ?&`*pk9x<*etcfGSmVRh=m(!rhlVD?-bK>ySs!9q z-}K+HbK<cE<bdd0q&P(1Zx}jtiRk7h62cf_oHvq@W|K=H1&hiYo5S|DWe6>v1FIh3 z$*3XOKY8zY{d6vnEpg=Tao6H}a{EEzNE0t?Fg%Ny02N^o$W!^wW0KE5&JZ`3cj#(J zMwgvMX=gj{>L?dfc4=v2GN>{Jy4+$5@-EOZe^j><Vvt-A=<79q?TZC6-xJ7Zi22JO z%XoL4nv5;^PAxR;3IBZ0@q8<cGoFxhfz8<R@Zsm$@KKfpwSi(O1<pA<X3<oVBuRJ8 z;yBjtU*dtlX(}|*z++3@&!3-(7IO;p1S(*Asf<Ta<B>p2ItnYFBJ`8sJd1T!&lZaG zX&A^9`0$<j2<dk<<dI9HUx}Dz3TlqD6}!rBxzClqmv7)$9K|{rPE<@*O>m2U_0Lhn zH`RN70DwEi)S+uC0s^n%dC@P6!-BAM^^w=2+_d$YpNnwSH&&`A6OY?eFsDh&6FuBC zZORF&C>~Oe53Tlx$7hA9OV+9(aRLH_h_qnZ?t#giY;rSgY|Dd#J45v#xWzZs3`tZq z%MQ=-TLW=<De^e>Ccg-+S|Z+A?Kx|Do@_OQ@2-oUcfr{`SOe%^KJT7ahMRXADk|N} z@5Z0oUtxRh@ohVw=_IhbiXGl3HuVg_T~d^jV?&**(i4@g6Fgnn@`&ZpLn&&$I7Ch) zoNAFeu5-@pzoPb#-L^`d0&FQsP!h1<8)0et`?p$iRauzb-!PhY$K`R8`g&S_<h_=I zPQwr19=M1sri4!UlddM1U*g=`NF^)7zBU(G=_3!4MT``)UT4GGE_FqjeVQR$c9!Cn zHS_Kba#NBF4vS>2)m|j+(feT7)QqlfP{b4`>su!5T6pCRLAde5ElpgsT$i-xpSgdB zxV&5Hc!(jD36sf60YB^21GhM;X9zle@0~n$R^EGmwyQg6iqt55H|A|*yyv;6V(BEC zQ+|%(rKJ8D0yriXWr9=s3H`h6@9sd3Ui^ee6E0wT_DVP4My)G)@9StS<#b9)8w}{h zaS{>+_kQL}z7dZEDKN&(L5db~-f{R~ITevcxZ4b0-+G0#_!>c}>UhJc);&*ANeX0t zV-^eb$szL^+;i6O7%3hQ*YfO#r{pn6zB7~#bWct!O&Xq59|AZ&musa{yjlJwUC%u2 zU&Gbf+S6FJpJEIkZzfC!ubW`#EyEW>j=yJ6hMFKdE*6bsyZ_DQi1`|qusPS{9SI|^ zeWmr8Wq;D5gj^C4?oqo$3u$VR7~f%s{KDd1R;;um(Wi?2&T*Z<Qsu&A=UNeSnxq}j z;jJl?K1Mkd8ftBf`7jFs83DtkO}u^0jON|88m5qw8q>!LM+p>cwYG-UsVW2T^~FV? zDy87h1{#rLmU{XG>Qn8adj8<`_#GC3K1GA~>Kr&)@V)!iG5!SkkD5W|R>#>-7w8|E zUk^#D`hkL%l)JkoM0F6~t1E;u!~)|ib^n<B$rKXscdEJoW575JX!qePzmSYV<SdB& zltlhPK|;d)y*dGvRMKVEzirY=141YYj=~T{W5c0kt;=%_id?adPkGz^U@!@O?pnD_ zLoT9>A9l)Vk=ag11yi|gkN6736d;H%+^@`XJ|{kYZ#-)p(R<&51~vM7|3HK(WpBUM z&dZv#gE}=$DX&KZecgo>b*|S}>RyCF^#=vc`-E%*2(MBmjD{b_ozfp1C#>$kI-_ar zJyB9C6V_~vQfMDMo5DRe9*>(cav^BoDY6b}ZqLCAl|*%uzaZ%!HD}%d(t+`Li_h2K z4Fk2g+51@ozdJwLzkKud)wjpJ|9~@hOsg-Aqr=(t)QoY0E#0?_MS7HQ9jiLvP+V@P zrz2EhuE}??Mh+8LvMy0DMthus&-v+odrNL)(`Tn=9B7*{Wq{qkQ<&2UUi`pq?hn`| zW`?PG1?#0Ld?ds}rY}R3)TLV`8X4#_GIasZmbAbyfZjc-i}g9#y6TbsqMPGP`wCEV zEvU4Fsqbop%d*265E+NSd|o3tUO`FEtYFX(l9wJ6-NDuH2sSn6esoB;2ww_ILo>IY zJhq1k)X-&PUh_<W5{^v@?oFHz8KcLFFm}S+z#gDwlp-B0QJZ58w?Bz_MuCI`BNpwU zJ&a~q<;31JO$)BGkd^{G+<t8X+>H6seD{^wh`0;bJnXSvw$XSt(<5dJosZAw%q`Cb zUgfs}+UBw9@v&N|sY>X}YV-ewK;<9s1S;=9q2N+nXGoF`)!iNRGYk%+Y@mAxz{8UA za*iBVb!d<eNZZoaUvN`bTBV}jR1y*did#pEB@(rf2K<ft78V0lD;X@OH?HyGj!VE- zFV;wN;jq<?QeLhXhh4fN#pd?L)jqSv9JpUXt$?)iNhGaDqU+s>ks=KvNwVP&RMI{H zCMP1)-0~jdD?ATMh9yn8=d+d4&3AC6LyOdHnvz!Hk2wz7Ru?z}GaF@Swj7Bfhc6gr zNU^6R8?)iJbdQA8ik~SDdbLWWEUr7Ek`D)GU3a@G>Hkv;z}-E|>CJKEV&lYKKsXBj zWmMGELE<Y!Mf-I{X0K5@GhkFcymH>v{WwN7UBcYd<2J>@{q*_F^4S%;iqF8=9b^ic z=_xr+m^>aA(;ScNt>uLBr$k!YEdU7_{jK%o_A>3)h}LF(x|0rEhL!uY#G2Q0^0HWY z2wt~(KMXs?P8I*V3#)hg_M|iv_hW1sjkYa{TmUoT-((W^tEHu!n+{?^X)rY4%Jz|5 z-;p+(T0Ik*`(0Y8e;ty0Kj7pIl2ugHb$l|NxQ*ZN?-XYFo-Q1lcy^MI6mw2+sm<== z@w;Sq!DP%>E)rD`E8gZFUqNS~Xt>2^cSH4W_uyX`lyrDI7z(Ew*3Ln1Ha9iN2QQ^Z zkkZHGlt`B~7bp4GZ#0YD19scTCu9mCm`3;5kM25k(z%Bp{rcLk*z>RN*h$(=siLWy zrMhPiySF>N{ID63rt0J*E4X*VeUY?(39BzaX-}?nY7TtZoeQfhkSFuKvpI56B&erL zGc*<4y=<V4tCjjnMrsB43lIu{nNG)$$ZVg(+NN-0i*H{SF|rq#dGe0IP{&6h%nWm3 zGnv#j`Zu<euFdfDs@~d)Yt64^8hf!;2S(NX%z;<IIj1nNFV0a$k7PF7#=H=4TW;Yo z;0X?CN7iYi=$G=Ci0|CWsPzbmBJlCM+U@ni)VaUgmIUw_Bn59tW{@WH4}y8uk53x} zHRJVz@-buQx;b?xUUWK>L*n<qtYLSK&Pyl}UllnQh00e3oR(y;)W+dMthEfnCmV%f zACw*B|Ln?XD!-c-<?~!_QliBpR5Rg_U0e0J@V6M1%QE=@`O5(4Tagpv&QM>CPl4wu zQP|C1v6!c__|q;td5|cyYHy9qKF<%Y6NoR|sl(w=KH09rlgN@X#-jOL>)E3<OkBYG zYxx*}`}0Ac-?uB-9$t=hy}|R%ad`fD74(j(L^)lfn^CGMK#*W#nX-st&C2UBH~Ewn zX3xnHN5zV}>l(&>7&upwa)(~I<h^i#!dy(u!1a*muRl6&<6c>NC&AFE_Ua~;A0jTk z2?3<Xs|uMV=oZzY%2d5VO~pG4H2`JuaZ0)YnHO++_Ix_M`=^4(WCuxg;O(kw7OSLc zvRCgg#R1p@64FI?>Y<qG;cS0)+D9tm4Aizp*#YMWpq1kJClI(3B{W*FG>`2F%KNx$ zf5wuIp5T5zU&z}@%pAY@TMuzPb4+-VSKMDOD{ens<tC~140;z$b|<F;9JxWM>4x;t zedU`Yk|pGmS-5)Xprl;bz-hRGNzJV$#tSVGv_wKQpFV$gJD}3eq>Rj%vb1Ye;T!mM zo$i${VNx*$@GK6Q*bs}yxIoP)rV=F2!6-UZLJsFYqWsaaXi}iu{s|$!vq?QZbF(Vk za^p1}0$;pcQKb!TGbiWFE5eT+3!hx^`rt=cv#XSh`i^;V*}tJ}eKM{qZtkcMi?-n> zyn-xck6i?TjU;T<RoCe!xF+u_<Pz#9hoTcHVhIx9gb;8ig_+&p2%2g#&}%9!z~z81 z{20f^K11}&!L{*xHAe1?BQ_gX;3ZRA`|X7KW^u|DmCag+E(DLucfOO17hlV+4IGWM zjn}>wX)&2;z6Q8uYpLRTUg`WHy0n4Ib{SO2l`mZmn0nl-WpwWgj^PQz2q=shLCKGq zQ6hb@PrSx!8sdqSRML=~q!jTffyqI^-ao`<m|YK_@<<N~Pd8+`++x)Yo=q0g?jrg@ zp+z3As~c%pgf7Qr(nM>1eb_(DpZwKXX%n4}T1hk7Q#<FMcq?RFkMJNE**x~Vzg;+~ zB9TdiGf?IQ5MRqOI_}}(+LDzDpQ_n&=DC;IF<!&0uZUJ}djTnCagz=s+DAptXP|}0 zdvo2LA(T(2+>r@mh1H5mu%a1S^rX%7%yEv_VVu>NBXONS&EaR@aao9`(PC}@kk)k$ zi-t)ge9RPD4@5`nkDL!p^DBmU9RO#g<z25_CtEx(BXx38ugN|0jShRU`Mu3z*IDc_ zu_Ugb3llxy$jlA$Y+thfu>aGX4lgk}kfLR2@g$BBYU40MuNn9rta$ETkx|;pV{;UJ z^7x|uxW3|H{s@+ulH((vuz9nfvfzsSm(KvVsIgC$Q2{T52>{{-Qq-6!D@)WhQaP&- zuNvn!jZbxydp+g@BCjE$pvIf=Q#<7(LX}`pzJZAs=<z(?-U{F}*@{$DJ3e%hq-XyY zNUVc|qaG1SV?|0qTe;myoiBNgOBv&6Z&f-!D@;i%^OF<f#DheW7AVC)BaDfDh=cy_ zU*;K6A+Q}yv|YaySeEz7bvs$*{_^tG-~Ps(Pj4Zhfh}9lN@8vc5G?Y5mhbdo?s5T$ zb+lbfKc8KF1qYFn(7h~|IVesUth+A&5x+K2@gZA5;RCaqU6h;Wk5~(B-?b|BUKz5M z2M!hzyTUbZ_FHPZ0p%~l;VhEDmJ?>Jgu#{~`jhi`&PhsfUDS1w8GQ#K-$pVg#IKJs z67{Fnl;^OrO~DoB>76QkI5zDMN$oBk&>HU};`JwDdEHz-%Q2rR0di=Us!b;n%##2* z91oT-`<YmV*@E0G5`%Y&8VztzMh&OQ2lMC62BZ}@*A=^=Rfz7;;@@odwq8iW;_{#` za1wF_V83N1jRSl43^QX5BSYKgOW5-dAF=LT%;W2Pu_pXJxjb=vnBetb<tIj}a~YY) zwLKIap};3*AXP#Z*#Ql6Vz<~_jW4fR1toZ^MzT&TQM6<fpTLOZJ3knYPg&klt5<um zAsHU(;n_(3bl<It^+=te;}=lo)oP~ui1VCj(;sGh%>LxB2{NWpRr~e%lr1|0I_!O1 zVPPUzItIp=uN*RQ_YH{a(@V((e3dt#zz_<D$lTs#tvClSmtx{vy}`%aKG~$PK@a?8 z`62-l-<0C#iY?j3*|)dmL^{{&8H2unBGBcIpExgQXwG2q=g8t*l9=a7rmG{~;>ALb zgsH{D*C)$2y<TAjR^>!HrhJR@<8@V~eCHc0QcSA?ZT&k&ZdM#xG}eHTXS3MM^nPL+ zve`s2wgyq}KQ^cq&gH*O>P;xg2!`i5R>Y))n!MUkqsX|)yv6JbJ-&@cHYmz0qp7tN zao8Ml0%-7@4<$uk#>A&FS5jB2s(Lf)oqtv^*=b}za07Om;HvP4u+XxxLcJc@jK)J9 zi;d9?W9EY?7@1N;AVwzR1><^dZ*TaU+blElALEgt-v3zAZ{@PcR*By%{+57c{+aTd zjM$rpWuogg<>cIb$7ialY41#{&uL<%YhA~L#wT2(D>CEF;KBpaYt!Q95l1HsUg%0Y zzy#bG^7z)|o+yD6BPW>W;*w<K5Lf&yu@L-yvU)mqX=i*KrSFT28xKE|mn!%Sf%ht< z#@j{3M<&B64^am10xY98Q6LXq5ibQH|Ab-=v80i^hl^1#@J#>%>#D&aRayBGWqv%c zq54N+^>wj~JgJe%vkY;8Mno>KaN+IY;SR6IUZ|$FFy0qg6!X#I?!m?cBRzslGU<9^ z{5-dc`)9A$iG?his?bsoqpE}F<Bo;=xL<~AGAcXOVwM4xz1j;AL+u}52piJenSSra zOmz=t$!1WT&k5mU{r9T)&0|sbz!uA`<`cq`_m3e6f?f=|ioUYT7dk#N@P;BAHw>&u zLh-&OzxP}En|BgDp_kR}e)gqAg*aE{*)Be+;`=g-zUkcMfZ^_X@V^ADaDVqLxZaU< zXLX`0q|aH_($+dHby4jyY1>%3IFw!!Q)9%>B~(rQJ~iGOKGj;TLSgIyW|uvpj)cw^ zU(BD|O{^11Y24VWTA>Qcc`+pwjsTDRtvx(@o%%L))mO`h5hM`ZJ6?17f}*7Ww2;Om z_gaV;q{lGqjS6!QU)C}Dt-$rT4OxD-rdUSU&z&8CN!tsyZ0~ot`3=Fx5UNVj^s;Ru z3M)xW?|JDOVa+*D0u|eRv^qb+`g%bEwDaQry{+bkhlZLC@-_>eaz^4a<tNXR__=2; za=li9H++v#en|&<L`2Am@84shvXwd%YCb-MHoV@K7w(Ka+%I|6D4?bTuXugWPhaX7 za=jo{4DQz(DvnmZ#x7~m>xWmD!U#T(eaRmCx}wHMKy8F5*o8FH0v4@F?R=me8<dc& z@&*L9YR%ZA?jxV3O(=W+W~KGa`T#R=(ZSI}DCEWi4P(mk5RdUv6-GZyfdMkwbk2)9 z7wSZMIZ412sTf(o<@%gb?8)JZ*h{%(+Rwdyb2h|D*lxu>JKNYae7wXM$(dme22Q!Y z1VUL(PP+%7`^dRsUfjQLjhV^3_0#;M-r?jxC7ggaX2}(Sa8n=&wLNBvnX;Gc!NWd7 zZf`Ir=VwH)XO(X0T}@br33g=H$VZ_{=_#jpUmDZYsYe1<N9_eQ5?tCsg1-r7jUD%Q zyaiFbwJFoY$<hhAtT6P4CT8vp=97M5Czji|VwsdX?meGC$HzPOiqOBSUL|c@81>0_ zQL0`DTU~(`s)fTJu~s~Aa_rX{ou4$ux&e(LUP`nuT#%GWO>mqo*H9r&U_Kiiceh7M z;!geU>EaWK62o6HEf|p5aFC77FJS&;TDJW$IF5|9Um83&nbzwuHwsFcwdNY5lv*)= zkYA%&c*Awt;loPjR3c#LX;b@HF1S!B)t!gSJFl5Css9?jO=0rfE;g7;aQJJ{KSNyg zI?}EF_R_F{Dh-7<TtWhmk&o>VLcu!E3R#7*O2`lh3nB2us49T>JDRBQ6b8jRtP;IS z;C1ijwvQ^KYlc><8ZG@RL{Wt%2Z4gL<AhGPt{G8^cNH>_&R&-us7XpQ>TjC)$cM*? z%$HdK5(+1()M5e6u9c0$XUVeJl4v*dTGkyJe7I$Fw3H{Vjh3;Oej3nlK3@J+W>sMG z#k=`A_7x?jN(>j^PYklv{w3b%#G3~1A6>T5%Q!19eb~I*`IWK(!Ebe}FBiw(?wR{h z)BALu@sWPF{>Jb1Uh?gdq2My*o#$#fg;b(1M5u>NM(awr^ZGeKGNOx4!)as>?c{Im z&#-7Ij+qrM5k()pzW2Eus6B$u^NwaiXVT!F4`F@NA*K+bIKwflNq*$qlzyg6@gvy= zM|?iY^K^!cb*-HD?!#B1+D;uygTjyodV;U_BKMl8G&z`1)iC!QaFhw}2s$J(&L6)A z<+S>sKIhF9hPb(&DUS-o42rLcgqh{56Ry!DmuEbv|I$;;ndkTN=Cb&R|JI@8#s}7l zVjb}TzT^K`SF|plS%-Z1k9MLtg?@nxUhX6oY@>iMjsswrviSnEE%B3_FoLcM&kv1} zj%RaKTA2C|jsf0b=t%-MJ&ceJZ|$TD7i2IP3gExpn*$QI8NaVuHKjwc-E9dz&Yt_e zZTq^~#*w(1)tK4c)iZO))OriR^Cnu0Ag<f1D8!G@C#{_Rz|L{U_4f_4o=z*GL*=Y) zwJB=iaCD8*S>qs)Q2mU-;AqN~n1qF`-~{GC8sr5p=uU1J;FCTf6fDI*B0mRvhabxX z6^ULYuBJpzDm}{udjDHC-FmhsMJX!#)p3;YXrjDNJjfi0Xch@F8v-);IB^=Z8Ure- zKS#%$e6QNZ7s3%d3Ak-=#JZycWB$Tm{}ND&SEpLyvTs^+2=kli_?JWN22CNNRBj0q z#Nq<u@U*a8zbq1xXh#0Y{(ylXkr2MNg%hD5fq?`-GJr1cOJtmPxF&}Frc<ql;PLx@ zV(32`?6$=dyNdSvI7{CY-ngK~2UzG0;<_i`;-r_|9PHT%6AWs);s?}!IsU5oz&y>n zUH%(SRhI)y0C#<@Aq3GRlnHES3kyI7@edH^;GYjUJSNEZ-UKU#)9L;j+KJ>p^t>Ij zU?yZ`1V3YP{jwj5ObGZsJCu8+_UVC4Ug$RhDYNs@yj6C=>dFL9blMlDjY;eUJo11Z zEb!@>e^g04cL?e`+hZoN@d8H?tflhO`xA2aHS4)yjm6M0VIz5ppKC+}`GAEXFgnHg zItku#x6qGVRT^LRleArhE$QdqDj8Q-1@oyQEbSx8c=?7!TsoCsdb?joW`lzug9u^L z{0s!<`w0;h1oelk3x(l6Cciz)KL6T{TsooyVRrTx%MWRBN>l620A6MPNeq0dyXJH7 zBY<F!^L5ShOYd>93tL$s7CtFXrx`Ou;A4nL&q^a6==~ih5#*x*(Iqgz6&GkMe=(v| zLi~4KfHiRce?Rg6`Z5atI}xnzy(lRp>i@^pz_*4BI*K#+r5ql!G$&axw#e<?Cz3*$ zupCGduP;&TDG;WdV|1y#P0dM-LMEy)GA$KR9z6xViBZjUnqbW_Ew8cjEo<Soagg&S zllbu+Rd_l7k+MY|eMjUYFs0DAeWxwbqwdCf*>XhZU0<-TZ5$U>rn2;oXZy8ocKzFm zPE;c_iF#@UNg^&Wk%kluu|nKH(l%aC!2fQqS0!LzEcz};t+zyAn?^)H<J29UsWF~( z*kqrGf(V^??&BDzNsQ=>#(GmJrWnBXZsX>be(&Bl5u2GI9rP<21wKrbZ*);GhygE@ z)dssaJ|oBX=lZT7A(9pLX?%oY$IU9E3=MwYq2%bw6b7KX4n2g*S4e7@Aq4;x%fz+j zk!J=FN99F2Ypxcp-VEtAdaJGIM^-$)qo{3{vygE=S|FL%g5+LwT#0&h`fLoii%<q^ zPM6K1cjS6O7MmOr@s2{a6FsgQ$;FTyVe>q{(>r)rB+?hV(A#!y!*Dn+PU|?Uw>r>D zDK{SHVfE+QzK}xc2vRN5j0ZOmBGq&)dHUwk@B9&cnClj^g=To1ui|)5E9$z%aQlaX zC=}S{LHS{3Z~#88&`})U_?pN#_r>RX*Zmd*9Y_IN`$)oWs8a{PaVxy@;d$Hjoe(Fr z&ZiImAywDhxs+vl4JV(z%^|>Kx%i93<q@XGq7SFWcbj5jHmS#ob(VasZg0kr<HofP zfC4?x`b>3q;GC#`ggd|XbX@{E=gHR|tQMN+D2d3!yBZTD{`O6ni)oMIeKppRH=OQj z>_I#uaqvs^tokk2ig1vp<1QFV=E2%K@hlnTv7wSS$D)$=VaN$?;_AH|Cx9o4f)5Pc zZ3FQlrv_D&68OzT^bfUXgJWQK(A<1<kiifL{P6i-mX5antOvhl??tI0p8pvL^7FwR zZ}W|@>Uu9GZt$pBlnB&Uep9R=Oc$+n%Nwxmx3s1lA1139zIiPm8gxdVl%CzMdaoId z-+V%Se1C4fBbPo)Ww96}Z}KprLPmtlh60<SHmDs}h-_nJo#D<gII!k1NM%_kgbJ(* zl3n)6$5^RYGSJxJ((d-a^m8xsi9IM5_F#;#$}uv(G|Fr%05jn+5HjHp2;%1V$7dTj zQY)$+_@?|OiF=$8z&C_WIuRMhNQMqoEZD)ZZdgR2S$=(E5~u1KMS~|j^4d8P4ogfy z!kplJZoat@NhH?YnpK_9etbQp=0{v+%Q%qUcWKiek9gJBNH$*$j=$;ANApAXNH_@Y z=xSC8s@Z&=pyYnA-3cRLaNREa(f4wZ8@S(WuZ!vH_%JeZ1n{pv<5@4oAMcD9oU0Ge zv}>18QnM0UY1T-TjH^etf$(PU<+z^>ELYZomcbWr7JWzaNKxNp^EWDesjO<SKUvgl zymH5*HFJbJ_$jDVfaGa~THKu3&*8AAVoqh>yU3e{Hb)~75(eCs5KaF5A%{9J<oVjt z2xWR%^SYs4h<bh@B!#S=vLr%1Y=?AP_cOSRP^|tiXt_wDtW=MUc3UOwMwF!XY=!k0 zk$3K$-N18gr<YH+&yY!%Nt|KllSQxQurZZMr{NQ{_r|BQpbXZ<5f(CX975J^{TpxF zIAdYM(dtE@Infc6j{ktMBsAxZNMSf$SI3n!YZ9Spe;)G$FiZg7_$_)+UO{MM&g<oB z;Mjrz@z^x-?gU5*1>Vxb0Eonc;L)7mny;)8cId<0^r-+$=3(>RsISywYbfKHXUYsm zMzYk(YRjF0$(?_Fqa}|UA;Y3RqgG5#fm~7W2R#HJvE-PGl~E<nMBd=;w>&!zJ6I}e z>jcf#-!t5Qi^Tk4g7>O8-P^8+c674tXswX|f5rkxE*y^bz|=v3qMVctb}|JKcOwvL zUy&7*A+|glh5fNJ@+Tyv4}aAK_rrAy0@0;wer!HX)x686OFETy__mOxHI~Z;^Ypl9 z3Z?kv%vD--!N7#vC8h3mu`6?&P5>=McK;#}`PVitQ8Ng}LTS<0wIJ?kQga3)^0M(= zB%B8WpxDt)58I7fW!S#!VI>?+E0ri=VpXCY(s}e=a2(RfkN$P^US>0Lp?rK{`?(!r z#xz3h1Z7uInj1Nl)Lg$T&ZRy}@NNop^Am)}W>^=I%-el6BunNm%uan{DOkvgu@Tqe z+|q;o)h3(W*TB-(%y7>FbuG&@;RC<w9jc1tZ0(Z@8mrX)lVW~YMRij}#*=#R!!YmA z?`Ax{@`bsblVSJ1Z<ZgJ=Eg@@X&xNPhf&=ZEzuq=_JhdAv+2D<AV<;Q8#a?1%ez{? zsP9Vn*klp6{#-<r+3i&0cymx2jYttmUF4Jrh+_VGZf=Y99CU!hb-jLzl;aPzy7ZpC z$O^gQc@fvnaYEH=JH^L!RN47I7`&$cV({Ezq;71zuWMS`b5V0(jVb)skG8xp*w<Xb zmtwX@+pBx}#dpcRvV5<t)*WQ=lrnzx@kRF2^Mz>PKgZn5y^_do<aOS1G|Ky-cT064 zd_BCxII7?8sx8?K5~%Wrn{{{LlLTS^N-^zQZ$(*Ky}h}KlG10->mzaV!HpvT^rv(| zZM{G8@BV>f9bu8kD7d<gYPnjxlGGfVN~GU@+4B8y(&p~LZnJQ7y_m(01l3?+>YVcH zaMpVwHYsfFnCc$;<vD;3)s9L?(dB#W1zh)CS_#Ic$^VNBB(hD<8u~TI=lppo9^Ct% zT%d>v3W6l8wkHhT`vx4UTo~pCB^UlPB^S2EgLG!Uiabx~a`$FzX>m>AWvFbi`q1o| z=$ejNQBei-L9s@5T0uzvr3Ox1;hWY{QPElqQi<YiUL29vbDa5^Mp)$8X)%w^UW~cd zwe&F$Pakr!_Tfgi;K8Cwco9#wvQe#uX?~1+=-GVI^2f(8Pw#*V&;d&)0V(jR<|KE0 z6iLFsAG;5Q-(x~0&MGcBY%;=hMa%Cpz=Ialds~&5Et$@35PZjFLPCOp;L_^%<J^NP znm{?5<&{G>^UM|SSgT~N)!gVa9EP<x&^Td_8MVN%_6_9H%eHr844)e&YBywUO6)9F zUjuu69cGZ!^u=e4`|k`J?=fx@5fuqR7JHg>pgg{(HcRV>RJ5Q_b{zGLed2#`Wj9iR z$fLgjD8gY3gMIO8u|N>2DF)uC$2deaFZ#fWx?||;PL*Dm3W~v|)PSYgwIJ+V1ZTFs zwvdS#7m?_l)4^0=5L;0+P~QsEbDj}4;e&?W1xUNa$`^uO89tCg#`a?R7>BbO#}lg4 zZ&(>6DawG*j7p*j#GO}iL_a(k>1Q|2QJsTlRdjOP-IS=7HedqBc5651vK&Yvo~MhL zneh*q?Z#^;1&p8FcI@CWSJKYx3!l=SoIL{Bpb+S*Iin=|S-wAomXAn7N6W^{0k`-# znZ)v4ul+$g?`O;xwc!gukBcrPr=SIPyh5tBP=QZ~gqt?wJZX)Qd=zY9Y+R54nPz@T zM*1UmK@fO+c@BW%7LN3D%VTP$l|S;IUi7I6jkyiFP%EnF2gmZ!JvcuZ8IOtj=zM3Z zqPG{{AFqh!%cn65+|Ho7cR?^B7yL{w%zis>2IPm;R8LKD&zLbT66Cfajfl2TJa7#e z{`m{j#lZ7{si(Wsa`RGgH>j4U^WX4C#!KfX$kM+zl$Dy1N^b3Hdr@ZAhTau%SAbLY z=P_wKVM5J|4K>GIIiRH>LY9+kYyU-d@sJ#mN&s(Bf;~e1rD`^lNdX>VZF9hs-!c+T zmen2pCV|M~V2$y}3NM_d8N&Vb@IASGNpEq~0Twn|h!0}}{%-pl?^B_fJ=mV92cG8| z3Aa4~6sR(7)$-%5s}hft_=SsJZ>;#$HInoT*4**l)@1h(vzu*jK=4$%E1uZZ49kVb zLcYEv5|mqm1Y)JQkr4rG2plQoRKlf8sHL{c0y$OHH19p4ZI?CLuDJY8mCc$%<5Ix- z>e=<RvR=a7tU6F>B{D(r#i(h6N$MVcs!#(yJDf+;u8%30jm(5f8o{%aC0tgPqA146 zdCGF%WYoR2{x)GxXY01i?41tk8E7izYca8DdBR%}zFf;T%s=@)6y1nbmt~7;XJ6Ae z%Uoa=cfP+q=zF?@F(=`ZWswe)VkUgvh}-YTW+9qc4r~YXr{mYnK!@Pw7#aLeNYGd) zZC@j)K|oTX(8Hmxjaxz3<jQ(A=AY4r8A5^kcI))iC3On_D<xPeAwuxqC_#1j|D*(^ z0ndinPX)&?SOyILlM)R6FG}z*T#o7Itz@6|iLlf1_YjH++y*lM4e0XA<~O+OmzLX8 zCiCI;8`mBTnQ6kFG>8TpjHL2mV?UUtBr3Q(qZ3RZqt;k~=X?#Y$_<Ls1k_c+<48Ly zSelC!Y2@I`c8DR<LHGf#mrWm<i+;->z<ExH*+rvWyglxW<kQqwue1Q=QGOHy`kXU^ zcO-8rTU!|BJ)wu+)YDxPtIv?E;(C-=D5f-Naae4i?~5JvF{5G0u=;MUr&{3TXup{~ z4eOy;1a)tu2gE7h)i>e~tx+hKyoqEAfRH1XBkN5`;;#FC%eh2=Wrb@D8B329VuG15 z-#L=5k`b=OJ}wzABBz$$-*n$A){<_(dC*!U<}X7$xZzDywY-WzIQC*!(DwUo*}!7H zCcM_wK_LFT7Q%JaX?{*GWFrTkij%dmHadF(3T8p7>}8$&`s2a1cd4sUv3weZbi$38 zc~T$@uWeh($dtuDn8k99g_C_&4&rDa-K{Lh(IdeWT$Ws3ib|p3r)Ee+8pSAzbTfe- z0UE9M^D7vFh1Al2A&hP$1#w~jFpPYfB_wb<!N4p_V_Zo#Uw#i)FuQBZ*=d5Ybz33& zNiUpo1g0kjnkNm9i%JNhr9)KB=XJC!kN;g+(K?+mELy+)qY(|+p!0mBwC8j`hPY4D zun~}V%#`K?I9c;Qdca5UBuX4{w#@Xus^NE0W}hzaA8I*xA7Q6?xTl?kGEL#0s6!Vn zZnj3MfFT2;>nW6fAV0nio9uj6tJ<ij{umSRW%)MQ2@#!ZMmN_*`lKV&$*c6FT*g3* zE+@Q8KL_pGH@2L9Ct<7%;|cqG6ZNno{1)(OK-L<*AC6wt(l&kG7Z^VNV==Du-4OjY z0i8^ksXK*j>wQ!`oB@~hr5U$xlr-Br@8!=oPJG*v2S(0RJ#Ss|S6BW(>Z|vZeTuI^ zgAmy+tJe?yU1k22;GE&E;9j#UAc>|<yKz*bF8qCS7=`~Co_y?aXXT>)kZCUP^KR2m z*yX{KWyZX|;eu-YHKJ@g^95wHl*Lf%3&YPXs{8SGn5&eWnE>*|6w?#jAM2U=|3U#D z_QCoYmCAfDrr)RW*S%yp<?OtEaGO<)%%jK@w{opXv3<_E0Uk3az9dPg^fNSzM^-n> zZhAN5QLdWz`qC}~tM|ZhTc-2ew$_Iw=QM0o(JLYR(28@$`(O+2AlQrMWE1c9x(8F& zeiqlQUXbaiV;3I==7#Zwlr|fCLi^Q0n244zVCxhomk3IU646p<I_yr-OB}vv#+uuo zxYhJLQ|k@geBE6T-pZ@3!vJ$y2}D2~Fkxp9Ro+B=Bx87`>xrdpc8Qri@z$+<1bM;a zfGCMLw&^|;PXU+)NwrF!f#R|V2ZZu@P{<UoY$k47{XwvUfDAmam&u}##8!qaU+YK} zL#5SjWaVK?fJ(wmtlh}k1)15K9RCjv@I}LPS)wE?Avl@W6z=~@=v}T&?#fC%h=tHo zWLZ<q%*mF@wJ`o73k9LvUqA`iF{HrRkOcQftJ#ohVAjC%k5tbUk??M{#=Ogdb-9;M zWZ=NUT7j~UxxOp;HSDhLT0$z7q;scVqlGwOC|gkV4@_twEm<N)1@&<-Z%B%--N+jO zw)%^J*u}CV2#ok5hPQl_Dzz~v?&2b}px9pu``GRZdP1(?^SY_VeEz7wU{<vh%2d;n z$>$~RzkzsYFZ;DTy+#A#O1d|*!|?*Co$}DYFn?!ITuS=4&h_H=C@5vD!R49w7}%oC zrEY)$(<eb?@~Xa@c409UBPYwYni`(5QqXC^dSgdr#imFA{vv_nk_vbry4FWTxh*9y z%ge=cAw(rZ`jM{01%2+WC)$^$<a0?BQ_EqxYy4-40y5PxgE)qflbf!KSOcgdXA;sy zhP;_#e<&GtGc`b<XmPbU`)|JpFjp4T|64L$CW68xNdTh^;12E{V27GpDf@g8B~wc? z9T8>$4~cP+NK5#pLJIrX!m%nkwCMH<qDkToR5q7W*CEbGJNEtp-!gDq4SL>kTXPs4 zj#5+<=cd=9C^mK`l`tVk=5snKy2tf|=QF|yqox*J1?T3Sm43o#-5Ucju~|DiwtPm< zeV!vzS4@FfkpKtJ$i9JY)c{i~$qtQ0_3h(S>(Gq^>R_osW@Z~3C?WC>KY$kPl=yWA z`R<e}J`uQ^V2u4~B0Q5`t9@w_lxg(#59sC%%;gPm&<PnuZqo$c94#be5nii{>z5Jk z$faTramChR=2{QbNAEK=#a_u^*yoVMl*wQ?k`g0c!4+%%;UFEIsHW}7suKj6wi(V3 z42%eY9Ynk?#f;NS*KF;iwX#}Dk=1Em5OG~3pmp~oX|pkKs#?e2rJ$-4XJI{U1g&6D z=)z*BQN*a?5cYC{U`Ilk%zhII63!hOXf~-*OJZj*1o^VfacD67gS{zGg2UV$Iogq> z%t51!OmpM%b`cswEIw^_IeGj=q4kMzzj@I8MMo<l82bH0gLAgVvk|4{l8=}A@SV4B z4uuxhhb45HS}9wSUPew8dze#dm?*4{8#g?e{(<Si0n-};rzqi1t~B!N+a{OwImtIf zc}?U>om|DEVeWBpqf3!9bD}?^#!}xcVoF;PQmoHS=N@N#gc*D~FvW`a;^5_bGz<hR zec>})?Dg|qlC9H9i^>UgkUe8#8RpRW*z<00OPIR3b-nks`<h{NfBrmODhjoDNaUUG znxeaZj3)Frf&MkIN{`7`qt28%)F#QDL77n#^@BG$)O>znP}PsP0%u2>cox`)CfdS~ z@MyF%3pE{cC2Q;*QZo$<B8>wnviEkV>+2+Qa_t)#zDC?B>V|m^`RhWD|GJUo4sZjP zXZu}v`$$q3$z0-alsIVr`Cb4>+VRy&m*NPK<L_tW^vJvd?nh)GVxL=2kX|@hOTxY5 zJhs%uxDG(GJNX*ySnQ{hb|u`;Tiqbqk8UnnI&&A-4|UHyUo<-2Ug=ObUX<4r__*;{ z31V_?ph(M-fSO~`!4ngt(2|GY981lX9@7V%MsNH(8&5b2&o5aCIt{2pDOx3Z7I%8r zo1OeI9Fj-sWyON{4kF!<bU%GmKLePx+Re}+KG`1&{#c?&5%}V8<|IkbOpsx&&AhzZ zMh-TU-;T?z|HI%CA*R#5K_eZn-_?)d#RyxJ!{CV-*@{iydnRM35@HbK$GM0ZYZ_R5 zxA-g9T;M^h#9BpzYBtcrxEgR-i-#kR*`-w9f?(#z1=6l7Z+*2p<`tfFB#T<(8pYy& zJc<v<?W7QfjP}9nK<34c;z1mKvtm4po^8Ub0b`Fe9>y+@o-F3|zURm+c1|h*^|+mL zR6yI3BZv2Pt}v+>NYm6l@d3khEGa{zJms(gS(Bj3(Udl%OCPaiL64_@3zq%kC7Hp( z$TP?{Fha*4CcAo$iLale_{roVuGU3)b2)WpY{dVQeni+s2hL)=one9VO+j+-wLiju z<+Q=n7}eAaUkS!M@Gx7*&5J*Jp|ufD4!sy5j;Ytvneo^DMogC>rkr;&OyZLbQ~eyU z73&+lwbi}Yp9GQiP4NXBZY*6>LuO%BuH$5BH(-TifT3eZ^jM@wIF7<5x9t=P=d|tk zRKD?4tZ^0!Tr++v@X<(dKPp3MX7;<IO6Z&|3I~%BR49i`md*CgcmrnKBCfvRD;z#7 ziS?DoxT>Lx0Wvuk&dp^+tF;RBpI^I*!03m=4r#_UE(ptKB;4eVW2KepR8c?wMeMkw zh(di}X=m?4zu~IzHRk>+mHo3MOX|cIgrLL2zk27dQzw$UZFZJIbKv1yl3k(eoLVPi zm(P*4Vz?S%wegR5R}I-&RQ9AP8AT^5sNj;Ma|H2PIas;7R|1|8uNoTRVJn24p(|dD zcg+V4tybvO(wt+@a9<i0JW92Pvo8VN!4gWUXU5fyu=dtv<nT__T^)GGp)WWSY05Z@ zXnb=K*h#<P$4_t@{uii)>EmkZDGm~1(10FdF@0BrmhgxidJ9f!c6|*oT<az<E~;di z0n=alPM~-rC}!g0)f>l+mihRmxZ-l~`QEa0)gSjM?p9{p&^T;FX|p&$md*}_p5Slj ztv6E<ymQl2XiN_ZxwY{Lc#c$OB`g&q5G5jfx{YW}DVHUpJ*xA?y^6Qtt;@&0;~<w* zWM(Zwd`O{lmNSpfvg(m=BH{9A7HyA!LVaoFT^Z!_SMD5i77!$_URRRF2Iycm4H9*m zL*1f?)$LW8p1zs@6&N5d&i@nlN)GxD+)L1SAjsQ4+pY&v8o@*~^k*?_&|b@EzBC)% zs&+_mhGaJ1Mik#FK7lYq9$<xiUm}ZB2wcgei{m)rn=k=F!PPI1=88Ss@~wlo#;?vS z`YNO>HacOFj130V<id0dqWG9&HjBgoJ$6j?fZt(<^p*5@r!)T>=O=fM`PV*i(O*V> zc^RoY-d=TIM^1^^F>_TDKhnv3R>~7%I5X_zv|^Yh+3{nimqGKv1GlL7J<E{rwN$3K zjxj(nbES-F4L#KX7TiK`qM`$HZ$H^1%|QviKL|k_CwWxyCGGD7Qc_?F85X81wt|vw zxJ+sK-jeyRwR{uE{zb!m?5MiGx>2RN6nKp)(axnl@*2Tc&4Hs)$h?=v9;cQJ-~rQ7 zRiD=jF#`BPJfh3|ca2fC2E^yXeWfUYF&etr-oF>kR^z?uZD3ba#Ar6Wzbj?7mw>uD zLc=Jeqld-%a65#<=PO?2Eew+n1#$5*l>v^~dD24$Ga&lISG}0VP6*4?#~3=xzgbX( zcDk<eHilRHTe{m86=1$4Z<}-@>An@?d7yXg;8cpv;%h+Dp!q&qkO&`Nq!sr~&=)?t z==QM0#t*utc_Uap*%zBTmvK8{i(oi1%eH?(#gn5=cj!vf2gD+^ltRAbUdOl3=*ue+ zWE^n6@C?A<j}Tsz^1d(a?#DJQ1Kh=I<kUWnKpd0nR;X=+>v<dfsA;mSJK4p?^?A4D z@fje=&UMW5ijNS|sd&OoUTHKTi8~yCU;W@>d?U+4fU4*BnEZ(e>7Qv;E#Ci>8#7{C zJMPQ8$oI@jD*Ly<Z7m9u%M*LVPQVeGtQ;#KLx#a!TV_sC2Jnl~<pi$0)#rx~9=36% z-jBPy?$}K+i}5nld5nG(=K2b==;(yStpa6fN{J-ozs+3{xjAf!OUDV$ACoh_*U&?m z%c~L`z#~w<3-bED;%?FiFrcSYmk1wy>tZ}(X7KWptwV#c)h~?{_7H0Be`DwT{)3&n zg!EYW7myR1IXBB<VL-}d2w*hjA0(<Egjksn%UdHWHpx$asPnivK7a19^Jm)W0erXC zO^JDrgyw3JaE)kWEmN*P*n8Y=S-!Y^{8A8XhsO)vYy}yIKGyFz7*`+ycLbc|&skUR z93`J{N&&@w>8Hg^4WKlz3KNT!<>jrMBziE7<B~S103<7$q&_#_aB>qrTg?2idm|3N z(@;-|G43eQpvdIO{e#0re-awx5P%xkraTjCX3#2#dVceT?T_DnRGl7&X3f5^m352? zfy%;+oltz*t(90SZ$#I~5g4-y9pj)1TE$0kRf_*jbna0WVr;~;m~dV4t5j(>($CfV zdeh(-+fw3NLLBRZqkhG21TVKH&yyQc0}>R*bK}=mF8s}d#tRM+f^6ush8^syH2Au# zoHC`4I{Wz;^98fn{M=e4ucCfp@q;+24`b}YWNTeb3i1vD7oK}@Ro$-7F%-S7pLbIz zp=GhZo1+B&2=UAA{92=&J?@#9H5pfs3cyu%Zfl}~TDh!Br^)ryRc?$b#L{9*CLyap zv??~RLMBm`boO6|#bUm>S1$N{{UR2HFCPg+bWzymU2cHwx@}02N&4LqvpW_TJN+Vy zaUt>)=|MBoJl?;T%(&P>&(SUy7xiT|xF%W0I-KC{^eHq+*FNN8KQ(-;4YjXlNSrFx zo3F1g1!bYk9-N6SuIAG75gbqE^EhbdicN;sFx)B8{^8{W2)D!hOQHC^3?cBp#?a?| z_u1xWspodmt`jc}wRH@iRu^+jl?`LAG~@z&4j#i_j0qn3Z4F<$q4*H4HVC`?Hq`Xp zA1PYAUlyJZ<*QRS)3No2oB2L?l^7sp#*v49ErKy~O4yo@i16kw*lbTqxY|IF(VBf+ z6DGJI%JX?4j@#-6#ceq7^NH<Lbq?3o)PX$=Dmh=}iM?U_-p`0%AG0@a7fySFW3+A= z6Z|1DxMs9#c}yjmpV9U?`J?TOfBf|Nwnd|%LqqNJSL`RrwX~=gG+rk>us=Fy;J%=d zvCmhx$P0~jx<>5fKr8;OuKnalZjCXtm!AjM+*7z6j)K4s)Wt2{#{hb~G;1Ozr;^Oz zTJa^|6YtU`XG!=*jE>-o(AWeN`wzb{;mmYa6_Jk#A3!!!l~v5x=Tw&-&vCoP=r-l8 z?kXYeefQsX41GFCbM5_P;!w|vD~!|4z2WLyg7JQ*t5z;ae^l?Q8zZ&pxR9H5?vd*9 zqg)-{=}$FRySjLvp)S7nYw;)QI`$ej2P}_#+4g-g31ybsPG&k`sOpUlu++=FWnW`b zQd(g3RV=%?EEhhcuqH1SD_s`IL``wSP<`L@M(s;Tc#}~AxGa-PQYXNXnk^0vQS`-+ zfaNe_l35=fp+4`*abR268>5?KC&h>%W6V7gpft3hjnN|NC9_g1lcfAMiad=coq-pX zzki>1pVn0jgA0i`=B<aga(nw7KSeAENAmZH=?YLW-2llGgn!ymcM&r7k-qw7o^Ulq z0quiY!R`4vz{FD1Md5jWy|iF%fK}x@Kc;)ZOOFST68|53opYEZ-LvPXds@}DZBN^_ zZF3sawtL#PZQHhO+qOB|FYa&m?%rqrtf#W-<jIUY5gF$b-{9^FxERVENP-<1BtAAf zn%!sf<bzz5?rv5&pc*xt>wUmFMZaxu#(A*6p^HlXV8t$0MMn_$D-_H7A4oTiIM%J$ zS>US=gI3#_%at*6Njhc+__oM&SDNwg+66W3*pQP)!Q~YWhr?_e<=tLM@z=4wB(n2+ z{8T3#NaWO3it^2AzM!yQf|E;*Ey~U2FceP795=g@b9eg`P-s>aLUWN%0<%47E>iq7 zh>1pgjMDBek=Ovd31y(ZKthUjrhqh>Nf<n4Olz$XR>O}uT|t4ntD3vBDWb~Iaa*Z} zZuLjw`9E_F(~W;{t-TNa2oq7o1oH7A_*`xLAzCGo1(z8dA|fRfc{LjmqG)^Ss(srw zfx#I+xiL|ls{6zIoXK5>XP@c*$0Vu?xf_Rcz9Tm42&XMpNV2(wP!EgL9>_jI>ISmR zPHbx0N5*XW&J%Da8%q}M{d~NkNzZ}U@|*Ma-Sti$LewcD5Y=BLr43^Y830Xm#N+@C z+9@Ckv4a)CBtVRHj$)inCUp*CK+?qLfdD9%3d&U}l;9e<61b}rl;KBJP+*Xk_SI7h zvQd(UAD>m|6T9dbcfUWa<G7lE%9+$;x(<Qu;Htkp=s%rIZ^Cq|Oa8%aUsAR?jy4j3 z31)ufx)Q9yar#1I!HY`Md49cM<_$xD*H!8v>}sLW>?MdJh{wXi^>b^*taFg*%KslG zYlfeXaXtKkGc_*`U6it~BB;6}foR*qFZ%GV5{E~>-M|h=Uoc9x$O%ty(U>Zx$(&nd z%_$~?$W^tRwoD5V<QER<`TB~?ihpEPvUm3we{LF6`cX<`-Wy#?0E8IZy<Z{5Avcuj zXOB>GECT@sU<M;w*0R?q4y-a>V}CwL(w)gfWa=F}R4=u^j&EB_=x=gM0jDtTAZ=vX zB8|NsKRIR)=}^#!--zaGn?wl8=b1#U$vmW<f7A?Ts3(I=%-XFpZpajY?2B4^Ccr-} z#Y5j!`Fl&{FXW68g064#i!+mIwub~l+Vs3*Ggr;ewf4P`NjSQAoRN2cJDv7E-fw4e zouc?sl@wWf$}(N?W-ndxf_{*7J=YipEX%b2{=W6c5~L&~`wNrdV*~N0W5Z^E+UDh6 zj@UaV%JTi%>x0*B|2ut)3POFc{5ko}a_I|*Wn|1C0O>K2oXK!@2yJ!SL}}4e`}f2S zBfF2c=}0Zz92^50X*i$ag~#D=fH+Lwt_gl#&RB2Cc!58GzIYz{XKI7oe_UfiE9r!e zHzZ6Co$jP!`<hK%(aqrKgj}BQ%E?i|KVKuj_in>=L4$z)Lvjh|txAyr0m$Ilpy1&h zAE?QR`E&mc65%1JAwi_T|Ac1YX(8uB5Pk_yzyMDcUZ7`ZO#%3;;h=2E;FEcQbA>1H z1Y`bz(Edjx?4M!2=Aw2F0il1L`-6}_``-cny6FG;`v3az*Ix^ub9qDOr3zTI;{rI0 z&v3Z(4+WHb31V)YgyEH=jQRvJ{Hvo~0|N2wJOqmDE1wy-Vqs?0t4z`hO!pJg6GCEh zsrO9^gw&>{*xc`i_4L<3@dDlA<BbRiep7KnO4|9o0|QgH1~IN|=E-NF;poW|o9bVu zxUaFtITE1{28>g&Sw9@L7#3$f?n1@DPYt$%yr6Z-*=G#|`DKfJO(+-}$Z%t!c`vi= zdL%G*m?#XLAHqM?1Pqk@40r0@#qDvTZ%PcIl`>i_#a1L1H3Sl5QUoNvAku_L)P#9L zeYw2=Q#{Y|dF}F&F8$gc5S|*H89DBc&W2r^%}N>wz0R3#6P@#xjE*+`A&A~UrY|js z!$2R(s>2x=(oHPDMPl%=*f6}%M(1LI=j5m+;2)B>ByflldDste14x=|*}WPRH0<T9 z!p+gxb2b&2S5LRrLH0JJfmD1)y^7Q?JtAW}b-n+RRhi0nDvnvrSqHm7$HMIK_pDr| zF>2c$kPAw{TFPY-4*N`@KR?Ng`8JOdZ!l3S#Ri3VbLw6Z?U@&3d9P@<#D4inhX{G7 znME{mW&zy>|2$rFkv`Ijprr$qqH42gK6Te4M{_ao%!6^(I8V4BnF=$sx$K8JruAlR zEwC%{bs^c{;Kjzq1>Is1oCMEZyDw6VzN+r;qz+vU=Xmb+PF7gqc)u67nah9NSH+|O zhjTkp!Tvco#uyeNrhsQ_gJ+xa?@?EC?O{OvK|y@cZ8U!06}9z#^_h(rrjnd(#EuJ- z&u)@!({a(EFZcz6MQYVMu$M;cFneVbs=RMa(z9jM7l(Yc<voKvYXLjLnlO>Y&HTkQ z_gGLsma}7?FWqQ3l(SOwArcz(V}sGPNa`+STz#+)@P>f`GKM`)_Crv-<x9c__hPUo z&-1qrPh`KW5IIC9?<A<Qa<Mp+l^$)lBkSG;QQaAq?27BE-_a-%867m9Zaey6g$5D8 zSNcM<!&fgctK*H>2}{LLP@RWXojY;~4hA&#CWnjS&Wm*I&Exbg2zUY5q!s?zWi|W= zb9h%^G2+WYqsLx&T&wT2j?y-FBY7hfMKw&F{cvj3h1C+#!r08n65zppT-qVc13*v# zz>Jf^0>dlPBF(Ocz4irMPNEV~CfE;JL=jb}Ubd5c3&n*``6HSyx={ojR}|+jH`eTg z<lr-{B)Y2sE6b%);VxA0Y9J8ls=aziImnK`%(I<2`bN3(P)KiU7joK@9c0qKXf%7d zdpRiROu9OID{ec8KHK<AL$I5GF*(&_h<|ysOeQ}ZmcoUzGRVgjasTU-|G;GdGw!4t z0tYB?h7#0>*ge2)e4EeLfN=Z6%xBX`uTK{0^?D~SS7Rem#5X6VE2{zcU#f>zts<v~ zQFU`8Ji}7E+ni+dsCj~ffP%8JuxJfAp9O6{HYP-h+!<3e504wYV+Pc`N<O$F7qU$b zdKRc{AH|^Q^qJqG?Gn`1Sl#q-cARMmeDmDTE>T|YS-PH)9MEC3JptXK6&KV-8*0Pt zx$4X2=pu|&1JQ{%9~-wpug}X`h+soAmy|pIE@XN+@N#J;w8%JiJRXLuc+yaenIg`( znE{ebi@BadXQlv(y6rtJ=J+xY@c@zI3i;?wbJ)H92-Tc|Zct6<eJXxs4dHJ--Ri-= zWr1B#5%DNSFz<A@UXFD_6McX2cq82k62n)}5yYz8+hN>BXC3<%v~iv%x@XemFr?7S zx&-LnnB9U|7EOc$;s#_nXSGq%zj~oBW!F>VSP;d{arhv;@$!X*07~zRNhVfE>K8U- zfE`yRvR#jSvMXXo)YNrDa?6E=vF>o_q9U_Tgcv!b+sBGP$EkSWl9-SMsv-zrM=&I9 z4i*JkX9S8GcJ?nlP3gzh1rYGqrOf5oPbtO5G^apbX{BJFcDpwds}D|P*pG943D72p zE#^oJ&7=X4bt5uX<w2Ra=NoH>wC>z0Eaf7LO5mxab2YhyG(s(mv&Vw{rzmQvCefqw z=9vN()Bx6xr?;}NYWJDE&s`1ERJdIs3w9P26U58$EdfodE$1bo$aXbklqMr(9F?C6 z9gzu5`wLo5K&8d+T*hvzav?NSv-%le3X1p1^l*8<2!RS*Lu@9cwvR6bO`GCK%gi^n zQOprPWv~Xv=MW!}3IWhV=r#|xOvEP90UI&myJ9d|E|Dz5@`dRSqA-1^bx}{Tqgtg{ zPU&3hA|B80A7Ll|ooM>r%Nu#5lcZUxqw`Z`sDvwF6(8;DQj2}{E!KFfrkz~6a!9FD z5C>=3)t70y!|H!SZ{XsbsKprxXjmidvOiuYVD~H3B3iXzBD>tbSthzXJPyprP%Tyo z(g)ISO9|Sl_$sBAdtxttfq7PSq+I&wx=niN-@fsE6BpuF0tq!H(65(!#ugl1WggvA zjXw))g7j|<vC}za3nDaV+=?}(s;M0gRx|IN#K0;y(vgtFt2!sTSoYErYWOpApt3!? z>Hv++9qebtNKcKX?MBg9KGyRbBDlQALRBEeD9X!{_Fm0HYlus$RRfYTzf`w5!fwd# ztjP%5_{^hK(qzo;+7MFb#$o=^z8)1|EYkjucQ=9X8EWbXYe)L?7dlI<b&_VYWU`cV z7D0B?L`2m5sr%{s#`5cWt4S+tNHcNIq>2mnVlHc-D)y?++tZ6kp<uEGt*h0G3fF2u z@}}$M!n<D?%RJgl@5jY4=R4tL+k-pXJ}Um^-F{g!*jtVJPn60EUBVL56i(+|-9I~c zH%&X;n<}oECAC(&gOVgTl{IM*4CWsm@rQR-o$*6fTORH_cQ$zb>Mqv@sy41V&`h3H zJ4mXYM0P&abwCBY9cV99lIy3YbIInbL6ch_!KcIj#iRXqojSn(p;M;-_W$VA5el=4 znEhD2Y{kUURwgH#*lmZV!FGy*HuzVk?y>>${|BV)8gt)WZe`n@QTEH@PL|LwQ!`Ev zlJz;Bil2Xe8gANr`Ba-m{B0{x6R4J%Ttyvd@*>m<y3rPw&BN%BV6|Ds6APF>1)*f& zWF0oDTh)|dX5V}1U#!Xzl)osj$XNXUP+;reyzF8&KYRA?nasXxn#G9qDt2skD9<J- zY@U7<SMpa+Fohp3(%wUB>Wh6<364tX;xDuXOpN`^@L8aQLzJ1#{`oGgSs0><Wr3Sk zS^69e>U(?8Z0d>&UBhx;|CDXN9GD;OVX>)23s6^HaRQecng+s64LeiGE$xQD0X(?3 zzR@!r5V}EDn|b<h7NK)Mlc5H-+m#dWSJN1^d^dh@RGS3pVN^Um!yS|o*rm43a?_z6 zL+?M?i`K5e)Eo)4D7OUm{4h)=zOb7*0?lk+@2AqiW-P}xi%xW7e}&}2Q7gO=chEB^ z&jjhAN6&*JstJTf1UV~kx3pjg4bfF7I_g!AiT-Mqm0CDRd~)|a#q>r>ZvOf!0mNlI zI+TPN$g_wTlO!?6JO;n|4$|NGbjkT&)RO3JdD1AZ$HBlH*o#XNWxjzo1oBdas5SuL zixYQzem?Xph0P#IY2&J$nUwOfWU@MfSmsB-sC^m)GhnQyqwI?ka1Z38<)p!|;zjm0 z7rWxr@Y-jpa)uNelTn)VS~2@CNarD9j)!JZ=@bRZrSCH8TV;LYi*Xx>hDSE^jMCAH z5Ig^E>i7Vq!j>#Am4`YWJtqT`-_Rbf(3Cx%FKE@gh)h4V9`WJyBg!+pvvTHhthbf~ zXgyKsfPnw3fBIVoS&<B*EH7%b@G>|WAh*hrT$BaiTVxi_`G2VOd79G7YQm=ZY(aH8 z%&(Q`#{T<CMU4*3;Rhsn%94{FudcG`!Ft(#p|bu`lA!SUKt&0kMHjGFQJ?C7p(n*? z@bNEOreBWmFI#3|#ea2#>juH9+X#7+S9HDDc)_-M#%Fcm=<-}rHT=%Tnp4RU^j<kQ zbjE07zQoeL_0u<}8i@C0?gt5`M>y3K<HC}3XMFtS{M-(9oAMIp=^lk9<4yU@{E*ex z0!<J1RJdC%qLWB1YGZsr6m%+)Kl!`?E+^!xC%R_k(Eg77Dsw;AW0fX<a}w1WSKDia z8IWLvFwS0KSPcs|T?IbZN0gj$@4+N3U=fONg69o_wpkCbEfj&qWeYz+2y1r_nry6r zsb%Z1^PmDGDKg|p-WIU~#OqaL)SSW1#o*8XA<86E|0T*o5n#msJ5n|g^B>{4lXsG@ z2*ZR3m}g~sMeKuJ(EcxGjNIsp8B^njludpC%3Y|9oC*9_`fXz2AL+MQ(;g;EvI^c) zJ=xZ}8I%gbib3L*x`#0iicDoHv_K8n9Tz;wq70t>6NFz$oDN;tkWEm@Nygtex3KVI z?`#hijHe@=_b$Fw2)lO650ND>`OcYkNClO49I`7_px}(1R@V@N7X<!f3Z&WMBUhr| z&wsg(F-#U`$}{OFvcT>ZRxKBz1nkXD3$Kncbu(zr&@Wye$Z*^r5F`6KLRg=(QT#&2 z6CW(3GLN}@Vi)KBfgzfxE0v2I_d%0yws<zg*0FS8dvJh8ac=n+57tHp=sNwuXPF3Q z={_vwBU&wsr0j=<h-60b4}rF#`Clq@2ACOi)AM7>ti6Z`*S@PsEI=p+l6nLH<~Kft zFF`#sjv1#^fEe4gergl8rCfs)`&krbpw6QM7;#KtbBi?{pZfaSrn{l&Qa5p^Bw~!X zr-V?@(M>#>8FX<|4|#*LIhv%s5zsT1b@Li%t9+L+&8<D8Jnohs>MZq<8K;hmz@}6* z-D1c%(|4Tf6JM%`6mB5I+2X1k4#RvLlF1PItI6*JkHYlxYZRWzF|QyDX1A|i4y|ia z(%(~_>Hbom`_5b&#agP*_9`gZ1H5ZERIIVKV}W*R=(C=v&K}?>KNj}gWYU&Qx>Pf6 z`Dv2=UU7qi9$L$ppH^g*x4YBIbtixIk6P;tgO-14IJOdo#y)-2>w`jV(k0zPtFt#c z`zpoI^8UqCU#`@Tdo|TI|HS!!ME9&JjIhP?>xi_D_08ZtOD$85vYR1h<$o1PV2Auw z`17?7Vg=EB4dMyC#-^W&!%YjznuxN^7Y6eyF=<;M>HA~CSKVm4@xwd;=kPdM3aSNn zaE6s5Jm*8!jcdyB+6P2s`<<$nnM7;4%P#m<kI)JaS6fB}i)qRi6z{$HW^F`h$&Fbo zyD45cr-nIQ|5XyL<5#qi+P(EThr2G<fQm;|x5F#er)EcaC$-=hmmYfBWzLaq$T}w0 zk`*=Uk$Js`(dHRGWr%wzF7!s5`I5!m{FG{!zWEs5#N(oKr-fuDGuD_C*>$g7-$A+* z^=E3+v0GH$^5f6B)oWoi7(iSMQ~<mr=c`dj4dH2CFetLnyvb1DEA^G9Y}P9-PYoK# z1Aqmd`ZwgPu$#0P!PoIuBcyGdTPZ0SG$V;CMt*?Jw5^|)>n%^~_J8cpT1+OnF{DBj zl~WA9uzpHx^;$@eJCE>{X7to`$K^l84TlxRK$ORG#e{^}oYyK)7g_`|fZNQBFfJs; z!C$=n`D?KgkYa^;Ic{-fLOoQBF*VA&WKJ)*#DgUG$&=cYmAmlq*piOSP-LhZ1gSXV zT;uwqaY?zaZ|*klnq#UW4AM@<5DuUq$#l&~?IhAd$h~HM6@+!uIrzfj>5r%b<Pdq# z%)@j5Ur@J*34yC)KRv{6$jLlCiFY?B0YkSL2dP<#p*$Oe2%JnX+-Z)*<>f+Nix~TA zowe0MD#x5ZTwl!kPa;Nr9=uea(@E}#fOePj2dZz-W`^@~L!uCLK7FqT`NHH6WatBF zT|^8~PW#;S9W;o0eLbnUruk7>z`NL8uS_~V2DE2dXAR=a06Ex9;>iB|i8aZTVYTf- z{1ToBjVlnoBo@#30j?B5h~_t*vqh6iK{L6qP)0%(S`qh`53Qt#&|(|8(%d!yb%b92 z5eT}(_mQkaR#xRAhdFt%e7(r0(0KL&aYOQL@OYfAMTd>$)moKw`{M4?NemU`jvYIS zWaj8#Jxe`rrs{)<Pm`NyRgQTut>kTEk1`hmbbJb$3Z@IRV%54zL8gdK-~q)wtgeMT zNr?;JnQSjnF~u-p%$bzVw$ac9_(ebzu*#|8NGpL=XwRa0oglwIZ1fUN?AuK(#L%(9 z>&Mjl#QcJEKn(if{6WjLu({DAN*guTI5*j<Z>4MZbF%Vcd@OD+vY*r}N70Z+H1*I+ z!;Jsxf+}3!7XwT42%;~1j^r3?@q0%sQH)HGa3D#H3LVMB7zY)iO<4xz$&kg0xvi*1 zv#)sGt3VjOTDW|aFCs;$9GrH8aWK{zjaXB&V^HLn)2c5^n=u3(2s-eE=<mLq=x_6& zFR`al6?cbh@_LPLe7J{CvI1EYdkD$9MCM|FWUvFtJskJBC$^V4o`?RJtMh2%Ami%y zqyg%OP<9~7kEHuWGz0Egvi-j|x%*vnpUW##=JCsSSrhk6Q;ZYpt=w4ves2cb{rY^1 z^z<QRu7$gfapUQJWd<CygH}H6oFDCZH%dl|Gi=2k=T=u-TH9uOl29jPc1wlc16x-D z23O+2&F+kYTPnV(<3!{-UBIC379%$`J_geAF$yU}qAIvO306Hkpg%D^Jo6(g-M?hD z=7yO8z5z$l4ZUQ}JJU|Av2@Eyyf1vuaTEIK2irJE)Uh|P7lKQu;bF4Nyn%d2qQ3!t zoIRYOvJgbHm@y=ng$<b46)uX1LzHfu?M8|X%I2#8E0jaF>>6?$EEW{P0&8lwKr@6d zBI5m_WVjEmZHi51Igsp#@ka>v(6bFOTg-ilD+4?K;5QI{ijUON(iuL3PfDtu(6U^& zQmv6b(cG-;1<6N*u-jXCHMz*{&hOFdr&yjt2e*WMVgmB_Mn8K}6f@C6Vn^hv8d~&I zDrejGpEKJetYu;o)7~?Qta6F7)gm&sa0C*nelWd?%r-V{ZQ|_g;YvnsmAE@-4ILhr z0qN@_pi3ZqwO72|Uk(TYpB8)_pX6V`DXRA}_~YqX3nS6OJ~%Bo5pv;+#yU>jj**(b zIh#~((OxV-VaAy_|LBQg%uGl63juK>L+TD)E?wCtd0wvn0UD*uLYN&8R*_!!x+lZg zKqy`%)w^yAKS~xq8d(>bx3BGD_6ObL+-5Tnf9UH`>enK+O;18h*M?{1ot&Z)?XucA z<~4(MQ$EWf@c{~V9OfcIpJ>`rO+nIhZNB9~W}an-*vK2kmLiEYD4AeQn%!wuz_E)m z88U7foh?`r`{{?xPGYH^oY!J^IcvKpqkS-t$@pc=&_0d$*ID26&o*nQ-am-%?c<_3 z9?V}ut1;eq-f)o6BKnzCBaj1HieRy;#n;6?I$YT5q>CNwui7-}vc`F{8{ykJHN!5_ zoCvID!kQ^YWQ@+TNlUt{NRgat?U|?U=UYb<9gI4;=cYLEz&CK(xEbM+B$pe@^v493 zKQ%E8(8h(0x;i0n+0@@j(m#PYaXn@%a|cJc6zt5i_QZh+hxsg2+uZ6<Z(6dRa-6Sh z#as-rT8|cbcpJedBI;tECafe1JR;}6@_*)mzfBNKX`b$=KV&4N$(Swt>a6+{ZMFE} zeRTBA(JAdtz8i|-gv7E{-m-g7b=2nz3k5A2V{=DB)35Q}$mJbd-LDi|!+IK=7pGs| z9gnoTtnQ$u&v>w9roBho$QH}<7%iDjZN@qIXN-<j)N4(;lD1{$_~JLCpRp9BLCsCY z;16N<E#{FK=J(c1VIfHTL^8UdW5((K+0o|4b60zC<+08_w9?D3bjk-!&?73X!_k;! zS^_D1mDMRYE6-_7nl?WHyVe$<Bl;GfI7Wh(Z>b^5&}&oMcRmXGBA>yelD+Kr@ta+i zbyd%Otg^}saZQ+yjmAM{giOj8M9;TcGm4=$qLd6M_N>wHa5E=}s*10I9+H6DY}c%O zXeHeq;!-d*>BgVrKwgCa!ZhLjhgH4eq{?<0UlBXhK`B1xv5{7$*M9nd{4Fi=1C4^p z<fl6<9!1jQB8*9UqsQW9d;In~gCh77e?9?~#e95bS>Rw4Q!nJ5?XF(q3P^~bk&~|@ zTZ(4H@n+94FFrs&KSeVx!DJ@;34h9o!5W3wqqHpd`@Y++spVvIM5Zh(^R(=Inl(#Z z8kYK1sUno2#BWE2p(MC>^naNpkSu=oN;{g#{ag%#BP9&DN%cwBSxogdgBFh<owRZ= zQCmPu1@MiJ9-Pa!iKtVro^4xi=DNpcLQXU0LiPZP#qpDmVO77lHh<-OaiaMFF2$49 zk@4W~Q3@OvxNSK5TZwwkLsqimeI{IOh;TZI!RvUsJ>|x_trLxu#_&oQoH2hOKm6w% zvbC<BbcK~}k^7%KaM=s{HeB>2Xt<ol=JVqR=l(S8szbmS*-_(|Yapp!egLohXy-HM zkvQDSJPe#Mgm3`^;^eM1fp8X~+yIXhF;8YqO?`)#AW;n>G4#O12|cI~J*?aqp0mAH z!Y(*iA{7=qKDxDo#37YO9MU&n#f_H#PTwff-q>Im*6)AQfiSHV#ApI3FO<bvcA`hi z(G-AfHq@$8Y3pY=bvUq~k{5}bB+zR>&lMo50~3VHT~E%N5y=(%(A+Po8?G48K^J~* zqRnDPXXbX4S3ZI@V@n_WSk^78DH|79jabzFWzmUD$T_gR-OqIK7!AR)p~B7C$oOK# zQj^9l$8yyS+CT0gE(1pTl#N7|#K5oa1&Xf+pp6L@(2QNxZ{s~_DnoD0e{ERABu!K_ zY>%z}5Vnh~8<)k8-SyoO9ueGg%f-T2FE`x-$zcX(8E<X3eUXtyj!zgfc0$hCG+JW8 zu1Te?%UD^YAVNS9S_rH^pn1iuFl>RX5g8u662WrNaRR-_fZZ9ciWC%(qb`h8*)#eH zBM^r;O{E4(WY%L8)@wy#DO$-pDWM$!sqhIitFZn`Ion&p5BeZZ;7>9<FJ=an6OTej z6Wlr@quhhe%7SuY^eBoYd4M?Hwt$*8YD{>>6zTgpZFsT4?V<5|_Ox-sF%Ly}2<T#R zEP~@I8R{g2MNT7{RXG8_=y#DHV1(3Bi+KLvfV_fv0Y_CxYU&r`om|E`TucoDvO?6{ zJkL0=asU_A#ZY>kQdHbZLNIZU!`4k6yu)j`OR(|Na%S+wVZ{0uk`@h{WV?|_(;{XL zVonSr$uFq#y*JNO-sYJpWzi-oa?gqK=%9sOxNx`<8Yu9aU^fPEx*J)AG4#D~P@oiF zdjHP{r|>bxY*}AStrd#%T81P1X<KSBI*O?0`yP8|?I^!iWG&`5Fldx>!cjL82BK3S zm%TESXO|0^er;Q<%HV?b+oqj8YW+S<r^&;V(IsgH<~P*?hxDk8MAwWnuT35@yW&{e z>5iJU?{_wc_qx2E@b&k%Z_-&l^~S$8YO%)8j&^gCu0;7fSs+=h`A%jS^TlHVyYUH! z6Y>(J=!Ru7Y>^+BJ|IrqkzOaPMdWFNs$)uuweP+`epOFkk=K$0q|bJgy=M-0rwN*S zaR<O4D1;5af`W3UiFpYH(M%;nEyP^Or|<_+(+$BN`$Di?_O<EhYt>-KaYe%dY8<ey zL-_vi_X-FHwQf0w^y<kD*bao<Yx(V?^D`(|eR|Y7a*)_+6xku?vYK_UG(6X<2me_8 zO_E`TrCFN`+fYZlsKKd}tq_S+6c)2e6?+a!I`<XRm{<t(05qr@%GxfE+e@qen9>iz zg$gm<;L_N_dcT55z=Kiskp0;PdPWDwZy>{YUgAYjxN+q$R+>gsI$iIX#+Z6wOVIYQ zawygoFsDQ$cNg?zUg3u1%g0})XJ0xfC6hjyOJ?E#@FUcqQ?jIR#4mwQ1KCaFCy~#? z8M~(3&8P9)C4C=PC2>t5qPk^b1`KO9xGPe&&@j#Ft10nIUj?-a3FevJ@(HiDp&mh- zxCZ3`F%wrqkyu1Tz!Y05FO_^YmiHz?TX?tyJueF}Zq$>WzGjR%#K(t8Ww3S26%uOM zGf2)@yAZ#^p8B+Z9F^mxe9#NJiKpq3uH_tpLvl%MCEc<dm!C_lw&998Vf&I+-~keH z=^dJtAheYc9xumpKTu1wo2@t@A!Qrt$^*|I%ucokLe1%W*co7A_)^nbQ&Uyaq$2+c z>&?wGb?Rf5yy49rqZ#Lu45q453hm^7`?6JT1r)8exjzSkBK~Qx;+(DfayXK(m7W(< zW6YD4E${|P3)7M?cZ3m}Jcl>3GU^GA$eOY%ocIF>flO8GMR^nQcpN=#)eB%TUjjx? zh73uMRS8C6Hch2?fuw=6%bBLMnwH|Y3<Hda;gGAf0ZxW8u#j#rLJl@?&^VO-XYxmB zKK2a~uOLu3Ll;Vsd*)Ixdo@&ozX`hGuaSXC*wVE{fLFwjaXASQH{8kbmPqaej3;f4 z8k5&pI2Z_uIDSVh;_{uY=QO+RC^n~(pFl?G>$-6TKGp6n)U!bbOZVjl&Gmz~=4QBf zyc&{Q-aN$YxfXJsk(RY<x^Cp`S)3;>fiiKV2feg&8alfl?)+?4DvFlG0{bpzYMnhX ze~;?ei#_ENH23~{+&U27?3DPv*$wa^g#eR4{&EkaSw~bl!S-@Fh29u_4yCB251?!w zjr03bOjByj`2&{5oW{QFQ}hs;UcTY8cb~s!L~{qf7*v~_?65F3>wbY29-IP~`V!6H z^38FJH^7sMg=07hlo5pE2QaqmB!>GVuI5+sxH0`+<xha?u-6NvN95M*k05~R3t4~6 z2Ux8t`CCAlhqWildqjj0QA06=xBDf9$-tXn*3GJm7CR4Egh`a)*p6LWJ9&s9t3DaT zeXgKM{im-@1qO=psDr`UXrsy9ZH`~6SVGEkB}r#Ryy=GC6cW?1p~V0?$Jo?;c}ZkF zAi$^Mf|iagnP=Htprr4~mFLdfoqaWP7Gn}v8D;@TcRq2cv1YSAqwcZ5L7CQg{w-W4 zua8KXoU0wYE2F`ZJr%cu-qMu#xs=Od*;NFi$7w)8gS6lVn~|t~PVe*#`eA;se<EPf zR=X)<(Tsz(U+HI?r!Vg;Ery8b&v^a0L!@cBw590gmRt!sI08-*+x_O=1?IsFD7+Ns zC66)sHSY%@or~<8kpB3RjvY-~Fy2erz^X)4zE{#~pPOVhuF%yB4D%+}iyuF!ATPFC zP-s+vFhRh;yG1Sew3#h)>!*v+6sXL`>}c&WDry;JZGs}Dral|WA}Jmv`vfq6y-7jr zYNt}euy{{c#xXa(4|G)xxbyy0>qT-){XokPlI=;RApW4?{;eIPX)22uwA+_~XF%SB z#yCj(+i6_snFy-Q$(Y^0cZEw)EZ<{epAPEA$ByI39=fit4$H8~<g1MjIwLzM2Jb~R z%I2#6jCyqIk>2xwzt691>rGfZC+q~-KqrTE^eUg-2Gk=CnbQz5k8Q1REl1vW8E@YV zIFIjFn?@>So!<ug-Ra(QsB%VMK-MnblE`Wem^d(i$1>d_JCTdN)19>AHE7U$`U@U{ zc0DLxH?<#q37fHNHIF_mE+u;H=sW{t9yPbdb__rivE98)^luq=Bw{%ZKgmH1+?~lh zg}-N1YfDh8Ic1i=e8oo`UM9D!tc!7a`|mdUEA0-&<V}l^mXa7;{C?%^<b%`dUXz(E zs*S0olxSH`SyS!ndmD^3+6hq>rLp+UXY8s63M#pZZBYcfu|C0=Oo)Q1PBTYKv9HCX zgyP5`WzfpYEsR0I>R0Vlc^6*P1;z@PQ}o~hoHULzOD$HMktgn-A$JT|0Z)Q)sJaTq zRoN`oQxqYF;zwM(1Ug5(qKE6uTXy4*y4*3UoTjE81#z3on9t^z@`{p<e0x#Pmm0QC zv(u&>7}KA#8sznUCQt|gJRQp1bz9&RUxx5=^0b`O!N~2gO50JYMi&!x6kZSFeFT1+ zq56z0?7GePL^vl?#P5=6Yq{l@{n${&CC&unLGYL3wuAi3aZeth{|r(MFl;(H+9A2u zkqjnyGc3W8xd6kM#3ihQcfwl%vn!HsJF2%_c5UDL-b;W<Gh@1g6zkIp4eK$j=YW?< z?B%|yHDi#s$8|ecYXDIX4nzuV1?P4lrJ0x%HD@Hm+P2t<uZCYmEW^2?H-hmMuLu4P zf-mlU)QvQ}{tb`30HJX_ODwM|?^8#Dna=4_tBnbQYY-b_>+@UU3)UGpN}-7(51C_t zX}ju&U^?9GZ@EOD?jR$TZdg$IMa~&^0V~zzu!~5)_}8nzSE_-Zk4?@On<9?hB;dCQ zTYK98key1@h0Dbh<Au<>JqQJM+X`2^=K{a-Jtl*9RwxgecEk>qaT_Y)L?O~y^`8{D zwIm?P3HWC}c)i|jUI-V0wZPaqHd>2Pc3X*EHt|W^zh63h?!ta|Vh6!O{<JQy2PHr6 z?nKo;N}@_kGXOcgS!>)nt|Q>a2qVmV3ZuMzLIYW)VR{^l*1$%4+^`+d8t&<{S% zk^Bd3;SUe&1wUFj@<GDC9mz2Wgi?HbPUQ&r%gf`G(lH2irZ?(v<+Wd(2_brd5q58l zffCi=`2?e;@ar82Ip$xJ*+9uXww{wuX8_$nE9f2?1NYFTD1G#hYV_YIZo4@2MbLwA zLH)WbkJOprn17F=_m!P$WdfdXfETR`LnIH`^96BV2OyYMR^)zHtdRDj<F_I6kPavL ziXgMY2;>~Mf4v{^p&7n%Rcj_Xrpl1(RdzsB*R*v&P)b^lFZ&w2s$(O8XjbcWRtA47 z>(RccpwImKMt}RyXn)_F|Lf!LGzdEV>a^cA$A8DFfBDhBPV9d=^y@sR2)q4zGL9=q z2oO~Xfz2S!g|u4q0%UvM+Ya$VWPC10Y3Xetz~C4@5c@bA$^BQ-+YX%-#^-}if1NMi zYRX^HuR!HlD;ZuJ!R8Rao<{p}u$aEWBzwPMkEip1hUgzfd6(sCJ?rpbd{XG6d9nZ5 zMwHok+od2jv_U&lZ0mg<2olDprpMTsd<~8~%|f|1#4T|v&u{}7q~*`gJ2g)t=Q4~X zm~McFz;yye-E2c&DjIO680_==ZKL~gq?al4W!(Kckpx^;QVfJ6OSbKkO3ws4+I~}$ z{up}!UsG?chSy{9Tf5=ua}(;xf-nC;!Ix6W?eri}lP=VahE<^xR0_{($O_BO)m?-W z?oMq6lKJ9>QYm@eGkmIBW8+vkMBXMjOm}R~<+1>AKMj1)5_J6;%1o{tnqiCmd2?`f zY&cmDY&{{?ho#PQ2rug<aQKcAMU4&BXB^UezdDp~x8fUOWwt36&g47!475@MUc|V2 zPRk8RwbnY6*Q2{=Iz!fsv2vAYcyNTH=v9J_Iqsqw=3}dpDDJr6@>rTUMBP?wIGE$| zlD0(8OwjEcY4yVj!x0>o((_MZ{P+<BkQd!+xf>q0sk~gvEh_fwZgE~Rbvrl2b;&d5 zgHUIEmMwdcAZF4MuK5v#B^g$iKac*!ujExuHR>+fJ;U(!9o<~-8LBP48$ItC-Gn-T zWR)j8rzW<>UdiVQst4LfvgLl`R*loD(|N0&MAVWpnPm}FZ=c#v2nR}#)&NlgCVX_a z3e}?BF?vQy50@fHq7Ty;eY=PwbGq|7_?JZo<(-BWOfAesJ%Dv--#N;v3>Td0P6p=! z`q@(ORwK)9qMyny2uTW#^(Lc2Jk+Q1hW)wuU`~~1ebF%25E9^jlMz#ddL*9r)H{>n zG{E0Q3vyMZsB?*cXFM)hJ+2q7Xw)2W$e11sw0L+>e14{+A&_8j-V7u*0>pkA_!C1M z-VYy8$@PKeaB9QZULeplk*k2OPr8^jkV8zWJuTx=LS#NXHK@6{)+z(4dehnKYCLWn z+TGQB_!J!>sdP0WFQ@rAPk%If3eW*J;1p?Vyo_wPP=7+be+-^Hd%Pe>bsjNNZ6>&b zPc9lLSdS4)OS$q!<ytPdoV_$MTQ-QSlBl{jIW}q0K)SkT(hS@d;mEoW9ZC3Zr`~In zduxMcvLNqXkY}`(8h%IR#fS7Ai}dzG`@A7}j<-eM{BSwS_#I2SG^X1XHvj%a|B)FL z-*w*DPYlx&|EDuzIyYhY?mfsdM=wsqxKx4CI!(`MPaou-)a`b`^40^f^We2-D>(#9 zY3NulF%n0VW9=D*>>fZ2!Bc<u=X$)T3rP6{B!@|@%W;f(IUYSchcUCewnfo)N*7%3 z=+}@X{-e?#3+Z`f-k&&49iL83if~U@7c_8^SLi^pOUfpeL-c6pfUor^8^Y%>Qd5<D zv<oJt-E^~vS2b)T3zUd0co9^3mb8qyq^HkQ3|=cN)|Zs)4`T^@Pzk-(*;~*=A83z* zxho3o+ObymSwZX~yAF+`TshQI&*#z-%XS++N@*$kI`<M9YXDPjrQeYSjux><=GSw5 z{N)p+4dw?RDeA_4A<<cw@;;+Sz&@>O4eWG)@1=$*?&MMR)qEF~&z~c7e3lc6gFg-R zwXoolCo?H}mYDBvE~-vJy^08(`-nk!$iwT)QzX(Ke!*r;@?6R(N8h{Z9#mG<-)kS! zFguHEePR@cFCXg<@^;6-yQ1wWfJ)lAq!JTuRw;qc2idChlBE{Z+BPPJh80u<ha1Gw zZO0W1Jnxa-yXsRk-0ZV&OPAF+2P#J^5QbT{fs1<o2D`EAL1z`ono9<<(^@a#(J-f7 zl7U-RRVH9c9d*l<I^8f*f`DPdCzscqZm4hbuE)=2*ndgF#o#}+Bg?YOWMN_?ak?D5 z(-ABK!;|p<(r7cEfy3jUwc7vmBHn)o5R-xs5%Tku4t=ccA0onMNq(htKJ&>4ZxLjp z|Aoomerrm|&ufq4|IHa#H3u=y)bQE_S&>xYjqaD%JjB7mbg2OT@s-0p#YTqZJK=$& z9W&eYNzgE2*CpN6s)7q3AOZhwW9z1SJ;y<I&mZR~<WrrrEFUj!ukr0P#OZXzD{lkT z07Q#md!+TW{i1o-pWEci0nrM9+=ES{h2InT6mYY~E<$I!zMoEYREx_QP%<0D#l3WK zV`f4r60wi}hRDb!-?Pv*?ys<pWrsrS|Ea<mcEmo3EkDY%qp@g;rz?7*#`d=pyaoaG zrqriXZ9~KBXi2hx>b(c8L$CzrSG8>}6ns7m!n9dQ`594m&s7`8<c#j|-5*G}gl-w{ zPd8gQUFpmOaq4A2$g;uy_7JlH3QU1DK2Vkcyju>0v+Wyk974UErk~I8B+51}gg%gv z2_fnA(KRkiZ{3Tj&~^Ru!RZZ5;~qupC@ply4W-!!^mYe9y9+lr=kGlie;#2cRrm8q z(4@X3)O9>sO_6vFC|H<0v~54pKfXDD9R;0+faTVo?6}WQA}KhmmHff8B6FH?PPP+( zk@h}q*1}m!`b1q@=1rP7|ER2XHn^;I^8Q+go}avLJg72wf$%lk`Hmg>B!}D|J}L3% zF{pyK+Gk~w9QiLVS65pB<_i-pRM+zF&OK@rvdFO~AtNlk=SO%i*mGT-7)e`>ya2x~ ztBjOb_*jT6?g4q2oUKnVBe%Eh8c^(Bu$gnqB0jzdER`3*hDK!GUqm){7PuM_F};q@ zu3kiq2QS;^3`=zQQc<LJlm?8CJaV#A`<MI?C)QwuH(C@<$bq}D7$VOzZFEW})elz@ z&yHPS9_753ZUKVdNM<0fDCm*lDiHkXu-lm@o*m6_ytoT`rpW|tPPTtu1Npi_ppbf@ z{ATJ{C57dN>IIXkGTF=7j8t)IoxtTyC4JY~LKh~LW_NZO6)Q^>HmdV6&k9#ebk z7K=}^IhJ;8VX-D-F%jKc1>8(8W%h;+EQPKfc^tEG-9Bd|v$W#%HW-iy&g8(j+$S36 zI{8=U+)M=7!<XKmfI1v|ayEW4q>Zkmnke4j=!Tn#x!mvz!G)u(p-%sP4fh;=duAW4 zgB~n?X+F-X13>APfD(`QB}Z8!-YNW|jDEXU9+oES;d}t?*mB3x(VY?%>DHw`FSNZz zIJgNI*6{$fyK^TBVG7IZRic9^1Da9ZKA*)H=B8@bv=buwY-mDIf5fPT62X5-)i=oW zaO9}f?Zk2o8ZB_S=k*u?7fa!S*o+UV=|q%{n2>t`^W}X&aN?aCe6=pLx@mSpOH9rf zAPWaYqVr*)z^dp3Ye`-c@oaxzDS#hx<;@z7>W1_e5d3H(-`(%K1}gNCYYeC84Ft4M z+%u071q;N>yF`JVX4u`7pZ*>&0yabQmR=p`_Tu7mI#<P)36&H$t$4<Lvf1p93cCrr zg%pIwJ$#Es$p7XKu@{@Xq(1s9i{uBSG6PG?e#&w1q$WDJe`N81i@qDR)-${r<KT@G z%680W%B|gU)QsBAd8#x0`#PDL=TBraP#C1Gv`z+`EAB>k>+{m;-Q|#^)oilWl3lMp z0M#WArsLb4i}@x~zr=UO2VLIX70pDA)4<ppC2{P4@E6@D>eq?nz~A^e8BBuC22hbd zJh2yU3&YEJ6pzso`Uy^VBsckQ_w^OBeiaKXOqJQ#v@E0x5#Z#QW|o%8O*{F&Cma49 z9N!hb=!sKT(0ls3LIw$kxvZP-@088%ef)4~*EtPxw%UVN)d(3|)MU}g$~=iUS%qAG z$?0O__0msd4OCUub2Mh9#^BdAjm-`2)QM_hExva1F^)gX>$sjVA_@#(o`aYY+%oN+ z0(V_+8Upu-Mq_y|z{rVrhA0qy!ar{pR6Da#d3V_>XwgYV%ofbM7PCnQ%JPDwuBzE5 z0-4IYlR|y476}eL>;(G`i@QhvW)g-N#E`k*vcmzJ6vxh`>qEBt)ebRufm2CM9e-lL zzy057c@qQoo}SAddtjS`X?ELS7jbcpskmUClg%owP_k%<tvr~Cq2ut4S>VO-1qqe5 zSGiP?$ZO(@LaED0`s)2KWycFO(^$6iIu-}+gqI)-062J<ZeWGIh0}j2at}v64Kbq! zP`Qc+6G1?-V7%!ElS8mXPxpukeD_8KK=(=)vN^5Pqlq~k3_ikusWw94t<m>QbDfx- zyW0aqqOZ&MmuWqkTv<bz<&*8!4AuDjnhD9MuNSQc0-bgHapDMbin@l!Q1@1xy9O7p z{zMS?2kB3f=TH0UCf#(X!&^i>T2guS<`L&ZnvM4!UNz#^u^{_ZwZQRqv`p(b1nGw! zUu%FkLk$kMTp2#()=ba#dM#B7l2con7Fd>#s)tkr5c6Fyicm-Og==$FvmhfN5nWJY zrS1#Wx4@4RnEhm3XP)}jbt+<X&X`-PB^?ZD3sX$RlASyL`;>vm+|e8aq-^KRnnsLZ z$4-_=U<hQd6a(ydR{S`<Adq7jJPt3<Z>zs`Brhja)H7ke0Dai2hOa91SY^5)M`u@3 z_lN&Y^tk-BDY5q$8{rY{X>w&H=D+~TbnqPox4C5KNhdrg$w6^t0%k7Rrs`BO8{(x% zH2yO9$%*jvU||e?bKCKf>6_kay)9u|Q`arzp$-E?CrVMZ;~gqC4O8~e_OI)~(YJgw z{zu(1DoQyW0<+IEEUMtGSQReGn2bMgUbklbG5E{T9at?}o*}tNU&)}R8?nwCN<{&j zd#0Mjm}(sx5p5C&<AHlBK0$T%)H9<Czi%#}phWkpDCmst*zG6wudyFN({h_)4Zhf_ z0i?A-n{q1T1xqnD?7=L~z~yHm-+<k~`mFl}?(<lFjxR^dTGTG$2>I>@Wifc(@x5X| z@e2Ma@yn+8#9=@4;^ThM>&!urOEAt!Wx?P&(dvYf{dtI>A%J%&3We|Of9Ivbdj>S% z$cratD2QATMfYnNYR}(BcF&Ki5WY+GHfdYgP*%QqO$;k40viWY94pFt7G0kQBHq6v zCSN;UjKy>bb5B~pu%!AWz4}^_&P(1klOR>~+9wykIR;g`_fQELkf?hEF42G76<Z^Y zFhv>){$v!&W9>T5bYygf&>D#p)U*tyvEiEU?X>u{jLlHdqSNnPec2yGWloKqt{Vmu zK}XFoo~-6(0E(<r2ksYv_6F0Y)r`Zoy$N^y*r7_8=nt&fr5+_+AG2V1jpA~*)<vY{ z<t#C%NMeg@bHx0F6W;tF0Rkeo)$Ym-8I{yS=7>q_b|!p>Ej`U-ziJZt(j19Ya}ItA zC+@?S6k)IFE#RmP;rm0~mwsy9Y@p;9hn-Q>yfR^7{l)N0?O!?c>m%Xpm_>{MW=c~j z#RSY(%s45?ylj<#Q&NUMsFj1l{1d^~C?@fw*-FRKCK;w5{+mk4lBMul6T!>Ky3{x` zzf*y^y{Je7NI0TRZtlT2BvezaZ|@KGe6UjK7|KJ&<<YBm^3f#bd6GFaA~-!jq){~_ zqqSPwWi<SbM~H`7Fg3kEz(&g=`tkZr4)XaBcZUe3H4~ws=uN*rneQ6w5ecMXR-Yte zs!MyJGl=<BsLJmM6@?#R6}s=Wvf-FdGVghV&p#iOvl`?rs4>irid2UXw*8&V@Zp67 zYGhup+V`V7*!5ycXD0k3MIc|N)6Gew6XE(CI@lvu-amjY&{k5!#(>l_;s<h}FpEx3 z^()m9V&$vSq^#gR=i{T4Xn4rRL$p_47xCLYS<Y1x1TjrDx-D5lO#N@XKI?n&4oJV2 z&t!3q0&6uI$8=k2-n~AsTrz<EUE`nm*K0<^-OihS=+QQewZtu7_f1Yxl04y?@iJ(& zU$dJDX6)^D7;Fyp-|~KR0YAYe8Az+U{BXsz@fcfD5{Xq#$)+3`w-XDzass!)L6Y!2 z%SdKDpdATBxw*Z{;_2_7@$T8}|Fdj*#zD9bi_?+ml$+NpU+)e|t9hS@A|6&)i>&60 z_q4C~+CYykliC8FU|=YWfN34xks%nt3NU_qHPGYbhb-^&`9Z_E47NK&6)U*VDbfDe zT>VC~gkDl<<=T!~E7t!eqB~1%#R3SW!2mGvAyt0-DIR>y0$E*XzTc1w&jDy?i6NyV zn0AXo`9A}>T#JrgNug|hmNg7E$1laGmfHFoM0ijjC&5{DcLtqSS14F9-X@fG)^UiO zba}YpcIKa1URm|&2H8Iw^f<cog=e90J#>O4`=4TDt%s!i2=ALTbj~xn=tzFKho8aY z=6jxhXKjBvM=BOy4{FdPw&dA#p;$csAbY*X5Z8ziIUm;v(X7-2biTk^5Mk=5>+S@) zS}SU-teBGw=R8(^Zh*jq{Zz8{KwROKc*%g4@l{PA22n(*?2REQBd>Zvud}6RYWYe? z%Ad7UyZ;tR%`5wVF-D|+F-GAJuwR`Zm=5LGkUA+L;T4FyHDgcs^t3=dJzSw>Y#<~< z3Vsv4A;QkVo+5|(u!@=O$O~IretTOg8gajxwhr3hn=V%~BESK|hCV{KUS1qldzwq& zEejl%M@{<h9gR#<{b?ezsj4W32%b0w?D*2?im^6b#oiJPiEF-Ji&S$+f6=<y{ZSrW z+UbJ5uT>M*Bt%-!{7mJc*T5h7E{5dJsbRDss1y^jJ+zQ_-GkW~soqhvVpM=`mez=L zcbLem4k^@y{d1p?YR__hya}ba+AiC8hhz1av*4}ZOho&Rwb<CpH_p0qOR@ScZ>NPQ zfFUT2Y|UlJuj~0h^O&Nc6KuaU#F2ay&(l=(LZi^b6sJ=AyshZzUvJ(y-dZeCuQD6* z>&)hjEs-)Fhgk1#t0T>>(XdsiotJV9nUo=W@tS)i`3PL$=lZxrK7A8ErMK%OJG-w- z(1;3~fY^JNkoVJ{QWR(>cdu7p#9GO*wFYS4oz4(XG#OSM#9y{Oh2S~>w%l7x-mW|0 zk@0cwT_29hW@|C_Myg*q)a|K=?jzolYxamUXRV{Kw>|S3Cz_~(d^rOhaB%To%ZYjD zBW7ki<Q}3_6r{mV`M%c=O(I;G6y;dZE^b!etOyTs^ohlIHi~;fOY&`{>ZU3*ze;=f zV~N8U<x#ApcCXnFMo#XNJ3@WMeaw$MxtI!=n=hey<Px{3e}#2bA(58PVzXHk|M1F~ z_9rd-QM-K>v4$vSmRE>Sw}r-(1Uj@A@#2-7Y}(E3Gm$TR{+)ztC<U1e7ME^&MG+W> zvbhR#C!(hp#{Ta#ZMGu*bZyinvXmnUDVS^*YR5>i*TRTyP1`WTHu(>~P3qJ*(5}%r zje-5t>cqeb!Ce7vEV351S>VEk2>5^~eqMb?*{tVJzOl+L44t}JkWGa5DWk>&#LN%4 z$j)Aq47J`tOl}<ILk|H2s^%DJzX3}_)EV{m)3EM(vyXLWEiWpD7K8l~Iup-<WHFjF zjV+Fj1U5VyBj|e(9^#Kso?9<XvM)B#rGHFy&7SUNRYwdL71n5^tphe#uA0+<$pHdO z^`7XE+AU5&A`VA1zHTahE>CQ>y`ae&^(RN@21EKLh1mzpTNt(s=2ref%hQ(tnwl8` zX^2Miz=De=GRT<ig|1*a4t7!5P-GT0@P&pv`c=U2Wj=)(g>>b!noPP=3G?Jw1$|A? ziHvbI5tM_*P`TO@s!UUMNS>^0>bCmM(aF=ox)Mz0X-c%Fpew-(S+JHV(-#M8Y%Som zs?h%QA_RTB;YV6Qs=6daNDqbT5h^4oLndl}r1AbiOZ=GWAKb=j_-;v3Ji_I>`#>dE zJ(LKEhedu^&TwP;rqqhm`Ey&MNiPeS5vG$zz_ae^zj#e_=>}gg2e$f+2x4fKhp>Et zQ(2ZE+eE3Lez7?Ht7#tO|HaokM@jlDd%ulp+qR8q+cu_cOxw22Y1_7K_q1(K+n(m_ z`R()Gd-gu(y?@qP&#HQ|GBYyc8=r`%0ow=hci||y%E!}iGE)NP44u;8x0O<%p#NEj z<6dV{JTi-(cftyPFk*<quqdmyD~+oARUTMjn*ORDDx9*1bwdmpAbs(H7(Qn8%5t=? zhCXMWh!qhlv4Zx4Wam*7)>?%cI|KEW$M1Zkrn{>~U8VXIqw@zcc?2-sM_Fw3VDp@N ztJ4H-<+B4kGhZ9%x6eOXk?I1kFF!P2IB{rxZ#ZE++X<s>N?zqxrn9{Kksy5}z3Cw~ zsFjguZ*KWQblI&Ooj#{H!q^gnr&JPxOwP;=1waFIx1)L~*I4r5^en4v$o9*Aa!j?d z6vF!T%*d9Z#J?P}FQBq8{)8fzEgXzxX_rJzyic3j!&KTYv_BXHk5pu;f6%VwhnQ71 z@1En2dXX?!p2W&Z{%tO=<6LslIFYjXmyYzc0eCIUt^7ujxPv?iWO)KMpWA(xnWv{K zN<Kfbh{F|dd=;|=yv}&#l_vxGmI72r_@-GV8Du$c8*x!(B+OKj-CIaZ4Ht^X;#2{A zN}`rxB)1M@EJ5y<HiIdv7BaXJk6{Jos@_uRPXkob*j}<Q=bVbvGFgYw11Jw1&hXFn z{IRYMbZ6fxD$`Q_iKM&{K|;>kAFhS<?)*A3gk6<d%vz6?_vPFaqaOb$nKKU=hyxb| zpJ}Ek<YlUn8`(n2L-vQ1lNnS1yYIqT+nQAa27C`9I`?zr;^+J_q|nr3$C+N1e1JZ0 z%!Rag&hC5d&I6~q<Ma>H{s5pZt?7@wA4T`}?VQ?=A}{XYFg1soyYr@zmXs-%!T|uL zJEmWt5PYsDEXhYrOX<zR+}6en(AFYw-rs+Bql{~X$}^DBU8vW?Xc~#Q7a=Zr<mc5a zBq+?e%q=9p$tV+M6#i_3%E)!urYtj>Vm=9b8X9ZRMo!ImCnvx3PHChKohR=8Prei@ z#oE(!<rcB|GdW}h%n@m|h9Lk#4&4{3q^CCqLeD9qw2pcD4J=?iTo%ggl&<;Py0hOF zZ8Fc(9pC*WFFcg3mGDz1*Yn6@ZZ$2A`}R3Gbk(}G)*r;VtZCO-e7^PcB?JDNFv4iC zVmH#u{Ah`$6)l!qI5U;9WA1qLeHgV6XO|ZgQH^-?8wVd~`a|<;qC5xm6nQ-`z#g`) z=0rG7Qp7O12@iqBJ1PEXW>|%78yt$Ko^gTB+D|>BH=e@ayV74<5l`Q%2CjM_ageKC zcOD<6Rjj~_ie~g6nvLT$jm2>dPs_8K4GRK6g5JT+@3dlX9nxhXlYWL&ohpx<0Q{(p z7ss1a3<bvA%1L7i_UxQVeK815^D0<wglUf(V&*+d#i~{tV?+ccb51B@hDWq;!<`?R z9g&TSoUYJT5}4zI`h;v^jwLeHKUzwv+vi<qIhhImku&WA{3KmPPS3IiQ3#-fR+gqT zE!Aw<?$^1pON59!gA{*?H*g5nDOA;@h=n2YBTHpuIc9&8XEj{GV#UY33YKK@xW6*V zB?w&~l@ndV_AFvWF~$EnDgB7-wh+y_UN~(vKI5@YNQr{`RuO;mOo`4*B5p`Wf+GWb zuaoR3bs#u?#)nB0^8u7)q)RwSvEkx}3%_GEV|G+#=L}%&e#3k@cw**Tq~`g_hZWP@ zu6C$uav{uDRueo(x*|*HRbM98hWvz3zi2Owdys7$g`g1tQ6iRqzMR73*=N<+S%%3w zye(dgM;f1?PhktOYWmw#I|9RoK!4!Z`73&4&QS^;KZKw^tIe}|#*y+cROj-}D8s9D z|0KKd>-btzS_~@^_eT&uDJIjw%#U&OXf5tpT!@qCeEn{sSoW_JMR8sNdAIqzPVlZk zsq#1|HRlPmv=|RPm%E}s*ibk^LAy-`OrA>zT90%0$`^AO(IzxANb}#*^A8?cb!9s3 z@F1#Gfjg>QD1T~bhd;m)#$r}^DQSu5nh&VLuFTU)$FKTVVmfhacU)@Om_p`Qat(dC z9*p5iH(tTuCt7t`h-QDT6nbtCCtvjJ%==DQ{26`d!nx{aWuh96`cam%+J%?%VI49+ znjNvv2wDLV^Xgt9k*{V_KlTG{ialKn8Pvs&Uq9lMTL#gWe}~Jek*iitZay2XP`zGL z{vBwQ%qKx)eA(gkSYV!cEiTa<Mh(m;K`6VeetxBXSBLh`daR0AbhJyEb4<OSa9#78 zBk<O%AxzqF9Y30d?dQgpkIdnNmu}J{&V_l2wknjh+|LTGC{Nq8;8jOcqsQp`f-^YB z%l`DrC7g7;a9}kxYMVeiR&jf$lSz(e#P<(sohN=L_K4}V8UpLxF}D|7s8rxjU?Z!a zp?ai~lI1Q0%}{C{^IrutZPpdXQ6fkF0u$~?h-~l2t<LpSR!#WVi-g}BZ_e=P12n*8 zpMZE!ZMZ?D@?~{!C}48O?hUoHC86Xk#nAQ)t>@)s5ii|w$5i;(f<xz@?43q8d)Q9w ze?tiL_<HWASnvmlc<$#3tUELYt0jm0W0l=N{FmmS<rOXpS=teBqZb%$S>l<V6{y>| zXtDO^8x=gy;@d3QZ=G<pN1%pV&uRwzAo;0_vf;t+h6brpB)C%Gj%vM+kTiT1n4sZ9 z(Yw)qH`*;>ciDqh4|BXsu#Jbilo;6?a(=&Kb&G%08TbS2#OKAseA2L^d%xPu5N#X2 zq2|QZISIYVd1Y*B;A@H!@<<TbW_;$7^iWcHf1WjsU^I9EYJWDa7vK6KZAG`k_!4o( zl*H%z_7M){wqT4i>rPH8T<V2~z-JF$!d_WWip%Hi25(VZva?RB!QTWx_`LI!ad+kt z+wQ>Di+u(^^Q{=Xt}rF0BLc$Om|pp_CS^6A9esvuGbmrt<aU*?kIDGTraik35%P9* zZ4X0Kd5y#}x^xTo`HT?pnG$G_GPsjMK``ur%+nz(E;+FGaL33eC=0QJ*YtubY23U2 zxz_PT2Jg4VNYYlwvE>O}MIQU~wVErUz~|fuUCrW7`6z{Yml#t+M;ukgP)TkfUH$UH zO=l!aJj?BcElYx$DnZEZIP<_=DB3AsW!I;~%O>LgNgQ{%yGz0$?Wy1mKG}a8nsFnX z481>k_&n>HqCY|EsQ7<s0VHJ&VE%TxO<JBF5@pzq^?R{Gwb}BUEBN7e%mM&MYS!ko z7y|^JFR0X<N`A4fSF*?KJy@b`PKZ0BDht)_K*8j%DMH%P(40k{YHc=UV0}5DUs!8L zxX6P>Pp<wCl!rDapu?y(1-w7_NmwSyuw&UznK<IJdEPwzC7a<xw!WpK#Vx^px2^_~ z`-9^Bzt2h#0+M$w*uBB$lB-zP*;z|&RdBxv9^tE5UnA-Xfh;Rvv-jU{(f3giFGs=$ zy~b#T9<@4E5_Md*#A6>0y*aOlC3`s@=eD}h1BkSlY=+^P@r<=dX!VL#j(*)dt5Te@ zi_P|x`tBC%^XR<J1H0xI&=xvSVr6XXyI&uu*y9W*nN|@p%Hgv@t(f?JTPAsLi1d-U zM0(F^#Ct96ASf@)f>uF$z`3w0(H@ej++f3yridCs$XMPvljj@pFV~mpd=Zm5_JM3D z=8cl6@Sxm3s9gBsZltCcD}|P_H82@1VCVRrQU9DR=hu^C?k3cTKaCo#aDO6YxMx|z z)X6U@;;PPCpdL&Kd2Pr<xobpLI*;UaS>PKYd-o-{SG}PJ{1A7lbbOG|Aq$XNk8$3b znEr=4IVTpNnD~9d5_XCoCQtv>`u5=?l{-HizNsjj3d*&pE%>*V*oY$>$rj&nbbP@= zt9J~rWDo29k%evH!~D)%shHJUGZcb}lp{>_f}d9bwztt+9dQ-bcG4exub)WbU(Jn8 z$_7>=(!8tNp)$tb>~uI*DZ2B3uP&YjdLug-dF%0CZauuzNxVl$lpQ7-Fh1BzuoR;Q zw~-jEew75a3Hy`s3qr}p-dku2Q=V*0W-=lCa}FP40@l9yUSh^@#aYPQ3fy1V6rCKP z_<sZvQ;OrA`fQUy2kH!sJ)B0ODk9P{mJ1qw`h3S7DY#q^Jg09MA2==ZuF0N&f?V@* z>P>N5YgeV^I=@im`u(oj7ehi<Sa3W`MIRax54dlMAa{?>Zw|Mv6_vi$;>x7QM6qL^ zo%`uwNFZn<4C+ASaN~@Fo=;G-<^P94uK$8zVx(M@VAZ(eh@X9*DW~Q7Shj%CU`l9Q z)!|Q1O<&3PW+ZE5&eqi~176;E@d;$Fj=Vwg;^k?1eQZ3x=G&W$IL1Tl4NIlwu}^O_ zd~aDsgTCD~%gaEQ3mDR<ZjjhcyWrGrYHyU}t=6d8l$25A)eZKoeum|@NWO2`5#rg% z{T6WyYj<?^k#a_Xa>U06pXcm{5gw~rA5YB*>h$=tnNs1F=!><9gN+2@6!=cY^@7$h z#NUbUvJTAq+grTte;G2|XXW`D_n|=YnbsnKv#YF1TS|{>;3XJ+Pk>_*blYBYKlEOl z$wLjGp{vSIFC+=X4}c-(?jXy5P|0B~k0rhSV|D>tIE5Ecfx#!b&bCm1ia*eO?*@BC zM$Y)Tufo6Arba)K5i675Y@gF+ErO3L*1uzP=oZ71c?e<b^9>-WOp!OTD1H1R!n{;u zti)EqJ9!;CxPoo}po8CNMW~)Z#y&V(&Mt`pB7yO_)JgagF1q@xoRj&1j}9+w2_XJB z3b*7Q>EV*xtm>E?R{$6AFM#)$$FKb=r@tEwr%0>c;n$^AR4ZxrB`f5D<_jZLK;)-Q zCk#en;YhjiXi*IU_+YsKB^4n|>-Xnz01ujY@sD=4^<R<05lb(mbc}m)GsAj-k6{>y zCNN1OFxD0~ImYR)@`CN}5)4)#Hf-Q?YUBo(#0MidW~8NJe)`-iTzb$oj_r!aR&V2Z z113N138LAFyx1Yd+Y%iLk;X;i-u0<Nsc6WI61aJm7gl_H7*K2IrbynunVeS=SR$sQ zG~rox?9Bn^Bsb5aZv_vTN|zL7MVKev<6KymB+iyRO$lEAqOltx>tedwqBvpH>N|<= z;?98;UE%u2?Q2%Cz8cr<L_0xX5T9$^3hVl9KNu04q3BAecRpEZM04^DZ-lBZt>Y^6 zsV7I=X`JQW+b&%~Gp7qo{Nsg|NPm5Vqu6M7RM~k^*?OcO>mTF?g9~I4u3z6~yQ^J1 z8iBl&F$ld%*bH7Lt!4n+nO){;NuV8BNl(qTkY<wiz%%^kMW^Y}r5LU1tHDVvxi(L~ zz(_TWQ6|3okMvq89w)h}9C*vuA&4uPVh)lh)L5&lgh*O5B~n=QJ-)hfEZ_z&dvlgr z7EN_yECu&!C<NbP*6BK(yN#%pM|Xo=0kmq&SsDI39v07Un6=K_q0Yv{k(~eBt7otf zcibGNFzcRHxF)jo;8Ch?<wu1df2kGBn!zW$FRAry-);%umEqEB|Monq*s(3#Y|YOn ze!JjQ%s;9O)7jBLObfrx6D(~_T1tMM@SF|5-W(ma`Q~tp>S%d^<7&>^=z(B!c@=2Q zpcC!+{b)@R-@nfYoMfX0e>Jq3<X2xws|#{7mDzP_U1AD>l%r2?UgZ*~wfY_+Y&e3r z@RT4#$%s}x9?v0ie<>i;1&;;c<5t=Ac+^}|SJ<>Og6<c2U)&9+*w(e-uMv#iE^K@A zg{HXZ8m0Qd+3y;SXIzKa)bgDS%WVp<bFH}FiZCQQ;q{jdXsp#d!+*EJk&V_WkDQa4 zV-;U=V)`%{>|jeNIzHR|8cFu#!&;lQH|zwDSk{y=4qrp!<Flg|t8ORoDdF#%g6Q^l zwe>AW1Y;!M3fx7|fl{5KSaI3zv8vA&Z4OR}sp?H|(m!}<mPt49O6r8k$h_DT(VsX# zHGXR>P}S29zbNBCkGOb}+y~bHCBN9Qm;-J`W1bB?HI}0AtGB=Je8-hQ1@J8d>9j@O zNRO=?q#x<Fct<%u745wqRgV<tW!7nh*{F5;O)|)dKZd#*9$Hqh2J&w5d*%}~XvM|A zs?69nc4R@n{jzSt^Uf1DP*AXu|4nhft9d#Q{U=n>vAI#!m{&tBsWFR<X$+YO@KFeP zV4TC6!s9b%oyyt{5#g&B`Q$TE8$@x>^2(he9=sT-im9#?A!r$NvBAcr=STaI*S!^n zS9Gy?Oq$0GWlkcIL|2h2Zff+)Jvw-#&i;TR!MOz5OmoZP!zlb{6a#<IfO6HOvgV+! zV9lN{X71N6NETm!xA>k3gg4dM=qA%V!qXGw(E0K^_nW1nI8UwJU&fU6FZvD7>oK!? z-QBHFvA8EMdQ=JN^LH7#Psa;I|7%fNO83|?ya6a)tFC_AF$GY?@b)w?{z<bl>DRYp zN!_Lce1)Z-jgO=;bFInm5E9TbeC=owU>NIZ!)A_S_WI%*>Q+HRUv&H!!$l39E6;i~ zjADBX-?Z3;vxFg>={&)mRdJtl`;PfO4GQICMDP56ul$(^Jq(y~^CHXcwnv2J%rRPN z!q^iFZ!4Xc2Zp@fJlw6g!WTfM697|leuk4teQG||lYro*M~C-7%_Kr$*tBE)ZsIQa zRQ!oI%dZ#qj%iuKws?rpcH^YuyyWr`2U0JC1)_uNPtO3`9SX>&7A!~tpcuclFz3MY zzY1{ynj?GC<@!E;o_W=ARKt7pt2I_xnGNFAyvFxcKf+9MivnYz!1}`g`NQa7zLhYe z*aI(&$f*K$6P{MpUUxsU+aS5+Ak*WTBTwaqtSAhNy`FU6>KPC_2y|ou^p^lxUD)48 zGV|tHv&$lMg%7WkXOHqLn7oRtmWB4ZP6oNoTaW=b`vik1Utz;vD`6S7ZvMoaOZmsx zML)E&Z2<t!#&2T2p;Yq}`Cn}<Rj$6J5fX{{ydBUje4NASm=O7_)}}QEYsPB)9lY7! z!5?*eU!R_ycV5(3ubT#j`I{q;O0q)+^(>KA8OcGy_lEQw0!ZlAozt$Ymsl5dyTZ2e zdGbUl|3-_J9}k~u6tGi$bBUSqHDoa0Vl1z`PRZ}^|1xgjND4(Vg3qE<*EhGodTJ5n zyae+lvsFz5$Pi>iXLhC(^iW38fBmnE#KpgPaehQQxWJZ^J3D#Hd&y(79Pj(oTq-hL z)tVA`+vbxZ91J*~e?fXizy~ZO<KzzifR?F=@jv(ltUtVHZ)zRb(0xPeQh@$0)))AU zXvh~L@I%zEX@2U(6jSdnhW<k&_q2EUdD?$!6l*{HAJ6aW%PJvP^rAmCX7zuY{_D&B z^)CMx?iqs;L<ZB#zgzt~?LV*le|hY`;A#D6AQW(|g1$E$0$@I{yQ}m-((B}Ug_SQ3 zdObuV`@eLX{{XCy5di_AI{v{=^urJ4H+Vvy{Y0mM&(Dz0&I0~#Uhhby4+%cq$${%! zgfzjV-iSEc1;XRyasK?Y>8{g#*Ya4T?;ata241yMU%4kP02W^tpfzP5>sU%B62Mml zLWS=Ga$PM$%peB7ZD>SDn|_CmrCUwVWTE3$1#WNjAk$u5(92}c`o<46>aARA6GX;S zdN-r}b&T4{VPAA_rd-^QtMUDrZvp?44;P^MZ%l8+k1RU<+XqLaMK{a}c3ifGWX3;Y zh0Zhs2zpkRz0Qf?pd-3LL4;^itZIhStEP@07f%4g!NNXBCKQYQx|}D%hMQO|6blb> zeKQM=DBky*ff!o1`o=>;m$;EsFS0#)EO=kv+_D|WTmDxNk0N)h`M8&1hYDB4@bjUB zILjji^CD6Wp1+37`YZP$s1FH~gBq>N&=3g^NrHKN`?^o9r$u1OIWyHi!TzRn3$jtD zCXW<!dk#or7!b`UHaQ~tsT)N|Kx4*`1F`8JTYHuENl8E(bl}CT^zq6j6#3n7`i?*o z$?78OX3jzpF|+QHsew>EO!a@#y$ws@8j$}u2LCb9*I%^1n7r~irpItz>gS3uW^S3F z@fKvK$BNp-QMsrzQ;$4&eb35*LH|yvps=W*o$8b#0!%<KG0V=vuFPEj;s6aXe3_!| z^%A6B{D*zN{`+deN)=wfZ1`*{M<I3wd~$@k>!Yv1lWzzxigM*jC-lwogwXK(@~%}o zNVKIYxWo1bLquMn#dWj<J{qj7-y%lW_r!mc>SJ}lhl(k&n>9!X+(qbdEf5EF>lue2 zCSxX`ue5i}oBMhoIct=<EKpAbx>zrLt<JV0QX#h8HJcK$di9O#ak2x}Q_l_T2--65 zq}aI!;Kc)C7`Qt>xo)ocemru0ydZ(;z&A2svfUKXaWiyw)8mBKKfE1UGQ7~_F$MC! zWgGMc#{lJ23SCxz6L7O6(he-8!wJK|_ZWl?tj@mYdw3|lBHX1S*nk=Ec<EKo3az4` zp8Vr6RWQ=l5IoAM70@|OPW-EHhjY)mSjFp<P)-eN7b7X)qwivqF|0RnETwUsHa~ZP z^=-ZeX}N)w-^Wo+GC*I4&Eca7uzs`|W`u(vEP(1P1$IVOx^m42&0Z-cXv#^pkn1dG z9g;})*9>h4^h&iXMyu$sQ2!TD+KTWmptJ<HdS7M#Ri4j3wmSW>fixv+YB#xKxR;x8 z6n>~0%^0%_h=At>16CHYq&jW*eND(prvVq?&9h)Hpmb1EHGD4VDz7?X@X}LlpY&am z>+>vIv<GV*5s{SCEaY+!9ary#quksNy(#jO6Q>(nFU)W!$Q|?UMix~bw5b@RO<pfp zyJB;M8(kY-Z((P^<QHX3W8@}t&wnR6v)3P7evO>}WuyONk?KQg??Bp_LGJdAVD=@g zEg!;SI)UQj-TOZG3_Q|3$F#q@^RU`t8wwAikwn11hyAeCh`<{*ce^Sv3FEqfFW$aG zdY-XY_qu~T_<TcJBA_3M>hbj#A92KFwF$x6e@?_#NLacY6JA9%Ra~9Bml#g$%cJD; z0D`ET5Hk}(VKf(URmtH9<86y><bf60_PGg*h7HI`Axu0_RQvAN<=J5FY<4ziQf?i0 zLXSzpa0y{8i|(`LJB3;-*b_f6^Q#7Vy`?zAJa~}IK-~es%=@4dy3W^@yextWEld-W zqnn?gi+qTvT3#M^UCYdUCz%0+!S{)`SgfoM?LF-5OYoRryCyargXmxG38jRnHSnL{ zCY8fL-IlU@iNWHask|9W>UPF?2ju+j3TAMJ7)uE46ED>aky3f@goa4*B^0T*uZ}8i zEfm&6eDb-ncJt;XzykIis?8XdbkC2Ik=O3~>eiAwX@dz;g;d+Pwlqz@gGf+uIj+c* zHCTrX@C+R?*hm5u-M>ou!x<Ci9DaQ$DQ~o$A<Y;7=p!3(+3lF@P^=8^Ph7_z2w?o3 z9CZpEgtv)E+IdIvLe~zrv_x!7*m>9;h}5DR?&k-MYO5RDzi)CanH3Vb<uS|he4JZT z?pG~^+=k<vG?O$7LB>+co|sgy>hToMXO6wjj;Xy$@8z|kYok<Mo|&|wIZBi}jR{-F zr!Qw3q4U4x6ZL|{0-YEwHKXfVjCu*_yzm{Ig4)k3%dd$V^mY;KTzJ-qR5t&MV{)RG ziS1L{nY8_kft({)GHVLMVv}1?!sBp-Lf>?OL7&8>oWtfL#On5W`0n(MgeFwZA6+zB z-GnB4OoJmad>p+ph*|M0;B`g$Toy%1SA2Bf0f!T|#XGj)R}BvKV>+)hTU<b0J_=`b zo;<4oM;9ju(wFtEvubE)3zBH7)2q|Wo7!B_GU3HY=#$c{D_tQ@*{`#ne4GY*e}tkh z$!^}}BN~jd^k@eSSxOJTWftp|kXi`&^bTqE`0|oV4Y9oY4~iJyCrJJXWZA<t7C!;h zw6A~TlddRGorwfiIAJ}~#E}&<Ou&Ub&KGudpTh;){nhx&=1jh{8b<J%Oq%g9jr&5> z6|*=>4yZFA0LkM5Ix3A9eoOU)a@7|S?ss&S(A~Ph?h0s#0EJ+0d&?Oqtuq{(+l9mi zUy4ho%=sy_i@`<qUUgq5Fa00X&M%Z`uFQJ4`FG1s_EU^xox}{+9X04uG8MsAxt=>> zTHdG7TrQ@Fc6X4^onptQWv17oNf<bGR7#xKHDf)8FD!&jtHuHVoteAi00uV4gUQeX zCoZ8IT0FTDWSfV;h>bpk+!gPU-=b>LGL81y0CZOQ7m4kwJpH+P(#{AkXR41iY)I&d z{Y*6TYG73Gzv_Ve`z6W0+OIdw8qF-Kl)0{4=;cLw_DaW6q(4l=5s8I$y>{;xB$urT zdNO&ppJV24H^wh`CwUSF`pZ$MR&1!7FEnJmNwdAavZUBQBtkI!M<<UR!Q29R@8yWM zQ8~5iH4|_^MG#&BcGM;16!XJ~UCaNu6k5ufEo!QP`x5LdZfi|G2WG%TMNQ_U+^3*w z#s_pcv1?@ZSR*RfX7!ebi9(Mj5wM})B-~9Lts^I|SB$Kdj8;6DKPv&^2)z)Q-rQG+ zBokVIQ+|CG8!GG65SPIPYqZ}%BIv2PH><=2#>aabc{W3{MX*a6Rzt+M;ZlB~{@%mu zX6J!CWu<HFLlJReSEA@%4uphKk{3(bAbwCume>ir$h{n?C+tX06WOjU=(*m#-*gx6 zq{z`4q4RvPL^ju+LlBjSuqA#!lQDWfm=V$FyqPEb)gCMik}Knw?%Zd%yRw(Bg*Nf8 z@$TPYTLP{wgB+317Bf?z^biT{r|>|n#!?NjeLQH1-y_J3S|&~flxxo-pbOUa{yYU* zvaw5G$5yz_X$Nm}nlqcrYzxCr2Dzx!z^tPNdp+6;k4Oa0jaC!L3R__B0j?p^67=9@ ziLXOl(f<Z{SLeSsQ!zJc__WlC=_y8-7$E=qu-RvYnDjMDKZ6q4fY)4UAgGUS#-QbY zUKe|V!vvn;`LA`m8Gn}l*d25Xdm+Ou=VGRtx%K1b*RyiF^xkmZZ}@5+-LqRD70I~5 z5te8NfC?ao`n5Dqthf)>)s5w^IL9@WaWCb|7Z>{HJ>e^`=LRT#&SmL9-3=FJGOdO0 zqO|_1;AQIOu17H2t7lSW<v05#ac`VSFSuQcf1HFH?!;wGM;qQ4a3ZO@q#->xOuZ2L z(0|OLxexXlHwKkZ;2<fa&6(@1Cg{l_kce){Wc4Q6DEHl;9eek;Jat21q{Y<oq}AzZ zP(4K7a!O<Dg_$J{QOiwH@XGVgpQ(@gs6AX5N4o961MIZHPUG_Ua@vk?c=x6>nM*-j zY?0;?(I`FF)*SVM$N(4(`%r~{kcR!d3j(n<J+w!xTIjFhWf1~LQY|w?4_}@Qjp4+v zuLGJxMBsQl%@PJgwr%AuQu29}Vs~x5gxF$-G3a7USR+!df$re5l;s6mQ2i9EgzKHI zKBtIa6;sOnl}tqZLEO!jgt`JuS}tH-SWPlHa}Ww_(*%zK^nS6li48c<53RacvvC)d z-wZIscgZ5UHmZByiNs3BC+v_O#`|9m*T4HnI+*@`BZZEt&vtOozH}lp%A{!YO=ypj zLwCR>AK)}>Tj4!=_Gt7Nd#ML~+EwR^1)Up>F$D+`74mo#eFkXt7OX2buad_{<V4P= zi-lS1QQkT4G2xM7d+8No5dquE5VYxixKsdE#bW=wJ^}dEPwU-(ie`xswR@tbDVB;T z(cWxmN6d=`;MW}d42}KjiO9@4yAhV(>4l1(NK$(RMA~8C>Q7On-KSA1)mZiUYi*!k z>U#-^0HBZYZ>2KHtTHTB>)BH><lS8ra%6J$CZ;ad*ozxi&-3rd0A<b?V*&13f}h!$ z(R)YytO=-yx2Lo6+U;7+5EHR^H#g{Dd+i=$UZHP;l&P<TM`)C(7j|^8E-5i}%<|RQ zhJ5FL<MX+&{`_T(>J-lR;GUbQu$cuM-4a+o!}0@1CdCf=O!75dsXWY7tsBrtfBb>a zdtd=7Q?4F-57h0g2&D_HC4-j|TH2MtxitOvf=6pSFnagMAab2y-?U`2x-2NBvdT#f z7~yUYTHBRoV-VCFQN>f}>*n1fwW<xZbun?qupS;=BZGgGS9*_@v<=jz0(O_mq>lx8 zFyW1UB)idO&9|Nt{cqk%YaHT^5ugs=yorlbK#uYXoO!loXYNNlsvNuXTzgstHBm*c z6PL`Q!G`BALvHey(Qcbz-OO2e@$rSS#!Ie1*-xF=Ah49(TP$NkfA}Y^dMyP$=5Qj3 zik29@2LuGfM#~FMJh{W~B<-$@F9;Gsm}!ZnW8)2#1Ck=RSk#aKk##nX?P&u1ib|H< z))(ePZojd~@){Y;U(>V5)maRP=(U3dybD@w9`YKj9?yAK*D6JE(E0=3!hA`x3g*q^ z8Ep@T%SKk$Hq3?Qg>^kKltvx|?ra(M38DN3@VESc_b<uk;VVSv;mh+EDe2RKSHh?y zx_p3QyzCcb*lrI+&EDL=sO57|z+OK<hi4k}CZ-1%ke7~GOV_+ptG}dpCQZr!taT~z z;*q~)e*B2P9H{=COHgqV)(IS0Ss%!vpA`c?nfPR3np*JFI$TKPNBUGV^9RRLnbWNZ z;N*ttj7})a=L!8?@KFNI6soEfj1wegGdQ>7M{x(aa|njR)*<$ml6r{kA5vB{dkyZ< zmW`;r=WgCnP_B=`l}^wy?QyGf_#id=Yq#&QB($2BtTIM1oiUW?b6~H2jgT0gqI12o z#hnB|kQX1e}%&W4<RR90S?`GNJ<C3`cDNoG<5a*uA?=!Ze^0na&NR$;j4uMgN zGx&yyw#e31jF?iafNQ85^s3z7d7|VMgvD79n(b@R-3(*?H;2MW6rchD7xsq>d9;Nj zwE$#{hDwn8nSXmruG!C1F&A}QwQ_LW+Of{5U;VAt9j^Q1z!A3;dU&wHb};BNl+ki+ zU{vL5uuKTl{KjGwuq$cx-FBpv2lQozD~g6YSjS`u9PLz5+gik}#ct4|K5kh^f@Vi6 zBQ5mwz$Yv!I=90kbBZ+D_)aqhJt9CE!a&~(b396OkYb2fd&aWf@uQ7&?mJ2N1SXp? zD<RJs23V;4er7kW^W+#LWQ_0{5Iz`}Z(*D{bRTJOt|&P^VF^RA!$W^<sh##$ZLWIe zJH@4g=;KyQkyq87lByC(;T0W>aLW2leZmXFJQZsPxurv?6Z<9_y8}IUvyI29)WY*3 zEqh~m=JDxq=R&}Vt#@oGMUBXDXDp*vFIOh7QuvPKw;5i!NRLakw`K=cXonv}d^Y66 zot2_X?fWyjtO!iu-8*BbCf#YtgGu)uZ-{r-zs#Q5V2F(N6&}}&D9QR7xSiJMh14S8 zzqpE4Mx;2cr(lhC^r8q!{IG8CSA&^cz>SK`vq&!gDlc-shZ_ucp<e~ZBn6w{-EPCo zAH}s@Bc|VbiW2Ae0wv!~4F)KBQiD^8>*ybCr+saPjVhjUl?eQy9MSj6La$K4`u+(e z;v5Wsmn!^?R{`tVh5Q65%z!ZRP-zA6O!-7uT-^9<aK*n?R9z+b>>49YU_J>ZB_;9) zQbLBD6HF|IWK&RyP*)IC(RRL|In`X!(a{;=FQq{T*aM>}TA`lgB?QS4LXj3?%u$R@ zbbh+qdN50p69pwY^5=|oTqQeRy>GFnxlVImX}b-|2rWc~BFc?xiHcIsecbr1UMcix zJ?-9486UrU5WQ_-Al<DLK%Sh%N_jMmJSWiq3N=KL^LeD;HMtkup^F{+Efg9ftS|v2 z+<kMkOyjCZi-^$4xlF$KVtj~vt0x1+{rObp%si3?grW~3;|IkEOx_Df{re#+#BT)V z^1yPj8(Y@sLF_Px!8b<v=M#7ZhJ_kkW^hr)R2-)*!$#e;t=rx25hi;-e&%`RQN<wC z+qgtc!jbwIy!hBx<ZlQ2Lyh|!mQ5~+$n#T&^Ll925lK;@=fOgmV@#c7nyPWC(gxc8 z%4MQ6RN6?3B?#b8FrhWwfVQE={KkTlnZhEXhJd#>4+s)^dgxspkX^bzr$wr7v-6yd z@MwsL_~GhG02*j!`)UczG)*srAEda$bub4s1B)oL?=Sl5+6X}jbsFyGMXbc0fwdXv zY_%DcDWi>#{#Gr<py6<plQ^ZS6ctgZeaYri!n==d8O-DFHTugPpTbyaA)c`9U|pA4 zBs2juvDHFzw?-;#2uJwd$Z1qVb|;)rYP|2L*02OX)~BYV6P}Y&&4QJ!r#++N^Sx9S zJk=g=L;wVAC})f@Me+HAW0r>=L91^-d<Gygy<h2iO0|+@&V~%@T$8#RiR5^)1d^3h zHe9D;yB-&<RI*&@d`ei#+9mU8`%3928!wbYtk}0$iCNJ-Js%ELNKFf6G;e|4yK)GU zG!fqv6)ZkS8jCb7bvXSo84ZCzHmKv$TT!UMTzn)YZ@3J#<w<Q<O^zN2g>ADuV}d#e ztd$hp;ETq7Tp$QWg{0F~1&@2FkdrO`iDy)E$lcJBjQ5u3M{DkJgu&Ny-_ll%c$V=b z$iRpWrgvuzk@NjU9xMOP`uMlSLMKW{_Yk0=a<KBsWaP%^fKWYD&;OI|MDZuWq6_X| zHYQVcWeCk(9Bz)nRr*Xk(jz_}a+f#SsMK2IJH~nHJsY(Mm>&O{U1vM4sL4-|mff9` z3)#~n3sem0EuSh7Yfb!}qJU~e&f!NVR>}&x0V!=^MH4#)nFyEw^~@N!j%ikv1^>?B z<wJN#`_?e6bI8`#wmfnp6lx2NHz}dac6dLo34)g>(nQ_3#P<h?mX#Y840p<g0vNN1 z%onX4T=E$nkVsu0yuQA^#<l{Q%*@P#*Z}P@3H!4G)EaMk$bd}K@o!mL1ePO3jwd8w z${Q~miS!tZ$#odEl#_`Rcp6w%vVr>->3*d>_}k|`5buku2TO*Tt5v~Q2kdnxRa6S! z@rLGwe;6j{%eQS-hfZbv`1jo=lN*hAj5@x9ZgLSli(<GV&gVZ(5GF39E3DPlWHz8C zlFD2QK@JD+FQgW==}W5fllVOX)(^)7B+E}gTn#)!8^k%F?10F{2_#?-VWM*g?$hhR z;+%`9EB$~Lq0MfZ&x&^^oOhazP?S;c7Vn*F=Z5M3-RXa4(w|MZcU3=3XxJF{luRKi zODon$z?Z-{MJl-q@1$zIJ#YyfZC5B8nG=da14$bLq2$X@%s>Owzb!$>wS_N{5TbsB z9btS(z+t2IDg9Dfn@5l`_iB^o;rRay%D)!O3>P5c7Ft2KN=Qsh?u=zcS1V6;0~rOn z><Lc`iB=vV`r+DNj(O?PgV&)aO#p(TcdZVduaAf4|Cpu!w(MG&0TBo_1EHZcGV2@E z|HpoL0#@A1d8spp|7FJh+w=cs;EweH>R20n<cXmJ|Njrxiu)z?J(k*OMj{{k6K(_v zL<Rkb9KTTMAIwgD9i_eZGs9vln)EQPwoWHYG5XJ+(>4Iv3M4n$>IZA}Ha<YRl+?1- z4IUj8Xw^x!DM!S|@=7z-ONMVrRY<7@-P!uKbbW$7W9XoP_%)h~44_w7o9#PScTa}L zKAZax&C!0|mB2xA?z^V}LnUCnik9{X)XAj9x4f7RZ?>QVy*kdaURqL%jV#O)Ex+xa z^#ynrJGjA$v+w#AiO|B*F8W*Jcefl~rte_WQ#fFoaGUn;)(p*o_Nh0HLI2J2e~rNj z8l)ST==$zD<h%9iPP;V%4`K`dEf6^16=ZRhquzvbX;3;NOJ^!qWTLbJ>35NU+@$Dv zm%@C0G*yS#mlg?hud{jcT8-LRd5?Z!foJe?oPo$>z__t#&cz%{xW9gtTcuo{4S1Kh z*Qm$jJ3Nn+&|ySBVyKnP#exz~6`&x~FDg2N1%M!Zt3+rI4klrlL1E>5y%|D)u!P%) zXHKSm8MS0`RU#-YXRbSpBv70&4lWb@t`&vlW0tu?q*cgf{bQM%aWEGWy^(_fJx}FY z2!o3pS~kH^Qv2RM_4QT{Dd9YF<s@=4-zNK$=kQTZ?9>&fCJH&J(qmia3G2n!D~2l8 z*W@y#YqZhz`*_68!2?4oTAxx|<Tg(P264{-|7B*tVq~oT#{TwN#gzH~n06`<))$&Z zhlKS-alRnuZN3Qn>g4hkxgG?B%RjgchrTn7&dMlD+(dQu^~9|l7iN((0Y&j<44H%Y z4+5}P_z`E|$@)e@-6nq49EYC=Eyun(@)h`7QKMQv2>&FNwc4$XQFmpR5@Q|lzw;mD zLq`C+5__bwC*ps%O<z)uPWU>`kDmctizGyfc)^19-bklc{x9H{5?FU8M32Lp%L&9Q znKQG*i-*8T?80N##E#Gzb_s?UrjR{`nRaWm4Nb(X*aFIDH@2!^Wo=DprDnsen)%!L zn8BBdTafp*&!@BSzQEJ6umSYete5KdmRZHV?q@D<S59beHSQn`v6M9l(@_8Ur!WGe z05fU&-`yPf`L#>+iR*UgeFqSH-hgg!`+!`!pKh;Y>B7tVHkGvxh>I_C=ex4Qo|Xr6 zlj5z*X*;R=D8n3POZBE1@@@!u<mWsUQ6Gac`D_G9yDXO=q($~sED_~fZho{*>KZ5j z)QX5Nwqp&BGP&)~Q%FZ??j6LVD{d7UcO8wb)x#$memb`xJ8M}`OVUpRQU$~bXUb>; zgX_JYPxrl9Y;{v_cVvRr(gelFG0WWzHY)9}l@kkU2hn`)*Th~Cblr4tW2o}E6OAV` zC?Z1Cq%7W-q9`J_e;@@Qb`>fu6Tuwar0+4dCB{u{-mr-og>6A~izRuoYllvH0NVtB z)6^nK0|rc%YjKgu9(%d+7)0TBsctztQISH}%52xKaqvrwA^{#2?`!GPj2uTel|1aQ zu~Ybf6BlvM8<ylQMg-}-NZ83^@%^Uh&j`st5(77N-SB&(*P9FR8vWoh*d*M?UK}^~ zDbk=<iTwp)?i++om#aHwf)n%CSiPx$oVmr`=4H^8W@qvw<$hI-uo`sjSTf0E@f!qQ zH<BjR2nGzgeCA{)E~ZfSY@KMTv&+8dSf23ZeSX%G|Fjcd)?Hs(K%giVl1T=EXnUz$ zr6>_~P;}*Hw?u-HumxSKdzj>&3GgewmTZ|jo;Pq;#IiUcylf$=YV7;{4AHUJ)z;yu z_blCv>{JyMO>f@w{^+dci_y7$LFj%c^Nh6>fY`%zsLop>I=MxU5b^5c1&2I@LvZv1 zRGES|uwjyw5t(=Q6kmp>Pt$*c+bL%*6#35XFweYI!D{E{=h*w`rwFy>F6#A)FA}c} zqRO1gDSiI)G@69^Td>L~Im=;Tp(3XtiwE5+>eSgG@#;PUrqi;Sa7H2Ampw|;kzbiP zL?NGfgi`;AY<%x-)<;nN{>gWSvTm35!M+uut4mCO{sJW_%60ZR@&IMEe=_BUx4ipZ z5=n-45jjs_;eD)CGSlzrLC2)1G9<C%t8@24zv8nxuAvumIVo8O#G-1N?}E0d+8=FM z`d41C0hHt6-wG4}3_!TtF+F^*rgx#@AFJL}B9&%bdBtcOq%FvfLnI#Yh@Cm38xFg6 zAgLVP)XztnLyB%?j8D9lc;eP`C!VFsKk)0w4M<zIu;@H)k!=j`7(V{;7+XPh&PdJg z&nRr<=!9;)#$IoC{D_2YYl!6vN-9D9#LQ~Nxr?Yo?Ci088lw|5B9du~a9C}vn9fP; zK>==FSt>nXb;Q=3%_dOS$Gjk*RqUzXo+3#8w=G_eKvz*A!|NzlKk+cs38z)}OjeKF z+|X<``v8xH9Q@omW10C!g07+}{aPe078?H}FAUnLZzvP@AbFuz<095z`QB#B)Gl4d z_&cQC<BjFV(&5V%Bos^K>R_*eQ{BL*$m*q{Qn^njnDDk6N*+n!nr3NrT4X7E_rR#h z)x1=?Q#)^He`M6;U}LnYXf3aXf25CiPk7*t)Y1UwdUI~!2E-N${y>--L9<%t7R$(i zTkq;G9G@1tp|G@qT_rDU_fTX-jZ&gJM)<GcHL`;^;|n#l0BeVTyuh_$6?C)-JJRFx z<5Bhdm9Ft?tL3YuteNu5FloMAVz?MoD}({}GkWDAFwr=ZNpDh^WN7I3)TWImDisK- zlSK*fGXcJhp?#iF_Tjz>jN9|mjx=GGV%STq1f2+_)dd#nyGX!qqQ+gSG{2+ij4HLk z(gfo@Q~cq^7D(R2O4ijm?fw1oRe#HYXsO4EMt4hrxTH(sqwwlfu3GfXnL{gA#Ldr& zA!=}OdM~<ZZlx^pV-}KDqBs>u(U%u}G90u#W-s30TXgbVuXD{u7=jH>sHb7Ywa=Wx z2DdZkV0vin`$~bG+#lfiBXzAiP1NgrU)c6?(ZZ{ZxiH^qp0_%7IAt4{0e#=9U8?R4 z?vMX@bpo2QW(Xj!T?rHNpXbj?*{3)05P>_PANk5)WjMyT=QBlsA4olspE)uhz50W1 zJMoEuOh4cOA;rp*DVk_<w7R+=3&Go^16|^PyXA&>A|}1lO(IUbwvMn{O)O`5O5KQ) zZAr)M@N1TC4iDHEOlJ-D%#hN>@b~BA-U$`2oz1+|U3$%~OO-?Lw^lc56#r#ep({*b zkC~_uN~Q3hoBXpDDc_UDu6$LGl&h%M#6%yo?_0TmgcNxmx1TT%sEtJy?;@v>uw60Q zvY%IoEH{fsXQkQf{QXP0-k=^kExJN3AYTx*y1j-0TwK84!P)IYhN?;I&cdn-izWsS z=_vA)+y%+bu28RUokRu8?yoxDgMkkk1-da&Mb*X1#m5#n<JmlEP=shZVxg<;NWiL4 z4F?rh=&^mgbjU3A6vNe@XBko?PbyeHbC>N8XGl30QWc_E`xy!$$-$U{MU*(C$CuF& zRL7nj0-XYl<8%~+9I3$bJk=aHWX5+MwlDfCeT<ksY`N{O8QeLXnUS=*|L}V?4=Lyp zNRMkl<<~=?zc>2FOwCwW?qDIyg(od|lJIb$czTR=CXK()`8?==lI3$aZ`l=y&3Xu* za*jc$Aii}VTc0G+|J@A#ahWIa_tUXK%+krDn4hmab3m+T1&VNRaMthY%ZiI~#qWf& z9oY(C$4?8CB*~w3e5Unks=~l;bD?)>y!H@xQXPxArcY+A4Ovp%%}<(p^pfMG3gq1- zH~`ON@3dY`l%!`!S-TCOp-Q;W5a%X7OL0BiO>xDgGVhVOd~Jxon{tBPy6&7^pvI%H z=}KbrXwccGe(yYo$yL$Gfpq89a5oMVM50YXMUHo;gv&!A$-6v4&}MAsu2hqnKcE~X z)EwQ80%eQX0S|IS|GI8lCj-$0W^k|uhK^vfMJb0Ej=w)?Ey54OHH?N%`(M>P3RJ6l zc!p!^j78q7Oh2-ZS^&wJdTNh7c)_{5{#=N`u0zHS23dvgA)FK86arpax7RROtSc73 zc)@XLzH5(5&b-I*EA;*(4Y9$C?%{DnxDZ;$c?Xw|<9Cdy8BR^J9rLgY+|!Ee7plii z?$!a69xT|u7%+%QY0P)q2x&mM!+;YTh0bj6!^PMi%-AH>2%2XtS728Tr~T)|IDvrR zGhjXvAb}>1uEm4Zq)5_a+WPJuB{t&M@CXsCefzx$_c=Ux{m~k-<**^i#!1({H7jLF z*E>IrBjKn}SMjY<>!JOSlL8Vl4v#5!O{&j}ta$q=_*DW)J8+L=Okw0+G`43_<PxW1 zLMMJAEHm(RTzZ^qST(UkrESI{Q&+00);XuN$Be`Ekrb5e_H#qstQ_}!$Z4N-Ce?WA z%k#~pLorKtDW{7ql=QA(KF=>}c(Pq29ra0D5a!OkYgTtWEq8*9!HU55!Ny&8L>&9! zDB<@`pqg;d>_*E<<DkP7wKr#Kw>hSV>P}S)E53mFd2?1P{hY;S*AO+IQ>hDsi|3l~ zTm8?hH93!JtU)TFkDn|ERmT{{RT#b#O0F|GgX$a*9?VA_DA8B*VF-rvK?o(ZcFvcb zCj>j4?QpmHR~ok(N(8jTbLGsSFO02rf3453PTD5ockbfSC#rV50}z&zJPRf5xI(Lc zk7Az_XpwaPC2HV<6R0R><bP}ve>o`u*n}m1=nkCGNv{)LCrK~3t4}K@3PE}#HUcVg zliCs)X-b>b2Y8ktN{TESKXK5GI_Wd^3Pd!yGknb?bTkPI<6j;N<r0C44D6Z=C+6G9 z<Q=KCVOfuB4m{q%u9=_vyc6p8U1S4&sii&uZ!w4h)6WhGLa^G;Z#Xl)_XP)Q21Vy< zg7IC*ZSLO?@j39lZLVTTw((e{;oE=kvFI@j4SnORC*JJ(gdAVDm_lgP)Z|XicaulP zvtAtw9=A?A$)Fk8AQu19eavD3TuIEW(i3*~H?D%tO*n662XY5j59#q19BpRyY(5Bc z6#y1Z@&}GWjN7Wf{3FKunG`~zUBLT#)BBNyPBq<#a$J;h1mXQs$G*=-#7!Y$4C2Wm z&KY6mFm@fqZ|;3fd+O$d7xrj2w@6g49g>4R{BvRq_~aWcm7FCZ$}JI2C2Ir?bIW)g zX~XxDh=CQCRz!P}m;I{k<h;-H{bSw-_`&$(j^`b*hFFSujJ{ml>h+k?tU$D1IYMR{ z&_3@sKhAmF@XICEelMzds1+mrn4%_v{8i`mYQ@8Eit4l72!7VB5j`-p)q0uC%~UK+ zY^r|2QX#<=0CP{9?|KeP>r)KgQ$or3vewP<vTCGmutpp6;&W`py7v;@Z*>dS8KAAY z0;9BD9qu5cdaJmalG4TezlaeEq{oQO^pK;qs;H+VU-cK~M+AAjVXM2WNt*FxLTz&_ z8O>pn(58sUX1^M9a2rb{XyuFh*#h+^QJMDivNaT54<9Rf+i}qmoL*BpB}7?_JH)Ti zn%E!;jot-RuUvx{%W}tL#|h3{C>!P#7inx$%`-a8YTl*KDIy82D&hWd<ziX)O|C%g zbR>v5j~3eno6kJhy{G6QI<RH$vz=1I-0<b4$8CeWs+*r76N-jjlm78}n>5P94;qi; zsz2CaQCP_j|1jx@xU`98_;@wS_>1{I0+&F^PI%?pRsQV}>T^_tK%cL!03TI$264%y z)GA@lC-awR)D5|^Oy5+)#IdnndyJ{QI5a-4f)?ge=daQO{TpK6<g2)W$tjyeP5E(? zSWfN5!?qFq;XX?@k_T}Rn^k14U^3Lu!O0R1GLf>I-gBT0`0x&X7loIIFKi;S2;Niz zfgZw`Ypn)WCD||a6Eu9_A)!q*H{2AXI6WJaU>Pb|XuSzf?DwS)2oz7azIPb16c_={ zi;0)F4F*cn=f0}MsKGI3k>IvZC8`sO`8Wnj-=QBg5PNxABfG;IFefCxm1ocmUPlOa zDf;Ymsx&!Zwyx-hgi$<pV}gAL@Ir(nHWLJ6h-n2C-u#!hJCF$YxzUYGXAfbAD|3Sc z3t{<8>7O5@)+Vm1>fClF+tispX&l>~jSqjWLKX#0e!ebnrS1QxIcN0e0`TaTT839h zyh1j7R1bT?TnWVXu@hU==A|b`8FXvk16}MoxG!;=|G1lVwL`3qfD?NmI-%35Af%(9 z;;48x-<0FCqdKO(t#cjG&@5y1-o#_8#lgY?KB2-e)|h-L;0V6c;JQa}4WMU8_&)R1 z*kQpYO%ciJSQsC=<!IGOyzLY1+@l3ojiD9hRInv?nNZl}_pGXfrj0s7w&%TMtJgKS zkf&U~s=WM97&B$|{ZTz#l6CWSpYV#0$jb05Lejs2xED_nov11X@9o%H2bF_U`pdRe z6Bba;Um>v=3X(WD#KY{r3F2jN${S7#XAg%gUt%lekY&!<D0>{04p;hARjiVB!7L#+ zH;%9G`|psD5qD=u4x_?O6KyQs-NpxgW37d(aY_Cn>`Y?O+5viEtKb<8>9I1BR=EJ* zb4plPJ7LiegFy<kg)vu_zMfZs`v}-v-rZY7f*i9RYz>82%xziv1l%0`5tE?0bkN@) z?G6l=Cnf!lt~P!9G}G&iN8c{It#nz?+Yc5ozsQ6Pp1-30zuk>;AD{}0G!vuajjl$b zcKb$oThV`gNU*t*GnZFzZY>cjHrkxh*JLP}Z#pgcJmIR3jH2ODE_*&p+&`)k(wH+m z>czo26bhUTLIolU&`d^W$O(MO;UA7PiYl~ip=KTm;7|R9t%PAiCo8qD+Vfy53y_0h z_Pp_(CTj0zJQ=qsE_>+QAoMmirDH2W5t`^dKaESOL382nLitFbiZBW%cg_%O>h{eM z3V9OA$QEzj*HJkiT6#HUa*Ytx?{Ci_;o*xX$#r%Q4oH1b8`Y9gTll1I){a21zNOC< z6?_FG)Vb-iqzR}}_m+-|o!b2BqPpCK&5L<XM#uFnvHu^&-Z4tAW{Vb1I&IswZ6j@_ zZFkzX?X+#%wr$(Cnda@B_q;kc<9^@IXN;<6SJhs7RjoPas)cC?U>^AoApG$x&)Ui2 z%h@V#m*aKH;_W;lX-W9@Q5FN#TjYxNdz1M8EFJ@#(Z%rQd<KOL5FH+{$2k7@FCaW! zAO19a3!z*nG8>lTja5u7Ye}`4IWJ<k6FZTS6%bs5&fz_3mK=OF|2AUem!G)@wX-v@ zDzHJAx~HZ&heI$*_1cxy-KVm6JSb7pTL2r%UfK-%H!|)She0w#^lx^9mjc0xxiO7E zj~@CCp0t0wY=ADa1EyM>2*nq;uY#YChHhb*w_FnrO5Z3n#0pP3IMpwv6x6~C!SDlM zpL7PT1TMN6Ws0c9LVyML?7e~T%!N~~-;0?}_mC0Wsj%iqS3PI{6T1F|ar1%@%fu>q zU7H}$)0_P4IqTH3n4hfm7m<jpH(^ovq@?|R|5`ge6>SSDr&>ce!%gGQ>ei|1z_4e< z^hbBRPSsp!`Y2Aw-yr5jYX3#dR}?dr#Vt*YYUpD?w(h45&q;obA(IQ1wzXy&+hy2Y z|9?#SU-tcrFZhn2ZD3V1Wi9xd$NU3m=Y7WO9NxTVP+FDyO+zDLz*Z2+{#JhotLMQ% zhgs9}|HAlo`T(a4jRX_a5n=yxn)=0Bl%sy$@Pd7Gb`mJ5Hv@F<WAA}t_%EA*3y>y( zh8dKo<3346iJ9e{UO2QALF2)ye8O+k`eVau#p)nvQ}yl>-32W7PYbOyJE?yR_D>Gf zTS_ETXafvnOyK)}mchGTB2$jcSI{02xbMzitU}oRjSiDcFL^RGHfFE_d6STcm5om+ z(s+2A;GeJZ&%gVdXvvg>JCq;R&N9Pke^Rbqz3YwzF~px8muHpjmnj1`e1Aj`g*_G7 zBK*x#{bQKCEBKQ|v0ccw#V%C7SY$irct2fbvkvYMU{6nhNhIl}!_WGHPff(_!~f0k z{5_8UzRhJ=Z>eI)_FA;V={{j(*u^#wx4K;?6|?{gu4lZbPMF6d-tj!JgXMpJp#PUC zjPQOiBx7DK+B4rlxl*kN@z50HwXm1~<SbFW%D+?uyn92DYA?WzWezL+``h}T1!_zM zJYEq#v#DP?H-N|^W7U=i6!#?)4;#2jMW=_m7f_O}T8oGP`7b~H`$6#z5KM~3btz1W z+ZGYvz}y8q4L4>RW@zrxEwVe|O@_XJo{U7Q4Py+e#B8ztKVO!)FYhnsLG+#V>9HlV zc^S%s(T3#RNS#3ziUfsfy#IpFCC;mVSl<yR@M=Mb7iR%QI3j~zGY-8Cq!)J-s&H6B zn7Jj$2t$ea!RI$N{P#*=0HlebVIpJsmNc`fd@2N(qG6^NONajRE`Z4K5*ZI#%@3?W zb-x$+6f)5d@6`v6gL9Fxgz*M-zJkYy`vCO+Ig^iY>zCPW`trP>+?AL@VKbo9<aAA8 zogD6fziVqXB6NkcN+3om(1HAa*qs{DFT11S07FOAH_YNi{@_L84MwK_p2~0f8yN$n z*?nn>?;pJWZM#|gO*3U14i#sLQUxFBKV=BD<e%#yEfiK)QGYWtJ7fSsXCTrFMLYt6 zf*Q!AfuTPbJoD6#2!7=e(E8ywPs((MC*^L1#=*A8a6i!e!(H$W5O!MNv+uWF7yhQl zKkc0PgDf=j_5BU={Vy}biuu$Me3*DMoYVXjph_-ZPXq-8@j!oPGCfR$?2vFmve&5b zft+8^ri%#PuC)0ikz*4hlV8#USqy<Cr&zgA?b~T^6GVXS$utrx1jkQ%Q!6nlfV6v; z^1iIG^l2t;(=OCgl_xZ<9dn21#=p46WZ_QNN&QtWcKDwl9$k(tGsz^m!F9m5u(Y#s z5!<qGAT*$?CC1MWlV84kCERUz^<cIpZ~Tw(XG+3r8(b1eg?d^6uEsGnCME<=lfPXx ze@#_tZ{~)+czc8+7IId8lC6VzfOZ81D=P{j%ronh?Aesp07@$&p(baa;P2|EnoOQn zy(Wd`y+Fz!ScGV7e9<KIaI7WDTN%!-ck#Hz<0qKix669^R4<ib$j$N<;Oe*;DG@!d zdomg;vEjOvC<D=mA)^hW$^)B}f-_9vf>KW~**_d_Ua|aO`E}bC1Ax2c&ByQ{%;!Ad zyz#9bC2Ax2-PFvbo8+(6=M_h|gaY->2xO@>IfzF#7fuIwPb%xZdy9*2J+>KDFSb~# z`;li4q6_}=phNP*W=8v+8R}fJQZ<lGCMEO_T#I)G%#Pl`3RgGaj<2E8$`9Bjo7j-2 z{c%g1$|OAY^DLL}&b;Y!&rFE+R#VU8-9j5_8Bvv7dI;BL%_PeCQ%zzyYk-eK_Ud8B zCfNr`ZuKJE`t$w));Jx+k!`&;g+x}iz2%(YcIXjP4*R`WWu_uDJzyPX1E^$Vgz})f z$(z-7dB|-&8qU9p&tIG&FB-n(;N2a(<8*KFxj*3!+`8$R=7TJJ8g)s1d;~cp5bmbg zlux^!Syv&W@QGRI(9Qv!7ar?sR*=pLEGZf$l<3d{N1kXz%gAG_x}l=g%GYFcF&nEd zWT3L)Vqq^trkoshQ>{EmAUxh?iP-iZyts_uDA2y!CP007Y)BxCp!jo7{lLb8c*EM~ z*cr4dLlC<R21iQ!F+8Wksyh&XOEgmI<Bhx4#X^p_{reiX5(1D~$HBi@%>BHkv{tqH zN*VIY_f67)F3vF7|A<;b^DhkV&TMR#Ir_+V%JU2yehllpy?V{!2a<)x5i$vepZch` z0t4;^@>LeN#-DZ*kY@_a#2?1Zh+1{v$SY0MQg=GCYpqa-OmWN!ECuMvg^);B9Kj$+ z7qMB`nV?d3t~WV;o8Or!ccnjM>|*<HUcIpq%_7oE%!oP$AC(_pYBbTWMnh0uYp}sC zpNx(U9(!wDMuDj`^6uDjGxhDZq><EJD>_C-wgl_!66JEW7x!>laVK1`Lv;^W_sTPa zSg<l^SL@yP=Y(Y^)w^;C39+!=mS@7|#FaGT5Pu`l{z$Pcl#p5tRS^M|H5UtOCi1wM zIXBhnt2q3_h+2c*W@lUDNixahb&!D*SNoRW3=va*+@D^L)|)~~n^Twe8={O}1Bp~2 z^7zgjad~z?fVe3z9EB2xUJmcW;!hW|ucpd`D;RzV*{}AXrN!B!0q3T-jTd@cE>2`t z^|@I#_sg4%f4E{JXm6=JNaW%Bt&)fbI1(BOXDed<Gg#Z)(aNf5eC1FA9#3x#w19zx zArfeeygEHWT9un}0#nUR*mQo}czggn7uggDRkI#Tr_^v+)CfE$WV`@Q8{J6%8z)I? z)E3dcbq!4ZyO&Hv4P1^-u&-A@#8Z;t0KZ7iLkE4Z>`L&e!vHf*d`#Z#Tu4HqZS-cm zV|@K>>%?jFlL(0QetT4ceQmV0(@{hLI8w3Kvd)N)+s}^<jS{cU**TdLXXj0>qj<Nv zG&tzgO8iQyVYR3lu}iYw!|J4=1a;EAG{1c&72gPxEXry$mmsV)D5$jSGJmYyrF(hY zqkJUOFaTn8;qo$9GmK^oO(hcjE~nU(7VstlLwSo5Ba>wJL%!2q;E;zImtTZeO48FV z42s~6BXcZdpy&Wwuzl!(TIKj&^`0zsVN9@kK#TUUd`f00!3<dzMWX-b56wfq_*T3( z@WWc-Kt#dD%NNGf4%|C0fT5t5i2_jaN93X;0a*7FT#;hUs$E9e4R^$&VE@U$(Z0F& zWYJdjJ<iCz^Pq~0Y*{f@vQVqHxD@O3*u}RAx4`u(ZrCFQHnOkf%RW}yW*S1{nLNLU zS#?pm_q}XEyYE~396!;15NGHr4CNAfY>6jZZr-3=cxg3gG!|?aak>Peq^olQ;Jm+q z<Bz+Ckll39hd}m<Yq^IGX@qZ2i9%SDUh4$zn{Fw6_y=fRX-P^8bWCD3Q}LVkdv}<f z0sx|~uXj}Q@l`nqZbqjr%o>3VTF;m_`H(&lx8j*p{M!M09~&G>{QZ#ZgYO2nuWldL zWA6>y%Z6_bq`{He`%ta5GSlUnPzOo|Q4#J_Sbq%-_YcvYXMA2NmVnb<D5vvv!Row^ z8#VC)_q(U7#6y|pGsI)oUzRO7ThQg^*L*Q>oTFpAGMKes7ygbymN`FbsfI}*uN|Km za?@Wm`-+dS#mGBRrp|Md8_(ftzq!FZ90@j(*FL^*z~St*Y;`<91PyisVR%$G8oTa6 zqey&1+1jF6+jFgEF>KVfvW8RCyzSEyC^q6M2(0H1m1ZHm{FX0RL>a)oQ)2A`d0mm^ zst2bU2JJ~4<fKcp_TbE>*R#fSnN#mhcoR>px%di;RiqXF*0`CrG>&@l4Ja&@2#7CG zp~R~%FWw<{mu)ANu0spT4Y5{n>L}7mqIZ;sN{A)=ZVAj%3du_ED^wYIF0f#(;c=Bs z0>B6ZN1WJK{$cN5zEY;b+YCfF$3}beE)MJ~iWW(bvuG~py&z8YN0Dk;<Zo~BIJpiG z(pG%1DmM-!p5>-@Q9=e4I*e#Od|1vgte-DVT85p`WzS6jNn{~}xAbHI9x`zhq`RQ- z?BozgONjHDrR)%J(@GA%cZXdc8P{cgxHN`YAF=w}c(qIyjlJr5<FGqn(FPepCCCAU zCt6>8Wq9J|9Yx3<$!yUkvWCgcjN)tf-F;*}vJD8MZ}AD@2md9E5t;)8BjG6`5xdA! zxznKRA4OyV9iw){>@6jd8I$`J{G+q+5s{5|>uZzoqoWK73c93bhhr_|5P{=d$}rjI zBK#~Pv<sgk_`jC&48xf7dAQKU;t@=~`@X{>$z6KYB(S_#sD;2W2>0YYGG0RyWmn7S zT?$en<|MypC?V@-72~2PDCCabfqPB+?hj#dZcfc%SP1NA(UAGv4Y@{Uh-pf;iA24O zj`Y_TXXarH6zd)h@z_@!XY*-#6SlxI?FDeCxEp)`Bz$-jxu%(M%cTnaxVX?c<<|i+ zun`raNk&-BLV<(eOEE3;DkOS$;fU-?_=Ke}w^ekgh}+)0G`==k)FKNa6YFm>&n{hQ z<qCoO;ymcSE{=ScUPF!Ml{`{?mfdf&y3TJK>aS65V-3n`%sEZ9G5zI+qED~l4V!Gq z(m0af%&*O8h9fVuoAV@<dppkY{en!b?rn5-_Xo;so`|z3(gfVxa4J9J3iB~s0^3mt z&%7VjdrrZstf<)i%~P0njN-!+*F%U#GH7e(x;L;!KAjGrpGCZyBycH2)nl$y13KMe zdwWka{b6ta38xM#0q3`ArO1w_?x(q)Tyr5E7>$a(S7m`>fjNj`<G}{;HvE$ez+>ep zaDiF3Oe)X;n^h|!5D$@Z1Cwv3rdP_QhY6;YA}-U*ojgQ{#2D%pGfn{VTHqn_<?)xD zEb)a3t(;t#0-ls&IKZ)(Q|*M(W55vtIkxcP^f?K${cflI_kergshWlc$?DD`7|Xli zx$a<WH1W^^9~;3g?dXgH^5FF`Z6NN5guY}Pi<xom`^B2DK>kqBT^S=D_z`~R{Dg=i z5mv}=ECu!ExCo|3(}>GC3l;&D2W|DA$k~n`;03j`C`Kwo=!iuT6w?pn046$4wmN8w zAS&e+qkSW7UOw2ofOGB3V10-FTnXZErR<`&XEykk!Dw~?bTSoa9%Ff_a};L1a@<!? z5S=($@Yi10QNrhqg(|G7+ZG=9g)KcUm1S}px{Ojgq7of}Op>;I2huEc`jc3G0pq*7 zz~Us$lHma~&LUR+SIi$;qHL#PAqO5l*gPq5(>4@$Z$IDS*dEhuKBys%H+tnxM;NKT zXn+|xW5e453`#OW&l}ovCtF4b99KkVQ<Uv+CE($!$v116mlL@^$@{eHG&zsXTekUm zcVcH?m9W=1i=kCZEgw_MhFHp<_nMfRf*37edy^v%Hb<;n2a5V=RNg%s8~*2OJFwFV z5sWzo74lMWs6oX&8QK#i^RH3+gfK@HV?xbUV6Wy{x~H#G*EcreCAq6{E6qWp59hqs z_4sTQZdaOi5kWo;EGkFe%Q~Y56ekxCbbDzaGC4c21Jg^^kY#SCUiI}L09)IEUJv<) z+>WSIX_z%I@(DDc-{=mD^GWVGM2F0qg(R?|53=C{8!)pGL;I|jEx|}ra0n8zN0i#* zO%WDMj$Cqj!J~^rG|oHS;snYGa<|f~<tlwBz4I=&O<dAC7UmlBT$$e1bj^pd)pn)z z7HSTkVb3wPgop3f5*gm$d~w*8&CY$Pw6>eK9QF7fV5$iFGW`<zFVNw=PPxRbdtRhV zpANPs9{?633@Y0Erq4kt9cs3gqe_bwPM=X+9<asUDQ*|fCe@Xh+=Hitp7q{5?SrA1 znq08o7E=Pq8vJ!CJCMQl-}xkwdy)PMD7~4baZxUEP;q8dOB`4Q9SwP6rowV`?&8Ty z^Pg7&^P9Jag6K;%D0Hpk<TprtlOyMy>rmcv3-av!4J3&(Vul8rGwz(OO6@YrdMIkR ztWZ=w!QcyCqlLkXlSKE?t#z2MD255c6OMfM1sh4@0xZpE_9v(MUY@Dne6;@R2WsF! zmhVBr1|92TAn~qDLq!Yu@cw39zDSp!tgeT;5Fq<a31t;WP>4AXee^}WT0Pz;h{$%$ zO2ZKg`=Jz%LKg}1$kuOal4z?Ex?*T0RwhFu4K|amwTv`$pXXQj<t_EKGu!>>t8aU3 zR!F+WruhpJl_<9tla`w|(#dv|KtK&&RSw*V@iXI%>~gcNy}wB*oJZ7$mJ$bkD5a$J zb1H6;G8CQ=rvC>~eq_t!5|mqy7#D=}`lD$Y%HQ8tWy^HjTsOD<EwNYTP1Pm=w<(2` zms|?n5??<ptLTTXFp6Q%ZgKPQ@&tRGNwGLCu*(pOY@EM}jXHU*ylSaZUwVMsNiDk% zrbwiPe{B&+RE;H!%FXn_Ah!Bw>E2Uz^Cu$W1Xy|QXKnJ=JHLlZWm|}7r1HoPG!Qey zu6?tVpb{}zz7-h$JG4|5a-Tf-IfG~*yHB$kl(tj>u3`@{GRjwx!}HKmLN!2wD9>j{ zEx^$=aMw)kZ*FJB{kANA58$;!Hy0~;+#Dt;Hg(dN$uyF9;mFDsnhO_<R^d$+GUnD$ z=^V3)zVONMDjRpDSg2$*VjCUnnV|8#(Ip8u4*B1DQKozWauL}`<M91Xd1y`F2J&;+ z2m0GlLT1ATLDK^bN<4ek{QwDxqVSbfwTw*l`&vb{O|PtLdGbB#_UZ1_@t6t%Je7V< zshcv7ng5LmmPu%{tOXOz)<Y}q?zm?;bCegRLJrHv6}-Bd1qLW-_)koz&NBm{ixQtj z?dZs?yObQRcQlR`f-;NF>fNb~v{lEFM+2zZ;ANF^amyi<=q1Xny@l{ib40u3W{@nv zew0Zn&K!6slI7TqV4XeIEb8L^asvMuiY%Q(%7$;6lWKl7zfXXV$v#Y~^r`pTuZV?L zm{{g{OIsM*H1vlgskmU411x_iw9eiB7vQ9&;6;a0kaNsa5XXdO9(}55D^u{Sl!!YA z7IZ6m9!bS%7;C6kQ1SQ#^eAQ~Inu!|mF_?$0var>(S&Q-j4}=DZ_0!t=OnvwWlO4y z(JR$--lchaytd}y4Q2?{j7Or9ed`TYHVVmZ=Yu#|{n`{|732+M<sFF@l~47e=F4Df z!$UWgm~B<n^I~TkjLuMT$irfTYP7Iu9DZ-u4OAwpDdnz|WV#C$3<r0Zi#?bm7r-`^ z&4P>vbt1XTolW`0hzV_F$VZiBk+>{|&eW#Ekmp(wO>zDKwm21_V(j0=0`h6wrcw-U z9J|IJbhiv|i9a_j@v0ziduoKHVeG)sy;H3kB+=WdmBAUCzE)x13}&qz$_rFDUe~Ca zQh%^6e}EyAbYO_v8~Wqdb!Nais9SV&pIiKq+hJ(ec{m&_%{IQJ)y<X9pB_G3kBMd0 z)IPy}lN;$S$nLIOzqhVI%@slJN0uIp=T3TZyN?C-9cSA*GEJppmI(D&v%7_};`v#G z+SIQp84CFaw#<(2jr<m8OcPWL2~MdYz!P{ESH#a|+~e120h-{3f$ICA;JKZRo%e{S zm$o0<fn^f%&xUUC+o03DqUayY*q}q|nC!Q#4<QoZ^6#Um6oozV*eig|hA|g1O!QT$ zRY{8gDk#dmQkM2C6`N}ot{gUgEmUDEtW!w&xN)O)Azp7GJx%%U!MLtw^Z@*TdcSck zXnG!wf6#s!*ej2e%WdA`Y9x&mo#oR!3;linQ<eyu7bHFBJy>Y59Ha58rj5ntuVEe1 z4s^IExEt*d#KLm5pd9lTUfcX&OEok0`(~{-d5woW$_`w32@Ov>lWud{ZUcy44q~o` zs5X%A%ul<etDFxMOI=(86r|OtRjoKdcGm#le1(@lv3OLsH9`o~V3u;Vrh|7Kn|R24 zMjCWG4>9Q8{aGq?N4~?WJgDRf*zz&a1WO}45rnNoT^NhUMJ<Pd=Pw}H8!x8mHaX<k z{VlutKr16f94cBQ&*2bNoYWlp7OM5))C=RH(L$$}0TvX3t(FEXXO^Q^=}B9hHY+~Y zQ&eKtcGXDIl4TkbwCww}az>piAq9apl=0Asv7=b;mY%T}W-$XC<~4j;-aX&IsB1ie z$h-idUR2!%&X7TQnVWIIgc{oVPwEA)FrJJf)A~1|?}nHfx&b*69T3GsSFJc<t3y2K z3qRz0h6F=vu3RHEi88O~iEfi`fNs&}kXY7jDeliW0W<~`P$g0{_)<R7)Wfs18kA2} zy%DAK!WI!8Vz@5rw&ky()x8*(t*B)$y(1z+T`R>M=5Xgk5N~9NANk5)I)xLx<YMQ; zm<yj3lp_}U=n<p&mCGEv>{flIvKh?z7b?3KEIdn_=aWqkrc7L!Pa2CjLUIWjdD+j` zs~9RDlh9w%vpWw>pSKSUBXs<Y85m_n*0_m~O`4&frIG@oLg!U~Dlm)MY!)5{dgHv} zjK4Nx6rb$lQp$q~-c#$Nz5=BX!k&wR=a(ecOA)f&iQ9^Chk(;x-!~mo-=?Ygp56ew z1m5#4B^N~6H*c}kAK^Apvf9<7TfYkFF#nWd`gt5TOghcoJ^V#(sKFK!+42co%QMFB zZRSD<^Cv1bcca+7Jw=e3b=E1J-+ik0-utAksSe9%DpNQ!eJ-ypfhDdXrm*jgft8fd zJLQw!5RCZM-SS#cq8kr!U<^;~kF&>QM2C-%{pWH}Pbo*>RDeG|05R7OpbQV=`wa^F z4kDl0Z%h5NNr~w8B=x28dP^(=Q=Y_OB?;ioKeYC&RT_2%Vf^nLyV$AO!lHbOSu{O& z9SG&`ddC<F2tI~DXOOgPVnwa`BVy;(n_y!mo?HO->lvmx!k!=b6Sj(GAmh~5-^AC4 z|B2nyx((lBx64XHhE86PqheQF)}d|-VOBlg4z?tg-<be+9L1KEeCW5^ks8+MQ59cT z6|ks(t4qMnAa2w?q$S~`6%WLIHoY_qh7h_}*nWbA^7z?=?#X3pMM=7Q5}D=Lt)O$R z%w7%Lfm~=M3BwhBTGDm>(vQ@{FUrJ>+^A#n=_g6LX0SovDy(fCLq4DaubQ$qjX2j{ zdotnNhN0n$r6LqR<7@}P_+t7Npb}4JV2XZhZr>3+{c*9U^Gx<kXZL^3Z|449q60IE zPqr%0aK8we^5f9OMbf9PoJ{as$x=w;E};kL@K`dQYXlGR;e4$z8OV+;;2$Apzz4%- zr*Aq~uRk2UwBWx9v!g%ne5h5vXpxE;xN71|WjM5w2-3#!(8MQN;_r$gN^MeQ$xs*M zO2R!&2~#!W!{;)hOdHn#4$%+;iNzpx75Fh?GH}7M>?*%8PvQvRaUF9{)OnZ>;ulvb zgZ=ENMiDb603_QzKtV_%cL`PlU*8R7k*?>ZqKGt8fcis=@*I<{|ExP&N^-eB60y@y zw?k(^+r&f*)JK*&k)1*V-rOpYTHn($1&7)UXmDtC>-0$G_Yp~R^I(JBXvQ|BBuB4I zGMeR?X(-OeFB4A^n=qQ|i&oSe6=c0L3nHahUDxm!bGyMhjpzkApMLX$#tO_#{LI`} zn|IHqhVtaHN6ik^`^9p+PAYy!i_?ik5p&R+9vAw7rWHkiU!GJ%HO$zShb|T=`l_p% zicwk&vhm7;lP^R&p;zm2giaK$u<lB3<<Jd{&DAfW_r>rnWa#zfTU;B4w4`&_CVLjq zO0<h~$mN);EYwcsn`<#f8~hK06YS%b^t`YyT5TWVd`=C>caNB>)06;fq>S~T0Si_6 z0V2Qr>9@O`$p@eQo4MtlNm2o;k=BGNqph_=HCuQPsTuXzX?hlRlxbL+xDOZo1*E-z zN--dS*>=dxZ`%6cojXqGpD{Ecpse55(r>9<feD9~<+-x-tCcwG8z+R%V_1t5VA9Y< zKDI(Y%=%4oI#aFpC6hDgk(AEn3qJJ^*)0!7moJ}L)CqgiO#?|UkDba&L8W+<!jP`> zZS(JqYwF9!Yl-m%@W~(UbI~P^ih3R^n<-f2!j=aT6lXUh)Rh3Efi7-Xj%fW6$5CvJ zcA6{Z_MhkapVfV(p;-yUFFSYf0M^rs2TB$c3DmQ?>eB$`S#)yRmtS{m|8wecCBh9t zL_cnAGdp2)wU$e^V|34Dmav}rR<V#WBk@NPWckd|E~8xfAL*#KyEK34Zyb%C$!P#V zrpF7H@lC|9t(KE~INGvlie{Pg?@U*<$Ima@29f+iFhv$A3<pPq&-a`GEE;&q5=9he z3HlwskpIdG)o$0Ry2XVh=)e1V9k1bVO__Jv-~0LS;p_ku5gPaH+*zhKoTN>aTr5WR z6xs6bD;@gr791@3&9|gjd11CQBhUX)=`0lOZ@A;S6mf|(xxxpF+OsUf4n28xdx^;J z;s~{-xnX$U?~CIE(l~ksv+CgFhq=HW!yyb6vjSaR*|TZcs4=H~{!Y0RejtprWm(0t zRWRZdLr#Z@ism)U=psl*)S*bDdO6$M&}93qgd$;dVC#+bnyc-Wo_l6}U|&!#OI$N7 zYi6UENtN5+FCE1)f_LpK#QwQZcpDBw00_aurYhw#!BRB#+#IH59jN&x2VKxTQPHHH z(p%n&KU8kPqW7&850O%@igOOzGXWYB-;pX@0sT;8e}7}I$Is=W&zb<+g9X}sf^aQj zrx;Xo<$4$D(KBk-k|OR)aZ7G&_xiTzAM7bsXlHhUmavr-t-8i<Bt7i^KP5e9{-4Nv zpCjp6MUuRFW^i!r-3D5d;O-W7Qr0dqJDPzz+8CiH%p*BJH|XLTTpH#=VsE>FMnJYS zIG1xKPpui#P!CWz_VXvyqx)Lu^=X^?VTDEfPj0N7xFxzA25!dRyi-CPZ;Ar2*8H~` ztN+;PNA<j^xUM?Q=`&V@0RkNWtTZnl_3~+GV=R}%=oPP|hQ_Uo3e7ML62g&<d7KJa z(fKcBgDN;b88z_*t(>oE8V#RP827`A4lU39SKxjko-YNKfpAtGGy&y;?q}@nYhtKJ z{FkfeO(EPgtL!BD(Ea>LGA;vt*0iq=Hr|w?^(KbL?a(F3XpL#5LW%KQ4=<xc{6pSD z$Xiwc8vioG&2<BP4ecJ4Dxm&UVi!JI{gIHC$Zd!v8$B+270%TVep#rIPjDSoepP@I zTW<X(TF$lMHvZpK)XX*n(qRf-=Q?mSG`2H$(pAqt=$u1bK&QPWKH})Wsh^;S)Twdz z?|W8BV2HV?d>WR$2@T(T@gJ}2r_%EnGVVEDR~`T8^^waT%6qkC|9EM2fX)yR|HllM znZ4)f>`hl78y)|g;9r=<zmy{0(9$3J4lIulXRrTv!_T$R2ol8R30{Xdpzr5XpqC3P zV+UXV9K%2Q8g=|r_H)kxT9WQ~!43OGH!S1)vmzT6&RxRt@w)tg6Zuym;O;W-b0=V6 zTzY)iEN@M#80OG@D>Tr;&7yOO7UEwiw5yx;j%c_wBE*wszeGbzhtzG`FApBQKA+F4 zGq-EQoZjjSs#5N55}@OW{vdk)sXJNz^p}>X9Uujd#royj&Ux=3EQ-8wai)zz7C8lw zX~Su~$W%oC%7&-k`hG0F8@)MUd~V?=85LU6-BUs0N(E|Yfkx<rtU4xa*}oHF<x0Xi zwuPX08x!K9WtF^m-dVk;Rf&Gy%7QlP9X6K0mBL3ko_^Y%Fr^k$ZYeA|MfY#y{ygbu zKXB0^EAu>TisHK|<v{*VO;c(*z+bd<8JK0`k3wv}=kG9O2f@-v@bhi~TtJFE)OERP z86GwlWs8ez7}hhI-PubBSC3jxdJmrAYAC<ez0@iJFr6JxO{N^Y#l=?Ci!CJ7sXXp4 zp*<eNhu&&lkx_aY(luv-AL}^oc+;)xzdHZySIV24E^X=7I!m;-5;03H1*MkaFcF4> zEF^Fp4A~schG2DLOo4xa-Beu;K<Xlw)r9f0bVjcy+*RMV<Q=Kcqh%*#!lJP~sAzOL z^N(4~!4BG56R=+Egg28I?AUhShNkrn0JS4GsQimDzFXd4Run267q+=ZYdn<T5n(@6 z_nE3_!I4P{t@X)o)EO5L6T=?&aDbH_3(s+uWnolG9r#^#cjgjcuMyC6hm>IN7#wfA zHi58WJNS{)LAs$;Zw^N}HV4AZIi{bAG?&2eW<sGEwufeuL^;Bi^A|GT*Kbg2Xv_d= zhrLnEUoR|BXBB|lMcM1qaQo`gHgRy<;!66GxX1<*o-`c1!_C<myH`fgESmEVQIk2+ z<IPF{T$%fN#uUEh_2;q}TXZZ-x2?*7vF`A|PvLP*(J-M5gsADQFT>!R8~-8l;$Px+ zySw5}{`_C+c2qFOpm;*>VgH7iDNrg+{J>!G`Bi$bTxrZqu5bVAEnTbP%)J(7^%3(g zVeS7)rFdKLaWkid{ZR7*BehP#6r*OpEW=|;vWI@n#iiqhBOtNthTV{X^a}!{=&Mlr zqKEt{w6lbQ)1SNL4wo4(53Q<CV$o^)KwTY`h4F^l?(|VbOc02dS|Q%w+!T4I2*#sG z*acVf=@?>ldIF>6jR8Wstg>{3z!kVBc$qCJQOw>v&Pu1s7Z!n+iWNg~)tv-VfTj&V zOpr<HoXxAoAmCcZ{V7Y!k4ApFs2%<1f$^EA4`t98pMTc^w3pRBtrY7+XW{zifa=N3 z#f)d`aT0XB=jW_q_{%HVto+hXXn7VNC5i*v^AUv~2yx4P#7>GytIx5(Z}IKcEUL)n zhmz6^_O`nh0aF+(z^b#*r|NU?%_BMqZwFX!$(LJXjA@jxYzHTHalyeIO1b4`3aEU; zi<VC1bD<+M!LlgXs>+ya)cvGF7uW<g8GV(8H@i7{F2Gts$3-iH_kEWaP%%~5rU~as z_?bT$&Ru~_3X{{PrZ3-xS2+W<_p4J+(mubITo`#8sDBLnayO$HcdS9|20&o{es-`V zCQq!lg&qOyR0~D;nQ4~?a}|zyDj1_s=Y5C1ULJ=;d-42)Z<{xpY=DQfi&S?e^*HHA zA-h2FlnA+}D~_nzB~4-0-zg;%c_H9%^HOqSOR)flsC+qGril-}=#p#)d%6X&)&=<x zsF}w$)|Je0dv3Np(7N(ds)tJHtmKceCg%xUdZ|_E|3ui&X42E@@{Yjift3Y3zzQ9x zNV&&VLi4$L=<ou0HRmdCj;uz+6}%j_Z?xq_9fm2b{01oQ4t<69fSl}>i;mQ?A3&O2 zQiKOFhmNX_98_3dntdY{tE8BtYPvaTJ}CnkLMT{Sj(K#%Mp|Ue$E(js3=LidzXymC z2jP<qqKo-6(7v2n&|zFKHs-D*x8Ls0ie#_+Lxv*Ns9fq@vz+n4HnNpl-G6O>?Mdle z1MbUIQnDl!1xt3u1Mx?~=X`0=y`3!YueU2KFXmH->nc{Ph<Va#m{7zjVL_*_gvtI$ zYSK{mVjx2sq{KzRY4<+dn5q4lkz>xp=^#3!u26)RA7`UgVwXFpShT5I!<T{3gk&AS zo(r=5tE0Tv>NYv4eEOlIeeDubf#-!cBg(prJmU6kl9_y`f9VfV9yyip?dxKff#uX6 z{Ri2>vP?;XrLdc)J0KIpihJ7<nM`0J>>|)(#G4_e0bjqJxt*>h3kh@Z6haRohppoU zNWF6i<-2>Yk(oamAb|w*3jSu3{<u4YwV@3(xl>oq5|Q<F#+mJ0HeYx)^1R<pwwwK~ zf1~|<ym%q*@wFt+&SLR#l{{ztuzEq0-}vE+a!Zp4HNkPkK(hNg|HZlhUG!{zOW(Tk z^)%x(u)6PA=tbYoNI07Q(T>%?7<(yIrH7$nsLv1D*2ZMSt~SodHa#*6rx%2k`ZyCO z)=<)s@tPKErTJijNHfM3DC~gG-T<->(<d)NM3t=pBt*9g8j!=gJnx*ww|H)!eFrqd zCaJd$w~~$PE#^*uSer^@(rxSG{fj@vnC|FSW3GEF<FH7bLraR`*Js>D?VPtqbJ??v z6JZI2xuVfSKn-i+qUe=Jc*Bsvx<`5AOHw;r3={co$*l6yBNCxhuJsSkTDSQImgHW; zMP=B457ZFF*`uovmu!|Ykt?K3DhlW&ly*pCi}i|{@PQ8pDNCFm@R94T;0}4oAx%SL z^2(-n!8cwMP6ge|_9P$<#4*yew@=q8hJWD*#|yNhBmwtQ3k1rcJp+YSkHm(oRX4Ju zPA=V<!Y63JT*F_3<J}=+(lVr4FpTd7RQ37LCenCkbK4NQI0ut**Jo&ETfgAgoDrvm zQxDv~ur+%0Qc}KpAV+sNgF3#LdY<Y2bsGGq5K$s?2oS)biO<f#fBnl~Gc^dF+LugH zM<4B)E-W$~f7{31J{W6k4^Rvzs(fjzuq5$^Y`bL<O3`m@v*q~q1oT4O5e6j{0`Hn# zxwlLK*XY&Px%Lby0?sjgRgtePf^d{b-!S`^q4K+@zg5HD_i>eY`bmGXS7!}9z<y7h zHd|Q7R|yj{SEn>xG?^7;h9Y+SvO6-rOs{%tldy&qyJw(cPORiTdurnsEjuw1h)FpZ zB7dCibF8SZ=lZ1_{MJR*n>_A%WpKIJgiUHKr@5acn5nPu@*-f1z<2YajK0}26Mzv# z^`xo^O+WEOls_4je)@W9g#~oWnqaCf9~^~7^Q+J>TQ1T({4TFr_>VQhIfZR`t;sn2 zr9#m75F-=9xGL~<Mw+DWq4q?xj74ndos#B@vy**unS|xiW;N4TX`#fRGzn!1ZJVkm z?4~}T)Wd+(93PpyS^(Q#pKyxH2K;Ah>`M16i@<E|qHJmDy<PzGEPASuPOPm?G>g~V z5)dSfl0!cd4F0dZ6@+B-%7>4LBKl&r6iemOB`LO~jyclz<46kI!eU0>=)YJA%u&+b zGrYt_`x4Je`E$ZLkd*4hjA0-8p2XkuUpW6<PknQJZN1Pm^M>6%LS}$a4$+<}%!}<6 zWHsd5d@K<TP+2^4^%u_9)}hO|+CWLjaVekHCuD=X+`Q`YW$lIIV|+3KDjWM<#Krk2 z|GaRb@0Bi0g<wCd^}gS3W*uUP(3>(2N=@)8e#hgiIF2|R*;L|<aYx5s{+@N9uyuG` z5ul}w@^hwz6szNc&G4w)mu{ecJ(2d>UA-X4s2+b@gyyT(#;02h4uCbWkLq$$btN<d zOST5`Blmo~SagySjhMD@xLl2yQ;F)4j8)<vds!{`ht}M>G}`@%m*nTyVj4zGV$RtF z@`cEWtS5cebgA;ms-Idgx=W5JQ8JUF1%1})>e2rV#r}C*PZs&erKDs=x(2qnQ=qCF zrZxK{?7F9%xAb)^KDA%|)d=!fI%M;@43+jtXw-8Hs&uhBiQat9Q`N<Nz34#FiGDs? zKaS8YqAZUtzxIRmr89dBTNE2U*)&Zb*j^#X&5q}tPut6Fu*b`28v|ROHc@Fhf#ZFx z2hY+V%)@Rf8Z`F?>QE^s@p&N>w4$E3WcP9xo{7{{=5MmM|CBwoQNG@am!cBX182yj z!eu%H|8Qt+wpI^w;wed(QLi6(vI5jbIHI6u6kIP+O?`JL7{44%&%{&UcQ`{w@rA>K z$4`QT8s)|HwyzgVfUdb?2*gHC)zOVQ8GmjhY(F7(p=m$tCRsLRgx-4|Px~3C$$q(2 zx6CdWEu8y}y0F~A_cwriXB2(?7g7No2vW<s+Z|LcGfLQw2}RC~zlp$qhGw4uLIAP4 z=Yc+>*~djhGDq5i_xmKI3&5FsBF#IJ3f-RIw}d~woe-L=WphW)Cfow><afN{*}NwN z@F8?p-dRp;7PQ*1ffTPhy+*A>$;=_JOr(Z4esYPKPb6yceY`j(gmlIQexTa$KBwpy zsF(QML$VPb{Q7dWBCdD23S0yv3ZxN&^L~eirQr0^6><68EKK)(N_TXf9f$&4;<bp^ zA{hI#z9f3N1Ya{&URIXe-AkTi2fY|R>>g5ha8H`mwHeuq%h#-w1^}083#qca*&2cI zaP1S>d28P~y3|%!grf+6HuNa2Za7>tiv@a?4;D{GN~n+fZ3}f(?yCzKS=DW@&^ zQC-}ngUcsCol&N?&2Iu8Arl68EtvpPwMA(Or)N39wF7BvtjqCtBBOCBuvr7JHpY2w zwU&D&_l%q_h1BB$s`;QK)vNd6pgwXsc-JF8Ui8Uomvmxz%$G^JsaiQ)Qim9x9UMx< z!zcXpu5)GiK=BqPo44U95(vT<_M;^->p&CVT<aBGm1@&I@+55_E%(Ox{*xy;TR<L* z^CKayD?FACvKxu}{I)j`vm%Da_Aj8~Uq^%w<y-{HaaCqn)OspZm){XXnBF8l&)p}* z*Aui-ItooFm4gH~pR$HGjD@@8AVaPAX|brOxMLK|ekD_woQYG`Rr(8qRem-Fl>w_w zJ3?SbhS|8c^Vdu4*32isi8Urjz3*c^sCtV1T};Y#e9MR7i2gR7fQ5q{m57MO?|m;Y z0h`Yx0lHh;2UWWJEjG=!Bxh#aPtefa3RPVqJh6IG4dL=i;yX3dAc+ihtko27!%^;V z=NKW4T>(Fex6Mvh()ig`)$;NbO;7H-2!%{*H|LB9iE?(|mB4dtri}Gjkio-tXBq(t zWJ5PG&O!^h-C+gEnnU1skzH{I8>?F7M_@y&4~?kHgQ571>=^mOiq8Fyav|%dcauXF z*pRn-lhkjIko_#=JJf2cyxP%|NX7?KYE+6@=M~-c8V0MvRVX7Qi&TxjuqA~t$pshe zwKm3%zox-0mozw!=0Ek330IxX3ho&Dx2mYgC>^;db_&+#)(_In6}>OUHWg}x*h?*T zT11`>&B#$Jlh}TELN)*&k*qAurIC868Wfg1QQ;Y3lO9ACth@y*lL1NN>8abO;lyqB zv~kRYX^De*VY2e6$oI5UvzJ%<p9w`-c$!z78$*`5Giq{?PkTL$J3MA+Zha(v9RIr` zePnABd)LZ`;*;8(z9!OfqBemn=q}+5eGiWMrZIMPkBLUB3jh!q*!u{$t44N<d*2&$ zmHRrz^W!l$V6*^$PP_LLVB=JPc`!$m4VdNH{hQ}~`xox=<KbtX9JDbJbYpp;HWcxA z1JQajGXj*#Dzf|lKUhdS@gZUHK??^kJiuy|Yx8R3mQHFwZV`TQ<}5#WxiC8BMjf+} zwnEjmF(Y|H#xsrwNgPRMf-wE1=7)zA=Z7`Ni>8A&OZS5`*Yglnc1p>RaRJv$!Ip^R zGLgtVJCP)IMInG?xI@6K@<BfxVL4o~Bze05G8`InB~L$0Ybs*MlfFfYbP?Y;alt)+ zsY$r7PK#q_pnR(BU`nV2Gg5!q1s@p42i_ul4gDKdvn!xRCu3r>CuFnrrDH+Tg70i5 z(~^rf>j~Td78OQ(7Tramo%;G{d5vz?=vRwkob`a=gBhs^pqx*Gdbz>UAll?{xoOx$ zFN-?iqZiHw9viN~ey5Qf-Ai-M7tVKgHLmx1<3|szjsXyGnAR^pef`-os!md;A@3<4 z%`P_t1MV&i0`8J(7&pfnct|4L#r<IW-&p}LKZk!3_9Ezn`zTxi_}5Qbak#>jy1uTY z2%-F4MhA0yh>kBc6M#cf=yDAFRyGgca?2~eexIYKMBniDZF^&K`f|fRJQ(opHuzgJ zl+f2%1_C?Pd@{;@e}n}dE=B6JLK{ggns>|~$T%`QOncHeJ~9UFproG2zHD3#B4q_^ zhRPg(HR_tuXuvKTWsnwPGSKg}`I_HVOsa4}<5h1Ln`)Abo^C<np&T*2Rs24o0B7_K zKVC{tXg|gnp@Ohig-My6?f7igC}VJ%{%$_7I)J+lpGnAKtXa-L53iQ$^$Il;gUa!~ z7kfkO=3`xp7;3Zn?yMatC#HwhVYJpA3_Pt|B^7|d8eqpG7U@hoYOkow_cEQ>8C}F> zJ#T_pLj4rk={d3n#Q!xIVbH;$NaN)vCB`QB>)>G^pof1f<zFl7ee>zFh9!?sKa!E@ zjpe{SC+YSnxsOU{v#;v*$DQ93<sonrk~?oSlf|+G0tg@mh*;Z(^!zI`0?A|C_F_Ie z5sr2`W{YZS%5G9{KSa;YJGs}-@q<W7n8rY@bS@dcj1JlU{R01b>gVvz)vvsso06Q? z+7|I?3CRSsDu5C_F6@L6ScHdm+&<dEm!+_P94fm?;hk)LowGl#Qw4zbN^O4oU;i={ z@1`Fglb_gIJ}@}=r}6yb*?+g+hXhbZ<uoi#Mv47jWBa51clgitV?wL;?`@AJ=3Nrs zIn14rkf`|W<93vClj_}2w-Do%;5a}nkl9x_yYUQw(d05SagpfwY<@`3W#ZBxsT6?) zMJ@UC?nV$tcmZ4$H`$@*0yF`k@vW@wR_&5a5Cg1!zeJpD=rfHh2=_OZ2rPfgB9qw` zW&7<Xu<0g%D;g8L%gQuL{<D-ub*s4|hnWFg$QKSg51@ZssI}g{AjR^8{AD}rT_}m- zYoK9yMW0+4xRMAV7Yoll<$2-c&d>=>w{6%IpGd)W$-`>+@ee}nR*1lc_8=w4s-D*T zAr+LJqchL1=GjnM+|~>h@2^wF!-JxV0mE_PGKsi?4aT2bmnFwR!c8fWD@uhdd;%k< zrz51fIiacZF1<~}8mg4*Ex_mznQyVz0yPXF<+2^93F8e=bgi3!=TDX0E}aS7)YhA1 zfX8z@0rwMWS&`yKMxrue#I;7Yb&lTvJResQxCeuRW4si!nvfx8cGQi>e9Imm?>cgZ z4mT>BDDZ!4#=i`Tw^N_XaM<|{>z%(_$ujGNU|;Ix2!v&eryly#bd1xLk~BV+P+`31 zmxhXOG4Z>%aT7+&2o7Sog#e}?Y7p&VEbkB8h!ktITCP1jo8xO817nUn;oPk26QVH> z3zpo0*Yz7a!x!zF;hdrwt9YVOWCdDZSZaPbgLxL5D*{kpd7wTYTqlWz@Grv6q_}A4 zdy|yNfD|H5ZJ?qAV~Z}8uF*`m%qsdf(d_s092L4vtV%mcE7IBxCUA;~23y;LzK@66 z8%^I3)xh>&Cu&5_UEo|j?gwmr5772)q>_Rwi@?9tIDM{`-G(jP)ZNad>5za0G{u0? zzA3TXs>v~rB;M6MdlF<&cjx5zoxAyE(Ln;8iuip=8dP52vti|6+r`i?OVla`${t=I zu-{KSQ1z1<e?G&o20d(FRB%QdXgQ;Ka^&aGqV=bBD_So}lPgwop8q^D_rZN!REyYA zODG*+>3GLDHN)a_3mK-MNhyOB^f$@P|H>Px;_}I{Ts5LXy#u>}+kTWHLu6xd_GjUc zVyD=!VFosdcPmapc5t2y!?7bvwxtuKyT%#o6z3tyz8RP-e;Tgv5Bf-X;%GM^`igI- z>(vlA?$r<(EE(^rUE`{UY|gNEE)=@-2U+}Fa}hj6jrwaYh<e+PJEJuCN@}0CZRTVM zojq4WK+kUc20u2Nc*u)Bh>jI;g#<5(i&Z~Lo;XrsDJeyOJk0(m7{{DA;*NPNPvP%F zYoxN{WUQ~51HOOlIsbAS+V}XlU8qScm3zu~M>n(-ov8Iw&!x_=!q7~a&|!ru3W3XE zYF2!*$jDKb`<a2832ks7Hubv-k6jUOFw|OApU{z9g_(0oEEup~=5sU|DJjl-aj;*2 zkx@)UN+qfSIIfOLq_>|VIxxKK$gw@PU>fuJ!zSKOzPr8eG01?{TiY*Q_13U1O6RlI zxBIys8al$$j%_u(IWa^Vh!IwIPOn@Y)l2S1@sZ7J`@7Qg$pwm(B{Bx$c)qiVXuT1q z2YbT4+a8D!f>%7G>4WQGrJE=RWyE~HYMv!U1q?F~k_hcs^~hV10G@h0Dw)tRe#p2K z8?jk+6o*O_S?06?pWv}WNnh>*JalL{DxleJrzq*%q=Px3)vn~tm+!LLg=suJH%y(9 zp{4oq&2J;PnHc;AIelM#E>l+EW2ZwPgqWuhE>Zwbvcn{CxDe>6<noYm1|q+X&eU$0 zx4und^GzEN^<CUURCf8sM0f{crLOrS&H&w29o6bKhGsHa*{2R7MhEi?JOUyu)I*Lr zDX@Q1Rb_I3mHq=CBTNi%Jtg)H3L-8`m>KfOQTp<zh$qPXxp}oI83lv2wK?@vxDRf$ z63S+^eG{T3{si?rfXnu`COhnFSv@eEeM;1MW9ug;F4enSQEK*zO#@3>(r=Qgqil5W ziDgoJg<y9a4>?_(!-J^+adn}Q>@L6s!qHWggkYsYrTuuA@7J{GB9X^-Y<qEqqjCaL z_Bu>qJw{c0=tRCMD?cJ09NBXuU(t)HyGOSc-<WqR#soA~n8VN0C^L#4?_4kR1im8@ zYT#^BB=C3vN6-l(iqESezCH60lvMMgGI-JbNM8?}Pr%Nh%g31?<*3|ENGY_Wzzgz* zu<Y}vSrf@M2#P+k+9y%k86`8J%Vkr4dZ~%*a0ZbYcqK5gPzUm#jAWm(yAVn>emFPH zcH$VoPkSf2Rl@_%(3#cB?X*rte<t$=53NukSPZQqq7gt2`%e62rN0~N|2~BMcVDCc zAWYTm=FlS1xu~g1RFdZp%rWnL@OT46E-^dgX&n;}I!PIQc)Q<tLvARo@R4<d&#?H3 zD$GtbSlEs%-S)_(BtNs9p}ld@?h7FTyXtC(vc6J{!IkUpHe?R7HI8UGk~`&tj0fhU z<&2<JG2S)Uo&dy0OQ5*XU270ywXkpQbgeTDkG$Pn{h3e*^4M<j_%u27yDv1?hYaE5 zt8fLfZ;!(_d^7UGm|10qk&CP0HHs|!&*#+e0gm@!OLZAUUnU*wWs;@v+8ii>gM*9K zztaZ^af3bCC~o+Ih{AGy-CK4n#;NX=U40GBXmnD0&RMwHtW$_|^zc^FbjHEz?GVcG zZf*Enu<XK>7$Nu_Ke!gs-N**ifeX7^mtJR7+h<MR8)`>Ss2QhcaFMlt?EY!2LM0#> z03J|HXmWWuj8Be{5r}9}CgzBb9DFLoC^wF>o4p!_0tbg*>EV-*2=7>L;&7uf{5iP@ zET;eGw$C;S;9x#TK3e1v!XEh=5F8!(@OeungCd~IQ|nM?g;3UHOUiYWD^UqRJ3<IQ zgj$whO8l>Qq6}gB0bCeR;&LJZyLO&DW?Aa9axx?m2=jEeI1jP{bZ@{l9f<Xr!_h!z z=)9G3`~jE1fwJ464@0vZa0AI}P(wc!qx?iTVjZ*y9~((rOg*q7FP191Sw?`pxUcAm z`bTsleSn#*_<&F*4jnM%i9WVpc_?iWdf{1w7_PL0kXxdt##EWXU~UB2=#p&B;Ht#q za@R4=JD@WmXg%Xuf6~J`@4}Tu@3>l6bcNR0U_WS$CJ4dSMCu&tCp}M?SN5})a)m$d z0-&9*@Hg&dJMZI5&lI}0m)_}?EP*ZK@n3(nN1Z`0>^}%VXty5=%N8n+U2bNvE<U!1 z{jRXtyh48JSEk`)d&76lfuXc}y%YO;|L*nc7^+%-qAfDV5iM?goW|h8<FXji4H1I5 zMd%ks-V?Fmv__CZ=XTjWV>clI7i2r}eyanCbk<{vv%;ifJ}-WCysnj9YKCSa+S)jy z7*K%So?iMnrSf&ia;s&616n)Bcd6Z>4yb|-N-KdOr-KTF=ZON$M|@|pZpT>tUZY|E zv<2ps;G@t1LIdSkS29MsaL2pvOv^^+#Q9quZf87mTacyup5UUyM*n@z1K;{1%c|8$ z4fS!Z;>mT2s8{jmY^Ev8-d0u`1m8d<N=Nenv6A|oIgQTqgBWq*kTzpt|K$pdR;V!Z ziX_uZ&^TFhRgi>YzVhUxbYPc4Br|2wj?-!J%2hZa`1=C{S@`Qh9_!1K#^d=&PdO*9 z9G;X#kCjrzhHndd1P<`b)TmZ7=3Egx<5||(3p8FOZUXMs(~DgT?avr#DONMk2EC(Y zqCv3<q8oH9>NCX>1)oA?AfaXqH%56Pt7NnJnElIpIkHAwJvhiP`~Sn(IdEszWox@C z72CFL+jdg1lS(SKZQHghww))b*tTu!OLf1eaZdLb-!I5B_Fj8su6bSeT#H_W3YP#< z2A(T~dTdTerBiy&dRbcyxOpuN3Bem9MCT>}lf$0z33qYCl)#aYActz4m5zGpff2>+ z0PQ8#Tb8W;8d}m?E7CnVkX_?od6tNFzr@VjMq9st05Wp0eIwWJi)sjL0(wI~@qdTx zd%oC|EL1|Y>+Mk{5SPRV`|U84B^MCS2a8r)0~8$MR}a~b&~@6lzb)_gEiT}8>M84y zck2$df@@m+5Y?OjzlJi%&Ao<hSyul7`U)b&*GJ{O<nP^Ci%z4d(<6&Onbv7!5Wg4< zh6K9t#*oHaA5BL#I}me%6;Lugo^1QbMW^K5^$o4lozBQ)eefNO=cP>(Z(edtIV}xx z$JeC#MfVMGHTL1rdeFNmF}wdNWd%GYgnrB(NektPG9pt{fsUbOFG2GDd=)Dpzbo-y zmopFePu^%>naY5~bwe(?bJ2ZPm;$1D?UfTBF2o2)jmy#KtZocqB9keR<}Ir7>Z2nb z^w!RKOIQNn@adxHNtG8N?vI7=nrdeMfKFI8142u2#54vPt!efo2hUAZ;5u@n@P~%6 z@uAb-%mMM2V_ltr!Y~Z7K(k<7FI<o}@R*XaJF3n)fx61t{@H8xRJ2_&uu&SeOgfMC z$PZc$!BU$>>B;yORLQa3^fB?VG2xcFT~Aio+^@t#Fw&s(S%Y|NOg(Lx6Ym0u^2^im z2{L;G`qi5j5JNPiGN*&&3CNJ3)G;~g{L%Nz*)v^{^`aO~-}+#`7N3MRkx9zKklKGc zrRRc+wAK{-g@24oYPnCK8mGYQ7>OSq;06&|P)Gr;2;oLih;!C^k6#4&OWKVz9)gg& z&Q|M^saEm8)C`nIROz}Vj}?Z(EU?exn@A3;@%^tlbS@ZGPBiOn9?LOLaw$on^KA{I z^aylxbbd`ksI&%NX5n3uqEp#2$si?s6O3NdVEhyjhLjX}t*<O|Qo-dqM)C@UPVsqe z5x=b_ST#)15Wxt!N^NQ!5kRjH1l&2kN@hEuf<m;vl(!wC$wFQ<^ITjADjaDPtT%y_ zTb~Tb_vzoZ-!OCDy8!C;2BBzVF$=ol8xR>2Zy4@fA^bXyGA5k0(6Normh;MOd)kR3 z8qRyE(oarHEuWfS=SPOJCJ2>1oxp=5&Z}Vb;|`|&^I6k}2wnkr8@D#x$kNEL(O!%U z5tm@gEIU{}agTHndfwn*pT<vxCNn8&BBE+1Q8TP&J8i(_xT_y0$?3x$Zzrmdf;i>0 zzw$w+&jjyGaDD9~3M;%L+z9tNan+U2d7Z>;D2X=JNSQMH3QulbIIZX7#ACNr6vqvV zuO--P{`=$I{)V2=x!|u#MuUS~bX9ByT>nNC&n!PFhEUS}*q0?qYbR5Lu7)S5RfQTv z=Z+dQtaQ;B%@l!oaLmg=DX!2sO<^K}m40G75s%t5WL*h2^rCn%3E-Xz8F<N7B+bFp zn7C0sVJ7{8^vb{pAf_vK8<PdM1}QfjFEPKk!jWqH#Gh%<hh~;SCc&szH)wfA(@r2j z_6CQXfn#`%2J5d{Ml<@p!=*>PRniM#a86CYvgn(k&9z|Sr;wy80NSn@Lwi$%riRbs zp@e@}0~(?CB=mQnJBbr;OpO%QW;tC4((GMF&SSwo-XVF@3{r8@;pK!lb>4S0k9!ds zyNh-ZQ>c9*?H1Wbl=-fxiI1m^z9LJUpM`KJ_A_G&rG*OBp5LUZ&EVk03gJ1Me-uot z862J*y@THG$%U#t_YVK}$_)#s5&OQA5(PE}sy|&b969RSCU+#oV}YG1H)pQ|x@O&H zp+K}E-*F7N`ZhUnc|9L}l-raNk*XAu=8W=Q`kN-g2sy0GgLn{maFmr=*A}EP_L9@^ z4(@7K^+rv($I|Vw>9M$6T<zGQ9_4MPPu3oNoL>M#y_tb)47?d{thp+WIrtj8uSdK1 zFuQU^w~t4v(@!;1qfa(Uyv;sfw{gm-&Y5wXo0%5ed52jU50{oI6XI^@RTM509E|}j zy55Ks{JdvH^IrcV*0|m*H8moXkSx7#y>iYGU-MCV=zGDP1*yy`5uo~Pro-i>gR|CD z%B@-Ai2O%dIV@Uedq#bcn+(2;C8_k;2`=&N(ehFd4&JF)FkU<q#Q;>b{u|>jjl+6h zY}xbe6GH4V2nOXY;`Vb}oD4KsGxyb#qs{&aXYU}skCnSEvLfVZS0i(G8?t4u&nqf6 zT41wv-n1R=(+H?qfI*hdqmfwW`-jy{1iYK<8DHKz#CDeey22ciRa(B+2|pvE0h6Ym z%Zj8BxZM1ENEmCr{(@CKCJ8u3u`b;G8tIRBl4gU~FR&S>{$)12w7(?t<Qb(e0M+io zP(7ix|D_S8hX^hXrx9~wj5*1wAP(l_qooXb?)fO-Ru?HY?)Rg)nlLi~Ra4yj4t{SR z6>qU(Yj872m)ke1i#gxe6ZUgF`q%auE`tL}g&@HB6D2I>!Pc=1n_f-Oy%85KgFXDm zMOCm(&spMQFq(7DVIte5X)rJqs}~9urQ+p#pZR5uo^|rl4Nk9Smxo^^q{qYf#~_&X zdN4~gZ>VOYb|~7;2g1WzHEbEy{AS(>Z*L==W~_22W^z^THNr%sBXPSOxt1gxjwlyO z)vsex?k67zJZ8z7<2(@d>s9B=Yl5aRFlUIf0q}>7R9+Q!?2)cUlgd8o{>{+nt8r8$ zWFy$T*L!P1<BgZcM|g}l#}<WKXpLL~%V{ljB8@k27;S|&*Tc!G#vX3u&sIra7<tA| zbU`~?g6la&H3{>!VX=~fVv)z(V~mj*>jhR(Wgto@#YyY$xjF1;m_;$?`Bu~zxc%V6 zXNXF6H4a%Y6+*<j6Y>I@-jEfYcxbOSUkdccjurb;hh%M~$XcJp5JZBPNx<iR0%h7B z*csehQ-@O7qT@cd6ZR*8lsbQJU*o-N?nE2IVHJ+uZ{(zdQP7}y4#IhaP(FkQ^dfWC zPXwi`5+W}=v|4b58%lU+hvWkc3JKz+g*0#daY@Dci%|`xgY&9%)Im@j<3Ln(qL;;V z?Ne<LgocefL8QFi<U+741rL(O4!Hy|H`N<L<na9vX@XYP-e`_*5h4(wLvO76{kWtL zIf(>**V;jMJ$pK2<<$&rtx{wV*dH8Ym+uRQ+DlRn`?R)g=ZcGne5XuY3yGz3hUnd# zw3Xei=qk5eBMFbuZHV)NJ&fSQUTnlD7S9>|?>i3>kS!d@Br{7*W?ib9cONO(it#PW zSzosIQ#WwM9FrW6zvaR^C|a^rHyp11RPbby%+U+nX5a#B&TG;@^M0k64Ga&16YfB# z5{O#b1-?`=kDLb*97R@-KN~F|E&ZYw6Oi9Xr#q0HdG7?`MJ&(mv>}=Pfp_lp3e<kp z@uT@;7;k$|rfYEQqo~*V;sY}*S;x1x(1~z=OZ4?>YUPR&XMEoQ@hI5kv`KZ-nNLmX zX-dF83d|JDTpZnF76T@zX7k=v8vz8aZ)7F11|P8usxekOI)!<b#)^AM*j2f_X1@`y z`LSBe^GmU=JGk!4l6z&s7>uV{H8adjIpbt&*9yw{5eA+~YU{|cm+|1%#0h@6w$Ew- zHMP^G;jFX%#kgqPl-mgHsBx2VVLIp$JQuSI3@E9Q(Y<#nkwV-6eo9RYCc1Gx`%;0B zq68x3$cTbCLDH1K?cq+$;P~sco!cqjw2(3Pbj)`}KWado8spRy=PAMPo#c*d{=n5U zZo)w^LH6`PGJBRfV9K^#hdpBqM^j73_xE|x&XK)2E|<{Q=@*W#SaQ-BS?BI=@N30G zvEMcJDeIUzI<LTac{nzkaZq5*rACb3l*4`s#4pPLQb{jaGFri<2W}+B^E~K(tjrHO zO>ADiPRFy)nD+FplB>CK+5G;7#SlPT3paT=Pl#--79L^VDa0p6Ir7Er<29kl73~N$ z!{r=lc2(p)kb*Y;nSsqFFD;-)?3C@+8ezHe#7WkbnANUF^7Nv{B!#bwDMCAwFDZED zqP^DgYp0h9dK;%Vb<~V?jhdDh>VEq}J7ZT5zmr*O>!o!x1d~!Vq3pA|ha@SY;VymT z(V_Y5WWmv8z<)+eHeUFXtGlQv$iF&Z*eZtjCz7kSp5Wx#Al2kk&aSgZvW}q^g#2}8 z&o~chB5KC^0+VBIn=ZaMxtg{;C$XZ;p{WQV34x{0c?J!7HBHX48CSmuD$Y_)_v_VH zg<hM3W6upQsL{#3Tw}9;@6TF{vl@8G_Q0b6=nM{~uM0Y{gf0fH=%s(iJ@$3!LW~?G zSDyxLxa_Gm<|V;O#pm5j;(APt1CMNRao{KxMJ2}iI017Clwk3G9{!QVB}q}%Y<~l! zR_1ig#I(X8`rH`q!^o!f_7oLb_?aDqiK^4xbbL+2T?nQ6NU$VxXB#&A)_CO0N;1;{ z`r&ll15!--GfjFo<0^E594sRW@m9TA51pT(S9cL8J0w|cU{azH@`1hZnGk@=b`6P* zu!5YT?N+NRd&iyq#g(A4hI2v5sagMS0YBq>aITQWg5VbuDqk~^EO_gPZJAdOBzznY zzCYNoM)q&mZ~*5M8|DW86B|1I|6oHG;#Z-!tYSM+Kf>akf9He$=+*k#fAekC*2Io@ z{z)q-Yq+4&bjf97nu5P1VQA;4C)##2dGHf5BlIN{O_!Iu%}^$NqDWSRF`rhIK<qR2 z1Q+Y;yF1Wq=opKiG4<e{A+x)=y?dT7uB{t7TJ}SYxf2S^{muLm)Nt7dT_hX5a79m8 zn1@NQ7^PerM^@`2wa)HHIMMvr_341$s6<+VOgc9HcTNHZegCNbkby!>C8EP10Q$6q zziEWJoLHb5d%mYq0@4qoqBL1ONrM{PuMm~T>D+=eP3erOgPHbLHZ`iSBWhF-K2=^; zF?x&VF4tge_}~*;k(FnnrTu4YRfO}kMY~(#x6!ICFuvtGj91r*;;Q?Wqs!LLNjv;e zl{?f%=Swv5K9$YPPMsw{zJne?TWD0-|H7V*@zt1>@ZY$jGf2c;(+-my68>*)Y6``^ zf{X4(3iEAQ80b3L;Cmg6R=BK`IMR#R=FQULZ(nJlvtX4uWd1XNNVx$&bbDc7tmM~B z_ja$c$IamY?`C??3R);*-Mmh`iNUP!u`K~}T+!(s7bVStz&~U$S8$fcdVIp}ztW<z z`)?pp_Maf~@mE6f@|v$_`&uT-X)%Y==kGE0;c)#gzb7615UxFx40d#^_C^s*H0NVd z%q7sv3LwH{MLn*YZK@_0ynDn0c}N8A#GQ)brw2#d^6)C8cP;8V&PVMM`rppo|5%Bi zT*@{44;gOyJ_0rPUzY2?!tPb@%MNfWYU4n;N@afIM!iuB*rDhY_OD1{x4uAEluVfc z!x4*O>jUJ51o2C!0b@JpjM8$v@9fcXbND2pepd{fzDmW#&zD`EeYzUBq^Q0}mV5>+ z;3#yWC{XC4;~H3cPb1yWOS_h$GA8c(Z_LV2obD6Fb?bd}b1hRFeRK<_(g>lphDB1W z?k@Y5jzuR~2LJ^24FvfGi+(m0lpO1gHWyEm8xGyoygZRx*hBI`8?0l@7vpMaNMvN< zoVFG;!>@Lk+9%mxq_b{%>@6#m@tg1=JjaXx4;fWlI$xrEaQ-Y2K`HqkMuZZifS=Y- z&ylh4s6_^M%Z&X;X_w>Y_g^wXLzx&%rE5Vk5v??+S%pOqs!*9gpX<@n>SLHtN9Jh+ zf_j72^Ixh@BJ>T4lpsR^Am-(<hj|Q9`Prue{#CY)3pe7f1~o1}SnQCvqh3C>uXwm< zLvlrR8_s}kho)?CU+J^lMo`Sd5*TbAD9i5HF5ze#JZwVRUL2F6Hl7<V%+e%Ob<P>> zi!D3%%G(E<5f;rIImcCYti3cE?wdw8R<rDb;XltseA<YRLl&k^lJ_KBqxt-#WGo_R zN-w}KAt53&(#7&bmTlwnFgt+t5y_|;0z09l8(xh0IbP%FW=Oup4gwOX;E)wYPp)m4 ztbD2Q{Yw9$y(QD#zL2^NK753w+8D6yKY_Kiay_12wg-}`1U|~3Z$n9$oJ_<=hNfP6 zMepeC%lCRFl?@4p14vSgtkQ14E@hCV!cuX-TZ`&CW8V^@YS;WO0J<nPKfXWi12NEl zmCW8&j|>%;@ycnqNI$6)eHKjWTw5_KFz)K8h~oV{X44TNPBg9NE{6`zklnT9D?<SS zh1{5sYZ3O8Uy@C8Fa6bObxN6^fdD*rkvYJZNE<l@I@0ct8vN_PH4d~;4fD7xw@I6= z&IBwP^};5)M#b#DN830wqxr;!BoD!BBj4K@N5<#176&%?neTRieUT~6u~cm-tHwmU z<6h_OZpntmS6AaNukGo-n{6B6Q)#%lR!VM;BLNoX<#myG*7c8n3e3&F!QPza=P2(U z9F!@YS6+kj{%kKBq<6!UFBPG3+XK2hp$_P|8t*WxouV=ty-Z4-qh+6XR&B$hKN>%! z3*h>FIUs##9BrIq+BGv~%@tM8iqChgOhio~Aut>bW;@@XsT9UL%Xc`O$s9gKsaG$( z44x$%jbFb3G~p~D!f>RQWkD-MIS_#+_<l>g7#L+FIX7q9K#QxWPxHkiFwNjZBWT-W z+P?udr!zcN=#uOa0SVykr9#EjMDO>FxEePkjvy%@<HrwI@lo2Iyha`D*&wdaXoH6& z?GS}!dREgL7|9Z(-H@8c`1;hTH7m3*syz&1=%_(y^ic7s7>O^4ZF3h^!g%HWTTZRx z#%R!eOQX)j%W?(3$zc1sgER>Tg84Xiz?)3m6jR^tv1R#Cg6qgWd|zjDEBQI(Sh?+f zp!M~f_K_)jXRCYk>$z9~QkR=;oqqFby6`S6Q(kbH6n9)}aR42#0yQF1Xy}>=uFtvh zXFqTi$EH#y)NiY9czg-o39B|bBVE0_!(4rR0~1GorAKK;^Y-3z{p!>HI3kXo;b+@* zQ4u>ZR5UIo(+D)*qvGL~5isqwdaC*Hs6S2hlN4|%zK>#7c}uzLYCmItjeo3UrVz&g zha$tnUiLuN$8H@q0>udSw-+#csndSh)}dSh(R@8FGjy%gle@jBXcr^frWYh<4RGhe z0*0(GB0Fle*7YBStj(^!@Ru-+T~<yV3Tx<@T*tMcYEEJI3fl$G3ti`o^4((a?IL)C zf6iB4RErIGOhD)761@6f=#e~tVVs{7vlAZ)Mp8MR)EYK5oj#s_?OeKKqh+Jd!~cJw zKntOSIre}ZU0hNBtZ9nBpkp5Pa4D3{QmfXrI6-{WPXD>*Pjn}^N?)wfkal!W1lr;< z&_vAN5>^|X4SH{O2^wVA@k%<rVeQ0Rv;ig?sZ5Km8O$NtwCq7Np(JW;^cbRytO+SO zKBmohmO>2VqY;5~%mGAgaCxpN$C9YgPf(CC=}A859GV47^wS%@9q#F;XHv{TS0!4U zaIU2_)mWX?dTPZ3M>}^v=fY8{%4<&ZK;&Uq3{Jcb0I(RS)a3$RqhEMmZWHpyf`3aP zq~7mza~8KFCc2spm6oc>?9j(SAX9iA(wnDWUA=cN-&K|&2Idm6HUz%bf{;^7W-Vsn zC?MX1DJTgpzd@RKIvRYe2l>1$4Fo3#^FC5*ggm8E=5|K(<<Aly2}Mol6v(@VnoZ;` zqxa9Zb$t2yQc9k&_O=EEn~kNgm&a^hm#x@h@)H}$q*6@S8*PnMFp`EBhGfXHq*0;v z6lgaek7u5Ew|Ed7FKUUs!+U|j!9C?W<Q$mLL^0u@YZ`&jc(I`RKm-;-Fa2&af<%_T zGI69F)qE0B(x@2(S9nO(wg*d48`qS~0lE>bRzMmwM3iSEo=m+{>h-dygJxk1&#o4{ zZ!5Tew!9@T`tMha&#lL%^HTy)%Y$jerXu#lExJ;(wXDx$g4+f^oBSn2bnG;j>$HQa z6_XGsa?5KsDRh|*{{=VwPVx2JKO4VlPhHFP0V+zZ)a5boV_@)>sQKdhMcW~1<DH4y z?qqLB#)wLSsr8t*U#{y;==4@$jWQ)!z}%2Yc9unf`@(TYy29J|orm^Iw@weiKJwI! z$ffgQ$naO}cDW~>aVUR$Hi88jf$3*g2Mcek>xF%SDrzjThcK6oTOofiTVP`-pmm}n zi!HO|C;3Ndf_Fw}TmbXFK9TCQ@4Oe{uYr=G!HS)3CU0W@fWr7taE_x+#vVI-GE&)` z`f(e%Gf~G3{II~eV`NBC0u6-7`Zy6aF;?5%9ihWx+-`8w_hpeTR73+zdPY{!<!({L z&d&>#b8S+rZT8_sGy`|#f1nyNK==V1Zxt)p1j|Ci2I3GIU%E5?jw{_eRl+55*o@JM zmUqw}T(+DP@4QjslRpwVb5W6YdVpV4(9&&eGU)i8SVrW9f_6}n5b7J93@4FcWCS2s zXN}xqprUdaX_ErlAQ6GZ^!crQv=RmV^a3}NfA7S~3G(k>n^P*JRRl!@9O9g<O-3!l zC&xv8AF0K04eg`1SKxsBgE=q6JPolppG~Dy6)922XV?z|Iv158#3LgGrR$5E=`ce> zr(&pf9hy@+#)8MG6wkoKDe}?YfLIFhH8RRBddc%7q%xmR7r}3d1}6g%4MO_lf4<tW zNJ_w4+^%GqYHHYm%qtrSlHiGnF=4?CmUh-wyE)e2bE6K!hb7JD_(Ax|<R6+{1XGYY z^{SDO(%GJIxL_e^UgVCDA|6Zz;8$vWeh-X~#*laj-v^oz7<5C-v2p>Zw%CEVeLJy9 zCGgKy`ew|at!-0GKM@Cy_R2@FZ;}_^aXo1Du!C_A2F7d+1|x^`(LGkbbd&|_eB+;0 zLu*$t4NleqO(az>LHq87Kq(1TO~26jTU;uv_y*z70$9HkwTzZ<L1iFfBDNID)|1R3 z9WIK|`}b!ln=t`Cxq_p_f8~gH--sUWDne3Hx$JZC_6k9*vNY-Kk}l<QlHUKYuJJuI zZIr!$)FmXmf+IyWN$`RILU`@{y!!H;Z*%FTO0ZHgSZ>1&3~%m^DBq39>)|1L#uX>) zVzy?e-~kr>d2%<Ges|QlXr7Ph4flXrx7z%WLuA#XXa6EK_M7lA4=p<7xk>JV#(8s| zM-Z$-#NV)UdkHW%qS&Xfvq`a*+M)G%i3V{WQ7=TC1e8jyN)r;9`!2a|4J6delIk3= zQL&l?{O(O43-QMl`7mM6uUx1*FH&}QI|f_7AHqmw%%CI#9P}~$@esiFsiO3uQ)wED zsVVmZU+R|7P|CZ-o&BSoNZe(04IdVIOfl4xR7KJTY>`IUz@0wwB7Uwn!3DdW8SH{k zspb+3h=83l)FJXLKDokqx{mk$zzWC5u>d$#(V2Upl70<CWu%Ms+Z*2r?&&<+qtlK$ zR)$EspJats)z}tG3Vk}d7a1bU&anB}+xQn-6{)H1E5!LMyb^`ZE6L7I&WaUnKoU15 z)q>B+5J9}DX<|}1qLYNg^uusOgXbwqE_%|Ws3g9mM-bNwkRkT5lbme-#ZFbw#*|S% z(P<5kk{L$8H>snSJ@M`=pv*=Kp#zlMd!bii5(ax*qQ#~i^48Kb+zYTu?X0hsH~OdM z4_e%c_58BLL5dXlY`D!l=|~bp?4d@w4nr%!<3j70wngorR8Z3jC1rq8pSNXy4l~06 zVjsU6xNHl@`Wm4tHAhpHIPJ}Hkv)`J9;HTtm6Rd32XbHUD)EdrvU^w<^-7LaISfUn zz-Z?R;8vum4UxvkNkb`oT<%_x2AJo|&uJuLu@Z&Rox<gYuxj#Bnm}{ILnL+L#n9U? z?$s?mwy3pmir8Fy0{cqKJIHRUUkLrSpl?R$Ay0$E<*frrB}l-bEqXKfH+JKHQWtRu z$Z%Es68ct|iP3XHsA&0p^$|O^6@JE9xWV=6q@vrgC;N{`djJVUv*Ji!aEx;*`R}Gc zJq}G7G@sXwW3)l!mOolnk$dAi>=|+2>6;I$*0V56oogbHm}!Rba$od%Ys!3wn9ans z46V#&_{SX$x7Qk{N8Rs`5AK3`rI=E9F|NI!HaAbU5r_#Bvp1%h3tQgHrw$m7;*eB2 z?1W-&Rm9AglO*vDz>|off!<+*O7l$)h9wWt5M4-M&@QG>RKs?EhAa5zhd|UF*t0c1 z^{CMP;7VJmtL{@4UMY+sWsQRZ+|Pg>)VM*?fFPrulm-Da9PJ2`=|#paDlVO|iNR=_ zg&0`CvExA6hmUz2mD6Vkj|8lnuf0fXklvvPAIDMpq(vjdeg+R*M+S<7WJZ}&lzaqx zpn8a&im#U-J9pil((bVc<$y(UDYy?BA~#XB*BGFtFTk|Aas&^|1W7D@fhmA00}2tU z?CV#Z7*GVA437@EyvXSOG&X2krsuBepszn^$V`GqWi}I&rvgs;4LIxQ3uN)-_hvX> zeNB73-*MA1ZOy1lq(q>gpp)~9e#R9soO#|``z(9+LY%{t8bnU<`>GMYy(UHKr)h~{ z%k>E83t$|G4`EibR*s0|GbYczm#B9Huzb<j)F6od(XO`Yh~`HzKX@1qFZ%4py_^y# zT`T_{^*K1}Bq&}r=bpNnurV@lQ}cEQo;|!s2;o~|_=6Hx7*n7eyCZ6SSMX1)ttguJ zN5lnIYzi7?6}QoFlU6ZtbnNJadi2Hm?H9eF7JdsnXx4Y(U|cq}QbONcpK<8x(~?M^ z<j!{mpMV~T;j56MHC97^(f)oi#Tb+;X5*;a6D?Dr`9LbtiUhw3OTYT>H9PkG$9`AX z5!v+fG`Ir?I-f0$O>R;C8;&tUJCa|vw_l&Ot&FT@_&E_lLKnU|6IUeGZ>Hk$_%ex$ zj^~Bj^r@=o&&;^fJ9yG$nHiPOm2wsFWQ^%}8x6SJW{x=|_F1qJ@G>O>0e((oYqs=> zwtb|ix#+PsGmiWzLXLT4p?~KcB;el!GG&L1B?`>b&~oq>tnXxug0+TeHvvmtd|pbn z7?}2@FuJ{4P8qi!A!Y855>8wu=Kko(?JViv+io;8YRJAe8}>uD3yLL_w3ZpYlZsqA zR~VF;b<#wc)a81ozyB(Jlqf_Z9<=7BgYz&^a(l&xAv#$*I;1*AKobwCFe_T*d3gOi zAf*vPqaP_xno{riChn8-x@O40o3*9ZN35_oCr(MDAF<*P!V0y`*K2DWUUG>iQ)>r- zNK4Hc@vE9+adOp%WOu=n=%0%*IAr$jM{_b*d(oO!l*eSG(Z2q6sCd+K4sXL3@L+vD z9?oD3MnV!Mq+^@gbX=bQJW>+FP|oXwyb3TWL(~h`N9E*_*x=dCWJS=?^U02x7WrB- z$Ke8>nB8J6z)dU81AF>-?T-X<b4rSv;X<`fMk?!2U&vcZTXei6?O3c&?0HdwJ{<Lk zNslXqBZbz8Xf1uaG_8sDQVAbuP!hE8hGRtwIQF-)0*dA{7=#feLquofWEy4~p-Y*$ zgX_@{+;6F!9yUq@;fds|Mazn4KQ+?Vm@}17JKge|3lyuDa36@8h%F13j|elrId_yI zcYEddQ`4Rk!9T=k&&-P+6gZq83ilEbqug`wk6SURg=eNWEshCVc%fut=mMykkPQb| z!mnn%aiAaq#;opSCt+ccmr8j?9YPwG2@pY*q~nC(vbckA52x5qz2XxlbDat}{U423 zEbXAZS0SCbk=b;mKiswOPr3Vuc#1=)+Q`7(Kktg8p}v>y1cd4~JyHdK&_@P6!$`37 zr#Ifp1qa&!kFx@uE8JVyGv+^Go%zv(7lUZ)f(rKMR;<btpWS;}E}`X8row(dIV07t z_SUbYbA0fmyjIH7o5~b$@2)r4Zl-vCK+rY9S`>Fp8CtKR(9?NWk`pVDTHNJ~pcSSi z3^XGskv^_*{iy{X127f0@s5MQKKta(GN8t{56v=`?AbE!l1^0dsrb!c*47+*gmwJz zD6Li?a^%o^l+&^}q!sf-02>W)1Ul@3_{4-L#UD(TuCQx5B%m)qpVO*(Xq2E<8n_Ez zVuwcB9DFYj#dktwdOg?tV+P147nXu{z|yre{k|1vJQ5=ZAt^luOa`N{#*s&STdaEs z$cCfHWiUn_Gg^)F3{WT}^_SH(64=c<lox3-1}02EqbU|@WT?5bI+)qv<LAp{9LH4$ zz8>H6!URW}xJ(@YFdb~Z%Ucp58iqI5)?H;}1b9x_w)JYcJr(Fw5@~KSErG3J1K)>Y zvXQ$I(<3uk0q@Vg2~$s;BfonhR>1bnOA{NLfOFL^r?=(Oj^tFN-$&QIao*RctUjLb z1&8JetdtF1aWFdSAJCxlZ7+KmU8RPg!)<*gFN}#kMT5r1f=r8d*cf|y>23AonUYh& zZ@P7GmEhyr*->9iU+_!uV=dJ<u%ge#lWLKdjNDUnL_x@=9;R`nI31L{!5_R&bZ%wP zt9a~)&c+cir&%2CKYQAvQNg(ji{p&ISbdqcg4zS)6tP28$aDtT!8f?citS%m0x2UL zS+?tld?!?{vzs1UFSFOZe+oi3n3u!y5U%IHDQ)Ir`!4x*XCQ(Wt5)*6N-_@u3}d88 zq9rMMjx{)cQ7lIUX}3+8CEz<`p#NHNppq1KX#41<Kt~FzcCaPz9A)0#Jjhn42r{8l z`<?-E|Gc!kicu{R5{g8BMU3mx1sW{plY}Zr_|jwGtIJH>=Z~HnT^35wqQ*H9G*1A* z$f!IypDkDp$m^x8jTW>W<Bnj75{NGp2IRVNE@`U`hWw^_ReUVKH@vd+cO{n|8VEvB zV4tE7*xeS~EibHwb)GieTi-(t&NZQy>(X99SAZy?78mIH9_Y8N^>Y#6ftPr;iC$#* zcNz`)herRDvP8yFOU6GvCye}FgEv2>5s@MZUpy{!CdhcBUm!#xIei*Tq42hJ!XfCY zfG|*x_r2ZImt7WWcpnxE2U(bv@Mapma4s)eHVzH|0+0vh+sDl~9WC}}WNx;wWHEhg z%Jt^PRCnbV3Y*eDDZcZ=NR8p1%0+)0^e`&9sj(_WF6OEjq8Sro#8NB~2O5w4Jwh=6 zH$Nym*VeWMc3ynX-ec=D0}-lJ4Q}6(4ca&GWTA0si<te&;<6GlxrivcRA}}~Lp@5# z$XF~<YKMEq2J_rD;%4j4c_MZVi@<irW9UkLwAmM2pWJvgM^H4#gu$>E-+@>{TwY;S zfd>LHC@0^#A$0VXH?`;Z=7}DqnYP`WbW!`Vk+R6LK*U(bi5?>(`*NP9=l59lAGzWH z4QSdQb+<iLlrqgrRP-Mr#plHIzeEacdYr34sbFyMrbizLk6|4ctH%MP!zU>wv-tzP zm1w+fF3*)o-d7x>u{H?0_tgl?We<y1R~$uk2f_*1nD|4T{_qv+9=L^H{a~6p1L@w+ zRIrD0&5vnShB9tAR;{mJnVW(8^I^HJFn51rYO}s!a467buzW$d^$*Lo;5Kx99vHib z(7R;N8s#SUl0`^QHj#Km<}{KYV)>!~|A8xZkx}o@8FVTF*hS54?p$ybl@k{Y0N*|l z#O6Vzf=R6(ubzaJpMWFXp1Dc+{2Kgy+?lg^xMi@&I7kv5z*B;&Rbs=!C|PMR7_Rqd z1<<iMqrUR2aVCrseccynanh;qXTKd@SzOx_&{U={A|KYz4@JF$b+1E;|I@sm>xW02 zT>epyg!dGXG8Sb?$Gi1zO@@eKkr8*^kZh?bfVSeSIAiz`i~FlmQb<Jt0>|Ibxn@}f z5wwjYF=*e|VONz<D${qsVf>4xNCdfDe!9+c|G^$U?lvRuxUk0i@l-@#_JV*)+m{vz zb+z_c*`bn)-u28#;`}>WO?>DvSel>yzB01VMEfOJ8qmG>WE7^BOq%^<=?>y~Lc{+C z&i5Cc1{9aH>7g6gbvFF3UzvB2I-f|Qi05rTV+#7Ma1*j&NL8ZP9CMN3l+!uGG&y~4 zC4gJ!9Fa6xK|~WCIo7J-2D~@;hACu@TFDWuv%%q}zgT%YiY-h~ZZqq=)8!ZB`9SiC zB7a<}-$#ZB_N>rO(HzHWz*x!`?)USCXJH1!1^Wgy^vsd`T$o~DL#adHp&gNd@v58m z)J2h@rOwVRKo3eL8{k28ZCz~?p!XoO3tH#JR_#Stc+Rq0&!qRxT!DI)hP8&_bk>9` zL59!qGr@IXl*<r;<BZF}JY1MsJ09$w^pjfnP8o1KfKUuJ!ob`VTcObuiXfAX=No6a zHoKq*X1J-`CeAkTymV<H<mqvQoyp07XdB;?Uc9s6`tRQan<B;M0^<+#JOS|YtpgIV zx}WNxZ;LPgs?gVZ3z^e1Vx$x6#oaHx5uHVzk2iF9-Q{oVdH(-d?2y~JI%wK%xu_7i zLutxQ%Q`$+A84x$udeBqrqX#?zMOd2fWE8B9&B1j-Zp>uK-WdGW6n2q#=;1@bozIv z;w5*-s&#>n=>?a}*b;j@1JR??28eU6h4HpEaM|zhp;=+8y0PA3UZpSuRT_<RgDL|X ztSwBl2{?cAh1x`+Q#-b*X6*r?>i|5%9$egF*U$Fse|rWR67>5g&OtThH-K&SH`Lmt zgWJ0DoAsODub|(SG|rBDyLd=PrF+8ITTH@$jS5Hwt#Ae8RJ-f}Qfl=UWk6aDoM1us zhL4Xi^VS*+wy&hz#Xu+yU!Y6NHKft!!5USut5jybYVJ&eg)$)xB+U@~I99`e02j?c z3TT~4EdQ2l`<tww(cA_aV}f!!RsR>!E9ssQ<WKR6MMS^skX@7r0d-8;C3(ogN)WvB zb6-V~jq0(T>H)OP?ZVXRBh6}86LWgVuUQ}fdVa#}P4UT`vBjvyb+r0Q!q{Yg(P~Z< z^$S`2jP}ocICgU-Rde$s<E+@1;L45B{?X+J);8(q9z45<*nC=3qOB{0*ZzDpm9!J1 zz?Tp!u24*N1Mj76<Ml?G3QwK~Co8_g*S+-M7l{?yV`J=kue)4_gIRVi#6vcN6PuE( zO%FUlXOr%Xu!;M5TEXuHXJ%^&6ag`}?vtTnoV?jHcX=0T+hR@97SMMJu;=00Eu+(t zvp1nTcEY)3e9+6+Zayi8qF;9Y(gq8{p$=e$L(_?qI~cs%u7`t}KuoMCDfF)?Jmjti z)2)B8NWP6g@8`4M(Py{+amm0fZmSjDKS7~1F_L&>#2xPvJyNP3mF9qS-~R9e{kL@1 zXrK~W)=~RgZG@s$Cwt^Ni{_Db-M|Y$7Z)9Z%WW*+=Ybn24r)n3=8!_KoMaJG>c;2m z?|eXn$mG}qH&H$4IG9_QIA4n9DBieP$DkFq>AyOFL*4fntX$82;Lf)BykaiG|In<? zJP$Y;{n6CQl=CP@V{&=ubmMU&fq+zY6MH<7O!QMdgd4L<G7zuIMp<Ey{u5q)Qads7 zm{zrIUK|FC9&wqMNi?ZL@FYB@Aan)klP*G*MGjI1EgbbBFjf>s4fk_MoD3g?_626^ z38^*dVSr9te&<GH7OxUi){GX`A^aKg%bAQf*A*?cIDQei(!Mb}tlwh)5@9$7p62iG z`PZpRQH3xRD~aj-NeLdPbI%h@*8CGQBJ*jz-~*2nsVVTjUr0pawyP5%OIu~`G0p7F z=eB^9xcLNPej^L{`lmN&156suzg9^TRp3Mr6dzU4g^Ooh;k*vo`8OS-IA%3H$Rsbm zEt=5LlZ3H6Nq_2*7W)*&gsnVtdNeY)2k>LUPGlQL`1KVRR(D-XbeDGYp?S1c5)pVr zALlf!06)c+=Z<kiF&spodNvO*o;fDWWW)7?!|sz+qrq?XerB$v-YP6h$oeW|`rbi$ zB3Kw~#|;o%=COTK#ky@k0c|ri^gLMRY%b=?f8>U`FPZ@3EQKthKWCvz0{kCftk2l^ z&XtM2HzR*R`#R{aEpOV<3B%3lh(K;0jc4d(Xry`OA*ri7KrIwKuB?ck)o1Z&UmPKe z^fRml*GO8kaVG3p2crWX_g3NOorCzhu6DqLfq#<Oki!y_7$=s1n)S_3Bnu(y%eM!f z;SJ7w{sB}$$->BND=#`l;6+MQ&%;yjHi{N_plf-9_}RXP^i}Yvd4pPJ{6V?{??IhP zG3(0vH;-x4LyUi6B|6p?WO?~@rIlx61aInk>MOtzEY($nS56Fh0fU(InI{SufOm1& zyLf5j>?v9;KYI>)x^qVB7h<Pa_vH_j2TAN!|MTv8#k!e)75jtoG}+#W=s%KQBY*xC zA2J|P&VGA46>y$X8@|s6^>@i(^)G{>`JyG7h<*V9{sotf3b@C<qt@kVLK7Hhg^b-g zeDwdzeb~qSlg55H&PY!A&sxjB=oTsdf0_x@<qj>1zUb;UCpZS%qqPR124tcr;V$3n zOPZA;nd4n$5>>OZi0E;^`^nY4!)rbgUWJhu4E<8r4UWwi9n{j$F>tH~*D}QP7|#wY z{GDj8xiLn2@l;WmK_`l?oExv0QZ+VB*@5cd{xt=DYG{Rs{m&FQaG*VYs3mS9!)N;Y z`~OLQd&r;z7nky+ncw96mHVE(<Q7w0k%Z^6CVhE1?IvlSwRO65QE3(*9ulU`Wm;bG z^~(3wESRE56_1YXW1f$!^fCl~lpZ*4_z^P0vX!}Z_Vq9{6bb+67i`qP_A=&AVz<-B zO?ZbHH}Y=jeU@^8Y|wq9A<7|9NoYsha)dYS%)`mL8LyUfZSejbzlJ$+2L_hEc@ljY zJU()xDfpyOP?Pvs!;`iJxv^KDo`eB8xa0ew$KM}{q21pf3XZB_jl~+G5xK=7Pb*y8 zI67&(De%lFs~4dfvuqfVP0~M22(Kg#h)mD_$)?xlR^gM77@832thCN#PPRgJx$JZ) z>_bj%rJk5yDd+d1AiBy?cDhZRm5hr64Yt|1oP@hLqH&Fyr)4-YWUar8&5|x(?jf=5 z+;8Az7DZ$j{V36D0S<&vbVvuSE?#@M1xgcBRUu;Q+1bf0%$^SbJf%%S=nGfcTjM7D zYwmn!m7A?kC9*czJ30bbZ*#yp_xz3s!Bpk|D3*g1T2^H5+HUt?cN(q1C8f2i8}I$T zP?d)ySvP=6C7EcwkjYZy;waPQ&G16BW;ZO|Mxb*!(W&GPs=e_^N?L^YS6&q(W!~b_ z>QUaw$tUP%lW}=~OtU~GFfG8)gd0B%ZBn6vSSwWF1gv#k^0eClNAtvg3Svg2wpqFD z38~F4G7Q`c6rcYJ(T}Wp@88bs?d`5~pX%@(pvmA^CRO#Ac1vB!ClZJ>COI?TJK3Nh zFOot2wvfF-Uw~zUqIh8Nzs<mAnemKGrfe!%d0}Aylg@Y%#^3CgW`uJG>n>jczLy$S z9JL2!n;0pvKiTLINo6YSfRE|}OV8UEU8-(e(KYAyx)<;NOKN_yZCRrIv79Vc*1Dr? zZ=?Ine73$%|M|BG%_Hmj>&A=xF9#u)Gnfw_F6R$iwv9LT=L~bg>D{-x^oiW|vxnyE zHo9gaxoI+IaS5Z}M;nQW>J4h}z$fX^j|jlu{*OZP6BWwO#4ZzKsXgN+`-XFP-+r8! zsVTeLYL4(1`S0F=aL}u%o=$sz=jq+d2fhiymJ^ZFrzO1N(Yo2Gjly-IjfA6dCm?%C zbPFYvJmV`M@?R>=Mjf~;M&Xr%4QPo%`lo=YZ(@@_lyg0f42;G!10!)hU(#a;JXi6( zr~tghDNp3u3s-F8AyC4Bj?ane!_EX(8V`BUPGT;5_U-MjZzUH7X$kK-_n$j9nVh$6 zqCD9Ug5gzgOxI&9Bo^S7hRDM;W4PVp#%X<mc$_I-RpGnu=V$=dY|*tNFMI-wJ(K}) zh4E7TLG_-xS2I!PwzvFv#Vmo|&7Y%|Z<c@GmC8KL9H6}pKpCFg22)cRdYHt{qmhA> z%=u!s3As5B2q(4@Cvmw}Z5@%@nob3wAutD_>-2%MEMKLIU|ldjODcZo|7~kbSrjcy zs=OYj!)@AVAte1;3ux=q@lWsi_yXaNM|$1y_(C-SwX{2+E84q>93f_8xt)FE?&X$_ z56*i(zw;PPw(i^T47qwE=bX<OSSsI=Ii?blC&;1*KtAstel7sBIVig$r>xDbv2_bH zWOd{<t3|1XZQP#OA+~tfQDm+`HWPh27j3(AZ_cc&TN>NtWQubg8*{Bb*cF&9p3Nh+ z$E8ejvr*<l;gF}KRacGNufWUI#{_^ZLc%APleTCB7c|9jVs{<cF&nMWuk*IKs}#7u zWyDR32R&>DZk&-oBiZa_rpN607a6s~T6@w1ODKJN#)*7TE(hM|ECl`C%pNut&{JAM zn@>Zz58M9sj7qS6Rism5^+IVUMHy3@Kb$xp>@lgCPKl&m!-~GV@-0mq9*N9`^dH8A zHGR$h7!yBM9#d6JENPLa$-$LMTE8S$jF8wV4i)UM*SO<h2AS%`3>d!q0qqvWRuFP% zaxea6U|{Q#p_Kg64w#){V&{pA2qclv!^-=g)cCDzEFDB68cqMJbYge3tqZapho|e^ zDhd)Kor(rXl8!Qr#M@WwWHiGcsX@QHdtvI&-k<=D&IqnG#DrRZ&(EK_ssW~)_o1C| zi|Ok9lnj?dpmH$H`sd$dE6n~y=|Bz=-q!k~O(;nn*N_tMv4}pp=wqG(-n9Xfmd4Fu zv~*xMN}Y>cIZ^p14roE>(aX4}Yg0QSYz{5tttD>7NyX#+fl&5267t}WYBHepY;!yO z{_X^cDXI}^h||rg>?>wu_ZOCzhlT{tfoKl`R>D`*MHN7~uCTqqH?ibir?GExKxV(x zG^5lQ)rn5w@!baMkqnyKkk<N8|I#m5tvTRpI}I2mtBW`>)*QiXsz=s(mbM?JQBo&o zfQ+n}R&aUZ9SMx3;gQ6oJwx+%ezoQ-l&C4wk=S!GN7d<%iyQU|ETrhkVbs3`V0$0O zy7l<Q+<BeWz5OJNClt7`Lnd~?uDKDBSJr~_kDl-;xe6`;IY|9MmPZ$S>TfVYTl6-n zyb($~QE3Ks3K6QmS#VBf;0mj95t=tBWYVSQ`husrgalG%`tV&g0@zqlx|$2=*!lc{ zeg+95Ybk?lFmx+;DpVc|sSh!_@3V3o{Q`s-5eosV8HEzZ3pewP+5{_7Z(jgA7str) zr|?=O=d9JLA5>gzb;$Y)tQ)w?Pt^uplRBNS4bMxY-3IP(std0k1Tqx3uFI~)6ffWh zZLhBI@#_`uATg^B?3PfAUFQ7qbD`H;O}>6v{X(JqqH24YU>rH_aR0Ykm6kh_RUy8% zcpp>Pt~)?_EVa_|Sa#xilw6Z#9)OYjheo^2MWM?vd@0Ij5_ji<5A0}Uqo3&tZrl4@ z3xYt(AucuC(WOkEz)Lo5;6yQBPY=kp$Mh<BrOF|_8y}O;^Nxf1>>WwRR6XiNT(nzw zdf!*c<vq9Ua+Wre2&ek52@yF4Hn1o3{CIChk|@w(?>-~vUV|uAdODyTQ0caLm7%@u zfi@i9SxRQ%zqYKk5Bc4VD45;3vK1@m&hzEY)BGhp4Kk!b9d(3t*f+uq<j^yrs?5Mg zo$`k4>!+y-j*Sp3q{6!TmEZPo6YS$mxdv*~Q4n#`9VDpcG0MSkd@r11hRq)UHBEpv zwq)WZCFu=mk#|He76sfl5qMkTUjMGOb+|Bkk{+nqaL2=9%*Q`^hSzO*^}Ph?{l^rB z?wTabzQZHW+pA*+Osr@9vG#9LUM-=|jfj5e&6g@#kJFLL8W?#-oEcBUbL{qEgUr*| zw4U$kLmTbiig(@-SlBB41ksQGn!-RO!eEMOQY5a=z{NLoGWp(jVq3J<h8F~}$ARK` zo-kXkaoS5%g%5~qES=I!DQ|?@78j*tPp3pPC8oi#;tccBWKEja@zI(@ODNLEG?|f4 z*w$Ko$;V}<&Xg7&l3=T18Cnoyum#$SX(_=DB<4q7c*yUpfx$7_QA<n+3%tn?{h&c- zOVeXs=JKC2Ae2ENdK>)IcA{(rzCi3QDCaS2!eBr+b1k>!;xrJ@l3<l5{otyN%Bv8x zD`5<;N%@>4z=`<tI5LKETcM_)|3^l92rwp!G`t0-h^jlEG=tMt5ZOoWjX_O5d_{<; z#xUV8B6qgyD*^{cIK2Q;EfblL;Sr_{{`c3kA0-s{0@Xi&D=OB|nMH(@<o#e+QUwvy zDZiH1D1?L>hhr3niy9a(??Q6GC|IN?^|8(V&n$pg^o&2!3%*ue$#@>a<XU8w0Mc$5 zGPSNYsUCVudxnSX8z(!rtZ-h9-Wnq{&5cP2uR{wun!)i}l2%B$S$M1{R1$-kA<daa zghb*HO=h$pfIzcs8}e7_P=F+FRMb9f{e3i4N~MlAwMUMgYv4H=waQPj&&IOlcj$@S z7KC7Z8_s%nzk5LG=f&6VN_%LzdG%kQ?9Tui1tbGRl)pRWVZYzk_#&v8PRQtByfp7R zSzKWWF-`Jsl)$t9%N~}yBT5n?hdzlceuIvLjB5xag^`vmzZ2c;hKIl8dD!0HkHDr2 zEHH3KKKnQtpq@MU-4?x8E%zW({>^VHWLAsA-jmFZyN!}Igp4^z0I>}>bce&m9d(0F zYYFsL?eND6|4A8xe&mn(NidhdUi~6KDmfxImuX;Y*cO?c{SR`hNBhshL5~z6ClCbb z@`)2db7R0jM*#vSr}68?%M+5?uiD&?OV;Es3v8hm9SvoOEUC8QGMDgZn)dWn)Pd`K zNFl9jx4peDA3i1*U63u5IJ}-GI3B{iSrNyPk82y=u#rTvo={5H;=S7GO<Tjk5>kr@ z=f9N<`g3H#D#opx*DNM;i;I)J9IPb%jP0mQb}5M$Pu)-2*hy?t6%+wl)h0eXKgFsu zXO#lYIXli_&J=VzQ-kj4D|Acmt}cy{^Xtr*d)O2}1ct*|3-m00CXk{YSnGNW4R31T zbHjnt(FAclKy%qke3%k=HD|ufT3+!{vh1Lp#~4q&%>oy~OG}wfjIK*rd})So3dEY$ zz`l8~!hL<4m1TTv6~Pb-Mjk;S29N6XS;ud;M>VDd?o!5$_HZ*Xp}lR#Hp@IJ?pVUe zxWsd_Bx3y>8)I^@ADfn}^jloLh#%&t1hx3Mjb8F%fWgRFlam$bZAdvHRMtmKSX){e ziMgNO(pwqG)qt@gh3x3pKWAhlM08{a3(340K8FbV=}FC4Ww>6zIN)3q`LC(u@1Ce~ z4WaALpXd=kA=<0#e2IADxjpGt>q0F;Fu@A<=N5?EJ;@pjOjjY$@P_PoIiW9Nk&lee zw=Ww!vZ$_kmvwg|f=EVUju{A?U?Os^<diF&YtaZY-R1h498*-BP%pirv51B^-+Wa5 z?aiF4mHwm5TF;a=)P^Ph@#b^ZJD+D<dw)K0IPqu@?d(e`_^I$`L7d^4QT=@*sB<u$ zeSV+-a!eWd(<B0P8~vHsAQ3*36ga|)D!{oIb*7^mc#2cLH>r?f5ImLZ=p}IUM@TZQ zl`b-^jAW)QRbpJ}QV?anSP2&DaEd+kODva<%MnC`I35%yYfAyfq`%*auOK_c90=a7 zIi5Bnb|3Z6y{WzFzYY)k9%H!-noVbQtCd7SS=Bwnkp-XmX-o}2$ID@J=i^8%&<d!y z(OT*r^M8XFRX61c!zXTBku=(94aHMnkH^>SwgCp?eg1@=0<V4=%bmHhqO_J2JSa8o zf=OBq0iV4g8_5><!h+!p5vZYGd4h;WO<UdXD#7#3A$GBi`iE|++kVH`$H6KN*l&n0 z8Nuh+VI-QHtPbEVr4mFb%#Sn<_*=o_-ypF5MTep|HYa!q9GVW^R~ObKv9xC34%e5U z=JPd$nF0f+VwRxPXRwkoSefxjA?{6Bu1RxZPzyfATqL+*bl6sQ#x0wfQOK=yw&0O0 zg2O4;<KKZU2irIPMQcPjh^Md<6!OeyBxd|d;8CEck)dWP{piy5!O#;!p7$1jd2p0o z6ymlJdp?#H^F}2B%tyEn1$ZQ5j^p<>7&N)}rJrr4gcNdjhvB?{&n9>Q8K}8ox@)l; ze3k`vg;h?>+RA09k1o$LeSH$zwt!u8?vDuGhV3LdqjSUH*wRx@QVonmvAst_g4-wR zsk67Z!#@E~MP-XOFz`WN;{VxiKoNc}Rr(VouB(HP4U{^MgLfY4Q$f;^+Xc+fR+ccn zK1MF!Je)EH!Rff9Ro>s_0KRqUKpcrP#MWwO&*2P=?mIwY7d8;j;CkK858U#)06$P~ z>`nuBKI(4t?krUFv6V+W%1s}7KID1}i!6I@Clzw2+4nshKKwtz-Z{Lou3Pl1*tTt3 zJGNP|ZDYq3+qO}$ZL8v>f{JY$)p@`7oOAnjKYjbpy`Qz#v*wy(jydp~WB5CIJ>fmC zZuFuDFU*%>-Bj0hL1&$;ulU^yjN$za#k2Qa&iM(2MelD`3aQtb_c%XoHbFo2K3sd* zKAxiByDq!(*_{YO$sEio6xB-9gBfQ_h`#$be44l;Vbj}Mh2HYGY;c=a3Pfc7$7oFl z!If0uwSRB??ux%&<Y4Vq$W@QrHg}F(2=^Ke-=C$kW}fAjw!1GDUWbz8eEy(ZAtm1m z$?nLbItp4=`7CetikNoPraRYt&0a7ikWLEI(6Vaq5iKH6FctjSHq3R*Q)|(?rqQ*( zmgFdh`4+av9E}SpG&hYx3UxE>-%=*3c!CP*Xtn<h>%~>YvzY2Jw~J~{N4Mmn>|+gy zh~DBFr8#Jx&@|k$b={`%KOfOW%{3fgXyhS=$<cRvH&pKiU43H96RmMvD3(hn$ZiqG zC%At>+*_U*uWtlx*Bjm>e0Q9Wg2$^{7iX@Rt1=hb|5L}rckjONp{zCkd%lcQ?Hk$h zruwc5r7L*e6BZ*pqRQ}+hJM&QINm*#yP-$g2VIyRQ4T7K^I(uIvtl8gZ-OK7NjOIE z>5yc@qMRjlK~2HJl~|ujcm!KQ17C4<JCd2S)tH`clx-3U7#NtPjjeFwGJ)jv@EEvJ zDSP~qYY<@(&5NdTRw#P22y!&s$+01LZO|6|zqr~FBwCgkx>6ExBR_Ad4|~b|19xyR zeP~FF+<gAQWpA>Su6|&=X;Ty;jmbhuYa>PY)Fj_(FrP#igJtN6%}xB-33X<NM7(&A zxd`d^{B_;{Itd{~>TE3$xTPeU0jO!$xOir6LK>^$oD(}=5<|`bFcwdUGUD5xC{&NW z5qqxX!ry7^*rYW`Son!-e*dg9Ib+!o4G^N%Y)?1jGVNZ#(l=KzZCYS}#)OWW|Lwz9 zDd)ngU@1$xSfxKeZq;<$BtkfeS&ymFiLt?SZVL7{Y=1SE-BJf*+{KU*kQ=@~N;VAc zU?6C9J|CQ&jIU@QQ^d?^DJJJb3ZWGO#wqzqptB>kzvNQ^23O9&e6d~Ry<R{&Mrpz? z<l&M<x0O)=_Z5>U=O#Usg(txJMgnL`ND^3%fx<_#)poMeAEO*gCobKzt0<2DkhLX3 ze}-W-aD86TzU`M;d_HeFL^FMdff_XQ)iP8R>xKUAUhi@s_dtMkE_^CWKf|cq4=`qd zml%AZ$DU!w4asEk8j1~@eizeEIVV#j<`T~ZOF+OR49^R1t~boMv-pZW_cf8_zW^XP z+fmgU{8l`jxL8}QhzSZ9HuRzX%;CiqL(IG%!(<DyI%Dbu<MlMaX60@M6`a{@P@<KN zF)R>Hn_tZ|7z19X%{wNHIRE-TZh`}1PbaYcx>Zs%7cciPRc|y<tfn$VV;O;&LqUy^ zllah&%l!yu5M^azN{WXc7bFoq%nPx-8@q)@BPM49BS#Jm{#7-?IkIwVKe=Xm(W&h% z+uh|-+0jv{qxZeFB$0mIt+%$*{(Fx1bo<d|*)+cgWJJ5W7q_&my}@5g-Uy=22bTBs zQ@rbLZ^0-V&bfYNJcq%gE4A%S*~@#n?5@egm0NsFR(BOxOcm$)i?h~^J33HhjnvhY zxp>ewa=#~5)ru%?NXuAwrVHe0Dsf(#ppb3(!0u?Z-CxSoOwuTX6lQ93ZgJ1KpWUV$ zGKlodfJ3(F+g_MhF_<%FXD*>L%XSW~t#?WGsrl?yWND;@TrDxZACuC20yNWs226c? zjFnSt5MNI8pFKn<hTJY$dYYJ^0q+zi9%h4*oD{Wk{-)xX#`-w;`=9+2%Xw29<*@;+ z^rXZ*jG9bT{kSSKq(T9`pV#)U;)$f#El(+W)YU7IQ*T>+sWT5oO()1+2Co#ng3zIN zYiJ?M7V1`4widlV{rMgtX##_8q&${2Q(n@+T@m$tyO(&<8$Hc`9<Hs|j}szU%m}>S zT#S5cu}aIYlV_k7e%tzl>-AFfY2IC%q!IBmDqVs~{Z=Sc)kdCUUpo6|D0y;c;jRyy zc{*0!jcfbhcW0e#2*Jy~qaXvD&NBm%^<ZVE;xC2#>tde`FEy4*{o9$fjpf*yX<_mj z&4^pAH<+=!IeL73mBBfvopfs9qqD+lM(cn)%!Mq4(C@`}^D28m-BGcuFaU3e68CRw z{J)&V7}HEFCw5&Fi4ogDus4kDQ5r`t^nu!UhHLDc;i7NHl38-g_FCdPy(;md>yx3T zL<2#ylefdUcd4CWEebRcXf$);R-WSzF!Dp`#_4_wu_&4P(|tRt4NQKWN;Q>T0J;OM z&uop*TlRvRf&gXUgmgh(n*4hD#<3kCX`ZPS^^_u7@`-3rp*Iwvc4<8)JJM=>wr<}3 z0%D-rmQe-*0sGwjgJ;xtOn@&a61<|P`1<o}htjIc*4tWa)GIilAMpA%xpO?FbhSrL ztp;HCRbtAsYkMc7%wK(o?987urC`2o(DJ4UE`jQx>uymr)TDkbc8uvQPjCiAcY?(a zhjtITOZhOP?2qS~_>WZm`j?w3EG+mqeK$G9TzK73aCjIo#(-d`jMIeV`2Db!vu;Lm zelhKxc(8r3y#An-ms`BR0|tFROup=yuNtY7bvL2S!1FRm4wxh^2omNq!xCaGBsRR= zeqq*TBRI)<(YS1G8BQid_Be=I@*>1fh^?M9zuaHXbCZH2DUT^DBFlq(NRf<F$;ZJ0 zdAPP{NJenJD09B9>DBj)y%;x9O#b0~l}rO0{%b*J+9O6x;{^~xXrK4@3Wca+X%RkX zjTw%{+N^eK6c<Lp0S=#NeU+RJF!7JorqT%#r#pQnktckNPzAYeMNe&mX-`_V!2l(~ zG#o?kb>a#YHl=Piv`7ivItpd)B0XREvSc>^33!_WRv|qrYq=n?UCcgVauyB&$j16# zE_WYIs5iY<vPx@+L=8R4cNyHg(KiE6a$}j?9ZsV(ks+9wB=CUEW59S_x_sG6bNe8Y zGL~&80oIybI=T3Dl0TwPw~3X!Nz8G!ZXByOkF(Uq(l2zJeQhIg0pFVpTj9O(KTRo; z<r&m6ae>~)>^ua}wb15a%T|Ns3z01-{wAi?-p|wuu=x=K{WhLISIg^K3Ike>8n-np zUy(Rb2;V-(j*M|t!Jl@S9N3=?m?d!&z_EC;O|1bs=D5enJO=aByyXg?;^r(?RxVe# zIha6&G2-Emh#%@~Oj&N3jPUmgiL4U%v(?U(*0K$CACj|ylVjzRt5BA(sWvb<>Eo6N z30FEBRw#$M&cNQ0+#ho-kmuZ()~t*s`Xtr{`XFb9MN_0c=mer{#qfwH=4!XYh#vbt zO>8S;GZ5n|>vC>8aSUzind*|JJnC&^j-O4&<7T0}W5ZsQh?hM!-3#K)woH6aX_;nD zyXsn9_9e|jrt8un!<Y}p#bpHK4f)ZIEiZ&wUji9vO9g%i=p(?_Ba!$V3||vC9QQXM zv}@|?h-0ql%QZm|rM7FD^)LLr?sH7R(l8h;9>hUkiw$}OXY}(iU3?|#aXzv%z(mBJ zwzUbkxu4k&7ZWQY7G18DAQg4XJzRkljdxxWm1)$pqYCb>YwZGr$>ZNE5#c}<sCDdM zGs*1-sdNg$vxUK(XryR{Kl4D%pzNth=PMGZk{EWek{e1HDpPDT7}_wdabR73;~}Cd z&V2}j-_p&!NQB1|alc9Dljy^zE|zTMDZ=hLIg3{uA-P@!&A|8FXADH7cflV5^Y=Hv zhNzahSauMIJO|tASNt43+6-(dbP(JpHgl|_NHhRpXctO`&I_<{69-YwDHip^L(WSI zef7v2tR;G8{OSW%6*1P~l3luhv)|~!_|Lj9x6OpBhhE0AzLV3R@7jwcYyx`D2g(-a z49R7zZLxvM>e9b<t~piph`T#_eiQZ5!myT=+FIO*CJ1{2V`?*oW0RDLEP6a8$y*ob zM#iEe5z5OCLhE&QqfzL6q_%(gq9!-3w=&bJLtpk4ngnG8Ar+t|z5{O1_EQaFci*oH zmOR?Besfhn(FZ)%<W!cxq0Eyp=t(?m(|a#TsFjWydhy08;8S==ogA#FNQR{kx6L-$ zaIIyJue^`<4$9nmP9)pweW-uYu^79lx8sE8E1uyawJ7+2&8UWEp68Xa+7UiJ9i!Uy zX#9cS{`YlLA>W8bTN(gH5o^o5>%#%T0Z<Zw2>!nYhIMG;nMHg2#-5zG>^!0igTju_ z8DLE*aGnjNCN5E;7bN?VUHO(7?h5S|gR}ARAo1{KIVrXKNoip!BNte<>kHbZV&NYX zw9Jd8Rp9~<Zu**-!H{{zi5xLWsM?{^s@e8T)4~uxX+?0~K&8oxgO<U`aht%gU*XiV zWE4*(#OdJUSkXn2vnyKT&<n}OW9hggc7O}i^Iy$Al5ImRq7_Qed4CB<f29;j+L7Jp z#yzT&5DlnjP?3I-WlS6tFj^2fu`P{8(as4m3fQ_A4)-*~J)FwPPI!|}_)z7QVjPmC zWaHnw2;SdV{~Dc`rx!~zC+)4pBXGqIN<q}4E*^wRx2QvTAy?)w0JzzLj_QOad{2nR z(BUNhSug4c%(I&b<L7`Zd%6_!HDFS3#hBZ{z-jZcLD1T0H8JFc^bCO*i^3box?-P4 zkLlHWcK+$Ov%?dwR$tQr1R`!L$BK`{JxkNWnl(={uL2^X0d%}boP}WuiG+n(UWqZM zW5Gd`Cq;p79<X;;%p8G!!sGpllkC9A*LYoYv&J0c1@3vN*rs=)KFoT0;MazSoqN06 zzn2!^9MQlf(o5^W_fp^s>i?m9<qw?53Bru?DfXHBzA4!7E`i?mYC$B?4sY>LiT{$w zQo52_QtOYqmnL9h#`*NjXu>a-T+47a*vNhvY&7^cJdQ}PO-3xqqNZbFfe}=W`l%A& z`PA$oQntd_21LAO>rL1HxO;D7R>4DMCeP0UpL(!I?}`^MjW&{C{RcWlynH+SZOITH z9$4|Pq9%W|8-Erq$nP7U4qc8U7T507cCzIcyZP5z`~m|4_-4=(nfAIRF}i}4(0Yyu zc<{yAB%~jxZq<`Glt+i==M$P{zemsYdUE&q*p0eA#hcj;5q#%*<V$oqLC6~!UWNK9 zbYL(%zUx2q!KDYeE|0aB7}p!yDrhZgeSoR!!g8bV&Q3&pkW#C|K?Dd!9O(9WV0a$Z zu(-Bv#K}52&l`;MN9h&BzJ5X8_OriDo{tLK4!K&m5NJgv8*SYy;W9^-y(Ff+dWPS9 z><PSpT7B1mMeAYXWi@PNf13%8-?Y{z%lM1jz+6HQ8jLSPctn)8bd<4UhB*cOw{1{X zHaE#o+s7l*1xCa~7G2O#ZXqmoS%Hb5MgFJ?-JHbQ5&0vLP@Gtj7jzAWP|_Z0@4STC z=3G=&3|8~AVSADwXhMXs`sPnll=>&h*GCjiT>7MHt%iJaS8KjND}P&d@#A6y0K00| zoxbXI!@!_19DD7V-4h8w>@Sh9L?CBEvMi&N^C?pynFJ2SH|(0LZSVwLE>ITN)()*S z{)N*+2-NBnVvP?B3%Wy+IGve}%En5rEfnnoO#!RVDA)fLN<lRuxE8W7M^`7O1kUE9 zsidt(ktEA9qPS@CB!uoI@Qmh8u@x;}QquNrQUW^Vc*h86Z4`x^L2J(M`qA7W%nlpY z5h6PXhQ^rlzDgX+@mSbE4JUqZaDUf*Cs%ZbP2*dvtOh*q>ly5Bx}b#f1kXAGiz#E^ zurop9o?{JG<K-?dZa}5DpXO%?)RzQp@L3PQZrgrKv#kyCfre{YQE|y8w)rJtyP+9c zEXTJDE6yC-9|6uQWFKmah=WhWAQ1<VMhC=;dQSehn}rpk8`b5${{+!It&rMD4{JUX zlPW91^LFP<V$8ldA2Mq2>ni4j!+A931xDr0j;EGQtrm|Vq=aQ=(-biA%@sG*>i<f% zkX!zE-tMN%v640brDTzb>}98woLM9v2|NuJ(*JO%0CTu%H5C00l48a9A?AqW`@=Bo z;JJE}<8D~va&TYJvb7!7Ms}e*H}&=GMAHB-)2F9m{p^Wsxe+zx#r4_Pjbh09YFKK9 zJS$8kyjU;%1?KO}Xk)T^d(C{dZjuE|)EWn?U#YgvoK_R8=Qxk1>=Cd|>$UBH+-qcP z*LP9cEe+8EAGPd_e;>CnxW|i6Qc^l&T7<kwx4aC=>d{T>I`%$T&I_~gf3(OTS-8rc z;<1KB`6VUw0}S9@O6<!TXn0+w_YlwqJZO1$#RJtlZ|`T4^&9{0Or{M*IO`nRV6Ax` z{S=H^b-%~mqJXK;doe8!74|A)u*h{jIzgg{yziE)H%K`Y2GLwgqUc50eZ2<2F&qUc z`Q2BTWbY#|i-LxNV~T^qAkk_TP1k8TGuE`7s1p$}-nX6)6Zv0%2hhC?K6LYZtkm8- z#t4p-U})^-5g8*%&gCkeKq>56^!lR3`CHLh*L>hxAII$V8Qf@0Qnb~qh&M{sGrjMD zwUWF@_6{A@miLtrK4baF^qq-JUb;J@3r|cg`;XdfHSf$p34}Db{Vp78{dA7u*z?%x z0GpZLu~lKtFc=(+(~mOvxKr2l!6RTl@=o|}AUm;5hKgOv{s;XPBqY4eI9@QzG)~Hh z@j%#Tw5kyFbOepT^iww}I!f?q#!o<uTg6fEiCEyFyEmfsers(pjy4moRx>B4#h3r{ z=yr^~{U<p>_j>}<G|%6Je2nEu#;w?G8eZEp`P3oZq|7mXine-YMHZJ!sS&dW&(b)8 z6j|~;L?VU*9vyB@kx}8?7o?>d<xI;`NwTlD4E}bsMjq@$BYafFV4;-3gKG`9T6pYa z5{?`=_I|`Ah}{w@m<3jYTUb>zs0ip;WJ?y~*BOf2u4#C57fol~wP*+^r)YAi8guu% zxXF6$7(84)34Q{9E{*O#ZtAx;zz(?_-)~x#yt!VmC^hp=K?X-{q;PyzW|DQvJ3n<| z#?BvW61J=S?QT_+CdJ!+-&*YK&a=6v_(g}Jr_~Ui0!8-z^AlbovU8lP5ZyxKMBmTs z<|oaq)%r%vl>mLToV8Z=U1$2eu5;zg0I}A3#al0e<d6;B$Y=|?VZ|P`F9kk46ewYO z9SjDcL=u>b4&dyM1@k`g63>pX$;meLYov^$2{;woJB8y`=ZRATx@pkJA5mjxR--J5 zUQ(tg=_n>5xzKTP(I@Z&18jED`2?~%c-BsLmvO4>>^)@<aR!<ssOwj}Q9}|OEvX02 z{d~Kr0;A2QeP{-?L-lBc*pTE_d<i~63t2Id=!jcE@dwdq7x0(e8WT)%N-AQ`iI^J{ z6{XOPL_CF&{+DeBtp1b0tNY5zPfpC14+z!oJyFp_KN)z<n?1~61Gs#e8q}AK$zF`F zc%MN8&Y>^Alj}xlVXEY&yb(Ef6s$_JOgEol6A?<oo@#{3)+-_>THleWY=@}sg+W0f zMdKoTdQ5z{kbfW*l|ju2;Om+McoBM@&KS24xY-Z40suC9bBdvBP1wPN2ZZ_L<A(Mh z*5Bg1<P36`EKgKNzd9#e!NX+pp<3F(P=AkX^+Rm6of5v1oY`ru&AGQ|Xd~Yu63imw z$g0VAlO;ktuRu~+0a{^QVsH$nA8*C!31iliv_CKomQF^EHHr`^gl@+Z%c>g$&qs3) zEQz#b7LPX8;<uSo&0j@uJv0Ijs{e-E7xj+1wRVNS<F3sJEF)e;`VaU68W1j%6iq(l z1rbTxd`t)k?(Nlch@dE-U5WsIVZZ>jk_pk1cSL#5qd6}NnQ5BzT5az#&KcaUu(cPL zAxjcOP`V4(l$d+-Ztd5+3OffmcEaSa)?E3V-jGD^7e&Z>UBt{OSyB@sI58Aupuejq zOb8_LZh$g4@n`asoO&(rR9ilR<xJZ$v|y1FwZgi>ymCoRTo1(S3Hiuf2X%Jz=-ZSq z3Jz|Ut%P3b?&C+Z1zze6_pzvc=R)F`X$D$=`%P2Q*3_P(bJ~r`+5#u{89#a{r<d+~ z-EY_Z!BLg`Nt^X_RuD1F8ZdH5@slC#l%=kZk+!cRM-n<Nf*TM$loQIgePcV#yKJgx z#eIu`##cGmxN0hnmEC*&1V3=xxY=7s=_#wf8CbJW4*GH6Bwl6uiLZtjBjyPry(LQI zgr?AkhDu393PWjw{MnC7NAJHwNZQZRK4Am%=utb%%NE4~b(1=YvIgQz)?c^6c~;D} zapugTPds^TN5V@A#ZKtb^ePvb3A_7ICML4hWux~yKJL{8lBVw%Of_tevmr%$`P0b6 zAjLHVA2?t$KIE$t-X?cBenoJc2=M{T1;8Ws+GWAJC&B0zLcm#oXfl}Mht^cfpepbG zO$2-H?-K$rk6v%9B;@mWOC|b&7E*ojeXG;~V4a)S^#lMcE(CVtx2%{oE!Lc&8ZHV7 zPi90Kr^)`OIns@CJs!uO6nR&C4$h^P^q6*{!Xq$?MC4FlRyIyYsVc%ZyV!<jpWBYc zPbjAP^|0-gzfFGKGdg=5txurCmwJ_P{#BO8zL}I7$(Ax4WE&8?oXS%NB68<xS2fv} z8MgGv9GOS6Vnw6^(Jj`&8D{pA{|H6eUZvHNiaW9c$TnQmz}bxNW*R9Pzl@)(4aD<5 zt1{e!t%4FUO!vw<mt?aqJ5C<>#I4Bq=<+exZ$FCSc7)sn0<kBy*)&hV>@F<H!@3zv zb}+tRZo+i7bcmpPQ0cxY#05B>W6J<32HG_j4udG#p~jf>=5JUvjL4KCgh$YiR{#kj zxI->s?sYN4>rQrZ!+Sy5B7As8co^(2gWGXanpj)+EP*8hW!ecQUB^F~%3Uwyjnfxj z(f%(`$sP)^D|}|_j?W8|7s=glbX`)pkriU2$o9A0@f$Jw$S;-TzC|niv+<FMb06Do z)|Fj<=X@}}eMX_GkhXkw9JW}6E`A5uKQAzY9PGid0&rfZaWj*N9)7ymKWCD`;mxiy z5&?5L=VyJ&k2_)%*L~&WT>3dFsOf!SSAJ3kae7DT^XIz1ersusW5%8QRJZl7)hM4S z3S37v3G4(8a8X12Gae8vY?goa|9^(0DF*}pfMDpui+ORe<2%4e$pl#)lGayy)r~t- z-GlmDw+TLjrQUT}g6Ru|BX{RyTZ$S0tZ;;bJxtjZ54?p~tmiW;!mwYxA=|Z>?wgYL z;fjY%&2Y1<tjl&bh)yJ<kFIZ>jhM#s4SS;I**I5tyglJQ*w^gxtuNqAY&Uj;BYe(C z!%W3D-etHjTO3*UO!pVgbI2ySJ{O~WsYxps?2nlYMv$N$5|Dphd0G*M`?2>&-j$%> zonOzP*Y@@qFw`%=uv`zcf!o7`%>=P&jtN-=y}t)bRs;p#a6UYz3{~k-(J>cxXsqSm zXZ$;phF|O8$N$G4)8a5+Qsh#v76ZWfn)LtErT_gfVlmKAR&Ft3i&xGy+$ip-S5DL~ zq05O2DI~Ipk}PB}-#mU8U~`aw2e(iIts)%KI<D(+q0feUk(rtjax$X4WlbWbEpj2b ziqar3`6<Yu&^VXa%A!v#JytF#lgN_$kGE$iCBzu8zjo&M1opI(<TiXeD&eDm8ZPeS zM7gUrKkbJ2GjJZrAq#r6j!%sFxQoB!#U(2?0w($uMFBn49;KLm7imb#O^O00PKy~( zL1ypxb{{JWqUp3SN)9N&>91`R{K$opAUV<c%S~u=W}RT<yxpyVWNbN&`1tkiI{7#} z>^u>-eHWafU-NqbG8XV&Y=Zn@a_*{0Mo$3qd<wEu+^WwPI9D>b0^s3UzY~8qPy_Q$ zl#@Oo%xC2tQI@dq-aOK}N1=!teVt?!QmDf6m3%b*eeyG0B~P%ghnM5Z=}0#zUD<!S z8I|MK<R3*fAWh6chGhja?zmcr6&pUCzESDWr%}_3%)@DTeGdY-nY5S_JZetUpVF#3 zEre4_G?kc{Viq`t<~K4EaFOZ;0*J1&{awDv`oS!#oA)IV#c6Cg2vE&D@(@|qB#auu zWLr#Z%T=u@MHGVaX=PCummZ0}kLC%&CQ4}^P_((rQlNftE)d@5{E0YfB}(nL+Dia& zk+i#Sju_E#ZFZ+A-3d^Z^Fi#o21>CwJoa(SjECz31I07LE1D-0P~Vlh?zpd)E5l4D zsx(!A)xxJhy3HyBSSmOs4!;2yC&rn@JBsC?_HDg2t70FmzN%cTGm}&S)_ROIn8@w% z0>pE{KL{)H@kRtG%>-_|uZMcwpXDwM_gk61d)clChv`&T0Oo$pnUT&A9HwarY4AJx zCA<^d_s92gysrZ$m;VZ9K5+mJD<V(S0K*qrW6;~8J96{TcG0496ZO`za}!kGa1@32 zORrm937k(GDNGrBA=xR{Wo-BtLQzY)Nl8yralJtYW6wEeT4CiLxBL3Cp@|hCqaIt} z@3S|oG?1W7k^qSKKF<>P$2A$H&KB5uLZtT&{S2jU7LK-?M42I8C`Z%3My`Bz<+`ny zo|Bw=9n+Za4=ZioszW40Sp&-<%*2Z&?%|8-v$WzvRkyGE#Ds3Ez;Z$bRB5`egJB)f z-#iEljeK#JyAH}3TKea_@ZWeXknuPO3a1)Kd1!E*OohAH2UPYXnSNd$OqO7^Q-oU3 z+6p!drNbLh@ss7|w#~M6YBdSroaNi>3+Hv+E#-~1>%h`b*1g5(g*SS!@L<^g236ej zG)xuIKN=hqiNU(tv7#wnD*B`k@xccCqxKD@w%?O}wEl^1DbrB``jX5Nbshe>?(>g~ zG_*kTd)gq{Ioa@SJH2$+`8*plwW7y%XQ4QfXB4sXqX&@L0gqN3HRrv4kqnX=#D_)k z#LXwAF5?>t2fK|VJm!{5ns^aRxTF<ylwe8X%bF4RkBFNvJEqEPcd0;TjXZ9T8(b6= z$_%u0+KcN;6=akmZ4YZm8d+Nn{7{UTpEVyia;OdAAPLA9H><<UMQ+k<)z@LX-R(|4 zJyvq{?*l86no11E_&!``k?{AIC1<=hi@<CIzqj_g%*5>jR$;jF=9#p(vUzqsa~=*} zUyq*T+#V{FKOy#rsEiSg_2l?Gk9y%!h_831k7v|yMF+=NHg`<Yo|UFnE^Ld{#2)@| zeH>!JILS{R>6dPE3ibW9KF(;qQA%V2`P5hvzQ9E*7W?OG=CPMh<uK9sGLG+RHNetQ z=F{}sN$h1^U2O}=DxS#X5%k0;rw23l$aEtX#l7dtZcE%f0!`!k%S7CC+^0QFR~$y| zTwx&2JPp3*nJBw_gjp#q5u=|<{bwTWibU4Up}=_L>Q}_8nK}}0B-R7h=Vf7cbVBPg zLbKT(2bOIw#2M-jHXiQKxJitqOR%bTJs=Fc#^+@oI7O|kACfrF9^zI0Jx|m!toz{S z-FT*R?i9`7a*CCs0;-~Pz2QZpFFPVd`_1)K^zQYgS5xc@c6g-ZFJ9+L5ogn-0qMGj zhL)*(wX@J45|whpyp%tz-!atGi#nLUR~6-2-RB9!<cyBp{>Fk;|84vo5<z-y7jvS5 zjx#@Sg7Vf~82bAyVVY`el+FCCi=p6YCs+=Qj;U@l3l?JL@x_V4fqmH;Yqo>0!pKN< zN;uV%@Bky|>EvW&BFpkZ2%$57Ql~S5wTm2ghY68(X%((-AO=ShSpo4hIF>Iu#vnYd z$K~A<macCyodMO$brT#>mNwQeme{mZg}o5OcgLkAb%rNG*}Bi?5$=nYqVLDM-gW@M z2R0IX{!$zZ9aFAT29pJ3^1mA;rVJ>hTq$se;ks{;$z}3jHQHNHPg>0TChE+-Zx3uY z`y46G2h$%Ie1jUatN8v+(Qi-W{PU}5m(5JxE!*+hGx6rjlbxl{uKk~n6%^nC=U!g# z4TNrEJuD7qsk39jTi@jK+Lk}ugKf@*Ug#CzjeGgw9b_hZ?Z=x{_b>Ocj!?Yob*QTm zlg`lhHmzcy7GgD=F1KHP$YtPfnJ$;Hm&ctll?k51on)?Ro^QW-DY)Z=2cSFV(k+}9 z=5c$u598S(Z>w)sfgP}wut_NLtM^lKgC~yz_+|k%br|bUG*^j;6TCAq>RQ*^@%{K4 zzrP695Nh4rI5Kb7eN~CUa9mVPdYJ1+)~Mkb(zyr(91&1cD4ooYNW&eghH`X@4ZZaI zXe#)+(;{1E6cl-x+7@#&JZ?g43R3arN~MH6csLqeK0YsI?j3OvF9FWlnI{TqF?AVw z{z*}3bNEniuUS6UAj>c8&sOWwC3PB1RL6Cq!pX^v(ROa(*!Dtfy|3wq$7Cw2@Tx>6 zE^iYxZp$CmDhl!Idt{n?0)=!FG-Y4m_AM4~8k&ZR3{s#u=mr5;dIVaE_AS7A0Tg&W z=5&gJ<YNX?&22BoXR+=2nml}o(=g#O?|{0Ow2=Ntv+)897m>4tZ<zSK&3bEu&d(ot znQIiCl#*9`IF}m7DX6c5%DPvCjD<Fakp*8`JVeaPnW=U$4`QqRex2fdnJH5dbd&B5 zpI_fjkOQW$qQX}1tOc2;2~K_C17j$sG&f#OEMBKtKxjP~AI5OebvL$}DFn4CKAK3% z4LkVdsx;3e{?R0{k5v#uX~y#Ju@p(Au$inEw#z8XVU^Q1qfK0RWvb9qOua3Jc8@En zu7)CGV;Q4n98GC%|17@5S;jOcw&%Jt_HvHB5GjA3@XW&}3>(E4P2zq;p+sIGC5x39 z+WCa>8q@Fxo{qeqv0a!(wDhGWP~OM16so9cpqrHND;NsUaU{Gabu!Z*gEvo1$`hfM zme*#WzY>&X3CIkOkWwBai|2OT^<6KrT)3l9lRTt9VvkD7*4~I9`8}Ujbm&?}G=rZZ zDQ?V8q&?@BA>2NgXxl+;pNu|R-W>e;@lP)9AInDO2c;ZIYR}~oUftAT$lX4jpSUA6 z(yuoK<B`Nj8^OOJ`5Jk>XWFK-KD*C|a}aw3aRQO+wVDWLvoKwEBkuT@&SYhW5`f3W zv>{i0yhte=&AJ19pBVK1B1v~6hrw_3G#G71TRkzXe_sOwM#<8a3DQp`WwDEJa(Rjg zeYvjyy55L=Tye0dbptVvfTXn4W$rPyu>CBX5+*9q&|TAXD#*Fnl^7UpjS(&BT2>y! z(Kc0*G8gYEJxr9{oKvx*V3;`?E2(JapCI;9hCii+YBsd2yBI+H5*>N8#4^X{8$QtA zZqX`M7NUm5l8=Vxzx|FGVFt^V3W1Wy$Ww)iGo<u`&k0I2Gh<@xvBsdepO24pZ&;y# zAiW#K<B0vJ^$+IEQ)#G(Z4n_a>sQc;z)Me5MxzX&4^)*-6AA0;rX;vsj$TM<ZY$@; zqiB&}k3T33AB|Y<_I9dMRMS(}Yr;8@<}98UGfq5jnUqR^un^qzx@)ua^kPQIs;v;t z{EH^hz*+s%2N5vgyzuc$jmf=dOV(iU&hf#mggMT2dn3O#QVkLXoN~1MSu^^HJ;X=c z49LCDR{AS$+!{4`(y#vQ8Eqn-aN>ij@@`Q1Qtb-0s!Hd!u=fQ#*1fS~PR3xx1mz;q z(7BJsqA`P}p)BRBAgW9tOeRz*6eiOx_jcMDFOorOy65nW*yh>;Z{CSvso>`!81M-g zi5#aWPx^(sm8<js7E@cVR4pgpU*>5Sn6(i6Ovi^KZJj{>F6;EPL?c$Mdx6|GTu?W< z!>a$(8$}FwXb?Z+%%@xkPDQe$OZ~eC?cX^&?Tv-&1*@Et6LY#Rv4vU7{`yULnQ4&_ zFIYgcQ}4Q&sS)wPGg)BDGd{su6tWr4f!3u6WT-?%P&Sogys2o2jrV*@xlmu<RJrl$ zTPz%QxfVvvh}#m(;@c#s#`>JBfRArrG~aOf*Fq4EviYNIN^%^+_%3&|xJ2AwWS?sM zv4fK(;yu8uwTHVW1~|PC8LEaIT#aLqs{js|4Fb*o<BJ7|C-(jH2xCq;xmIQ?+9_EO z0hmt(CBn%X-Ci)B*;uRZkNtV|znPkz*`9Pu+bNLW0|GTbyDssZK03(LwGH|d5w$~_ zdOxPQShPE^X6&#Se7bWhug`Od3}0>^%8PKW6at-L?z)8E53;y+3(_QmUAOY@eC!!1 ze#f5Jvm-pKVPN8+T6!F7dKer-DwD(<;;WPi{2AduA__ai|6x-@VJd&8=(2$h!tiht zWr8UEhZR3uMQcwrqYTz%)#=>#3fjw((cAW0o0BLaqz;miLzt;)afTb?w_gp0>Zd3W zSZm&+%4+ybKJVBMwcklajKATbYNDbtC->71D>Yv1l}p_YIKA_qU+PnfGc$~_xg-c5 zhh=sQAUZ~i6Jn=S#TTvyMBJ0wR!xd{Iok?V%R}LgrFc5>vCy9_Dm+Cev2vrFXqkpk zPGd>URl@HP$cY5jJvJ1$PeK&0vJT3wClu{vfDRJmPo}%Y?G`JdOxc&2uR!BPnW_Lh zhK5w5@m=npAa&`Lys+>Lhnfk}DM~OI91=MRCA{ZEv&F|kJ#+P+AclX7acv?r=7dTL zeEKkf3i@f&9&Acu!d_H=Xy#@@yshzm^|;Z)`?~3lrU~(t<yw;cRy=EO@r<NBd9K3b zeG0i)dy~vj_xwglr#{?m>>wL+HyY`u0L;s+0$t02)Y?yNg1vD*n;_ey9ZiF@Dh9>; z5^sD@_5>N3f@wvi*Qk}kU`}D3;c_DAX3d>~vJ{W(ToD^ls)~jv@Uv|)Z{Fj+1Rq+f z{IX{L^kA8f9XkWB#iLJ<26aj^M{8|T<1tzv=b?zUA#|^O6huA(B52!^=;E%bfzkMF z`nM~!+i9>tIwFuX?M~==?b`*!7{@rLJ3J4OaoWwZKBP0G_Ol97vVBD7h^4&n(@>cn z(*D5(#zjNYlhMWNa???u*}tL;ktQ_q=5#HgvqN$frkD0e{B!}IK3Zf5%d^eMlJqMw zd2lbTJG}E$Ajsy*H$J&vaJ1r0P&~D(uf`(pnu@ixEB3LYcCYoXFO9nTzK|Nq!r2W@ z19%F}b~e>bXIe&}whyO}3qG(>DO0hg%V)xnNh_w|e$eDJltkvs>wR;q_T+x*$g-$8 zNV9x~egY%~sgv)eo#H3j=u38PmMeK%TIgiQL`zT)X=d~YxlYmmX1^M<3t)m&JN0|< zz%29Bd?zI~`|)M&D1Ajj3?Xiob-npGSNC?#SHlE*Hp;)1%<SzZx{9!e98x~=sB>~p z%-;2l^;w8d{;rn9Xl%;K5b@CA>)?e-XfvjmXny2s%cv&xJ#b+YuU3Sk10;Nm8_E?+ zVXDqzl2KW;YNEc%^GS@Yc|am&6lQd%>w$C!rf9p$CC4v{>kOxWB2`;vaS~FzTTHre z@x&tl1rQv6k>!1Ba-KR{7hz1TWX-;ph#)%Y)^2A@|9J`7_3nk0T3tsbxDnbkWxLbr zQ;tx3DS#nVq$Af(cuFz&t#YD?G=;5M2BrEsC$h-Z=VDRZj%VJ-D$R;Gtf2mwI%zhw zdtfxTPv@!0Qr{@X2u+Bgw=BTbC35_BdOmApZ5CiU>g*hqq{v66;v43{=^AgWSAc|A zGD#=Oe|k6DM-4dOEZ#Ru(t+ag$_g9%t&IzNw-AhED;hM_EKWRC)&;70h_#mzCnesl zckSFSIP%qf8OH-NiAX{=uA^h|RMFH;RBJb3cgG4#hB@KUL<X4bV$#L(Uv`5m@s6-E z#aRg(ZpY@C$h>GV1|pA8>?&pPp$1%M!Yjt1m~xnZv>?$7yFlZs*Ps0lm<k77c}S$N z>wUKBWNlq0f$L}YKkc#0Z6<mv53NUadk=clT}LQ?rkX~CNqDE+y|FIV;i@9!8Qqb{ zODPsY`^S!=;TFQ^W(Hr5$b|#b7h(wS<amsHN0<)UF^iTqIm0U!;nf^Af(ucwY^Bwh ztRzhqXw3A&vqz<N;gm6PaL(yzoO@A<e}@Otfi1`P&ByoI>iwDDwh3r=jI>7g0IGJu zwQR(~U2w`Jl0J_MUMcU06U51gtX9gQmq_;WyJm7KKtb~3d=vLH3{(Z*N~qmpFNMAw zHrTYh?lneaHiuBXZbaon=rH92i23=Cw^u;dK<;IdS~gs{A?^k7j}B7Pq});$rhe+} ze@mj_w#%@}S3UHJD>`PTSzSgU)CK^_3tfLvSUlRC!(iLl^u?OEu!v(M$iE<3+{R<L zwQXy>zaTlmLUGJk0B&y*l=ep1DHQsuoaxNJh%`Of**`N$zh?L6IA3W263gCUU%K_0 zRhc`UiiracV_Dr<V?ZNJQ>ED_WFEnrC;)!2G;X`#(plZI3~@OXi^ZU3&Z>Zc%5*kx zJJ{hb$v6d5mVB`;_HoI=HTqi*G&nWX_sPz<<(p7K`t|szgXZr|F8xsvEvsQ370W~l zIH$^a@<F25cl)Fif?<@C|Dn-tZ}Ha(DQV}SLeq_NdiBP{OVBlbbuuN;!k76ZA4@(0 z0$CIwSbnz^B??^25c!e&0NlO@B6#RIKS<Vg6kz2#iokigOT5-26GrR&8z(-d0C51( zQJlN{^#xo`RV(g%)acYRJkh?N5h(6nQpG+?Z@!ki&AvAJQ#~Q>YTtZyBoEN>Ye4vW zUAZ;O!>sSxd)xJw;F!2$ErtCG&mWH?tM`2LCdT`)+>7{Z+9~tYbaoZT1tw}e>~01` z?MOKr=OD-8R5&V$LcWfCjbkkN=LbJo-OzAhZzaL#sm?p&%s%w|WQCHBh*!p?`8ju$ zPfH>|o_N{-Gk|@qzL-1H-#c^`uRl`_uM)&a%J7DQd6dxe24^YA_^~3UTrRHv-W7kI z`bhadR2Nk8|4wyH$hkAe!TlH2RcI6RAF2yluDL8G%wO4_ZW2s2qN$nHA!7#&N$xp$ zUUd!>Nm=@<tY0ih9Kx`fyJ=nAU;$-`d1AkKie-NFE2lS1<cg=-zDA4q=IYOZ`&}^& z6l)hY$A@Ly26y|>K3Di#Sh#pBu3)Y$D{?p^qgN7UDnbEF34K?gz8{UyJmcbRwmCRd zoq#$Gbdne?VHNjaS4PAyp?#N07E69n;E<=AlBDHf#=Y%DTUmN8Qaz@VO+XjFWVWqR zJ828bHY=BQHZpI6l2nZ9satVbSb-in338U{AUI3)oa3|>QHVtdib1g4+ra#VtPHKb z6*Uv=Px$iOxAcNjOrUolCB-PVA;ZL*bEB!AOF?)q=?TpsD((laFK*^%nfdLvRvS<j z0@ZwM3-jgVvh?DYvg@@L>K%?qO3Jic6m|JgR1u*Bu_(ic<pjeI>cfo^hNJC6+O#IX z<z!k{&S6-KS!@g0q!P3HDqJo#LDQ^&N_ZkUU(FxvkUjY#DLOL0#9!C(%~DER13`*l z67h}Jo8sW5{i=)0&dSO1Q5X$eJo8eBlOk)KULQLN1^N%3;G(AQS*Arj&I18{&TTAW zUJvLkQ7+ctA0(+TceG5(0A1h3_k+PXNZ<EzgRh{+FHY<^V8KX&!n>4Nzp}<s8;Qk= zY}My=6Tt&Mj04$up66N!sa)_!Iw@hSEe`R2Wlbz$($6-ifh19K?4sV40zMB=wcE}r zxAs2UI9-lAQNWWyqpHqN)p9!NKIsLWm6rt*Q13a15A@n*y`VEryTUh;_gAjJ(i%ns z3L1GNis#M%pDQZmE8WmDhi({~3<I(8k+6Jnaj`CDNyJ7%a%>j4=V`^U9~<-Mf=HrX zm7aR>0=kTRp4kqFeL(d*$)Dq*6D)uKapC|}s3}r4nJx?>=CbGrQ>6sHmKXQ)!eg$G z5=NMXkWh1ihe>%t$;<!L`ip%RA6=DIUS6TfW*eA6^4GfFn-XFC)w|Jj=9w&*0AeL& zC@mv&8k9!v;>Gq|sV5SV74=aqs@#N4xtlj>S0UQJ39hV2!!RQs+Ps#5y1E8+C-|>% zbYA)BWdOD1j+M);>n3T;E$DI<e4+9oo2o=|A*SUZcv-qHR{$D=s8mVNh72v8vdFi~ z2$XwX)cE1#Zk6i`_Xx@Zod@euVk5`@fIcdNFSkP=3;Ml8^|>kKQ)Qx86?DpshPTGW z7AkeP=B<HO1`RWaw;J>-HnI&_#FM-K3r8Ae|8E?LGbPG#t?Bt1nm#epD;b^9iX819 zW~dkt#l-Vz5}%P5LyucmjGUGkOX@zYT7zL%hBOX|0QE?4Ih?wrHAcr&W)d}oEVv>8 zTQSC-%a~THL|)iX+2TWP=;nu*gmFOebx|GGLJNyE3s?@f*>q_fM1h%<S>-^Sdppvu zrU?^mRD+V3GYu*o62=%iZyX0~7`znzo!-*zuqu*O?v!$#Cva}M6HVLM{e^zK?3h^+ zHL{jpnd>qawPhxwOib1_U>Ux-75tzDU%F>;LXGc=5#Q_YH+r}4b!CS}7rZQAkXQ^q zUly2e6w=&1`??PCSy?j-xbXG9p4_&`$Bq8VZ?k^B`6A|awMs$Px^nZ4*-C*Vh==l| zH9P`L9&$gmQ<C4v6sB4`_yiaNb>kt(TAmQEbUcXe$OZ01C5S}~L_M6?QyOi2JuC{H z2okLN!F!@!rC5Tf0=XTu{h^(V-LHeHTmuK>_gdsY;93Z)oask8Ywj#Q_S3&hhMNsl z3dr1*Vt22zHN>%nJ*c|XhC`8MKLjTCTeje%Xlu_#kY9$ys(LxB_Wf2*_hC%EO~+u= z<X0kTy3o|y&A!W<vge!jAIB%rwg5t&&R9bSQI=(lxfmw72AaHajB`=VI<?H|L|eO4 zNsM2s>Q&Ri>pg@p;<Mj95q~NYO>-d~Wr2l9SAJzfS+O1|6Fn)3s>eoZS6!qo+A)7I zOIlrI62^2z9(;1tCG$((8FjfBuXym0;4i19%$!!>umqlo{QQ)rS*%G&4#Cas>kQ-& zFC;N=k=!moVI%*F*7xm~<d1m&zvvqk+u)HBi*wo!>}Yh4q+VH?>6-cO_laFq)qT9y zPP{GOXOiagoH-AD9TtI>l5eU6lJy_khMM|7!vRY8H|A7C;=%wguk5OceS-~bN5E-K zIfeMvH+}y-Z2Ix>;?Ufo_@MT%cu=Hh@W~nhuS=Y0o`JXK6j8ciw1_lK6}Ja8#DjeK zD5SU$Q`6y<?Q~`g<<hd>cy>Jx1w*ou5Ywnp@T_xgVby}Kjx?jF@?p>`yBUQpp{E7f ztCOlU!{2X9l1-Og_#LN2c;5o1oy{No+;viu^oo5@q}5Bu)k-g6PJ_ThTC$No_Ov}` zw6&sQ_VIeowxOQu$W|_S)A1N^th%x8Y7Bf45ABVvn(j(Be&21+l3@w(^4=@^?1f;? zyxt5NXfy-0&!4o-Y9Dgb47#r^7j(}3<g&=X2EH=10VUJ{%c(ya%7JG`j*}z!_kQ>I zes62if}O(@FQ3mU(Tlbn&^S&`#}2+2P?;9~<-L~)ST`SMk=K_<4t;_GE?(}KU6XYu z&huL}BW(X&3*htdYP2TE7Hau@;5Nq1b*w4FWV2Mx;^y_MyU@2gqQU3i@^@t=^m?&e zsr0&jW)M}PW!Gz$`kHpd&mQuFS(?$ZzYhk^xI@xBS|CVh%Qt?ko#Xgix5gbBVh<^a zt6&Nj2ieo}V6>St;3RObg^#KVUqxrRsDf^J9UHB6%R?DzSDW^Kxil*Q7xaw14Z!2> zaj~Pr=iJ6hSEk<3kyZY;dg9@Or+F8UJ}5NCnnyXW(VAi_mVu1KAKj!`=Uaa)Z7!)W z&HX{ld~W)#@2-Ys^DTL>8DqkHPf8-KOR9NA5#1}!&ila7q)HT+zLgQ;QRp|d8d)yv z4vKyzNTYNCg|i%dfjcEdphwPy1|^@zgBIT=rxw9!;K82mqJHj2;nfpzbBCYMTc}?x z4U!&2r5l>9)#_wa97T2`<axj~+_5DjCkGr9e^nSI3j2=H51*78-Lx6y`MXwtEf<r{ z@<<-(<v0nCQ2&McCI(Bp?Qn8N_p}02G3rBK7E=4l^JNJxj<b9Ca<qwumH6L8WgRmr zciovUk#RdIHyTmr1!VGf-N2cz!(g#bHwzZ&#&T+g;7-Q85qb`g$y>r#hmJ1)J9)DB z6~K>G6X^x|0?GGO$m@1oMtbct1*@;|9R->-rGE?c+XgJLhA1Br&Y{Nb+Ggb=WMn7e z70w;59aKu8;3LdPJ>h@RA}jBAw&V0@=>6ucV0<1esME|3ISH(RBms?5Upf9~c+6!X z9X{M~80$$*pg6Nh43tDIefsK-EeRA;$nIePjJ(O8f3x+5<5GRvKj1X5pwSfKT)@Bb zm__`^Bf<9L$#MNsLZA|Q2x9}`{{jZvwy8o*ZOddP4UGc8$g2U59<N42<wIP7Xrj#< z2zKePXeQt#{>sgx@?w>o@Dug=f%ViDrtZEMS~_ox3ID2QMowI{2Bgl2BBHBd*dK`S zW@M~nN|TYfh}M}piW(bBXaZl%`$eL%M!smTGLL5F>l~ba7>BR(`~jz?22in&KiR%g zg|Puo7vKUuPolUhdbE)!gxLCCklFv{ex`qbmulC4bn6#<LHj1lP$R*Y@X3L~iIQLA zI7mnY`6pffwOT2d0t$LSq7_FAyZO6n*D3NqaDon(ul7{)KJXGPw+;h><nJW_@N$q1 zb;`VsFGBn-wU%EaQJ;ki>-O9Vvuvawqap)Yrsh@h8j0xN)L%ovRVgjz-u%?(q6~R? z9k>|`$vEBk?3U=>OH2WAU6$%og3RL(Z@!M6p50Mp!!-pOvMXWNBK%A1NKi2INKlF6 z_Q&^W5rY)f<U)j))>;1NO+gU;izNB|jW<fa6~9U_s*OWaFA_B!$7QzQ#970gB+`&* z;fo^aLWi)tHkA^Bf}wt+ngwYO_(v`Mher8VZ2wPqNb1+-XLdbL4HX3U-^9)TA5TJG z{?9FekzCIEbIY1TT8rHtUpaAwRjGO<)bPe(vN_B~rQ`26tZPn~yx8%4L#VY;ZXLtM z^RP@m#tzU3XWDOFS<Wg5n^4)<lyuW0x~7Vu&t6m*>xb>J>Zuv0#dPDPjE$J4VLUOx z>-Oz28yL=%HPW*CTum*V_Sv4?>*L+X)S{!L>5^L>KmM4N$E^SO4|yUFI^O(y=Mw62 zkm@XQsV~|?RvL8EtXwOnCmcT{D-I$_kn5<s-xF~6g@0*!KK^>aDvkwCqV(FbtiJ{B zlNuL)5h&qvIeaklF3u>5^BKoyLqFKMknjl8$H)^S7<AIejLIRHE-sa%Ccui~7lA&I z<j8T&Zp~xNJlC6*P%Om@Mo>;xR%78&f$I#kUPXoFu^s$h?fc59nMS-`S@va+t<aXf z@Dq_yfMp1<s`smE)sWYmhbfbLPVT%6bKFyuv}}aD!K&k=B+S=0@-aHK2A)i%VV3lk zLq3wPhQU33Te>sBe*gd^T|9BqQiU&O$(uy$5jvRv2!<<bJhO;qjTpDW!Kv%Hg2*IJ z9cSQ-KoJ!F2L5kk$?`o#ZBA`SsODG;V5_5J)>Cld8B0{)&I$`oi%Z0;H@!*3%4TCm zGE}=Q=0A3k<^SSaFkk987)I1KJ2kd`)av?^INSDZpMU{((`E_{%G{!1wL&y9p7*;w z@+qk>(l18}xbg-XJ6DYK;m`p#H<KRzVIAm90<SN2ZF>=9aAHy-czyzu-4K>OTA+8E z-vp1W&)@OrW_o!3f-dqqAf*2NgxMzt8C3k>M+Eo-LBi?flaDf3xzQ>))e6h|6jDti z(obHH|K1$M1<FuX-=gYvmY_!XWmzG;DqIfTt%IcmLQz7~9L2=Y*IRapYuKb2!xCZ- z4;`IHY2p(9CU)z>a9C#QR`ud1RDsXncRb+^pw(55IT)Y7>?M?B`?NS>7F&CVaCltu zKAFg4b(V?<b&bIXQ-po!K>6tdq@E^{$T@o1(-^5kcKaT&=3}`UISDR)y{`oINOTEl zd+#*Fi(5bn{B)kKEf@M;;a_)cwiLA!E79fcXz!b_NLXB%_@111cSPs$pe>AYZpnYH z0nXM{6T7!!rxO%Y;@Rf<3tGSSN`tc1(qZwgIo{4wz|C!L$ORIHA=Ib%kytONu`}Jx zgvAQt$hpTO@x1uV=LYBGAFUED1j?2R{bL4j{69F&*#85kfg^fA_a|g}Kl-3<gtXiM zE(mVdY$$HGc>7^0DJ4-{#pwg_Q!W$@*98S|zU7+Gua!~MYo`3xaS`LE%b5Sa7<;Gi z%C>F&yMjtmv2EM7ZQH5Xwry2xJE@>z+qP|+-&||&bDp#Je_ec+b6(6b=IDL2-tcR0 z^O6RhH{GN%(2A;fRWG9hf1OPj6hA4atC50Ro6Wp)91f>;Px;8%!moOx@Vf5UvL}`Y zXLws}dl|PnR5i5$+R9cN)vu`n1q?5MKfA$qdYLpnk1p$pPEjUY<nSYUgDY4w7dmKd z9M)>WSaNRKt{EC^(LYqxMNL8}`j&0L?9%o_gnf(=H?>89uT4oKJ`*{b-L+YfXO1Id zP*D0S{RDZ-AHAID5<~qWxwLVp@83X<)UTdP^PdY?W}CFM4AS~fSZ(lPiP<9*s^Dmh z)TlI_tvzHp!AYUmY<N?*$gllq#nmB4);<lhOuIj-prYF{21L5m!F7mW?o#T9`cNVE zmcKUbp~W=d<s?rI#-QR8^kP^pyi4(-8XnGOXrFHn{x4l~O}+E*UmT5TtM9>B%BQuv zkF)bH{izo4NCLbnm%6{#^h86W!MK!+1|;P#GcKhAyy?KSnr$Pn^AODMd!6ps2l7Qh z8IUFOyy5B_RO0%yQ{L7U{8mGhSX8IKJTQFJvGtOf3&H!kJ9Yi_^-khuQ9aP{<pgIj zoAyHm->rj$oJK<Qun>0C;?8Hi@dYyJm&eRH_6syqce0DLCGQ~pG1Jw;p$H#DXPqLR zhsP`@-;kvD(R*6+`)|yK&KJ(~-qZSf3TL;-czrq2jx5+!tvMj<wgXJ&15bvHy4nk! zlJ&C?(p;KZn1fjnW6ZTcGT+8fbm@NqLJ$?j0HblUppdGWPQP8z4r5K~_4%l&j)Vx| z0icEn%vx+ZnzZ)^JQ)^d@{T3_z(u3g|Hb*dvj2kF*NuX6GT6!{#p_V7EY}Jg51(V_ z$PP(9DAUJE<DOK&emjOw#|A12VdFr{P({TjqEMAD_xxErJu@5jAp;aFC}6@;4yA-J zb`So)+)IEQ#E81D1d3I`gqvfIF^{Rh!mB3o0F2QP7mV@FP){riTFT-|xG1uKk~r<) zLdpt-VaNb?^j_OjzB$0-D?Q30i5X~>ve36!k2RVx0TggUhPjIE_N(A#0BKmChMTxv zp9#sz;YNRJeb*Qne9m-a(cMc+QSlUdCe~9m9}Oju{p=HlD9&Qz#rV#{3x)zScN9s< zx!xpmYK!6WR==j!wqv4j^q<qsj(~Rb-Fo3l%|Fn=X*YtM;!x3bc><Z-i(#zbHM?#I z=JpFPdM+vlM7?GyZEz{4B0?eB+)Ca}#D*d&4CfmAWNexiV_D1fB?D@Y*w$j(i3Qab zvxZ@As{lO&m6dQhsK5E2g)=kz43h;EEO~(gvc@N+CX?k>Mwm$n{NUG;v^t=M*ugwv zHr(tq1?)|oSXDHQHit*7RqFWnGG8p*3}j=zQ}hA;B$y?Y5<-To_G{P}$Kj#T88D8~ zq(7g}j4JKap{u{4hTs~e6R#rxBac@V8XDn)$L{QnV{c=U?HqpZCz+=N+bWc;b~fK0 z?D-YYRK&_aPkEhLFtXZI33Io2BD$2zV^LB`k}mP+9Ah{VxgKE7AEw$l4e>TeYcvkw z#IUM&ehMPbR2D5IM&ysP=P_$+Z2dVS_wb^Xa?@A8R2d5ZqE7dU!9NLTJT*$3bQT)U zp3RwTXgH|s7r(v>7*$bMNsThI=*><uXCHA+O5>Go0n@7U-pc*CWjI1HbiiVM%+rqd z=51q${#{D*N0V-9biC2SbN3OWWR__RFJ-Fp-sE4tCKDwP66whIfIr<JN?qdzzf74f zKb%PH7bEqwT|sd1;E%L?-S+FB`-q};(2;$2!QF1L&<vlRzJT;RKa=>-s-xj{vwXKg z2FWf5H)3)8*{qp9U$FGLS+FYN42&!h(OTi!qiQ}r{>V=)t{9KJWtrj)wPy2erzv6C z@m2jv^H^e8_uJxiW5ZozA>NKbndHUj_2m14ImO_!<&E|{0ZcbbJ-CkSYJ)LHr5dh; zENuq4YWJoRp{~^gyV>_v+o=mQR+YZ@c^uuN|N3NlcHUjO_PuO{py*XBgX;S1H*u>p zC+U>?HIQN=YA{OTt%=+3yHN)d%kqXip2^L`YV$Fv)a<)vQCrzI7(y={!irh}qZIlD zqPBHs2}TIo_>#KVuBLfpF=ah}bPC|2UJk7^9TBVR7~eCM62!L4=UOEkv-0P-*N2*4 zo3U54Iq@Uu8LECmBnn^5cpbh2wWmGLZ0YtSw<yp%cZGDd9ah9s1@SnOyYEvCYpI+w zS!VS2k8}X^4Gm8Dz_v#^kkH<@RV~(3Pov3`yihZ;JJSeJg*8I#Ue}iPoIoDTjXAV$ z*0%6pgSqS(cg9LP+?g=O>p*qPTCO-VZEE;2G*FL<Gj?1gTB8V@ygrcFH+r<hFgokG zGWj@QD9IGUG46+5nU-e(CplDX!ay*}3D$={_#oUk#t11I!c3vQrP9mmFi3&$q^fFk zWQC(aWVWcOCD|%iaeQ2MD2>)A=yw8fnmBQvN~;zVb*YH$69P?j&P@6t()`x|hc5v^ zT}^zi%4%qhLbEjDR3)6iRAxZqwz@y!mVk*!<C%h%bcFsB`|7F(JtI<J)UJcJMg~>w zQ6mWf6ECDaLodX+5eFCr1w&X&baC-`<%Qd`z0oQMNQshFH}3C*tW1ahfvji(8t*36 z{|{!BjPY;GYOb56Ox*oCsk%ahMG16DI=9W}8<YJFqy?&8lXEj@A$dh1qVAxV6C<TK z!a1~7v5jJ;Onf`(_Z5zfLiN~a5$WMP#}>fUQo)FA^Pz8;8EZ2f+d(ueNK`2%;z{h) zky4Q*HW0xTlz6xNxhpR0zh&`P8TTuu{)bKTE<HIv?%57XS#|iEO=IYtbNQCtS}qeA zKX1du-QYD|p}Wph89l|n-YTMJOBT4+#^Mhv9Th_&Vuu`Z(kI?PlZD(<C%BHC6-H>0 zaV`X=wjqB&{9M#vtS^^{)c-wjh)9OIVINR1cN=9+@ERaWdDW7BC>VI^p=KBBY%7y> zl1+urN(kw%{Wc2sG8$0gZGR|LUjx!GNct<|Wl3e#UD#8~8pFJ|*_?_}#94$vb@gQL zTX5yP@a>swXVLeRb4};Ko63bvr1)e+s;DE9GzRp`6M?JYDETKg08)q5=C1EHYRGV~ zw}YN>Ux6jKQ~G%V0Jj)Oyg9tp$z?;_4dG#;H&Sy=6tHmwt+KI0jn*YvW-hg~`|b~- z9)(w>paLB9wBsY$9c&l2q^>B;?#AcDzQ@zs{1phY?;+;;Gxg6db$EdMT4}e-_8O>x zfHkRi-;x+tSG2!4>Vm&Ny>r!xgx2K4-Xdt#Z{M2{vwuUWFu>vTcimi$>C>^<pI;9f z%6?5qowO7}@E)gJcA)DNjo6+cYODQY@a<O;KvvmyOEj$(7Zg*D!Kgra{o{7+d4O$1 za`|apZhgOhcp4row7*_fTS@5n;-Wwgjq?qRf$>la520gUnNhs;;|I6nlt^v-tou?m z$nj}TKeLi-MhL^Q%w2XTEy2gOF?N*<lesr_6=*mi*_2k-4R@!@o`tZhcbI9m`}eGV zUs13sy0`Rcey$;40dL-7mMarCw?kG<N9RqBjK|C%$4Y1jeum<uRtc&rZX=Suo&vHN z+!U00tQ)9{-(m0v+=uTzlGz8tMX?mrZcKM^IIF53exvdGzAvnh5(wuuE75blZ%D1N z57Rw1TJoPKXWrqNb{rww#5^caxJUGvARYH-{rlbcKL^Wbpa_6wBu2#Fp6TjN7AL~& znR9KofTUq%XU@ZbvyPZ$Oao;S><i;IB}NYlq16#naZlfW0P)PeBpyLHqz8?S1T07| z=3SI5r)1KPvi@dV44ENJ3%li3#Fut1P_Q?c1XvQXH0pqnoz4tc22UBz{z{AzDoc9> zdsa!SXfyPJ!G5nbQI45bS320oa1gx(kqm`wV<AdFTOBPGZ6yUhh1<0IKGAtHEIJpu z9B*pJvGJ&y6s@Xpq-4mSP0q`D<@4^=Dl~k$HQ6;U&KY4lXwTymh>@d$eJ!=boHE^W zudWo23_!I?hhm%v$Bk{+Bib2^+Z~O=;68uXh+%V17?q{6y{J3floHRR0X?)H&$i=a z?5#)Gs<Rx-JTEO-p6+_V>L<=>gJfEQ3BGgGkhhmQq*|hiQNXgqsGC&n@9N&j&qE~k z)d|U(<WWx48QMCcU;gF7Xz{3O8@ZgN6gkK-O?_(3>5TjPFY`S_so{7+N4bSo=K}+3 zRrx<GF=bfRMrLygXy!U0{<ad0F!9-jYk9o>p}+jZ_iE0T30||MkhYw$<P*&W$H4bT zyPsx4TNdkHgm>|wzW(Oj9-x#az^^ZFkO^>eB*{QB&v%d6n9*;#iXTm4gxocNip7N{ zc;lASMCi**G-Vk`AVa-UooU6e=1chQ8EonZ{9UM{oS)3CH0|;_T(Lz4ZhC>~@&j+& zMgw?1%wuJ^Ke)xTiaBd|SZ^Akd~ZUdqY@Yw1EZ9&7)z(_iy2c$`L!vddzA4K%)#SK zotC>m#J$&n8rJZ=Ymo<S9Mo=K#mw#+L(4fGZsIe+xLQ8U_3>C(4A@^ebq3jWUz+I) z7iihvq%VAQtx5z1C_YX^BZVd-?z;646@yz@VmhvH1mG5`j6k}hu^i}^Js>=}`Uj$Z zZZR(S7yAn;7nv6Hib_I?X1tyw-UeT~IK8+)+>95n590Xh;bg-7%f%T;{2wF^f%!j> zxcmovC~uhwL*ntSmWQw1w5*(-lr!2sK$7C-x*F7NgKhWKS%SW?(=UgfN*nT@ptv}$ zDgYFhye%7G|Kp<<|MPYN>t=e4NU+s*+MSmzCBbsYiS0oS(5lfxSHO8j*6ghVMB8~H zb^it|d-;jf={f}m3T5Otru6*Q<q5f&Hnq1w^hDJ9GSz%i--Tco?wjw-6v^bVxDM@f z^=T64Ok3|(ti2cdv`I*s_q9L86YbiiOiLN@A@|~@t72V3(Deh(_Z+s}IHI@9$82yW zM>kk#YAf3Jy+dvox@6Ex+H!NO@$&J)MkT}6ZX(A#wBhhCbCVRV#8AG}8jc`8#+6*k zduLa!#l832Foeh}PXo1+1%hwYef))l@DRuCu#2}_ttokD9&1V->qv`8YGj2a`*6xi z>S0*#>pM+NxcAVFF{7>%^AG*Q>aD$LG+()k4_T|%Gw<5WPpC(4naxcQ<}{rc4ko0@ zkFLSXFFNF6IP0wz9BW|Jaw5DhoF<=Y?P-M<+$=OSA&g4Jah5gSm<VDz?4hl`%S*cm zeL$!c9CSSj(8z`s<eQ%_YNkK(SIF<9wnqwbF%Y`=1+`p`q3iGi9%l-*>{1`)k0&yj zcZ7b3twl)Hu~ED<)Tr$1Z_GYzTxqB8$UV?u$aq<uv6-8NZauSZQJv*6kXQXrG#h)v zM8SfJkS5IAGQDtl=n4lzfBYirA#|cSqDr2`Z)vH~$y#r0;t19Eqrl<DxXSJsHn*t8 z+A`MZ;B)+aBp527ZUR_+6%Z<t&94cUDapl59cMRJV-LzSYHO;5KBJKO`ufald4m_- zvG?1^8<bDM#)^J<aUL7Nxvr(rH06@5GtO^gD8Wh>q8S+Jpw1>5fn21(lEw2DLIkOd zb`XWsS3ArqT5~~7)8+>?$*$#<=|MJH7`UTVI?xz)Z9B-$8Eavm2E0PhaDXRg&%(UX z8;VGX)Zyv>v;dU>hmFJ=@{(KF2goHvk~c!_G)ktqNG|eVzuYD~;A@q`#G3n#W1vw( zC+e%jIg@|oJy`$*mug;b%=e}0X_T@|#{?SdMz|(c0BCA(>^+=x90HQJu#6NjRUo-^ z3_C(fs$eX4?@j}tlVSf?(PAZ5rZv3HX^P2c(;UxUA+)Tp2dZ}_`^BEp_d%}GjinQo zK@mbciQe)H!))iiEf-=#izWBjSx0Gv6=EtUi*X)fcr;U^QD{YT^_BIQmeL=vl8oFd z%b_SI9ORT!f*?4kX}Y4SJxL8!EkgY83S0*O{h1ZUzniwyg?|{g<AK{Ypy1y6EIXUS zIc!b(xo0*xg<{*Kq)OmTsr3F6KZx4)H$PbNU;H4%9qi7*GjtWU$r;>{#QUX5aV}~O z%yjAxTU5!r5g1&GK!g83@`A@mOc}Rz3+m7M1bd`S-XDN`mdH0o++M#mfWqKTEZ7uu z4%?4M##OFG?BH9(9{=wNjOE7zxO^;|FR8QbDV7^F=r?xbY++Q592worSDC^_mG@Bm zB>8Kt;bvx&jmBQ&(aFFNOXx#<v}41fxCb<m5cE^7lT+d!523Debinxpxg9m<g60FN z#+zSYO<vV-1u~)2Z?kkWF9P(rOWEWN`t_2Yrd)3_A8U1NfPzkxSZn=Y1l~;1+ueZ$ zc_4~p>tBk1;jjk|kLP`OTQ<;810YDO2E%;-l+lCnFO;!}{=K^&1Sw$A*E0V*p^^su zm~2TR7)fzz;Z}nYXkwv{%P?x(`M|lP0C>WWlL0<B>jhQF83j_H4mEi~@Z9w|LNH5d z=yqN-P(nGN)N2N7pWYIr9MNB{vl$8XGj=U|JxJD(h_{#dRcBIE<8mR?bV?gAZZ8kC z)LI5&yg18oztU*lf5A2GENqlGO<WqzB4Vihf|F~x`>9*w1rX7RrTpnH+u7Q-wmP%G z5!R1FrNC>6*X7WeZ}fah$wzb0)F&0G7V~b`i5o%+EPc^M@9$hpwEXf1#7@1cwz=30 zT;!QoyUaE`itd0h8Z<WCYbQPeJKTK4c%ROuLRm5=UVusz6NvZ^m!#e4R9{MP_Jveo z4K-eN9Ys2CRV`wcEgmm3J)~R<42Ap3zROVb<{<&Ha&aC#pUkrx6SMfJp@w_~R(yj1 zh9o5;pv=aG<*8BK3yJ|Pr*RB;StxVpGpBaq9X3)y7^8_t8{GCQ{nx)*JFMYV$}mbd zTYrcU(Jm*5Q=Mao%~2e*6!O(k8)8}sJt1dl#b-%f>W3)&EMeuFlMBU&bS7uaPQIfh zG8g_UC(AAbU<=~BA&XH6vbv@pbkP8+PLH?_e%MvW@#%Ur=Qby5>M5c)pA4T~`*Y9Z zr)TzwPh_Q}DG+vey@^u|iWc_c?%OvP&5k%#_Cu|;XSP!YLuYOBZc{|fY39*^f==ja z%2wHk+&K}P&uCt6y07tidw3o1M%w0j;WQOl%kFXBox5;K^G6g1k$91uQ*@p01ecYa z5UyY5aMhL=p&i7b`*T5jJQL@6AXFFPhekVY0Fgp^oIvFHLoCE7-%0GBpWH_r65lvn zrE8oMh2!Y15F2JyyrbqUwN>+JeLLYz@}@HNCQbJ3pB}%Waqt#<e3mYT%QgM?RZ@O* zB@7<je5&Dwqvx46M@JP!<r4ez+ZKY_%ksKLlmodwm)rL=t=Z>ogh(iY^1U2&FLAYy zyXo&=kKX(nu*Ae62-L-gfs_8`p&EsZOkGm9uXOM?ILQ?VzNT?v0=LWx#e{>eX23;a zLw4U`gi4WUG-nqr3-ye|Xm-tqund-%GJy<93mx~xVZL2IO5;v5(%W=^UsWGftvO$# z{fOsB8n_6E3EYN%5GxU{G0vG$wHhZQiG*qef6XRIfp=Bri7c6Efw*92goam9w?Uyq zH^mnr;ApzuUMplGhY>@9;~f;uE-G45SqmN32x)SkN=P-@m@)Kj-X(Ft;RftXq;O8{ zzcEEq1bE)0uwlL@r7>lQ2Sip>(~?$+H!p#!>P!M*o?axK@>~cwC~olxeU6$Uzg>Up z434osh^+iEC?S?A!27FFP!W594en)Yt}gn`Ty*-cB$*gDS1%K5i&+n{1Rifj#B)D0 zdk}*ht>Ufu%~2Y^m?d07O5%YD!$^V|G&I9^8o3+{0W9Y4Pe3G2y^L6np~qg|PQ8!C z1Ykl+sGDD5;*(apd~OlS#{bxq-eA7kYy#c`Y)R!E-f$P4S~!;f0v*MX6N25(`)}rm zhAYHHA4VAq=U{7R4x74R$#C3Zh1T7S0oBZIj5xnPepNDNC1%4w4u^{+*FH;C%fCEP zJ|AMp?4OXt-q$z&&1XJo?fQJ(u-T2tHSOT}JYaD;4n|(8Wj}R+P*_>2&1%}cThCj4 z{>B?(yA0QUusdVJ6M6K%+9vzjbF>xEn)!q05XZ>A3>mQg0@;HS55>i2*(zF21qrc5 zeCo=A&r1gLaK#&{$9JuhASeDwlo}gs6lZGF$F>C#%5#tLm1(?bL=wMfx`CV?8r%_U ztSw7dA!z;MB%?K>ZqLp)DC#CfggERW_0Bf{R`z{#p@{uswV?Sx%QqsZ{hOt36Xsze z*UTsR$1)P9eD!X44*s8a2jnAPxT?;+jdtnAeqB2MM_LC5m(S39aZ^)Lx0XrWMug-O zhScns0wl2!9vcsirui8IJqB9li`8gWQ$|+b+pF3H*}b2UrPV%Ev>oq|_E?X`a4zTE z!jYfEu;{um%X!%D`pzv?jZzE<a8ZVakG%_#NID{=BzO{Pwp9dB`!3MZL-;kd-`wqm z-0reOF{^_p{QX3^yJ^-1o&T1x6M+i(w~QUTHu+jMoTmk}?A1oNheQ9yf6<Oq0t&w| za9<hM3CWSc7<iRpg7yXHtB9YFCf%qDF2Z|Vbr^*aPVTOWYNbA_MCoNu6lX8g|BOdA zDIhsGSfN{4@voulZHh?G{;@idbvcONQRV{!G;T=H_L`iH@2AfTfuEreM0;x#HTu?S zp9HyY{n$1Sei0`z^%c?{1;UWSR!BemA>Y%$fe7Yryt7M#BA!a1r?Ah}meIs7Hq)c+ z6oUW#H#MA>9jqkFA1rV4vL%=p&OxP1ZH$8{!0RU+E==$ra)dvR37E{6s9gbCc4AW7 zp`QUN3bRVB4l|HTTf=ta6qHBexM=ZZV;Z|+T`rs%fy0bN8pXU$UN7m_FO3s_!H!Q% zTp0z_`?InNY!`$WSs#o6WVh>My9f<*4_@{SCY<O(o>mcsaB5?p5Fx|QY$Ku%X1xNa z;sxmWwgnW#QgK-EpYUh)X~KeWqSIg#%)Tw9h%o!JLqAIxQfMN~-;sv2@ibM?W9k(D zG-0QC2?jBqxokQcp^6@W-xZ?>WT_nrdI5yvlHccIcpF?iPV@zDC3I4QOM3+FV_!~V zP!YG@>WW#TlGF&svL)n5r^OxFx`6!?O*eTX5=lVD|H@H+Px5Qoj1EBi?e{p1PztB_ z(L>donbeMj=LSZn{Y<F)YKMMS{e^rgiD)-_kLvPypW3Yf7|t_bX}z@FDwA>S1JU(4 z;XA8xTeZy;5v~&xdi6nknl)zkQN?CJa~DazG6vsJ7#4=MNHx1I#ZUL{9?=!{X4?wg zltDX4g6E54>pLGZKT6YlXt=xK1UUhIOjJRa_Oeaj6!$Q9yYOclO)smbV&bP&alJ1r z->1m?XKufm-%meDV+NXR4A!<On*QON3%8SKjQ#}A>QOG<z~+t`{Wk#z0A1C7$KV^V z4Y9ON8b{pF0Ajn(z>&l~$w#JuM`fB)pV^AOWVwNyOENWL<*_Q~Hpu>IpXP+uz{DNH z+c^lpPDL-%(+L?{x9OlRG9}<S$6ro}rUB}DA<>u;3r%vlms(TbdEq6Dm8*4^E}FN+ zzJh|nQJp$&7+>LXfNxLZQiUO80@2SPl1%4E`cm;33M-p2R9q)>-x_|LoKZ16o_`6d z1?n%-%0m{)6L{fvCA`+(34(q<s5t(X#(%(XMOv;_A6|pBhj-C?a*U!*N*<8LP7PpK z6Gn>A_sCA`#>!yoJ^4k2LJVBy18#wvW^wOrhcd9n&z1A!R{vKo4qnHZWc2$tI#CZ& zi3=LAo<B4z(%>&RC|0E)6K1LJP3Np?2G-`7x1&-g;<yY^4~=;e*DU8fc~5ZNifST| zyWEvJWSy>@t#ziR^-~U$;e9YX&HvKCTMZE=;V0wIW;C4xX64Tb#Y1QVd4qkLRn7Yv z+H~y}v)BIey>dD&(UliL@&6`)Ki89LVbt9bY{+E;gpEaZv&G}GyKH|OiL@4e=la%W zSbN7r%+O@tqaOi-m`doO@cp4$iB9d)*2T8wWHcKR!u{~BWo>1J&34nv)y3uTB7-fS zSgBlslur{(c~vswYoxSoIQ0Hd(_W*{$;RDjq9lvD28!NQ6B3wcmqEcy)7s4JsRU-< zV;FZliU`1I3XTTIr`MiwaZOt|PyAM1vagyUY+V~<0Ux8l6B=`{qDjNDE6)Wx`4PXb zM4#*<s_D%}DT@MuwWNONLdUyo!eNPZdu{K%buhn-1D!Rp9>X*c4Uq>!kT^RRFD!Dl znxRl|BUU&=7$C9t+Bs%kaXXq|arL|suk@>5WV5a<<3Y3IP2)u4xDclPc!crM`aXTm z8PWzJ$+*K3cGB)wr(Ls$Y}v;utAQhsD#OsTdOU`l2a~h690{+(smLY)<Qct-BJrTH zXx_biW75hgIvat&ySn*3j)n8gK=`^R!Pkp}DjkQlF4f)!v%Gb(YEOgH%v%&Iu{APV ze;Mf#VCRmkEX)#mc{K)2*{{XDKx67@W#7l!Xp?FfDoi&n8EicT54zHl4CmT=)6v56 z3I+#tZB7NdRdreSX$PFCe~mdr*IQDc2Nwt1Sfr9^+{ds+dlqJ<=kF~$4{n0N#LySo zn>nLlz_`u1RsLQAC*)upyDA{2c!>v$LTyfkc;++kb&flVDXBdkQLXg6WhIvBg0)Pm zP7z$`d2l;VPDD;TWNLJKe%NTf4Q`oE_KIAJ7>86NhuaI3361Y`AgtDTV6HCG)=4I_ z+qNPkC84)5Jl5~y2wq$bt<~SaFTYG8`Rb40E4`W3yp`ZSu^`4cN?u(gZ2ubHSQgKy zmk`KXk2un8#kA$-M5|Yu7Ihqiig#ZrgytoP&zqxh^_it!Ny=LHS6B}pkGhp+h-Rw~ zpnt0tlW_>c#ufN1CbPS{(+e-Tr!(a~G+UP{z{4=YQc{3DYPlV>VjLnCw4dBeo<(1y zR=Zl}pU4<D;lQ<gpxxNq)}7>%{q$_nS<dBP{KXR}>Gp$`x#(y#o4d*Uavf@|{c-Az z>5$D{IlJdY5@&E|uH2Oop4;-2N*Y;~2y%gqe4QJJ0_uqHbQS#Alz53H?{ROba-)s> z&(8fCS6oNLI}{R)Qd{k`6K7;n&(HwU>ypOAhx7<6VMmTDcu*gyhC%LjCF>)tR`E)t zl=(UNhdPF$Hs`5CxCvIu?6Sfu113c^(U+@YCQgy#7*V9FO9J0SIpzCKOG%c>RlY7$ zDN^0N!)kEnJFz#3RV`H{Hf9?J4yngnG3)*B#fMxKqb<JbzDiXzWeAAd&_AKD))UMv zjdf0jh1m_^5^*^Zq(#<d$Vp79(BfN{(RPe<3(j-SY*p%3>=<%73lj^@Z`z(Et%peP z$iiELZ3<%OT(Fd_XuM|DW{u3JPSU)f)wQ1G#h#<9as_j(4|>b~G-D4ujx;y?*YG(| z?&zFUQ*PGZvT>HI9|V6LywXB*2Qy`An5S$yQX1};>l*VgS%X<amkA%tct6*z_cmlM za8klVl8W}`QVjg+I1>I9_<E(O+w$N*Qat90#9;TK-ArkMU&G}I_CaqX!0N4BHS}jq zRzTzm7o{u%i)EZA2zh^6yy5)#RTrAZi+Dw6j7H({iyhwNAuyB@@eZxHr{o5^>2R@I zOeO-!nhhE#Je7$eJ$udZe*M>DS9%Bgz0jd<yBn~Wz8jIeBDGELutggC6D@THYH)gB z#`WZ)m(l=IqM^)99{NZ+FVaqDXDQVSn3x$6^IGk5@Wk`nF6g<>jV5>VPWy#P`g?5e z{Y&9T6;~8CRpjz!VYOlcqbVWBI@*QvK!3$FLyPiHF`8S)+e#Gi7)O|86ro|9XOAIU zcozpARJygOWok{3bxp9oRK2|pv|s!wUj)VLw`>)+nbAX)5LubS7;Ee!mxCmGp8Sj0 zg<n_DFLynkDF<K>9TIQXx-nzf5$6az%TEhEyqIb&j&vT8)J4$eseHh5N6~_xuAZ+C z=kEPKd)R29BVaZ4T<=SXEv^a(P)^N>zPG~WW0^T$GRg6YQB9hINUvfI_Vo!p*TIZv ztltjrHXT8JZ&70@t}g%>_J-(s$44W92(4_X6JY=NLEUwYbf;(>iHg3y0YQ9TYtWUZ z6SJX1PQ;$i-R~UCmm^!jgJ4o;>`x9EWsPPtW>He17rrB>CstxvFM*jH705(*bj~1z zk^R#u8`?T4&&`~zhem^g7<9Ks;t|_Y6t$kK$LHCw`X*pa)Jsp}jmIE8f$bc_gVP%B zlhrNN;UvLlO&$bezmv`d2Xq#$W<6y^_O%xxsns0h@C^mP@|jBX1zllVUJxe4R1hcv z2-VBx^shD%4NbdZ@s_#v|Fzjt{$sNZiB4U@!7zFcOLxR?jy(ooV><F49Wb=!1;-M% zShkRie&T`WSNdGbzf6A==PLJzErkD4wE&^yBaV@WDj1289g79}sHsX5;xlGt+F=09 zCfY_6*cP9}EhzjIu?<13V^5<vTiuNVK%;-c>8{wt9G^#_AioU1Ojf>M$~8vDUJBG< zgQ=RV#!JA)`b?t-5c0PT(U<%QgW?NpFWA?|cOtxO;nt9EH#=Qv-{NG)jMY%$;7ep` zvY!;VRB_z|xtw05^VL6;d31*}E6=z(IG({Mgm?_<Y$=b8&?oi&y1{v7@TK9oYb4hC z%I48|L2!T~*n_2joNle*2O}V>3;m`BwkC7{T(pq#E6)$R8uiaAfR1C>pVr2=cW3x} zKDZwdeI@+#c4!t^JPR+n3e9+92)o@JD{FqcYVc|M+{bG<Uu7<4Z?eK~8A)r_(0UX# z*l259AKoB@WA0d`1tNMMVd_KLh9>IsQo12HSnV$89ZdTfcHllNAUXSLu|eY$uW7Q) zNK?EP8F?#<jF`QFHeY{1^MYBaPM41wzu)_|Zfr-A>wF&`UbP<{R3Q&ytb3gcS4!zs z`Qx8%<CIK%7^@J?ce;-l;bRGb(*<SSlTg23CmEc)#;?#ba(YoNNq0-^QrvMkfdBn} zx)IQSLAcEhGE-`zFBweXB-RZ&n1ztA_q8i#pW+J#zx53TvYuR=2nxx-RBhI&FhV=R zyFIW23n2qZu^|W`)eL3b8Oql>^K^2Pz9yI&!a1`c#N^71X7X#5|Je>>a)pUu{1Tq+ zV?;BY8CM9qCe%BpVPXG$2Xaoc>*Ch;@i^v9_g3C9J;SM9;TFO*idOBjF4G^}m!8u9 z?}73EzR_(kV4emJ(O4)C4rW^Q>oFmC|7=wl>m<t)%pj_O&~58oLVM6$j(3Vrd$;Fr z3SP{%&&ogJEEIk3wXAY;IP64fF(P-c65n(WBer+ez-WuoIRN^16bk`kqyKrKe~n}R zKO@rrn&i$7EQ_!`s$X(_9r?cx?qA>k(?@+b{O;r)p>tlwE}u@yqcQRQX=v3(FYkBw z+(#5&-adV_pdR3eyMw=f_&<KY=N1Cggl@3B@oBFZBb?8jnil%ornq#JUrk~!Fkx>z zJ0mayf<N<9akRQSIw)wngz2@?ESeh;FT<#L8y09Bhg1xI4uV~^^EuO+6rYj0GV?n` z*5fMVyz9zSPcdmayr>YDz~Z0f5_`CC2yI?h=69^f8+V(Qz)A-*Y~u@8hi{})6N0tj za%{5a%b|ju8sR?>aCiRS`(y`31SZ&-fp~xmP`#iafq5}HOz^b7NCGXDm_4oMy1os$ z3TYqD_oFl(Z-<ufmsEaYHqdLSQuF4M&P)q_=7%CFs>bDN%Fd^`aYJVZeWy3sGzq(9 z&3)_#+RwbgW?vLaN~C1{fi%~b7yHo1<{6=V2|!~jdIny95L_cEfr;T8S#Tom?w(NT zfAc8!?f3lRF>`JcnycwvNGT!eHfE|4v;Ne5_k6QQ($OB|)@ERV0YW`?o<H1+^tBb@ zd96lPol7Bp?5(0MV@@`~iWf4<Fx{TyvI}vEekjrz;~^3y<XJ`1?M<2QTyozw-pl-d z_5)zqy5WU##rXO`9SCC#kh4FIVYK;Z#{-TrskNG*x-?($AA6Z4nwoi?@@LYJzKhfr z?>FO!(C5lZBOv$SL?5twwMQTdB3#Zf2BGw97Pe>m#Wf*%rKs@?^TSzbNE#`{#{^Qp zi<s8X@I`AsfJ#fn^kn{+cxJ7+%pdFjz74@Hq;K|gI7xif#}df-V+Co5kaT?O(sFz| zIryv^U&Kz1M|S_R_fZF2VFpY%Dm{4M<Z}=aguw@q0x<4!4*YRD<HA!xc@1nUOhMhj z!~?G|;dg0V0zc~?4;aXDC&l~;1=whrUqCzy`K|4UBnOS;)~BSCkn9Og{E-La|MWP% ziRErVperV`=QzSbTwUNAEO1>xL~K`&;@#|~V=-I}g4gnvK=YuA%738h$DyMKAjaXG z!FW4TxMW%U){<0j#w)T^h|>ycU4)%iN#1jksMlG|i$4y`<(GSY)rM%C;QzG{vu@4t z>>>vHm;~)xp<h-tpE)ArFABGHtbmT@^urr8fwDW6j{=m|-^P3UGBn?rkJrtJj{zDG zrKb=LhBW5CL9qJH0gKq@jr2ZQl>t9hjfceYDS;*aM4xzmEr{LTScsxE`rNIDTyOcw z*$xbB%|6P<Qd)qpXUcEt&QX?jp|v`iXRn%1K#n;#G(^BXttB6F=E<p`tL@hpe3)XQ z{mLGNg#m2)*g4}`aQW_j&Lg5HV;xWtvX>sqMyeD4U8Kh#^H#cNd}hZm?U;B8iO*pP ziPh~+32<Ec0V0(Duqo5NpvcD%tljV>q4|^Nv_0?+cs6OmcPmYO&kGAr=v97^;uP)3 zbdbTAC<(?q?@u*bAr2oGZcN(@?^~XxgzBl-s=E_dM>~y#w*DTc8&i8HT&M)P&7~p> z@l|e*lS5UNky*3!R0q+vMv4z&%XT)DJ`#=&O%bYVPN-Mhb&xd&%$fr6?39qWg~vSJ zg{iYu$tCt_E5i_E1Uw=DJx(-fk#yZ3$-l8m9N}_nRSK`JuphPUC=X-cMAX3Hr5!J` z7d?_1p9v{e;a;;*v8N`4B&a4HRDjT#SP^dG_v@DvCq7`zDr&kvKL+xXf6Fl+j)#@J z)PaLC2O`=pw7cc$HZf}X>pu~H!$=f0Fb=}o=?j3ZiiR2HQ}I)TNpl&Y9b0(c0M{@c zz&@(*Q>CL2^pvlCiW^wp#KK@A#n1oXzFiY!;AH_lk2!ABv^(8qKu#c3fwVut7)Hkc zm1|{r&9-qmftL3u&9x@)c@&CKQ<Qo!!PD7*T8R?wO$;54qjx11jfoiu{{SH`$#Af9 zi1DKWt@M;oo9{bpEro7W%L>^AjKfxM#@(lCmn_9&1&0!;Ra+Jx*Gwm1hqR@nVwh{j zz!IP(<SsL!rEzG_<cEzeFoemIQ0FB29)GWRYF0Vaatr1}?hT*A3ML_1^73OvDK1Mq zLSF|<QmSHReJ}XBUzvJ5#-)GJrj?r)_xkox(D)Q|oM?+PdxNI5+(uBV1olwPPv?>Q zulV*qcF(^)zD9kUXiim}B_v*F1wnAqeP4J}h17yVWU!DYA}5AWQtga{sW26k8C}WD zBr2^u<Nq^LYW}|ZbiKG*6sE>zxO6yma}n<$Y(g`LrT6}0r|{XhhXf`$k$<$id2DH$ zK@s#%=5UXH{e%4X5`%{v-%x;Ot3b{t4DJb(<xI{>=`!GSqqj5{7&D0*MhgXfe0iLI z2ixH6RG>w*OAqg;j_1p#c<GTyxC|nbF6&m_2SE5}`jfMP#KV4`THzCLftc3`$j2i# z<hNtOT!1}?4j3*bsVnHuLOHoU<W@*&hgK{xym*dT5xaPVWyi%3D}uUOo+`*IheW*6 zmI@Kl`zSYOn6#vKor(Y0lt^`f`0a8c9)EFR?L<Wpek_nN>Mn?r6%bwsaY@=C99;}0 zdG#%-je4QsMRWQ1M_~#?!0!$qQ>gN3Si0Xaq&Tu-Sj^T5650LrzG6#Hy)vI!D5Yj< z-AwFBs)=_1PpTE7neiICH9-%41eoC~qOK77Qh0^qQDvwSfwi<`+s1?9hu-P2q?!mU z>qW&$fijSIG=XfE3VH3_En*tLt|+&&k(v&~-+L%$vWI~rfIJoW>~pR7K|TU2ix`bV z+<b2}8Zs}~Ds+%e_rx$1?I#*2>D`UYE^r{<fZ_G%0LJy%G^?O(cxg4|p|@AW?D{Vk z>VGx}Ej;_5HiRq$Orm5&Q$9Yr{tnFt@$^h-OH+{ren-oyI9$#Pp!V9IzZC>ZdeEk- zdj<(-eyd8|iRB#IDIavkRH$~DEBr=-ex<q@$3Zd=@WQq%re&k}b@cAT^y%}#y`H@i zoN`<3EOF<6s{sTRu?pt(IPdJ{5qUhhBe8mS)MV`Ng<dRV(4ml(r`WeO=eJm{*@oq+ zlFbRmnjx3UjG}=6iF{RX@GeS1@951g@2K856Ph2Q+I7i`6;gplR#1No;gSQ3y6Zz= zMPiRNiNoWM+oh_^jLwt`R$nvDPfr0aBp)(3iFv*u)cRcrx|$Go^w8nF={I9CpWfq> z0Xl}fniCjVMe2&mkA)?yY|R42h3MazQ(GgHZ_@~w#Q=Gq=<)tt`_GPbNk-i3W5E%B z5Oz(fbpPlq4yZDJi=eo8P4JDBIQYZK0vPa4K7Wf=zLHb_vtrS_ynS@oq$d|!LgeKk zzLcllo^tD<0dob_xsV`Xz91!UP3enqdsv@fB0C0nfImrAYD&|BYwizbChHr!PFYWw zYNFtzwzGc%90V3ZNJ)yk$)HpgSUz;<Z6eFQ+Eo}4CdyuCOI_LUc5B$OKfQc3sdz$# z+kri!Ypx0k)qhb6zx6;5`uanPS<{k=2K)F=L323_!+iXAutdM!u|9i>^9U}lBuP>w z6c@OCM!2Khn~MK%KmUEKZ<B@cKjZ45b9?6kl9yvg%0wQf>`B(R^5R(Q@j7wv%Zv2L zhNRL1_m$8$pg8Phi;CLHU=`vcMWw3|C>2||%$5U%yi6c<(qp-jJxn>ac?Dz?&Ytk_ zIC9~D(dp)X*qDT<LTbF5TfIrkh8zzQh5gLJgd9!a^pt@x#w@2o$TC%vRiZqgbNUW! z+d_BpP-Dmb*?p%Eh5IUHK`4W(w7^Nb)Z|4Q^PDVZa8lh381WELx2zeNGab{K0GIHV z{s5`D`AJPxF?5C?J}ieFq>e|&%)&xYV}>J%dHFhC;TPAPD<12TE3y;KFdJn6hJ-1c zQiLZ_*rinPNoQ$pafYT0ZK(Hx;oki%LUMo1@*{=LWrtm$dxm}oHUwUV%OMz)>?i`d z6KFHzGEl#UT224G8=sR3UhfbWl!uaY&QNF8?vgUPqTR;^6hc;fbgg&Mq7A9X(Rp%0 zYQKx+g|LDF6;732F=8DyX87Wag4~!9_IEkB;OpOv5IA*dl1nr`RrfcBIJK5XSC_Xl z@j@g+ifISie+AY5kC)JmaEt}~DM#;2aiTEdYIE?E4B?gD(Cd8IVycm5=8l!Zkya|Z z`;7I6DAK8eNX<8FO06Van;$~@xTZc2+1cf=8Zv#Bv611;*367Rgj_@-blvNac%{oi ze!e^)09sII27)?>PmXKsqEYphyx|-h0s@AxPi@IjmC2TYmEBQ&=2T_=9&>LnK#5GI zXBi@0Zw{ANrO2eT(u}`5^+p^Av<o;(#kB5VO)?4-DR!BjMUY4oqH89)=$Z5>lLnb~ z3jF7%>}R@XvN62|LP|2LzLhxp;6zqT&`+9q|9O`OYjW-*b-mfhtnr|pX0)B1dn*Pt zymd<TL!E77G!XyIsqKNd-GG!8lGmbz@EZKJT{^Abh>3d($M_=G;9ncIjw|2=q{Ic3 zSA{D9stRF;)l>*Ys+e8LtH$;onEpZZaL1Ta1?!Vz%Hx!wgXRSKV+=_R{@UrU*pr&g z`TBY*oSJQU)+eY*zdv^hQ+fM1H5mG%^l{QqA6WLkZ)JP2;%Mi*ppVtNhLIlKAnkt4 zD0-msW&ZvMGN%KV+xw@`2^&ZY6xx2=P-(>yq-9Vh!~Sq24V}lD<Z{XjsRjond1!xj zp(=NJJ|R|Zm0!jY+48D=E2eiDDFS|p*#<>&G0WPx4_TJi^9>Qq2=+`p=9_Q`qlg_0 z@0!b^@L;CWDp;VsEnbJY5UUpC(owcWZ(%aEeQb_!CqFK})jlo~Bd|Fy3Hus_4?KF< zZ*3`}Si(3}8YUA99cLz{pK($DqXnScxmj94-B;Fb$h<lu7E}}^;(~Z$Qyy{MXFv2t zw?e1!*-@Lb<ztacx1r}vWD&KzTC!V)?H?K0EhmY=O=yHU+t)t5aS<tB-Xf+>Nt=@w z5}JY<%+W%A0ohxbVblE#q1Q^K=@4)g$Z>}jhIhwVe$%&UG+i>)_ij$)U+I*|ZjY*B zO-VeX)^6-T=6@*KhLcpURVf<|r1a<4FM2xB$3Se%H;$rtmrPn4L1Rt$L2X_X|L+F@ zN_Pl1bzyKfy)Pi1@oHNBzYpWZA)|(R&2iavmIJ1fh>1Zd@@%Vw>tw`8%V&7v5_lkS zL~tNtZv+NrfHenqaC0_mxFvp`p!*^3(dOq786gP52A+3-5?lD}|MPObL6F}$g}pH& zlGkU4QzU8Ky!u`aQvHePDR<@=UTwyB)9M4XNS*YTirHQ1kIcjq3d}Uap1IWY@70^` zW>{n0oQUOY*OEdwR(GJ(i(&Wt7KzQ3hlN2QP2M51LN#qNY)TS}`cqJ>5o`CGG+GTM zZ+=j}jIBdv)NjfF!&l0SW^Z>?%MFx}hynV+g9TA(7h%%ridE_-O4WoJQNiwZt(!Ea z3BP$Hu!4dGGjgU#*+^D^j83I25yRUp^Yc?&j^QduS$QW8ZbKQ)1qB_lsONfG!1`}$ zOT*D~(I8$Sh<Qq~CuJP`R-%()I4BYnFt=&S!`%4zYcn%`oeBg#|42O18A?k%hwu}u zoT#J#P4_qKwEbjXI%y4UQ9=Zn>OAN4pY=DnW89g3M0Ps}aj#2Idbc9v474nPtP=It zA7?oJ_GwmA^Rx{(<2~+E4Co|)x}zN>aV(Z4feGR2<UYaEe9AJa0}Sm{)IhUD(w6wl zjC{})?}|ibW=A3Q@(%?R#XWVo89(6APq%~V<=YGIO=UOemeIP@RP2b<dE<U`2~A5W z1@h;!nZ4y~BKZk)Dac)P=}cloC-d@JUt5HZl*+RO4aI<nAn1Nj5d*>txbCDQYu=Yq zn}yZ^v5H1rMkD00-D!W+*9L4!teR8vp(Rx;4r&PZq<{9iweh#Vg1n(tap>Nm<?h?V zOH`!?8nk?3%z^P}Zo9tFSTSgVNfxtkVq`-2blZRhe7$j=XvF&_EPW$0qP-#<$A%Sx z(D$dE=%I*%e^E!%9OX+Jt!j~ID5{6nB@!}_GC>xFmPZ$<<F&S72tj%Ko!oYh8#IbS zZBEJ-8ykQ6YTzeFRx8;V<((U+HttE=6A3B`#U*9O5KGQ9vK5H##fqojX@bMR;?xjq z2oX>0D9Jdw@j1*WtXkxaG)@}ZFZwBcXAzeR69ztz6KBz#buHLM#&FQsp{$`^x^s=( zjgHV8L#A2dm+c<B&1TH<d(oZ~JTk}*lfberukRO9a>8z#WX6zN3!YddG}7=??Ukx6 zWW9^OW#?^mq{DWsYexiB4w)aRDE~+w+Q)Rq3Go9eMADR=DKvBE14Ya(Nj{a(6tp-i z4&ZCeNrN%7u`}ZKS+b@P^~@)KCFirU_I*prA${F0%}p21hFI`|M1s3xUmsm$zMq~@ zWwrI>%J$EW?M-X=Ag;x(y87aW4t6-G{BLoHrq?E`>4j&6!4qCZdTCRXD^1hKy}pRJ zOIko+|Fi=OQ^t0y>+<?!Vuev8I8Gj~fwf`Phq{q?*Z!YQV7nOvatc<e0K}usV3WCg zc}F{>%@s=8c~f9g(g9s34jd?W|C71;?W47rgsaEgX+eb}_Sh_{5QS7;KL5w)3K1XK zY@8H?Br(`%oW;ikQMn9(j3NpJcPBg_>OTzijVV2{tKAa@7xaH5Z;Lr-(~e!{GS@~| z7b1q;3=0<?au+7s*K}dmm{sXmlyu=^MR#}D@4Kjn+D)_-L<~QBnV*@n`xe(RpW~=x z&Dsng#QQTPX6Vf(4aPPVsYLBpl;U~v!QVPL%?h@g2pt`ECp+xMMNyJNM39Ii1{D)- zGK~a%4ifmc(@JuPq~6I_A*Mqs=Xiqf*2d!pXkw{tJgep7GE|K?xg?K%iLJ47new3) zHXpPk(ZZvfpATdeNh~eLdw}4+hVYY}R#2MPv!kx7f!1r^m=hhh6~Y#YI6E!AofT_i zijwh}&E(IZr%*4aw3XE3I6Lq%E9U*w?I5uWmAhL1MWM+I5Iq9_rxgIiURIzM@rm^l z>R}%o1=K(Osw>DU`f+U&g^H>gG(5;${t%`f=65<omOh>&Pz$S8&3pXGZRfbW*<Pj8 zY8G?0+}e88u*gxwq*^1Y;ppYMpU@1qt#AO+qt&SR9Z!W!GnETE84ppc^n0{~7}*-- zG<Lq2X&m7)((7S4FTjJW`CQUKi6<lvNalojyrdz>hF#^NiU9}Y2>Jb}0_k>TN=veY zpoSIX>IOn=ns$ft>L&W8{!bSE|Ag-P5ct~^m>+Qr7;u3xeqem(+~JisJ*5@~RN5_q zHq!)n$H1IZd&&<GQFsWEEl^ceM_i|4H-SY^@Hz3#)Ep2z4T_#eB2E1Z|67-Mq}c|? zB%6#SnwA52tj#&!9?3k#tT|*CIgbD@1_!uL@;@6fS}@?~#s{;rM^TM5Z@wlpp<)A_ z;wB)m+f*pgYKTtdE615UJcV*tLFHyXFK#oTw`^MG`T01L`UxJAft$yxis=~(YZ@<w zQ<;m)YoN_bTFA%tX<h<AZrnQ{+I07y57QVwM^NTaz5za1u96+KzaEh#sD~y?gG6@2 z27cSm0tnUwxE~_5jmPg%M0OJR`dbPYBm|sj3IF^T{wq<rPYAfUL;SAOKZQO2<yvne ziUO7{bb3NcfcO_7FcUm|P@w}sgaPuUMm;bEeKS7xYD!`v89vqAvlJ|zw!x2j6w6DD z{8V>*kEpk{%hB)D%(@cqD7$n%-`2+I%|m~&PqIbz%!!LEk~~`JKz^hWPy-u`ltI8b z&MtzVadgOAFT_E1DH!~ci5Lo{0uEeI4W-g;*ZuoWw}FY^lRD5V7B^!veiG|$C%D@O zMttk=t!Jd$S0BR)4@bCmRxI-ivm=g);+Gc2_fi32Uvf}9l)Fk`1D@wA+Q9EX$U#47 z*!Z|#?Y=H$c)~c}<_!@M>5H8<uc_kqPVxR?hW-6Wz=2$o0Qn5rF>oQTy6dvP8wRq) z?oDnC|66$bDW`e}Mq)E{_MJ!7nw<~AWZ0-|tQ{3jj|oG;B6sH<q5bVu^rg-1)O2U+ z>xE1-Bf_FTgKe_gQe?9@$v+CT<{1T7hXtv%BEkOPL2fi<PBbhILsvXzKJfjdFHu;< z=|myBK*U5zuj{7tx<1+>3iedsW(`LDX@q}i3yH0BFHl_^lAXq7eJ*692=!vKIObM1 zRF*4=tOlA=i1SmJW;QgpRdXg7BSH})jh1x;{%q(T>1Ii$M&Cd)?whpQXK1R!*jCW< zX$tG!Cp8~IHN^{Rtlk&>WAAGVM(NS~YqfT6lf`iF@xv7%CA^uYD_P9@TXQ4&yOlZt z{kHYONIg@f-(K>+iXmta{&Cl4L9gHf6_4%wB#&LG<0MbJs}w(S%TUUvF1yD7a$kIN z0tfK^8H?-Dm8I~xZIDBqTA|S#R!lVlkoVPI-cN6-2v*%azLnh@SJ~)=0mM!JQ7mzf zb?R}u@9R&~2!m^oS3EtfGdiPaSeCz?`^4W4rMRONO8NuTNCu04<Ynrcs)OjRQYVp` ziVN#qiPyQJ1iJRiRYExc${fxA)574K5eLu<G@P0q6V&YXs)_2CeTsLp=?kYBj+O57 zy}FYd2Z*%854Z8f^XBT}k!<d@pUQ43-^tBYMSssTLtzX2;9??`nlb=IGn0)uUj!ix z!HGK`-HN0^WnqK2<z@gTfRO#Go{YAf&}}7$b?2r+iDthGj7pVysN#vPXHCq6oH^OF z_Hsat0a!;~?gQg88%J30jX1dI`x;OLtM|PWcl@*M`^h57^ZtTS>eF`DYd?ok3#Q|o zIFc2Hk2U|o<<IsPuPt0_xIHvuxSCEMiO23}+X@6N-B2}OQ?Bicp6sRnkFR%ZjIG_) zb>BE6$%t*+wr$(C%@Nxkv2EM7&5CW~WUe{a+WYK-A5it7_ou42-r99v4H=Tuq;^G^ z<w$yEV5FwzFpY{wc|A`f-#^?U+Pbh{L;E+yiy#B4@0;LeKKEQn_gEHVs3srl-Pg{~ zjDiU38=~j?MU3AmrJTt1!fx9Gr&|WLe-JCDpNR@>zfUiEWLr&EQ^hSeTS=-It-gvf zTIbLFgd#B8zOe@P*>`vFY`M$o^T)fb@j)RProX>!#dLNSv<{mt?ti_oqoYDTz-)IK z_TCa$t(ft7f~>?gG`e?zPo!M-*QD^So&#S0r0zh3ybZqJoc8#JBjY(8o!h>0Tuu3) zQK^1!S-T6lyq}lY5p`YYP<z~fFgf5EWe?Y-jF)`hW2g}do5><0_x()(xFYxc;bahz z2X$jk0o>eDN<xaX%1ywlf_f$1c>)WrOWx?{HdUNG-@o;y6fvKL7aH*eW8JMa9hSsb zWdE@kV@PAl!`L}m`t6Yp2K1^ueCWei#;v0W3j+MVMoh!t(v_KgRM0Cr0uj5}o|&Ut z!IvGd`T4)Y&{?1(7e2j+^wFbpbR;5nx79W!<JmL&SgBR6`WT1Q(n|CrBJ;2s7qWYe zpo#LRUP0OT?w4|*#&vJ>K5j6s<eC+{70Z-XzNC~v-B9*FOP2M&J~D3ka<E0H5=&L8 z8M{#Rtlc55t<__{v#krGD4m}L%4Q;xu)4kXNI$OEXoGaV;Ip%3qbuPAsLX$H)gJb_ zcD}kp@OsF^LPeA1n?me|U~Kv9h5cqTzd7Tna<}Um`th&I;)Y?D3F)W#pd6LSb;RG7 zp?bU$D%tQkbjMxJ(xAUdRk8<L{V?$mXK=Rinb$;Ya6y>d@YOJ+U?01odCRf!3e>@< z*k3O{du32^OSkV_)Tjz=Jl}Iy)gWEzx)?CSj+OU41vbj}A!TW_f->K0^4~VT<0!@s zZ_LGm{Jh~ih2F|#Tu0OOeg?YW^;MjHuHXXh)BpWEqa_CpQ6`x_&IIZAqGC|%x{t|) zyej`dpsQ{}xVQEG=iF(0c7cs65n8c^WoG;5y-CjYi|Z=0=bx7EBfC|t^^iaGrYqL4 z;6jKAi2?8k%R6gax5~J~T@9$aAy{a;F)Nk7p(aUSr6=K&{#>Zron%PWohv8m6dUYW z4`rZ&wTYBkUGnRwaLA@IZxrERhVw!~Jp|Rn9=>?j5@U_lug7=LK<r$N_GKsR*`ZKx z#s6jUAfG+i!{UJg1iZaFPyyc`)1Z5&rhC&8ZSjVV5NuX)CAH0<Ay>WM_F=tK_~EB) zc3?BGW+HEi)xKt+l1D(xs5+ZTp|skWuzG)_Gp;IHpoMu*9T6z6g@l;m1w~NB*sybQ zJr3kBKqo%pLNb&WBhf=_JVL!ta@OJQ?6VN>85t7-si+sQ<F`lUigqDjpy!qL2I^aU z4VuB4VwK;*Y9P|F4dVCnXO-vUWZZ&e7Z)J+$AzSxLXWuzqLp!-x(KYm0*G;oNKURa znRnc-mu?6|Cf;Ybg)%*<U|kljhP+}wVUQC0hw3${>Z|}2FH<``NrMgm^e}T5m@SqJ zAm}zXbtfy%+p@lj$eN*z$9$4AF}h9vSY7>#DaokAneIpxsd@xz<;=?JmdXK~9<Q2I zn0?|_wR(y^61=zl|8tTTVUnMqEjQWV$aDKqkfT3V(gHYR=^1w7uuC7erxL{6yJLc~ zBzWLj^cSSF<94V4Hc023E%AcFZ8hn_OUgK_6~gh~NX5!kt%L21)Mj>0hy=IOmP+Xa zNO)}6%<nwuf7`9oY_hrQk6{6cS62^YkIPfH#_NJQ(>ed8y?9e1>*gyAAlQbp(pBuu zxlw6&Pr{D)Ziw&NM7dFX+<hO}xcS6zas#+S9<@`eQc<v5g@(*(xIc{P>CZLRL8?Ks z;i`x=@78hU2<Y-9&no`3WsH6LttXey=Pc?dccF%CJ(sznL>MrSXT0hS7<I+Sl^-&p zh4h8cw+9F{=L?vhX`pU(Crea*#S&u9dAim(FG|h;G%z>+YLmvf+?E*Yz+m^=jpn?b zqf^Y!Q-<igV8T&$YCjt(tD^7UK>BcJ2z;v0pXUVCkC#<~9MzMn$l@I;n(h;U(k<iF zf?F)uq0==45~y2;H?v-#5~If*C!up%S4;w%0XEW<KM`0nGa~fn-$S<8Y!);+?*}P6 zQwDhD#~>G5O5#ZDoYN3FX?VT`&4ph9Z2R6E1DU{c#NBtOgy-ME`w?T}U9?&!B)_N3 z6h2n;@*l)O9_F5R>wBm}W5>lV1QM@$AK>f?CMn%ZF&)0#R(3x$B1yu40bidoUGE;; zJ|l#KkvPmeC0e%^S+N-#A(_4^u+h>CpSJF(Mt0hu-~3OR54q<*9Wd_?31+EJ@V&IB zX|0=&2i$}AZ>Y7FseqP$BuFBz^{Dr0LPJ_Z`EI`BIO((|YpeoHM?4R@EN^WS#zIwW za@Q%1xw$I2asRvjuPDOr59?^BAGRQ*VCGwbC3rPJlW5Mm=!)Lc{)P+iY7I;3m%7cD zSFzwGu<HigeadoY&5vRec|cQPVcmZ6Z42UN!1+ECEYHfpK+zB6PhHpWlSkWtf`m7A z)L9)nwpZrg%7XB=eoJ<`CLJ|Y4<iNxZprGYv(fhaW#=eE-I;g&u5}Hw0b@z&W6d9H zE-!}((tk7NT5FmRWU@F*y%$fozi_KHKS_xY1ounH|IS%ByoobpVO{&*YHFLZGWLi2 zm$3iE>CmT~H`lIFbOktH0U<X>JUE;J=xvQ5JJ-s(v0RR4jIJr_@may_q}vIhBLW84 z57PtE3kF0qo%aW0@EmB_QJh9X^COFi`~0_0EULsbBIy$HKXb1w`ffM5ljw!0RsI={ zk`eYMex-gg4$%N_TvF5j{xY1CTqDDDG95&+gPY5xB}Y)3iX>~_X3P+FLjT1-T&RGK zu_yLYn=52x1ac>blB+CaWUyw!QR8J$0#`p8!7;4{L^HK8I2#zy6)L|<fsx}uWHbya z+?XTgt3^Is67pvY!AA{R7Kb}TP_a;wfR+aYgD7xU;#qKKA(}P|ND>aE@i)n;Z>i$X z5u97<vTq3bzm2kel9_=0KF_SEqn`fcTT<DoKR`ki-8N}^JTS#Q^bdrMi6cKq=XyAL zeE}u;zF<!goE^@XY@!=Ypj;{zG+fEhvYftC*R;s6S(+}&Ya3Ug|Gq;pFYBp?0@QT> zYm}9A{faGyRo38uC4oXw@F~%?Z(}{UsE6Sl<it|84vbvbD_{B}wfNQ4pFtiC^*fmE zRr@g)Ej?-Y#XYf`2p8@YAS^<kxVRg7PLCq>J74h+MOgPz>=38`LM4$&Vs?^<Zz0t9 zpp7VI1r#S20iFcY2&jNUP9WT6tHDY7I~TS)07#lt#QriI+q;PdjiuatvgiEQCKl<! z1dJDkUpKVYwlC20RCM7=4r;vGR;=017jj4U7Z)i!Zu?{zx=2KJ^+%0Ngua*I&f}Y# zdsGr`UzW(~(~_$vMF`<}d+5y;R>eg;mvrLLNUo^7IDB!XHyW1eOweCsP7V$+d5x91 ziFI|2de{z134cz{c6q!|u#Q%J3pyM$vhFx%(gFRqR`^2x@hJjzr%>4LsjN}HTrnjO zEJb=voOMfQ^U9UHHr?1|TDTVokJVN?{6oh|+`NTA`>AM7=PZ&Ur+5hNfKG<%Utnc8 z8XL^HLPq=@qTcY%2R&)GR;1n0&KKsXx=FN@LX2%cY2g78uFm(O)LKUYQg6%|{gviR zcHJ@|<z*Lln=PU0pjPpfwT26+2!1}s#ha!V4OiakoacYei1I1?f*jNbc_BfO^p;oB z-cZZ;6bFDiD`QcTI<g*s%9R8%Am$-T*-C5ZZ6GDax5eveWm%045_#uJnNjyBl<2{l zqI{#y?!ETgR^jo<1GrEs<qS=t2l;+u5Hh``E{KgKtc^0*>E*%SC%nljNh~82UvarO zcevyat^MIHnO>)S#Q4RGAJyUg8<$AL9{MpIVtQE!B{O8n?<?z7SAEo&t$a2&!+X<h zQ7yls8(c@HaPoIyti#u^TWH)E-dCN#O;#tAQJLK0@o|22D{MqBb0PN~a}zvjd+ri* zekAWxZSJ)t;_DoLcR@E0kBwuF2|>q1&#l$YfR<G%q3%|gP6ppd3v*cHxMmbv_X|>g zkr!EsUa}BC5%aH9)rVi&$9>Vwvz_o%^NfN=J?{2tr2Se3UE20iE?d2sKD=O!AI?JR zOaNLNei@H5D9-P!#RADb7MVe&9sNzgx7AIRs570Nyfzwi0chObhn;UhLqV|>Z{mF* zi;6+%s|KRviP-=2C+sN*`Nt_TRFZzROy%AZ%KzXSM{xB|<)nZts^ibA1koe(vR&+k zl;3^jG+ei5O2#DA(Rjpb7T?iF!=lX05h<DLvYsO=i}N*zC{4f3ZCPTPbe5#%f<nrn z#+4`z>`rb(?Cpb^yadu2XMFB<nE9rH$TalrR&Q7+#lLQD?A@19_pLRmh&gaR;c=wF zW&h1|(9jD03+a$$e1$L82X}UJp7VfM=WHLF6~k^IF_sf>C8P*&u_33a5_O72>qk<m zqvu)=NQUU_wAjqy1iByPt2A?iE-%lR6@{`a9)7reCOWKUqX^)cEj$e>;fzA=+ZNP5 z#rP9sJ_p71F9d{nS^57&K#Vjvo!#a_pJ*Kh3;#`k5Tp&5KLj}w#}l?{Da8ilGb%48 zPK?C;bjeVzOf{y@r;jFdaI%6dLh-FqW02Rjw~cR%IfkEdUHLsTPLQREMeN;-cr4AS zs~%u~&=y4tQqqvxIiwR^P=U4WKMi0i=41=ddU*3PE{y^UrW_S+>Naa=+B?u|mBRh9 zmha3Z&oHnee=;;=4&LU%iho2t=s!!9WJ*XvNGVI=b9cUAi6jszsiucsYrX=@m6jSU zo({#k9x;u0+ng|7jjT(6b^6iPxYHm)AwdnlP>dvIHp1(jF3v+&?S&eu`zk^CoU<qT zjz=)#lMk9n)7)7Aupg;Oqj~C~RP+LNy%<BRoB8nA*t0HgDZ(=$#+7TNJ`8n<q-AR7 z@_+QGV)I}UZ%`;geM&bl#3Xm<P8@uasP9L86Onm~+=2NFI|Re2huAlzS&M2kq#bYs z4IKL5Q~cEx`%}JdveqCHowJf!Yj|9UlD7i4YPQ26b~p%h2~0+(R!(Zi%)6-Kxwt9s z91h&Uigmist;oWa@71b`#35vDzmv|y+Z~CNn}S7P*J|lD`Eqb2BhI^8jlMAF2$PIo z-`%c_rW<qO&%^!FdJZ@b1Y7!l^J;qDz6pmGP(Hg<)U>Chj2kL6t+v;IN>#@W5Z6zl zbQ^QU_g#@BqnU13@kgRjn2fyO8&NL+yY1ch2{*w`6cBlE6QRsvoA*=6)!QX0Mj~w7 zKapt>l=XMoJ`zmq;}+zn9ioB&fb3{sKie>J{6^f_0OKt}3_gWyqTp@?d5s`=n-k`r zw>PSk*O}mUpX2j}o9v^AYaE|$8mfuxwGQjBWkGJ)K2S7c5VaN^<{B2Wdg0OU-vM(4 zC2_&!+pqX5WkG>13TH^dUp=hUeLCQ`R6Qo)^IJ|Io!6qIE)q=i5OybHUjiC|OO2Af z#+OtNG!!pQ=4?MFb;BVxz=j4PJQjtCVH!UAa8Wed$Td&VZ-AF@4x~lkmgg&UT@7{Z zH1*eK2ysKAZ&U~eUE)RtuA=G}!aikCQN)_NfZXx~GpM=&yQH_tgMx7pwUlYOg!&zI z<%dTKiM1<$Sr@H8N$cwm2FbO7okA8)`xjqH^*ZG_Q<}+`nVe4O4{<N`mQC#U)IySI zRX~peb$-}cZl&;cAt|U1^LD;7ve}_1v%w;XvH)##O{(1K%yj1#J|p^3@gB#`_)9?G z!J*2LCx)jMHzeDO{&V6zkMkP?mdCWsF^}$=tIYYF$cr?m&4|!NW2DaX%uxv|>;8S} z<^A#A-pdqC*EEF_`QV|#(Y%tRmSceqKXTW4-Tep@cE_<}46*gY-_K~ip9(&;SSWms z^6y@0R2cut9$Wmo*ZT{50YmAvz_`htJoC}+&#G$tYOefP+JbE_GzKKQfzeeqY1FOh z7xk6gZyS}X1|uC>zW>bT{iT5XojS1QF!C58$_LkGW}qEvRCy9e$reszvF(^!BF0B& zE#P*8SrVfosDF36yZ&ZH4L4FUyVmBoe*PEc!~;HxwDVm(EUw3UOBEIAjX^~=Wbi}- zH+PLTI`avat@nv$a8*LB8_H#;E@qVRUi&^sx2N%-x9J#q*s;OA?W#(bn^IYrnr`bd ztAl6wEL7G7<BJZb#%LB5Su$o#kges(#!D6$#rIV@IHp!TSm#&MA9zmU^G}^Z+1|AU zzm-ar1-KdFAHw94n7MIYe1myqV-a%s&e)WD=tCyTgg}`3;VAgzF)r6k);D<Ck;1lA z0@EL(<w_~NM$4H+aD8YF+j=>)4Ye|gJTyRTJs^-e)Gg=tz*1!5oQ5-Kha3d7Ll1mC zdCA;lTLIZDU?m~~+z4E=kL&$M;_^2%p}hkpI*Vnsqa@@AouM_tojhZrZex60IrEs| zR0qrtZ&~+uDHUg6qKdSMj^N{CNXc@kvP%KAnTr`_`ohE9ccTLS(x@~w?y;T0Klr-( z+`DtZ2_O*mjVWUwQU48G?Y9PANr^*h$!>>$?BwvXY~?6D_PQt)%*s2$K#XsxML`9# zzc_i&5q~BGesm=^kyls<2@+z^D*TJMs$?q~Kt6<9z3F+sxk*6I+-UA&esUAHI}Xr; z%;<g0eVy3JcduYi<-kb-mXpcjuW~k`CGv~15sNd3BQ^`+fGJ;Vp){sJsPbbe=@GO2 z*|x$sC_Cb^@Ka%w_C8(9E~w@4yF*{YkpP2u%kS)8q2W}O8Kolk_#~*#Maw+2a}jn9 zMmlIRBvk&fkex`w*r!jia51-dW_uX5A(JvfjoAhL+=P2ug{%h$o1VQ((DiSm5-22B zRrWDb1!W@C^z62fqO&adb<JA`bIt9D)y@6|x(2T(pE+=!E>#z=o7O)umBxi1(B*vr zaTz2maH#SIFv}-Qi;t)N{>%e)s+QxobY+)6@QhV)dnqk-GM>Oyt@I6qa{3aa;$7iq zjyL`-<)&AipSdIec@ex9eUXD9cbdE?kz(=wJr~|ddY>!0id<ccVfQOSKYaO%VRdcT zLFaPy9_Ke{RGtcYi94Yqs74rTI254}_iw_J_Rw*UE)rbWSjKV3b=dH_`WLOFDR=B^ zZ$=2fLjL5m^tz`w&zjsTHWaTtn(zh~#78F2^)R&!swMxz2yu8;051y02o^?2`l=25 z?TrByA`GP_9lu=bLsRf!-W@AtH?c^q`*&>I-^q3xuIrHq`xMWN@RvVHIz&~-o4jEK zaH{oh<mrsDWPJNrSGYur%6V(yZc*dH1bs&{fEUh->JAV!Sv~)i?*`ykysglT@4JHE zC>o;==Nu&Gnr1%5%9{U$rjeTOca_=|yM+@Vj@1=@r53@Ypofd$tskx`$UCF$b}ArD znzw6dSV4z+24z>GM_sqS{3C!!^1B>@>V)ZZfDkLVRPko=_#r^vBVoP;0%(p|ARo>z zMRm*ZO@)Jb`Ya!d1=m*)A|>j9jdh_QHz51RGDj%lLA|tV-4vH^%LS`W5m42}RWMf+ zi@d#zGtwLup`ViM&7+1*DKIJMX;&BRH9iDX&BXgNPO7PDzrR>bnfULCqW%dHe0L~z zm&Y6bwVdQ2$5Plf2CNAd%}NSuYhuW2KPX~YIz7rlL!pYcaa@6EgNj4U-o?KvO4`uj zpwbG41VTKz?G9wW=}y#{nl_Ng;sw&y1=Za^9Se1*;Df7x5S0R9mzMFd)nSb;={t0y z+vyPTYGYGw82>Oi0%?mO6U&6%USR*dNuCW~qhG>;ss$Gf?n)I-IDw)1n9^6^tER4~ zs5>G2e0woX2`mjB!y7UC<*b8oigfg8;LHJp$w#u1;~TocTe8|HC+Sa7!(!Ibg_rpu zf)1!j^R|{*n2n(%`s*-%cjhS-9h4<N7l$jKB5qMU((Zm~Z@yDel?|N4i4V$U`mg>> zBw1MUDo?N_S0C0HN6DpRw@6ZWVaUV;Rsy^Wetsj)Pw=|TdT{ygiU#d;l%=P|stY$8 zYBapgy1e-bs|XvsMH5|Uw)A#Lm8l?mMhnxM`u=o!+9G^zj_M1`-dTYMjcs8shpgJZ zYBZWqv3W=LD++Zpf2Z+{XaUpc8-L$#*a74E5YG(fXUS=@zVaRAaC?9(Fw$~~1;(MG z#&UG(wsTq~PWa#o)y?2`kng@?5Ej%^5G0f>VR{mvbNLI1zNR4ivC1?ASqTryYD0Xs ze~b|}cXG{bP<2Ve(-Xs!eL`Q?Q8#p3?TWS^?sy6zm-h$#8_;<ysINYcp{%`c^hiyu z#Ssy?WYuM*BeP^q6^Z9pl+x^<<A{7FX6Nv;As`r8?te{4xdN{4POZr=ZCGqV@1rPw zC9Q{}a!vSN#BC7Qy*2LvsKz9@vOoHoPv-E|r~ab!DT3Q1rXc4Quhb=794Qbq`($XV z(z#|>`S7{uq*S=JKH1c}X9+{0+^J>VFOh!S*uaWb`vSETJ?NC@B`xgT(@Ke-Aw@YC zUgg6n;`Z~`EzJ7MVos{8JuyXidYfW@Oc>gUAcv{_zIO=r2bV2Wrd3SZL$6Y8orWit z|8@Uc!zYP5J=W%h##f0QVrAO{?Wj=4)I`UU1U2gf>ADwYox7;Y9c^3Vr}(%sE(qK9 zG5*e0DsPVBO_Ztjq-!J8+jf0p+3;-jvd!(7x$1dr6tud1?bV6#DKOi?QpcPA!ooC< z=nu-js(780s3)4sEmg5B0!Hw;aNMdH&qHW?{8DS2E0hvn&aW6FhYQc8;gopJ!>D4V zWqgn+5`Fc$Pf*03D>bJeJ&*5LuiBA$BfZ^Z`oqg9qzula8}m|Ym6FG2vy^2vQZJ2r z{O?J)zZ3}2H(8oy{I<)1QS;rqBq*<p<{sz$M_FZ*&jrMOlv5|bZZoEmjUR9fcl&y_ zjanPC-R8J`J&DTyh0ec?J_a~3d)dN#o9kxu+qz?;j>3zbut=WUE|@3u$@8TB#$K8* z5v2k?X0+SB`!UtCAys@e;6+Amz~>-~EPM!l91nC24sm}e%!*mCs=`7RIXL05Qr|zw zLlS8P<|Z*im!6}#K=JBIV~j-s59Sh;^v+WXQ&c_2+u}m^FV3T*DaCPGKn;t+&t%Ig zC#U4q=K}#54HGpz<FBL@T!&7VH>}>-kcdWyi~aoBqhm4%zC_zn53#i!Z<<oqTve|o zTmy8854PviR8`mi)Di5Vv$=61{%w+nm}e@p6WZf2H8Jr;^{P7&>et_lys<xHDrHT8 zPT&n&x~6Ww{D$EBU<bK<t`<I6Wq=${Bl}2z`ika(>)B=XYcsNL!O#Q7@N8L<;y?L{ zTqTk9blImGP1!M#QZ;n!#QX`Re(m-g(K$s`zsx?*&Z*H-oQ&?sC=VkS1|>K>ZU&Ch zRTfKuJm4c?34~ig4tv+1ZArN*Qi-!jetlh{8hnINg_}B54s#5lM=f~mQ5FLHkimwn z;u|kCgHy+(;<*Ggoc}R-m>!M!*~J!36Mc)`gxoXzQD6~HM<hKhEigAH*x_+Of*F9< zI{;0j@co%nmx<gvp}QF|g2pRcjl&DC%|-tm=0%xmB=L~^0@%XSU+OR|y1EO!5*yq3 z4#$&K4Rom@BAY7w)+shTnlY?z*<GC$a%SF<L-IeJ$VyY(QR5{Ic_NZfcraYSDLOp8 z5ZMgPT~eYkM+#Ha^kkI3tcEib*MPbB<QFJGQK8&VPxQP03Xu)F(EE9YTfnFBWFz<4 zaK*EntC51sRbP3fx)Isj-Q1{*vG+WZP<tKmk!GjF`{&mkoRVL?c(hFA5g+5QW`*P} zu>Z4S5F1eWLc>}KO|-s^CHZtLB*^VSS8_K-cZ+q<c*J6G-!45V7B{B=mZ&C*N1|jZ z;sexdN71|NR5z;CGdkYBh>GDVyTPJ=u6H%W#Zh_t^ivi6{o*Z=-Jqn>hXg;>SeBBy z#2#gLyVQEQtg<M5-IJmA`Y?h}eo937tNA7_f)#HbV|bbMyz%;H`F$Y8M;0Wp+`Iw_ z{5&EB!2b0DGHf=O(DM0YAVI)ZO;?Ia>gEe5QA)`ww%$t(zb2KrQjm1&>HKO`am&F; zoaOHSPtGP4890QUl~(y_oxj>)!8FsukyKPpEBu{l2boQUND{ybTz^h}{8<f&(aO+! zSEAb=Ml`d3NEby*pTwvC&hVQeu!<!v!Hd2svM%}};wjKxTNC^6ieGnH<3%Kx(C(SE zv+W6vd8Z}4BF@DO%K~v=%*;+Npt(p({^~7sq4OlFwo*wSi76o3tEsfc051>4$H0b6 z?jJ%S3)u~&z?tSO79BHLHk&|!M&-cmMuH5Q;BzNA7K3@ol-3bBLOpyqc-FqiUl{(( zIf$7owpXn1CT%IAxFYx(mj8x<{}%xK_ObJh`yT?h@V^LPuj-4;WQuQHc7UN5&1~vb zO}4jf2J3V~k-ZPCS@%U$q@yxv(yN!k6XGX2fem@;)73<nY*y^x>al_%Z8O_X&%?~* z_p=pi*VIk*RalgTINZIUTMOMKsU%)QzoNq{3=4N>Bl+Z*h=m%w>6SCduvl$PsOI{^ z1ccKO9Xy|>i!vazYh+g5JAs=^6XLM6Oni=wi0(QmH?5)j>}_(-d1W>N{0wceaIgz( z#SoRICI+>rZep>HvknLghQ{4rnQkxSmOV%qdEW5`bbU5l<Asds%c=;beqxg`ev=xT z@?u!{?QdIx_f~a_cE9w>*AAH&!|N5yhxgXA`1TFnMY+8G`hG@jTuPVk=b|;Y>BEmM za9&q??m>?GW03>d`ZbD{>gJY+YPQ}Oxtly8sin#NfKJcoYeI_N<`UeS(}RikyY5$F zbsGj#!bg0~s()8a<v`2OgoDt0)r)N)=C!voA|Q1qc*tUVHrXc_&L*jL|Jhz|^X}L$ z_sCBwt_vTQ%kLeMmu#qk%lm*^9sClfm3u6ZwU^7*)xZEQ3`qR^6UsHVOc`&)M*5(H zdn;PB3eIpCe6M+Fi`{b?$zlPS{5#B>C@a2I95q~0+E)^6%G8cnw|d~T#~C1;_^Q=f zQJ>ZU7kVkL>3+$BIaAg4%R{HYe(Fw(o*^^oukq)xEB@h~%<z`)2yGhzQ}&v0APbf< zM1*Luef158VQEqFKY5FOL4X|fKTLyc{;WaolD8PyN|{5Vch^2>=?1z6tw0?TpIU-g zLnM>|2$iLMm#adw#+48xUC86Cj+|E`>!9z$=Ii+PW)ZKgnK1zKKrRA#1Vf&K2ZgJ# zOcpvFblHyjN)obv#IrcjM(e(A$W-k3vz1D0mNt(*t&^V;;6dDzG^;`*>$ywyEKA13 zZqhdBpR#e4vr49LN(u{H0Cw^g4;j#(!j-Kql>K8Y@-O*%yI(EasfU3&<uUmVILnv1 z;Ui`<gKQhD`wOwWeFie{N7`Ogrm^e+CahdA8D8+=Le~Y@f4AEPkwqpvkuSAEZk0-m zhQ06#F79Q_Eq@8VbY{>K-hn>t+?OV^G(932=2Q@2nk<1UXX=Fv#<Ll{=`E4JT@Wv> zZ2Gqv<DrjEDW*H%Q#rT{inUM2fXu6g$8P=<2-g3rK!5-;$%b{v5d}7xFXd0t$=j5) zZTNpf&4p(d&Otf~+^Q>|J1QCeoHHcw-U5BxrFh8iFk-1`f77_)Qj3Vc9jY^DoQctb zN5;&GFT5bC;PQkx)`MYXwZYWz&Ij5>B&CVGgW&kR168)HB5x^l9c&v=^fWl=bk5NT z-=AK-cx%CRj^PNuZM6(M_pYq^Hg4yax-K%GBgifn-j)+4wV#(Hvwl)q;f5FXx>IK! z`7Z?1K*~r63dSLNYVv4U7c4f|BA^<oi_nx&14Q4|V)>1UL-KTML=7dm`_l#5quUs? zSXM+uhx!a|)0iVv+nUMYQHn%``ZSW((M>c^Y&gRQFD4dtcZ7T+EbL0kJvBk3GS<PM zECX<7aovjXTc{`grZILP<jqh4vuu=%EuL84Re%g)D6wG(Cn=-v3Z!fZ5E1Ro&Hiau zCGr)-<%^PpDv)`Hxrvq&l@zENYial`1yOQ$9Sj2Qnm~krBVKMD-72{W>wiwnac@GV z4YQuydQsC8;^)Oc*<vHGb?bC6V+sxod|IZ&oZGa?ZJ5H6npZ!`k%`PLO()^AL|>Kd z(zLJ0H0s|T9Gu|>I&2~euYk4=d$ikmj2?xE+((@QH3k^gq!$<7NasFS);eI*Daw|v zVd=)-vXRxS4>6peG7qE+Hi76(ki2C~I6)i729GC9<2|8}6qm^gawx7Z3e&A+Oqd=l z@K_s0Yvj;@HwB~)O3CDih(Y@#$6!zAjFiZ7Qd{{RHNdf5^zqP54sH2$LY%Al>38$j z`FywH$hr4~kJx5JtWl{dlo^t9wIbkYy$m*vAM6slO&mLm^f&%cIAu-w51Y5hsB_@v z=h>aVB^GK1G);{~@-B8gxu3=*A}DU&&v64h7w{x7y3k|49O~?KoSw9}eb1SKx?EcP zzM9zT?%R9j?(Tx!A1p-I0~q^q?5ec9IW5T4)C^v&s1SsNH@=@~)Cyy2HkdKQf_NrB zs`2tB*l%i^MN#zJm#sT)*R*(B?|tQ>+7yBrh9d>YoK?s5r`}jIwGTq;#=g|wtV9ci z0g(08WG1yA_5Xxk#wFR|S#w4`BqKRomY19=LETny`-7MvF;Mi8Cvia>Vr14V8hCd? zI5(jj0I69fqDq5D3<r=zKCMzkzQLS(^^s4_aB&6hBm4Xl(TfLTUC_*5H<PQCQi^Zo zTrcddQI~9P3UKxLr-~JF05oMJw*WT}<7?8b)}$?I+th$(QoJg#!M74L2OkAap$Ewt zQh?s1QYnrlj4<E>LWw6zWbCwHGrp~8$n&+Usq=0I{D7lqAG=wleYp>{Z1xP!N^jYE z(RzzdAt1w_p&7Pu9Uh8O%FM$L%u79^K54`L?Gk5HSA@5%+J}EtC)2@_GfQNA7eJ`w zIo*7WYIGMM%&DevT}-3c`tj|42?hH3=(5>@|C_Dmlg7q!JOFj5&E$Z*pL6t7?QmAz zsfoA3Z||7>{YS2uo*eSRl_T6~-v(h5IsuwQUFOpG-c+%hR*ZV=`)cL>`ROqjr5VHk zM~A3x5!nJ*t;r?<t$arx@t#D4QP#pKH5;MEh;{feX#9+{dgX<BzkiwLt#Vzs@0q#h zAIoqz8B!K+-8o4ki8qdZf9b6nH^2opxK(F9cVJ_x84;U|@zw3aS#~x)nHEa7V@f0r za$0Cb-h45+VLksvSV*gXZ%eHn#)_RT;-Iu)HmmeC)@7v#oT8G>TAD~3+Mo5RJd`v| zdHoS-5!9Qz`mPj^atIg4;`=QiwZ6XANSh=fFB@DGibst_37!%(L$$e`T$wtqE-0Bh zSi@aXG8<9v3mMYSg~_EBL%lzvKK?Z`w^%Cc%4N~KadoX9BfI~e04_^#&g#z;ricn( zFVl^Nl=v;6=*ek8ed6fFbSbtMD-I~05@g+z3lti$8jThsHdIs!=3tO|B1+XS>eodz zm3*%Q&!j9B@DwCQB=-|6kC)tuj!**YKe9gZz8iN`c4NYuK+pKu0`~8;g(J+!4Remw zXcbXEH$o!oy0Te#Wbp~RYgXP^E&Td_#VyvH%7aq%C2Wq2h#ej6k9FA%j2tLz1%azr z!6YNcX%x4j#?$Gz49etv0{f?s;_B^b^UZw`he%(kPyWik-&!qKz#LARsH<WCJo2Ip zUP|cY?N#aiAIXgRfBwIc870O4N@mE;o^Vv`li1V5r6?~j0^jAETU8x*-(-*GcX1Dt zozoFu9ScTIkLl=sn+@=8@=jxQ=>5>dw(NFfUZC~GW(1q5nTvR@Kq8N<<KSEzZ;44P zKBUQqk?jd~_CeUU8zHp^ztZB+V`37x9Vd3Z%S4tRz=9NLVh#>8+$aYZad?{<#gF^g zx}z><CWC3ek)+!W!6-b?ad_w*!Ch#wJQs2DyCAU_sVO%CKMK#}uY!gJRF&!%T*a4b z7LLi{o^I(KE4%A6>N^m^dmlUs;=Z@Cb#3}5jdRT>vET8K-r?@RrI-7rT($XM3_@-! z-JH9=5yP<4uyKQQ0waB;e-I<hBhdA|*M`vf+eat1y*j^~2CeY8A-}<9w3OVJPrcnE zwWsHNjFaO<3$06)H+Tv9LO~uIVq_eb6L!x<_Lr6vn>DMB+m}hvj}+DyV=lvI3h^1s zACuPQLx<1)T8=d1*%sbYiU*HjLv9RoVD|;N=6F_52KBwhFhqUTxQ8qC#80y3-+|GS zXnu)04TFULUGk;sAiy;dpN71_1&EW#W1yJ=e3;{^2^#J2&R`sN?i|jJ_L5LIktPiI z%;~C01HJ@DIKWG}N5I&73?bV<^sZli_sdp~?3-jDWQb5UFEgSKe_&qEwJQGzyr$s3 zO^1vh8ZjC*{vsxeJ@1V;n$qw3-W1A=2Ye_O<`$`V1t_lg;NCg96A>p#J9m^}Q(38b zwM93!<2G6zyii?D1ujX+JObaE6XV7R{W$+7wT4kth>z%`1LXi5)>Bpfv45S3)@{*& z5gE)BnPL7qt=6|JMkr`MDI3S0^mW(3u9LS`jb>)H{)CMh6hw*)<_5(R>XM8b`Dz?9 zH=ZIgU+ZnMw~wtqE~EfvtYQ{<91#Pvu?(O8l7XR~HzIV!!f7~oLGm@95=3g@YHU7f z3xp^u{{Kc?r~+x`b{$&a=}&3~#k}+e-Cf|?{L;uaJ_EIaVT24NfQrsIV?s-)N1B0F z7wypdi8~}aamGW=$V5iL*S|l{*u)K_7Rb$Gx<l67!c<=>%$@q)*Ny_HXH9YFwjF7f z(L5rKhrj#WWkZd$x^Bl@Ubd>zfBb|2KQm%LC{2Ya1F;-<dljdbYY6c_+T{Or<LN;W zS|5HyMDU9Sgg*tK!N<$#rTl?kgkGgDxQ8*l31n877p?~~oK9BE+h!`mjOihbdGvK9 z7zQLs3(zs#0e;PLH`q13zqz~WfEjVhB#uO4g5$-uUJz>Yo$6ueAVWc%#8(wp`TcEG z@S)qo35>KXY(RG#vfjmM4RG^yTsfg)ZCKKhWEQwr3$BYH^3pS7h~@NNHO!YpTR3`o z^o3$_Bu$fsZx!9w@pG!d48_sLsAjrj*|Jsbq3!5aY!(D?-23WhA>>i4zTfT9Wo-{6 z?99ic-d6NNcmD^86Ff^l))YiHvx@V%m|eb0C|dhp$~vbBR?NkRs}67g2ac^xvW#gq zp@_ZKS8D5L3Lj$keyTOnEVrWoJo-uV*~MBLKFWUZzw}Pn{(B*RN?JJ+qQ=~JA^A1# z*g7+uNUm~xd3aZSyHE)K$Fy~sCK-t5nk~HiqOaUUulBq7M=5=im>0%>?2%cH>wimR z$l#XuSpFyG&GAD&4-%XrhVF-9i7f`^dbbJR;G=JhjwY{B$>Y3!kds8%<XfbT-rQt- znQxWTmi(V&6ATAv0+W*bfi=ZZTw)sZ|7aZi`^0+Z8QIPEA6uPtVW66;M^Z-yFU!+G zg*Idcca0vD=m@Bt2vDc6gCXhcoSWjfMziqZsDy0EnKw6rOE@7F_P%azb7ej}+h^sK zglxGysh)k7bWhALyQC)VN6g5VVzt2GiaPpC{x{>3{wRJgN}te?s=dH}=s^82!vA=- z!k|Wm+RY&s@jg+pPRwAn5v+#|Uxxo3);VMy>q6<Pe9}hX_TK1~FI$r<9%(bY@5>8# zjY~3mpDz<qtd^1}ebu|@NE$q>cl>vO@COWdNUo}x9Wa*z1uP=g8gf+PSVMC@He#J( ze)FP_5C47OL%T-#)_z(pHT@GN{g31%u=f?f_eAzi60hd0?<^5E9{m52)cv1J{O^0- zO?Z=72XjTm&y6Rxt0>C9vIN|<tPYY)$K4gWL9_$ngGN)uU^AK*;Ml5it7!X2+x0(R zU?0&NWM$i%grGaCthT3r1&h208;})3fW24dN&dH}sMMvjDtTXa=zKvWkN{&13Cn@K zrcUnFgY@U~yZZ#WEAxYWfx`=dD<ayR<F^U#!GE$zlfk><gXckTJL4aq<+9U>?CTJA zEs-*~W_6SzXsgI5l3<FdE{aN(#d`T>L+3eXRTUt3y!Wt>V1Mxw<WPbF<yk86=0aSG zkj-w+0=a_=Wc>wi>PZ5bWl_uTN_MZ9v=G$bCAeX`t4k7VefnPGf_ov4Xo>x%ZBw52 z67<B!_n#H;OeRzjj@!;yb+78xgNI&4QHEC*1``Idm@kz2B_8__2b#bSY*85R>2}@V z#naZIE&c~S`_=o()z$SW-K?9dh3);KVJ1OfW>{*YngGKR?BP*0_3rMLATC^r<_r)d z%#opl3@4n!w9~gxTns-daFOB9-YB$@r%7i!v^zF6b)~<2J!1q2eP?-$B;xBIO*SI< znCD;sBJBl@Lb4Z%?aR6iYQVXxN31p364+$aO>d$1X9PvQ6Q|y+hnEXpp0}m?Kr8qw zH$t)W-Rv58o5@X$*d@4W&vuCko7JXToIg7qF~FCf9O<g7h2DTT1x`b$)Itdr^weGQ zw65Sqh8i=RhDWO+e(|99ycbN`E<LSpc`w1P4n&G#SqnuqQO~5HOz7X30=?zUM!jmB zmEe6~cHBQdhP1pc1u_s&u2Du!heX22Z+T6*ih$?IIHpmQmFY}NU3gB9rM7yaox|gN zC`FM=PMPaK5-6PCsZa=C>5znG`V94^p|!pyplK4afmrzIhFu2bw`hl&``AQYv{2Bh znUE8T2#vLR#y(6Qai>7u5EPx&G<vUau@bn@hTamB^XCaQ2P8m?HQ>{y)$eupZIFh+ ze<XvS<)x!q76Kp1VM}v2&Hq<P=M4``2RDYR+sqz+jjuRK)A_eMY?YR$d`y&L;@>@W zX}Jg9Zp3Zo(BuOh+pr^x|8@cNrK7FyPFhfP!7it_A<%^K{Ia5)+Ga+`;G@BsP$#g9 z-X>$~+YqIA-f@rKC?J<w-To*kGGCmBShIrAzwZa_Vs%!7BC{DdNd0??y42da>tAnw zugD$$z~m{brvZ3#yT)<kA6*W-DbPZVkm@nKuV8?;eHs`A8}Dklzj;d9s{gZJ6phXj z4%5q=SAyXXoaBJ}MkNYM?H`m@NOu)A<p;!FQU)(rJqe1-1q{{F{PMQI06E8z3VX7J zu+#I(%UYuL0J9(RV>1$T|0&#F-)?+NJ^a@1thew2w`ldpo+_R-zQu$(+nf@H>AEQ~ z0~TnlheM%R1r%CnG(Gj0H{huonZBRx80h<TK#J*K*|)J6P_UF9kE2zap+*gt^Ea3# z_OwUBNptHO<wQoxi_;yMRLd)%^R^<2?ZkLPvs|#_T~q=rGSm#r<A6O-Q11SmqYYjP zK6D;CD40!OKhHxs|6P>IyoNqYQWJ}Bh2D6NLad=fCfS<vc!q;~QriC8-SCK{?S>UI zZ1aI<KQnG8+qxZ|&4yayIvAcDY?V~J<0sM{V(ywU^bwXkGre3{!DP$imcLUwe6~cX zkusvOB|g0DvC8Na?ulaH<d#3x5M5Dp%XB?V@neRvy-ao&-3^z2(@|4MP@lg}DPBbR zepHPIeio7bH9sRpq+=S|dnB`)%PF?ig%Ew-(h2`%95&o{-p#B>6ePJfSBjuLW=%UG z+y8j}8uv@L|M|M6P*ffuOYeUs{U^H5Q)~p)_TDs4q8b!z#CN19u&&mQFZ&DMJGa(T z@FP(^4y^{{lc#t-{H7<^FaLIYEFUeeiSN^D_z!nTuyPdEglJ@lekkd{&0ySgtt3YT zQKWDGs~>G%**Lnj!6nu56Ydk{ht&qZDsi=->TX%xO1LB7tYGiL!oH4H*mN<6z2_cX zHpT--*Vx@P%pEMcxNu;74%}nJcW#aYG9lA?)eTA+s%mWKPCqDwbD)8rzRqbLu{OX* zpZ%hYUqKuV9<{{s;M;|UitBIZf(#ngCl(zhY;dZB_tQ@4{hX9Njni;LK#?V%mD^=- zq^aIC{lEUO9w1kZjyjCS;4Aqry7g|SW69<$`YY1rNzfB_vcin$Xll|zYx|J|{A29t zsGS_=t(qiN%R6bjU_5VGqP*tu5?&Bl!7Jbr(w!1iX@XugU{&GLLwkZ##j{@F+OLz; zBAJ@4-=9MB3E01SEverKpacR(_J)9H7|s(VR@rSm(zhfdoZ=`Y#4N2jZ94qat`Q^6 zF_F3yLi-i9qo>FV#M;0TnAho|J1I{{ZCnM~mhgOoy$ij0LFevPW&tgEH})#KPtA4? z`g7{oFkyl%y8WB^ADkF|Gop&$C}}qWT$^cFVO@S%BkG>>W%QoESf@UKd6~Sn0~uP; zUoqVD505-@V06k_`D5rxMj>rij5slcDdF$e3^UW`!G{j$7X+Qt5JWT1rqlCjvH!+X zoXUb{F;(}kug`W?F><EPXrR-Hkny4Z?!z_yIW73uZCq&j&p(>P9gIdh!2M0AGR1Ff zV9k768^);wwpwl~+`5N%`?3XeURlM_($xUml^(p)uPl<Q(B{L5##&PKS7y<K1_d&H z3+|RUO+kU`i(#3|!wDa6OL2XZYkX}70Rkjj<wM4nk>gz_IV*C12>Zud^7w|pm0Y!5 z5z1rspEIbk0ZTOJt_~8IRU45VNOc@SR8J7>Ex#oH<#0rJ4x<rr>U_$3sl#jzkbVV% z#CiaRvIGko=Fsu)7BbB>NV^rvivuID|G{dZRKR}+J;uDT(`-d&+`7#^j3Jmm6)I}R z0B#*!mTjJW4|E`UB7fI336pO1!NNWA+ZrOfj=UP^m*6KI=nn5&2-Q7Au^{8h87^N) zoV*?&-5}e|pb{NUx^^<$`9!Nl34ReD)wuue(gZKV-Ix*Ee??Nie|&!!1>lSd4I7-( z4eXLO1xL=N-!QOy-*}9R8&FLR&MdqcAT*H_HX|JyPN!u<+9TjY*<22H5FMN2av^hD zqh7zkqEd|*gb!e;GnUZ|mM0if<J>T#4q^VSjmW>=NF{!Us{Uw4KTfF@U~MAYOf$dj zpMbO|%_=>@)(KXEHr>_amVplh&poVMnX8rAV&tT-Q%s^*Moyw5!&^b?49MS$gx72Y z3DwP^ZZ0Fw{KGqkr%L`HJY9Fl&iZY$iJxWVg8mPln^#idNPqo`*vYKis}_|WUi8_a z8L?Y@<GtI<jF$vDCTRkHIuepTuyilGzotyKh!q<c6rg2q2@ftD<@?P6NZZOUm|%~F zzWq_s+mjje``wWeIAPgf94%C(|AN8b2%G!R1&qmzS}aq`%=_LKuU)_d#31BPoPheP zjo#0tBI*j<*~y4>VWXyZJ_<eYcVgF7#N)ww4=btd%pj{f*(zdpOr_OBc`UD_NzON= zvE-S<g4V?egZD(F1dQ8ye{8chJS|i$8a;d)c&~WEXHV0PO$e&y!6;^El6QWPk$TtZ zRjwO7NTF{v5o88Cxk;c-Uv5RE_mH=pkGJo51XogZ@7%)%RDb@-PE@1FC}8h&Qu~T1 z@tHQ#d|t69bnet}N>I?N9*U$nDdi%MMo5gk8a9WLQ}x_d)XmAZrkn&*th0SPrZl=^ zV7_w2#>txMVX&3$ktKw=|JIH`rLd}{%p)m|wHB2{aAv>K?u)gP8_6HgcqsKG=Pe>@ zZ1>Q}=l2GcnB_(4iNz^Q=L^SO*htL})ZyN~=0?C8t0f6aQtt#fai6+F=fGlyuoQ9s z4fb$;lyimDbw>h_M`f%Nqj8^t5mRdhZu|;h(544ZRT}|u`w9<ss^L%AgIpoy8PiXX z$Y0b^XL7{#KDrW_G5f6-iGHjURT#@@ICJKX46EaR+u)U+4UB<i>>Npa4@?_R(8_+t z1M?|;ihVDfA%6$#i(`iR6&ym9Y|wJIKNHUQw|XOZ)Kk*VY(S8z!pS2u*eE`5@DMM4 zT5q2s`MCMMly3Ixg!AIn15dLFqxklSwGtpio~&u%`wI%|@OmR)KTcg;<7{VH0hx%6 z1;c`ZqBVm~J6$tBMUVUggqzt&X||i52T0<Ujhq`8BjINtof=TB8wstyrvWF>Jq{qE zm==ADt`L`#M8V0r*bGqUh@q=oQdMeLPapu?fsq3f?oxI{pQi!{%E8#6=;W{Sg3-v^ zF+#C-NbQlo)Feyp-jZ`dtQcCzf3)a(^YsQY+MU==@y<Na>YhZU0^}FUjwWpu;@!BR z7uuI~r7|P^@(o2xt$61N``VmjI%1rsG}>sIt8M*M?C3u$#HCFlgHI)l^~8~56Z_|Z za0v)*T+yaq-ohu(NR?h4%WbXGaAzd9CRRp_-Q0<gO6x!^*JXMrx#S&_Q)!_hWyZPR zrcgQaBp<(w1>odcSrsr3s%0>v7qnmr*<uY9+u{k-kLwhhb}!QIM+?-4G=4ceNFZcS zGQ>mWLaO|Iy1;%UQ$9Mg7IZIS0|Nz3a9Bx%>0@nmBmsj3vKfWHAUP_6eVpxZv#N`h z(DMz6-@@vny@!Im*p74>b9`YwjlEWtSva}bY`HeX#|Ut$#vWR4^4srC*MbZ?`GZFK zq_7;1tjK-DH9ATSzaj;7wfl6b{6-8ox`Z)4CJ%Kxh$?#dO6G;MA070U@iSOShq0_+ zOSwvekaMwuf?)6X35twf-)=NE+vi4R5{c!<XKMZtbjgBfO)|#qTYkcE2!iR;t?>!8 z)$<9=?JQ!aKX56m02hB+PQ5)oSg|j9$~gJBlrw)D#AD|u0(r7+lP8dwN>mEympXSa zc-&wf%ZW%Db({750$#-1&*wv+DLKqf)Z3epXoy>IAn^QdN9;>z3fp?Yy2E<#&xyV3 zU*+~0w<ujS#cJc~QLjcu(lr5=&fN#y1nC@vZc77L64fXUKlve182z%dqa(Kr&8ti0 z*~AGxW>l8gi<;$p;Qhx;j1l@*86<~>#^|Kt*FX}oDG^InC+mV80SOOu8<_J@6{M&! z4xGD)vuMsRZL8-Uq%6t7?2wPs<eNKir-Wp36UmwJbSf6OOnNv=1DKFK=hMdn&~Rr9 zD$4r`5GEfVG~Ht<#ObAZ<;Dw~hZ5Jo*3@rBM#VwW9R!q9CIC^nP{?jSDE2B^@C&yY z^92JG-^_`1OumYy*m5Jm-}mJJG8{e^Me+~%mToR=?JRy*pu2S@J6XlJRGFV$X7b&% z`RE+rM>J=w(lpN>NOBoG43>x5&NoQ~#CImlF7mnfQat`FO)ZWY8lU;E3i7#3A6&A1 zTE>vmJbuU{HHAWFh%se&-*7Gz=4C;)8fL|iPBq33xGC{+Y^OThyC<bxC^Yeddo>^w zwU6cj8h(@TDCk}8yqpm1L=Ml0AR)VVk2S0;&M<v<oyx@DuSomhlJ*t!RS~4;?EO_< z<n^-J#73M`MsC+Zc0tg#-|PptzxxCm+D60MDVyy)*z+>2psW6(jE!9rM@&QAkpZ(@ zYu3Wp1%f|-7CkK58kg^TjWR9>*QvSLh|F)xgl)XTT^VDwua^O5$vBd-L{t-f<+AjT zxR4dtk<QCz_USP8uHdp_EPq=sooFM#!qrzVLzYaHZP1BxMuIZljbC)`;vhn~p-Fkp z$iVC)HBG~kq}PRYNxEc$z^m85Zmo_Lu`jK~E#*6<SB*<k{6v?&3k$VdK|}f%2K>1v zYY2|^Y1)reNS)U6{m7Fxr$j{eMYP-b*+?us2DoZjw;&q4$#ILI(m|JXf$Zxi#S{fo zFf+F6JAKC@??-24k2@L-TRq$I!&-@TW>D|%KD0&)-GF{cWM_p<92><Y>p^e3ob|8F zNN}U3))XQnL*x*PV6-}(@f9WztWJ|bHVFmj(@hAE4@r%xQ7FfG#|(=SUTJ#ulTjnn zx^js3yy5L9I#CtYdN`JwTBk8(Pc4)P>Ku$q=MKZWtFx8hdi)6n;T62T8CZQkg&8Du zM!1GQa~<~@MEk!8`{wXUx24bS*d5!pI<{@w>DbvFCmq|iZQHhO+xFy~`M!B(?l<?` zKi~cAUGG|@UG-bFsvw?^G5R#I1@F!d;ia+O2i=1c=-_-6DSU0$Qn?WdYaM*&Ri|sR zA86D1Za6AvwL?}}mc=%1C|s0gh-m!xD6}*;(aVT-wvCk&W|QV;>95*<KRwPc<yE+$ z0DmqDjlBvpk*v!YF0VO7A^nExyj1wWfZm|MlJW3!z1Ph3H3&Yc#@eFL(m^3|9hYir zRbkInat`RBQWhU2v}P88QG*q}X2Z_@U1q?#og6(1c#)~L7r$uDEgtW=y#qpYHIha7 z(X#q_T4kz-7G}nXl$kD%8)e{n99Uinu8=d-YJ3yPVUJs90_C#pIUlIAF$HhMYAw1> zzpr+6xq>7cHCXRVruiGg<kv?;&qpZ3gRhA&T|gEbq-|}kDD<Y5-yH6*4)O{hdup7$ zrrT9aKhGxB-EOP}Rq$Ah<u>S6)3c6<LLDqpS5%kIPtFM^O#i43BzRPz!d$2$!<J@u z;<57(53HT|c~gT{Ujs|%;;MB~^j0Iw``b4;^N~%dKafg>K#12Lw%<QET~h1jHe_Yr z9|><n0;re^Ut@jn<c=X#Am0ZeF0`NPzQ&Y;)c(TBrW%+~Yj#C1tGMhAdww+w<$%0U z^+!HTPiPQ-`aQ#S2G8Y95$<(q!G*K}zrMDwrfh5#oHP0kb;b(0%K;*o;0mKS)cdT` z?1o+;$D7t;Bwn!_%G%kDzzF^3xB;YT(m3dU4$bh1&);wwrayjccQY32e4KA=q?UWv zE7SIV&sAsf!35TN+1~;+Xu?t!%AOyC&EQusz$x1vNpAxW_0@2O-2qX*v;H&nPkmil zlRN9Ly11>$;7LRI64$z^HsM21O97AeI47`N4Ozs@tPmY8TrXZHY;HfSW4BkT(qYqz zp9u$aCCw2V9bhVB$B9*`OR`3Kw`JW)&Hj3FDYX<(g1rJ$YmyO3b4=7pj2hHv9a^N+ zgWIaTBWqHd@7LsSD~@;~!eL!_n{%S@?9f9ytomDA@2OOn{E-R;M@+vPkNmMHe<rSu zwVO^0xm!!GLL&jRTxo^gWizu~s{JzVFavcwGW;q%u(f_d$$fPIUR79x)5spMuYmBh zVPI6j^<Itoz%(qcUU^iYg|zg6XSC|Ce1<R7oD=vH2}CgpHZ@L=Uvu&^uZ>(CIkVQ1 z<Kc*DE=fR~N!~w34plXJf|Lz<5k=TBjO$oLb0eU7iNlH4a+Al8KpS&9@+l_bccjij z!*AlAwsO7P-<u?c`EPgPMtL)%@8r}zwh0t@iP!?${#z{{J6vi_CN3X$%1uvTzPNL_ zN&<^AO8qlP`s1fvDsQXT0p<OW#53a=t@bu-Q{K#lH2f*>UQJIjEasprgq4Q-_hFpr zA9yM;nyo#Y)OgFPv_xc0DCr%-qm3fzH!sH7Z&(46?IKrz;lcIQ<SIxT7~Mr61~1mY zk2vizyHg27|D-#?_Fw!X&3`!8v1=o{<4YH#Rd=$3)yvGDI(`|6MYanO=|Wuw9oRa_ zJuEMehU#RA$v^n<P}oOHv8JL#bQf)Qsfzda;`~PY6qXR+x^PW>&S`=gDh{cZzi_Vj z!}E9#Uu8=wCk<I-k~y!`ZeI2^Lc8skOu%8GrmeyLFQ$gl%EGd~QW}no7QY}bmaVm( z#(vS0SkDaaKI3Y1+Yc|-YRUFt!GTR(cDtBE<eq#-Jw?cO7wYuV7}?1AXo9C=FCK3< zW**mm;k&?{bMlYx2Ze<}F4@2eRP(#icCS%$7tCd9n~>o>9(A#EZ3g3^0xadBJz_UO zCoCpkCDFQ+w7OvhgX;-;$JX3)QGrye@}mpul+NvQsBGeb3{J0L8WP7lEg%scA4*A; z5eB3e1|%ex331xaI+O5aROkHrl5)1=K>m}Rr3@fcn!o*W;d}jJh&e%znUcegrey|; zjv+D&Hv^1%6NkiK1FTWwc=;#^MH3`BrgH<Vl(VtpQr1QvrT1p{dc6bM-r%GqDE1E_ zoYJ*R%5;6C1~(k0nmMI!FLe5^7l)yrYn`_Bbzzd3ist5Ii^hW?zd#v1+V7fk4~41K ztaZ3aaNZXZmvRomMJE(oXZ@ezl2k~nIMB7W>c$YLzgIoDg2TGAopT_c!7^Do`D<4w zMYUWFsB7S%OeP1M0ghBq%U3q+Zb?g0xP_h<dogje-iehny9>k0S57iMTuZ8ZF1u&E z5`tCu0X-~Mg&mEj>R1GTAg`8$&R`YXCsIWRL~UcsBLtflG(Uh<O`B<0w-3%EY0i%` zJ|0-ecU+C`mM2O?<p3RmHK89r7(3*bN*($E(>f5v#u(m>s1ZHgs;Va}%FNF_=+v81 zxB(>({mvc8fgEMOA&)C<<RFz~%wQW@x0)ZPDPM?$9L;5%q<83BH(!Yrtyq|vMswv& zw<8BOEBJ<BZ}L(<*{#PieLgdm{)k9()xD$^5$UiBZ3?We9!6&%fmHTrFD>Xi3$VMk zW@R}1QOP<^)80Ltir{&qQD+gV_5TcfQtc4B!;%<86BYv*m#GYq9#MwnbV?0B03E(M znT4Eydlu7v#eJY&^HIF4;7c#B44wFHj#DaRqL^mZ6!JAk$kWGn#Ipq~7fZIpzJ8)a zBXXgq2XiKdQ>;DOhtnu;j%(H2B)dg8`y?Xo8_Ar!#mn+=Xq*Yg_KKJXv|^o;#!{Dr z@e}ex$^Hf0TEP{Pld&y)Sn#g~66amYv|jikMvzh_XXj7@&@!!IPINOdi7}z9`j6(( zHBa>@Wi<g62mLm&{65vHEX9~vta)M*BjN((U}{)a!y_M2+QOy@RPqUlLQG^z`LbvH z&LQZ;3>F2p*v6(2_%h4%9);qG`IsH|>x1;z#MBAq7-Sip46$JuBpb2i)%Z#W;XS40 zC3=PosvOzp_FYV=tOEq{O%0{n7cCO*nxS#;d=JUGv=!{tj#S^>oH=@rWd+qHC!9zb zZPD!c=W;eKODO9lci+@S-9QU;?V+NW&Dz-MDIpk|?eZR3oR{wrWaPM)r&Mw?H9T7F zc>aQgEnx_srgwB^zo<7Of@#bQqEo|&Ru^`!Dhwgg9(Y`mO+N{D7uth=y=L}V*n|ls z7HkKZE=#|KHCLfp1$veYnAjITxFTFQn&ic@hT67EXP%9s*`?B&89LmNeFwz|M)t0B zCAOGUz$M`@AC?U16TN+#^Db6eC5{-8gMJ2eG|{keEw8PWX~?nHvM9YkJsm0%Tgbm9 z7UM||DVMg%?Y{e_rS*bj^u3a(uA`<BWq#0k^|x(4+ENn~iV@G9LE`z<`2r44WY3qG z6*@zI;W$5%{|G$&$VOJ$#A8D()XKhGxd&!)xnGyw&(CgXDzT3-$e+(?3Zi9HRt$cf zS20V!oha)a5>LGDbcvmA83eI3od%OU^zg?qnkpAtX?^4kgRzNVfbJA{^lL4`ITAlS z`D*{j8QnL9M9-oyEvDnHYB&MkkG7W0qxe-nQ*a6XXj3jH94NOODui>fiq_6|p8DBt zsL-}%g+1W(Bc}>zGduOf*v{Z>(~C!_)w-9y-vKn?1U)GnvQ(|J>{$P0CRji$o|e)^ zdz%thvl<ga+7D}$nNXa2dpVmG^x`PI>QHoh=MIeRZCSUdQQ=TL&;B%z@FF~739kbR z__QnwZG@)x>4z)PJrSMd@^4UpuDQy&9J`|nv|+9Y(fbO`4dq>6sV<8Q?<(e}_Ki>d z$du9cA}TDInerpvE0h4LwaD7N@6a%jp)JjM1Lbh?j?}f2Kbkk0u9(oSr;WbUou)x- zv*z(Y!k8*bN4`Xz^OnGkbz1K|vHd`{TGfXBJvp{7aEOf%5rK4RNV|y@{yt^}4lgj- z4^5*&;}D&$3NYX!^GC(as%oX?ft1+<R~stLRr5P4w6Vs9zCqaKYCADB+EhncP^uX^ z|CeL@7RUKLf0@{5Z5OvuM3#m<5E3SFJStgT^JNXD9_V>o#~S*l9+7-h<a1FaMT255 zLm7koHe1SQ$XXa2Igz-^qO_5S@S6b#;d_P|8rok#%n5%!=sE^|*Pd{a7GhM}T0gp8 zD7Um0N$l<C$Ru}mh6|oXmb7sk(X=9*Z_O&XV93YOp`X-=7qnE(Cd7@4TUl<;?V>P2 zM)Nz{Y0pJG)x_gQBX0NGj$=g=uw8y5T!HDzYvdUSS$`FG^N>szjTO0);0&SLa7B1` zz2ox@O04Ep2Rj5?zjjSpXew(?qF6{MmKQs+KG4=DIpvkYV+Iq<D4eVv+5b7&8OB`w zVpa0!wj@bF4BYXC+vsN^3y7hXW&ce)fm<Z47&$6hd148AA@mNqec&C~`J4JgnS6fT zEg_do$%`aX2foqbPAn~4VrG-i!k?9HmZ++H`Xsi{OkghnHPf=s_67<;7fxvPGLR=m z;6|XDD<B3+w>m*S6FTV|lJgj(7B9B+hmaAB^<w0XK}ifDx?u~*v;=B|f~Ac3fwrqK zf;LO^G=J>bX?G>6wpF~0xuJD+$FyQ4X8W-g>-~vFpvtZ7eNTFcjbtN%;q%+)Rd*`g zc5V3Kw??p}4qM2By9ZX4RXrEepdazj+blar7&scZ>)wq6V}m^L;EvV;El+V#Ubz9T zuZ<QIb+Lh=cW~a|$<#w#0zB0zg{giGD7fR>vJ9@0WQq<kGk{Bg_QfT6M;IILeT;}- zpFN%Dikt7kaXzn4V>L!G;X9+C*0b_az8l_*muC_a_}~w%yu(<cD%)PF{Y%wyiz&(0 zioV2<;Zx|rZz;1z$ia(H0;WDUU&i$?Zi~&%0o;3RY*Pcxxs5F!_-nwZt!xn~VKrCM zB_#1j|D1c-Tl;t^!LX#zuWYh4!jvxVDPZ-}!(D9uS}M$S(R&a>o_;x<@KuZv3w-_( z!fl@$Qa-z+0lhNoa(j-{?qv>`?)DH{!(kqd+ag6$#7{N<oWe|>(vd&q8#hPP$HOD5 zMi33K!a_zK&dyEU3mVRtil16?F?3wPCN#KIl9<{T{P%K|!Z^l7-_|E$0!yt&@)Ktu z=>+PkQKY~R>hoK@0Hc~NAl=I~5Y5Yu=S2*ERHQqR5%*jDkdcX&sqoP^`0pU)X+3=3 z^lstH=mf;Tgw27J2*Q~I1$A<;@ep0@RncGAk9(e`3R>@Ifw!AhSFspC5>H0CN2giT zNmYs4B)9G`Tr+(h&`K+mHk>=~UW!%^NRWykLGCK)%>^PU=L50(CNUxu7fGtv%H8i6 zc0)7NIxFF*dpCtPm*0gQ@+*erx0f+!0t16=PW^=dK+<bL<9HSL(kfdgYYPyV$RX~o z;wqHVN67w2@MSkXN~M_GWvtdLNFM0L<i4a*<yUtpbX(d7GR<^^2V(=tc6bDK1A|TT z+nm6FIfc?*1q?)i;$UkXrpXy$J~mV-yg#%4fGMv&J*N9C-W0C<z@Qu>HqY04<){4t z!_|UvHb=tmEZtV{ClUbS<R;hnfQpgizMDJtwJi2u?E`|<d*=pcLG^sEGO}B5Kac}< z#?0UB_1HEp=1^N7%lihDPi-kjF|=QPh=^vI!kqI!Gn9zpf^wG*{^&vQp5^u3+p@H@ z`4#!#CFK`c3X}|<ARl(JIc=tj=+lmsvpuJ`_GFC@$5t*7yFoCt-VEQ0mf`34rr{iy zG6wZIj~Jrsv6F~nx=Hp;y)b5bp_CK5jEa;@6js|s4%Xd-Q2#^oj#NXExUCcRzJX$s zw!A{knMPzxBe0I2?<d6`N&iq}Xf8dWcNLNjg)YCxoV_#+%ESG%)3R<ARe#?cPh0rk z@o&%{Vneir^z(q?aICFf;mWN@=|uTXSv;YcPr&ax7G>;J)3q@yxXh>yHG2MlUUg6B z-&?U)@E|i@@fWcPF<8}2;>G|hu5fi<<E2DXZxtFrTbEw@Gcg4-J&cIRqv%`ShD_me zTHxzAJnop3H@b!(28Yt3a;*G{BN#x3(y})|*YGo%C5hJ!TLWMPXQ@i1Rg&Ya%<Hvp zb+@*(`}8Wt(BD)iqSi>J?{Ewwvq_FmwBmUtdlbmyExUWj{-E}CvHbo;ep9fVK$0ix zr1g9EW3gC_=Qr_Yx~|F#xw4NYkXJ@udUqi-XUOyE>)G^*<c!#(HT)vKiiASzpzD-g z*UA1L%~aI}w<u45^FT8}pySC5+BBOa)>MW@UGs9ls|(%9<11f~lT~n?SAyPI=qdf~ zqDRt_5i!dI_w&&JtjyY<dtY4<{m5l!S1r0GHdKP}0}F7KRX!FbDQ9$8`dpcXN<&*) zO;Ikup4X0pb`6JB6kv-QD&to8AUQn>*4<ai8AZI{&=4issLh&ChHDw<>wFD|(HQlt zva<Ub$Ij@yJk&atBe<1fM|Jno$wcwv6Q2HznXzF2-?jgjU23ldk%WI+Y2L&yThxiJ z4x&Rr4tux;k6quw09N6J6xQoYGb*OnYDMN|IC`12C)9ai`D+}beYWlh9a9&wYsQ(H z;iA&pLPdL4U1WmteJD{hDDI-HMA?IbXoO{46@__b^!cbE8$zB1D9?@wa+%1%a2R&v zijN|a59OrA1PxUWhq{)#ZR+}#C?{Kp^|mI7MknTg%aHrf95)M&?9@O%9Za-6pS9CP z@;-f@Hz0R?6AD3V4Mc_8HMzo$#Fav|+RyiKv29c>tYS19!tFg5=S65gqI9Vng-RlJ z5^zuHm9GAQU>#&r@4Pz6pvD}ujpwCodjE*ma|1CgL8U?M()<`D1ci#((RGhAyGNPt z=FiSCiw^yJrjdav4W1R~$#)8U0wrqjPSCg)CFo-%68qsM!l3ulHmQqAeB)$#8<y1v z4pVn>8J-Z$h4<wm&B$t<Y6%1z_h=VWr?LU%Tf93oY~>jt)b%E|U3@UBYS4weUTBGM zxPm<chB@x950$ySt#sx)pj30U9O5uDjyoUXA@|(+SqYK~dE<jw9+fU^b%sPA>u-!N zu(MC3{03H)XMr6rDIMHFQZm^ytrRrMSJ@N_>i{R8z27NE%7*C)A|k`4Wok~CvSF4X zABrZqyz|sj9eg&0a6tZTNU?o4HtwAz45UAfd<sR|#PE#SB^a+KV{EGB$vV=uV1HiT zzN<Z`m^flzBXX3KxTc#44Qxq10bbPDyy_uhTLKNQsA}oe)^x(2iip>y89<=>L7f27 z@09#M^!4ZUfCAo5{JajO2Djx)nKAt)*CBY7gWxmKerKhQr!L(-LukEfsrO&zqa4u} z3nqiR5Cg!oZ?9mNKJV2m-%<{a_qf+up)q`i9m)yq*GApK!f5r=I0L_5FX}DQ%DEuq zO=leBc3(KYeda__SUF0>F9+dGW`VZvl@q?iAsAG3ePtWfJ%1<Yaws4To-ep-n@Qn^ zL-<_oX*axVyKleSo`yZ+pJ1pzxuIYOc!LA9!T6s<CwV&YTFW$cDZE;~7nJ(#F`|Ch z!r;kTg|h&Q3V8gwYid$9gCP~njXHZz(LY1pC)xomCac~GXU=)7wgqmMSZRqau`Kf0 zj7gPG;(n)2VIjxj>xwICB7Uh1w-rhy*k$%mS&UqNLD6|XC+tXlW-xF6B;*Km8VIcf zpt70_;tT{jEEK;~Z0vr}k;JgM-}mxRd)5EM<mE;UFCH%YxmrD6Li7S+u?fI8RoF-q zD!2NbaCH<J5iio-9hNWDf@`Q-9*%O!6Uj2!E`&EP(;TeE?FF_F7qV?3mDl{<LKP<H z>X!4-D<P0woC;CWU23j{%Lw<$N)HorM?U7PPct056^if^!R5)K4wDO-uJX)V*vQ>= zPoWDQ=A#&0e)r>t+sB7ouIKsi=+r~M^~iG)1|aRl-G9TXee1jed3)~GYXohCIae){ z#AC|P$xo!g1!MM>;npZlbrhH&^AitI=M(W-@-Q@hpTBqdzVs1(FTbrX&JSkrPi2VR z-n>)v)9Rs^QgGSribfr_AnVseI}!kkZ|zi?@*We+6E#+<PG%TyA_Yp(D`fkX?4|K< z*AV4Yl;D#W(Gt(tWRahYPySK0gZn~jO;H318qH5Vvs6gPJZiCJXa1XNxYpBdYSv~F z@fe9$zpjW1u_SL=5d@^gYAbg!mnHm(0gxhMO@SjMeQgbKZiqHiiiePZa`4)^8Rzec znQOpX5)4d?MV%u`o}F`V<>WF|@R$PZBg3Z&ZQh_Ys0|~CSeY*n)j_@YPnu#Jm84dX zg?yd%>*jMSO8YZ26cB(@b%J0WJ*U$f_VH?`yGl|0WWNMrTPO=K-Ox}Y{0RQEEeM(6 z1uA530>|?Lt$BAz?DwtRn2@+tyP$R&<W+*H*syL#!E8eN5j-q~C63vr>{JBQh~LH) zHluixEGRRgv-}hE-h+OBg!qS*bYZO)Xnw}2CPGTyi<%0itJ3Ww%e6b|Xp>UU<7G#1 z(B&pEpR`peRi4uNyMOPOlFk;@*l_#Asdh_eNoSfLe{GOXNDR*DK~!5}>nTV$_pm6e z@p-(n(pE=6+0e~~5DqK^@~*38a}+TtP>_fbRU<wLY?{^_n6W*&YF5y!FU53Gx@4TE z@-Wlf_+6goHu}|Vda3=~)V|UH*<>?2abr5vFiq>IdbcKi-=Cd4?+O92Wz<H}4plmT z=S-=kSYNaTd*m%!MJS?}#cyyB>gNqUfXD+tmC(2CT+7n*u)@N{S@7M+#W9<_J~wdy zXCT2^kigB33QTrE2R*J*7Oo-;av+=bmEO}b&sy>^Zu0rv<?Y&mE^MU$Y4b9J_*&-c z=zuE(WXD9dJZc5*f(N3iK07s|5ngtq%s8eUD+SCg3!myc8m!ggYIpd?mNeRm|FT$! zv^*v!O2?D!a%)grT7Tbgs6HC1jLGF{6S|wIjjUaMja7WS^QXkw%FgTMU>EZ*q=9ix z2?E%o31@y(WJjX+(M3){)J{m>&E*0!-7T%fRY=fAL^}rU$+(JQ#bl{9_4L;3eFz2T zfE<%uzBL+?4Z@)2O$WI85<p6wNKqipv19mw!s1+iO1=PYuriq!pV6AV5Zt?rVnu4P zSf}G->*jNC=fz-{NFqbYwNV-+;I^a2O7%TWI;nDh#$6i7j0Q~&!*PthFv5EBMqbK+ zWE-<*>P@z>V7o2)Ica<3QAeUW6T0})K4lgoMVAuP;;=S>DYKr1L%SR*eSDX?(1Ix+ zI@C7&mr}Od0V1n~Li4KxvFp!$`_n{SelT@}W_gV%=s4w!jua1M7qKT+OwbKjIo2ib zj0qy7KmH`^hvI|rKN+g7EdN}|nMeZ&hzjA|p;E>*L+IM(R)wfYS17gbqcti=Jd2H@ z5jK5xE)!Tvc$}$?6tk<882$Ysicv<^6!HC$ZxA^mqp#z!1LhcV!jCD!ekAK5vraXJ z3^9=Es#jz&NFVZtxRec6`s_BJ+%c5X*p#z_AWq;6ra5f{Mn?Xyq<Cm1S*Jka>47GY zr1NK7w<n;>b_s3Ka?;kOrItLLHwF?0=%|$}0ul>ucHr*vH&okoT-EPC-Sah_#};XZ z`Ak$#83Oh4UVTJIve)fI8q7my4RY<sRa&j7RWsUd8ouU2+m4p&?eD1%^s1<mZ4-7! z@Ei~;)=&}-I%=v^5eV8Q6HgKXbEhMRUd#~t(xUrq3X8+JFlZsS4*<KzN5Ymq{*=t* zWJ-R{0avjs0v3N$ei~Z~&EVL$F;^c*aAJ|_D`@uWX2^rHH}!gQns+%GUDDB-0Qt(v zvmP@G3b%47;GKTjYV2nlm!#Nhg3)3WX%cF^Oo1kEQ9BbngxE1CPbJuGE4K>k9|B$D z31~p$K42J$kv%_j9IbNk-PMdtjLlfcZMmoL%oB(!>|Qlu+@kU?f-@gBxgMY&ZH_wT zEO!|DUbA_*GKG^-)J%8=HV`FRJbY;(6X$y2*xi2Xm4Kv43RzrKNnX=f%N&x+WAU~` zD9V9F1?izh4_4S{Wo~H@P8lTtR^N!HU{y$YZy3UIS0y9S?fF(cpHexy)+LSR2y;AZ zyn`}{iwVQ1tct}_FM(W%&OI+*i~k;k>f1iF{ZN#wda43lK5B~|f3;CK*{&7F=ArzO zLi~G)gt~HfL`CmWQp(MIf?8B!ZE<f!ZUDvCP?cPw8NP&ydziMjik!a{B#RJ@!CN%$ z8<sELH1MGLPjAtPKLEu#ZF<zyUp#@E9Se&*rUx2zm#V6rRcp*4<!yUR?!_7KZfar) z7v4KFYjlM&4h&b7>M19va5{GeoPRl&uR>LRK1!0wayJLaGF%+`EPrA{ER{^l!0Yi= z!|9p}S7yeE%Yjr~>;<ab_z?tn0f%=kukQ^}=$bc1XbKBnoc+dtx0PyFNc%@K8U)bc zL))s5cArwiPIWR;+fGPw>a=aVBcCTfswQfll}fAWiAq`@cPhXkKUJ86)Yf<St?RdM z_zp<S8DG1ycq2G~WAr`|?8=`MMW26W-rHyjCv=q(H#qdus28MY>u*0cJw=nF*e&<h z{FX)m1WEQ)ZkohbPlPW%;KRB}S}8^VFFY=R)sYsiU4NRboyWU&BtM_i#@S>`8q&je z#0{cR%kd8HR%>w{5V+*ppAxbDPB!L@US=TB%<=`e5`O30B%A80h46p&C(lkCRF6U{ zs`sFQ0`K~h)RimxXYe-HX-sYRMEI+;cmCA5iskFv9jU5lAF|MP5_41b0{@GKR8|d$ z{p`<ZO?85K$Imsa#Ohd{mA(Ky8t93?%lR*mz85oFVjnwX_SLG9UhzR*IeTU`HCLwy zZ&fpZ;h|@FFes06_$kj~6>ncDC=<OgME4k;F|bdqN&mIkZ%9Q9AkH6(hH%FI96b&V zP}@5re~Iz0!rLT1SfZ{U{&Q8pBkTG=|L4<hf351jzw%!X=!9JZdV)$#VgL2Z|KE4M zXv+0MR53Img3omiqJ97Hwr$LA^l&ivAJqQ$+y9Hk*GYGz^q8JQgm+Ii#z2H6D5q~c zwB4`sA8aYskp6ClFc+(s8NbanTd*4^K7C=q=`hw}p_Bj30{-6d7ZRTOr5=EYKY8S^ z3=FFJG_l1J#!>38_=Iz?L!IFk$3|a%C)?|j<*JUN@BRphEs>gE=u`zF;wbF<bMlho zPC|sx1moW<`nT^X0sqbdc8VLA1A@IAo2BWaGAWgHuZ8{U0Ii_Muhac;)sP*N<W==9 zR;I?vKnn{@b{}XXgv6Gy6pYOc+1B%yWd0|c|C=$+Pat!4aJU_$^K!tYE$vfdt5E8R za666>JS97CK;;85sbW%OHU^yFO@DU5ExK(Z{z)v}Cjx)CeZz4fH62Yc1T<%DEkBtx zB>GZf*0}Z*C+hj#>c+WzMjOko`eM(gr&ePm(&bjQWdigGCjU+~{)?smsu6!l+v7{x zOGDLB;Elpfu|VpFkwh|IXM&}u>4Oiw-_hr2(WBE}@D<48Hc?>vek02e3I<V){U@5^ zf7ASaePx?XW4{)JwgYtP_VVkk5tvu&noleXE05$kC|Fjglt6K6EFb+?WY3P_9~k+? z;w^ndJ;N%5m+zhxb@}MR0#Xoy#q_Y(3}!p1!sjwUj<H$9_ox`Y@!P~O=RL;%pKbnM z4Db&8%alonv7lb{LMwVjbK$JF=8mbz9ifCn3kafe;7#E02+dw}`bhh4MgF(>{W~Fd z0sm!EzFAh=1~#y9$e0kXa(`AE8RZMDziBu^$z9M)irjUKv!(O|==riWNByIK17*He z1@?pgJ6xH%5AaSyjXvJQxq7HWVA|I1F;Hm?*P4ttS*PCL{`=o+wfBkS7nw&_OQ_oD zm^hD0w_DHuzzuMTt{v}&f$+Z_)jue7mmopcz*eA7I@VV;-oJR3|5o|G`NX9LWC`P0 z)z-}XADH(=kii!Z>fvPZ$Y0fHpK@L=+qfCf1oV%pFdzHP4NP@%w@2eYEV$&a|IAWk z6IdjbsL0u273MO<HJpD~(UtRGDi*z4VSC5-#|z(m4JUl=TiLpYGQcuy!NrJm=;rE! ztZ{m$z4VD@{v!GujOy=@=HIEtpO|lhFtk4r)22R>zndOuOMXq<<3w;<`1F4g2rejd zxzsns*eg^2Dhi7LXv*fuDc+EqATKqOz+RF9_lhp|(@(yMHvcT+{6}U8efb1QSm4VA zZec-Nku@_*?N-RZ39{}Uif`I2tkZLMHk?XKAZP^xTU`@gw$~~=*uWYFa)El%>7wkh zsd0Y_ofLjxf*Xpb#)vjk{fBo^eo2*<8Tsu!t%w-y@Pj9$@6ITVliV2uSf#<7%v_eK z;t(ost?%Hz)sEo<2+ndTK&WI_iwx*OE-uE@c^)uD#%61P*MW{vq}p9Rs&&S02O&8q z8nh49_~5)-t6OzA1)0X}5WquLb$jSynzI^_LyKz7`=?SA<O@%>5wDPweX<;c&PKUc zR@u4)7MP7#V(UYNi#k0Xr21!dOaWO!*E(tHAIw(_22OdnguufBMYb;A5+(2sg^t6m zfeQTQJnd@z=8{Kco-4eX0MTWY7C8xO*#>`NopH_dt^|Y+5Pm!yJT;@YH^6fi3$^?G zNm1?ohNi1$^eDFUOJ~4)-OZL(9V~MIxauiUweFPyd+Y2ZOob@XaDMK$ZIc72yu3+t zT0$hDsi3B*6MZz*NZ){99rqfF_8O(R7z;rn>p$x9l^kTzx;9=3;(YOSSS^+vi9Kb{ zJ0ZPo+6*V!4YK8$Yrq^bOsRs}jMKn4^4#Ssmj;L$|A8G^r}hxgiCgMAN~p!A-utqC z(o_@HFQJZbx?HPl+jPGVgaz`jXPnU8IJ*2-yA8`dzl^RH?&KUx|2FW2k5|Z(c?<uB zy?Qqxl;hkyAs|iNA9>i?J{gLMCrA3_v8+T?iLts&Q^ncL$$g>YOWvjbj}!RUhbwY; zy~!;F(PGcWY=}aq!Tq%`eklVmAul~>Jjb&IF?B^NO_HCk)(v_rC<#t-MU17;0R|4U zhrBqX&k;wgW@Sy1i)J3%;?07cbhANKL7V=>nG{dgkvME3*?2j*!|;}psgfafs)MJh zl*)WDH>@I3?=rQQ?MC)C`}#=dN7Vb-c64vfc>mx4<g_8HOsXcL<<(e4Mq4U|WW#z& z%1z=mk@=69TgZG)S@`#|P19&75#Eip-vy)U-ksc?<kZVOFRkM!1oWey^)bpGJR$|n zxTl+~beZJOx}yqxz1zI5M_Vjo^5brAez?(R`*W(N#Uj*u;J}@S2yD$gqhl6Wsy?>j z6Cs#!fElb?9US0rolX0XjqM%&^Pj9YrqG{tUciq6UszD@Z$>U=D+<Gav=9`j+=ePA z{L9s~(xzlti|>G~T+iUto*(xXtH95Vw#<b<Vk8Vtp0~nXH3T{zrf@0IZ%^k`b|O|& z@r|Oj0bd2gtC0ieZiXjgKdS66acA~<R<6pwZKJq?)1t{Y1wq{jOMZp$|K$CZ1c5Bi zXW7YP?x-1bDg@uHkJcLy+}Awh3x(0{!W{E8*oTHtY>kOtW~}}Qh~DAMAOYTcrvavP zPf;E$GzZx8C2B91qnq%O)#NFU7vD4)xhgdY(cR`LWRt6l10M^yLrn%d!%<pg4NTcU zbIIivr)f+3ge=c}zDE<^TGCb^#~3I5eIMrEE|S^juekC@?j9q{I{*sfxd9@?GSGVx zmhY?OiCif?QlXPI$!-y&V{f^k7a=7rl0u`L<LN5Ow)H|25}H3i)cQ!`Cly`wnqR%> zP?HqJ>6uEI)FQ*NM%uvSsZ1{4N$7{-Mt53brl{|ZB%7UoSRcpy94yKnT1joZn#Oi9 zZO?@ndZVBYBzqgxKRWmM;J@IqIDr6`(*%r>(ow(s7oxiCiPA*-W-Y~niNDaXV?eSL zX+m*h@fR8((2<q(je>&0`SRUK3NU%ZB6<V$ySi4u&XZJO2KMz;LlK8nUI1*q7)r1V z0e}pcF3^NuHjyQw<X9KWANlGtBwRq0g}zDG99%rzC0fbt&3dwi(#WhPhC7`04`Bfx zED8N#`s4QQF0iJirkaLE2p%+aD5GSyRHN3ABr#&ORJ(M0MJshW+Jb*%)SSyY0MM+) zuRJKXp_J^JTE(=bThjV`J${%+mWXwe9dwe%1tEm2$!2ad=4&cGAAmv{Ue*6_1l0Ea zEbP~ziZ|)1kY)7GF%VbHm&1P>!fkmiYl>x6nH=p3Fp|ByZj02Jd~C*|&iJP&>^sR< zLU1caFVVFy3ftS}*ei-&K7#cR+y6?<4nUqj?dRXVRlEM9VbFV*;CE$oEAv-_4Q(a% z&j0Zp(*AeB!(V9yDa4mIf@Ev^PqDV*U)fp#_OSUzB>j)9;J}`ugn|Z)^<Y+|us=Dp zn4&F-%VbP-knyEF*^XHyl=5y!1>t<?VR(=Bsf;-e&9B^0C?!6!%twXnyMt*QKU%2> zc5Lv+sxad*0_!e=%#bJ_IqA!k<KtTb7x;@>3&mYXpOe;Vcd*8%3wIP?FZFA5<Jm6) zQfKKrKn4OjdfEp5B`e~S#_!T648s=o&jklcKbKF-434|QCaO38bscqpYI;TtZe*X< zUeblfN<+0Q58cMv2P92XLw}6Li5+mk4FT=WyNq~#24(xk_kAF(Sb4Ys_u@i369;nB z$Fyt(vs|7y?-afcAU!y7-x>`TT+lXy!AJ~)yNt;K>QAl&U0a`hzgJ^5oN6%4OEtA1 z>>V2_qW5-lJHowpem$MJnU&${Wn^%i)u4uLl1tIt7)G|S-h?>mx0I#)z%Qj9FK5Rv z;8@X=XWk@=a#al1&S>(Mq*y56aotxtJCIu)NhKHO^ZD@MQ!kH!5+hf@7+&8z>M8Km z{W)pDoh{-hBbSmLPFticgtf5Fx6Fjx6(&u&{_u|iPBge|PYVi>p2smOOj->Z^uiZN z6+!XjxhGd9#roz{NsbYM;x!?34$Yghd{rqau2i0~W9S^|M$0Uj>6V~lE~@xmvS-J7 zsKzx^EnjljHu5iA?=qC?x|-iMgaNS?cr^jb%5GdBSC2^#;y(QpaL-<eIt&&m&*Y2p z`u4_!Bkz97=DA{f6J1zfThp@;&FH6rV)1e#rKl&Ng&Sa9z4+6>omnA-jIn0QAvGcP z7a4G}K@ANwT#gG^ShfnP#H4)b$VwV)-78<{kTbph!Ko?vxVNf-q&tQc70ag0$!d}u z9oY4$(=kI?nRShb@AUwdV78^Ou7;WvcN>~jp{i;AOTDBOfD1rFyPGK68Niwxi=)9C zd5x34eT0u)Hj>YuS%C=K&5&xckxHO8-^QO#m4k^f#=H6ioFS$W!9(}170rErsuGVK zKUcDoTe&Bw_VX_}4NA>}0<R7*&mt83JObxpMMa9F9SkaluJ5dLW78oaar8_?-mS=X zh|AuLNaom7=f?TzyJ(0>o>=vNdI3c7Jnf!-PTl7-|GH4WHirTyoBM6&EjS7X(XaCa z*3#R*fLU)b%f24O&@>(DfgmRRUhC;U3?_Ze&}<0Gno=6cUp;@+l<Gi@ySGF?6#73f z4`*t~FY}$#f3#j#WCAhiOBb0N24Q10jc7plel*h#xzm_|VnKy1FjZy-yfn1m@?n@y z%<WoAcOMl)(DdyvH}qOR4i;HQp>0XsXQ2Kf;UtXYq-k_Zo%|^`#SkVT7kz-b-9GGH zCW4*}y6;yiQE43Iyd`tz9~cR^2<MA?*6aNv;hf+8PLh9OTEW7l;^lQ?G(lp*o}}>% zFCvtjO)Wc}?4*r@7KR$x!h_FSiI|kUo0^!U8KOcuRo=-fz&Rd>4XZdqV9<LVf0MIn z-t0-W-N&IBEq-)uv9FGn+tm5Ur-xt2|MC?;@R@=)aXwI;m~AfEgMd=O$YgByKnFbt z!*e)EDtxVT*%cDJ@|T9bzRsbEV!a4A`&p1v-Rhh12MUial$b*lLtL32u5sK8RXPQ` zcM7g@E1iXR=e_9Fp(1vV@)cjQJ%UXfCPvZN6q65bPQ+_A1DyvyCIjgCM`!tDPC6iS zWolbLBvPh+#AJMKP)u<CxGB|*8h37q-X|>dUy&$hn7^gM|M=+eHH|Rs^_3j)7>MI~ zOZTe$CrWmMhEmL$*Y&N_rvf+GT{0WCXTA|vNhwQCU<J%4c6A>{H#7%-fOscFyB%^X zu`3*}E(~iZV$+{C(e`v(qnNMz)!sDmG`f{ttY!-a>u9fPhVJPCHyZJ~G65iPEJkd! z@T|eQnGtmYjT-*sa-7)`Mo;IgTc_Am()m9E)pLbaNLAMDzV5pYJH#8sN9hBWRiND+ z6g6dQd$~=x7(6$$>TVRW#3l)iKu>c*pYHA};VtHp44S4jq9?b@ha#`-C@!@C=L@^M zU7WdY1YN@Dsw86UudD~*E?9y4?N_@S>{sni?MK5Uwic0SBK1Nu9huc69KgP)WrLbH z#7~}%y3|C!dp4evP3%}sd^GCJ#RntX_E4i#EmdVDk>enK84?(8Jzjgj1bD-XbQBv& znY4?Zh<D`$w;wkh>h-6w*A)P^m4@85TGJg6oINmJq~6u%<H&w}wt>mIW%l0b(Cvm1 zwz;Pl>)tMW{6TG0F`U0&NaCr%2#3vaK7{g2V+Re*Wh8Kpvd$UYU(ah`QlapV9Q1zg zr6BSzX9DK!oB|FV*88}b<eUa4v#Vo6^w4|?<#IrZ+{&$vt@h`l7>_5a(rMZSS1ZHz z&yTR#UJX9S$JHQKTnevnZ419fm;>=wN@{!q+?gYk5hh0V-40eCq&BOGzeC~PL3(D) zBZ{Jh^=qD1hPFcJ`glKgv3l47o{^>0r3m;&qH{OoANGXa?iOxMF?R?a+KE{)z!yBj zKQ)`A%Lv0dSxuxxD#@_Adil9k8h6SW9Bd2bY;xMJi6EE?BQ#hAC9#UP<}-qQLld^8 zIMRV1K0?gy<Vk~{2ca{PT1+7a0A)n>9kEFe;NaKOp!wtuo}9nJ1mg{Mc6?bs`7*<E zr`%Rx7{Taf*OiQ2{6|Q2VxkF0+7kE=wHd)Qp(Bma#cBd_r-xO&@3>Fz1P$W`MM*~I z*t_EgPQGT$k#%DFerguOBJD01(=K?vAXm^9RF}Z1=Ej&PW!ewaE_cq}yeRt*wi6ES z@Q1+y2WE!;YiQ&w1&MA4>?&m@*SNbobG-Up`qjxVGW@GeiOScpcFzt_J%e;&csK(u z<+?<q)Q1Eq2K=yZVvn7H_@KcYg(06DerlTE&zrd30zU)ZwUOv4@TO!7?=wQ<=g`Te z9e<AJDjM>hXvu^jySSKa@lEvTXqrL~{EJL^LjTZokcb8I(W*aVK;0GgAanKot2DRK z4z(bIHkyLwbp6mCH?T)4kYn~<b?0+nRvHcbtqm=iWYaaqg7Fk<T+a%OD*M{(-hPOp zFdm0qU{2;wH?nFE_PQW!Mmt>vG)n*$9G>vZ0VgjSe8qlkF&ylz&9e5Vo?;Oq-M%?H zLwbNMk-SQ1fKgjbYbdmxkG>2&5wJ=Qg_73%XUrPE$cXfsl=Q&)YVpueqi<;FA-BIb zeSU4=MRmR$#`y`SU<|ImZti`%-F|fV)L0`bSGuE=PhW>Mw-Z|vN4HLtVZ?-yF(i~@ zfLEZIb0|zV`(du_js!;@?RL`3wANRvKw|%)i7_FOf*Uv?asGm#uRFj-JJH@}S~p5$ zz>2l58-%akG;4P3=ByEeCfx*CG(2y+ShxESbK+zsswQ=q&Df;{4Zgq_1-UsBgzPlB zn^dzPc>H5ObvpySztX~XME`n=#oexDWDp_8K4_#@=u`wJO0a$f)w>KPbuCpdNU&c& zFx?X2D0;t4S#+r~Da@X%!wrFE7(Pt`rty*|WK}`e5sMWGX+7Rac);r#ROEN0pVfge z_EJ0eVT^H~#W&Q?n~;`c@Rl~$cewh)5DLx5-P7egk}}Q*5a}`Y3ni<O9~Sh|^dN_% z_#rRp=NR~yy`TsNB_(!638Ipr7M)vsH6ZmT_586juBUUQQVWbP=+;qxe9kQ8r5<oN z1jVd(^ologTEaVe-DZ}F@Ho8+IPEx!wRn^o+Z+U5ia}Z)cS0^EXYoR0FxjhrgwGqK zt$RrnDkU=)$TsgbW8yxBV26S;u#9va0R1b9fU5~45jtbI`d))G$<~UXN?1s^Mh65u zC`?W@q*!HliZKE`Fq4wna5f?;2+kP>H6}_Hg0faz43oGU!eA3h1473q{u?r&68Xi( zpQw@?UwX9r=c#a~B&DLich*zfBxua{3u~SLFWt}wq!<vdHofowRE@<g&{Sik3MSlE z*82YL2x0P=qg#|+7{P#WuVDr%l`Hyq{fi+DbcukHUk!{}G(|bvR9s*i&COXw(Rr1L z(Gn>JW)r+>H-%*V5I6yig1mh+!4D!nTR5C1Ox-kjXv*~q9YrO#t*KSEda7aOH<&X0 zsM%&h^ef~><Yvg^BljLTpcr(<MS?o+j8OVH4+AK~i#V+?CWGcFgUiOf46fB%6lo!{ zg|M@hwz!W}A1?V39d-(}^UeiY=|s@X*U=~!;c}^5)JQ+h=Lc+*gHdr)RWK{>R}l@P zV`2*#RZ3krLSLg2Zx5D%uO?LTw=Gcn&v7v&2(-xk#4X?G&~L}+<d9{1cn=GEDXoDs zu*y%vDV!4y`7yxnF?r5cL~nh{)xD;6-?qo6dFvo_2a<_Im+|-${<=FFLCZf`ED7K! zzDq!ZlDbA{0Cx`JnP7VzOnuVBSvStkv#kW4yh9%mAIf^-R>8sWS6%&`Zwu^V(DdEk z^4m+jt<T<y$haN3Y{b@ZoAU$yO$f~ZuWn?wByWi>`4Y14>u{CKRZITeZrkz@B)2!f zjj<n~PhIx@h%{Ha2xT>_sLKu4AO2&@Vs%UvVf&s$BnHiC@K7gv(x?yn9SKkBU5HCm zJ;`njr6TqU8{;z?fNsdqj(<V6hOTyh$%=fbxgJc38R%-~s(AfaZE^H-3Xf(@GA?8M z<e<cyqS=4x_Bv>@UN^33w@V)8nyQ;d@Kby4Fk8F*XkdKvNuI1MjNN^Vlg!=s-Xu_8 zVAnbc;kkj01$6nHs7xOHwl$-%t*8va!_R6z{LtKGjmn<-NXuh$FaRRC^IyHa9?(eP zSh6pi_se<!VOkIS!569*GKNF&-8xF+Da)`?<jHW7Jw1i_XRDqd!hxHbp{FLKYanv2 zP7z2c*}neF;{#h6;|AqWwc^!Xyha>z3}qYjkd17F5fnqVN0^p(t3BgeLOHF#UE|y% z<^qwXQqX?&igVVnfRv7Ty9^B@scJk!60yjG3tYI?9k;qLH&jfu!}|qefHXIbWaZMb z!RhPhS4%rCnCC6-H)`j@;+QQQO-*_>@m_k9Q56l1X#N`Xh>kmIR+l5lNQX<#^dLwC z{i4NkVC>Tsd>S5D+-<0y_d9(@noxvbh~0n*r(@A)Z(TAd7BK(afjQy$&mUQ1qh= zZ*$|2v1#@8*tQ0;HPd~2AQw;-e#T-4eHax>l$|t6a1~b;Zp6wffuf1g8e~AakcdKY z@C2ICmR1W(!To{YwGm83q)2*dG*!inn0W+tH<i{GgxNlH#u+Y?j}SL#a{JPYjxY_n z{^0~qrYqgQFKJTkbl>=-U->Y2+q)y3w4?&TO8-@a6*^`5qIVMonzKN=$fR0<-5r}8 z_7D@7t|3@e#k!8JF50V*PQBwqP<+1n1)ffrqF>~~zC@cm30s`JU#!OLY<Y52)A59y zMgAxV7pY_c$UP1tJU#QV6#!DQ7-Uj8bV#Iqj<G@W(w52{B1Qx|u7KF{VcWu9;&B4a zy{{L4lAnS;t~kobVXV!smKce<|B7%HA)>sUWW65C>?!&ER>a!!;DPFh2Y0wwHp|(W z+&j4D&~wNe-ThvQ`-SpScjTcR0@4=}Gd#aNyj8dviWEmPc=(m?N0{V8v<&LMJ$`j= zQ8Hi(mB4v~!iLW7e&u0dYTtqRR~#*p^Lsen+%BBJQD;vJgT?|t*wX-6rC0|QTo~Rp z{33X(MH=3P9CO-V!e$|5OfrVF_iVh&k}=nVc?FUCYYLOlMpNLdH2RzpAJ<uYz|I+V z`PZDkGHMtwe)4l+tzwp=>GwvSwD5ocKQUS&&v#mG!{BW57h{$vHS3-jtJvzTW6z^> zkpT2~Znbk9Dr6(0sKdf5XkuWchkfX#aO%E&3A?8~lDIIKUL@K3!Ya6aw(0|74p}Sz z@9!GH15KlavKA>wza!T_X?1kc@+eAA!q_=VSL616Dc0%Xv(=DzKyM7M2t9~0m`U%h zSUo1xGQ#)d=JjMu8n38;M$pnKxgI1eTjylq6HV`_G4zYVyPZ#BnAUf4>v$L<bFdZ% z2BEI^PaZ*gW$j))8;m9#@(c#t3er>7;AJSf2Sdz5cX{dn!W*b2We<iB{Nnc@2E=!d z_wgR|e71xotNn5tDtoiF<ss5I@B~3mZv~|irc)W5Fg=D+?`q34cZ>f79P#0vh=%nY zEhx{=&g;A_@2{1VY=%AWR#}zeE98G;M^-u1FO(P5jD{M1x*a92L9v)zJh)<bOw+5s zbi<Z74W6)i%?UR65x|8b1^4{9lL+u(?d<SgN#X$_a~Q0ZTU28#)E#(W*0TPvV{Pm7 zGy`B_y`)@Y{;MJ|hyT%&+{q)|(j&rz47r_|BXMkZP5){VMYx+lbmor+6MdV_f)ewC znnZm*xv{PW&)wRQjDjonV&_)v-te69OuT{A(3V15DOGaMnA>&MdgS=t4HbDdJ_%d? zlFYmP%D$y$ejWw)BBqT%7nccr0<6Btmo46VeCrpIzviY!Krr_K!I&@QKE+@VF;#pI z!8cm<X=j%)XfT*Sm8gNY(67;ka*xG@rk2`+6*i6dMh3EXxWw2&MsH3^^jl_LEh-D1 zbvnucG>Gw~HhB!9CM%LssCHygLeqRH&w)juOp>8k%kWZs7b+*$Bz}CR1Of3=pW0@> ziycJ_|IkjqZl8>jTw1O(HOT^NjCbdg6EOMSfCZ`BJNly!r|uA)?cgqh#2opmvE9O> zLV+5cX*D?zaIiW<{S-J<Sc1yuf%aSq*VldMUb;-^_7(`tJ5#H?4q=v@P-X;)B`Y&t z@3@2b3{1H~?CHpk)(;AeP##dS77N&FdpBMCP}Yx4`XxOd!3{{>sF{13UM<jJkT;oX z)4kG|lp}t72MriUSl5_$(|<an+w%C0`;pmx`zLf~<>SdFu>=UU3l&-~6ydvDmydyP z7)?T9QMCxe05RQU5yP~JYX%(y=4Z-Mj)<b=G`V;fiMdkPBv=9nbP+sBG-1}9@uSzT z-zLy!w7%5Rlke`oO%4(qCf_$WbH7d)FJ{`0SGe{Wu-l?!2K3HJ6BUFlZsT29qBG?A zVr96GUcFjKndQQ{T1Pot77Gid_+e!FFfP9D^0<xbgtLm&_iYaH3?{kgVxcYHY2{*u z%Y9-FwZFkOU|{(8%j{i6zf0j?E-`O@Mr6c#FueNun+kpg4A^X1?nRg5BrtpUVcK7Y zj&NMA$ZLGkT3e~vjOYJP*!USF<hfL*BTF>9fRIF+39*TH87tf6(3X}3gLXrfa7vcG zXZn{ChfRg6Ri=oAljz>QvLFtjsVD<?D|mC)guMT$JXv&<g}GEIlqHijToOtYc;YwC zyO!ioT|{j8!VYeMROkXplnRpAZYfskZU;7bt3Wa=<-w9H_ct-z-u2XCyKN;N77{9i z^z)#Kd#!34Q<es;QtuCK<SPKap%$*3U>(HhE>ZH4#LR)ddSRcoZxtYmCdN?_a-)0n zQKmqxOM3Ws>9}&9RZl_gE`6n_>KSJhY-`6#h{G}Sw8ItoT@hM11MtCC%Q|G=jEMF) z=IX4)o7dK#bp}UCay}{>&X7xtQ1aX;u!bqs7y@*2Z*%nLZu__QbJ)7eS%|>RBwua{ zM#ltHaEyg|hR9X}?0(^OOXQ!*(XQxT8=3wAGy{6Guawv_Rw32f1UnYHK8JNp-f6_5 z3L`!823lHJ#$%vw;x(Gj;oXG}H`R19!Pecf+dC`jOJ%U8(yUc<DxQr{y4Jkjq`+kQ zdWJh`&d9o$7-wZ83@d4pGowB$2Iydt?o1_+OKr!Qrp~-@ycZjxh9=hC!&DGF^}`m5 z(IFO#;w={oc2E0AZ)x=3fPsOFOPSm|Ua&Y$U>5E7rnt(NF@0rXR}FRwbhm4b$s*QN zwvN3gb8N7j-s=7rb8i(^cemwh27(1AxCeK4cb5crC%C)2+X@g|0>Rzg-QAsqyStwC z?W*doop0Ca>hqlQbYCv6xR`VP=N!Lxydw*G@60_5KSYV975|cUe80Yv#Yp0J2J~SL z4KqQ(?yXUlq7^=~j{xo-G^WLs@}eCC-D)|9LrI$nFgTXT4twcim&pD0MGC~M%^Lnk zk6Coz+Q>-qk0mjHxkqka7^ZvjFNJ+>qUDbLYN6Fru8N#qRK@`pIimKK!)~L~gFCe- zdks8mJxyv17)&7%%!dfU7YaI?LQqNounD8RBLuPSBOF)Vi0k@yJSZSVZXgc_TI}yA znoL0HezFZSJ?$&b0tKyj=;YZJueF}@kEfr5<}D5RU!~3>hdIy1KBNs%x>zTh_h|fW z<@<w19X??$^+>xbFH;#-dD_aspW^%F`{*3z;Hul;jN`}jqG!Z5C|uXORc8Y0G&$XW zNB=_p#Ds}7E~+ABR7p%iXyoJ2S*?%YHRy6UqkQ2$9!O0=c<iHWSQ37(4u(PK(w+JP z9KuzR1nZHwu({!S5bMORi02fUt6S(NO9fTJ_uXy95V&Q^>QP(c+#c<RA9>^>F~TA) z6h_-s2a!6B7J1F%Ojp9MyJNRu_?1{?u<+DAd^~t;?=7%1Pqn>aOSbw!>bb%%L!z)~ zM7b>>%!w$+SZB4#NobS{JtNFuUC#cz|GPHFR`x9iM#<ny_3GCA@PxhFpv1vaHG{6F z5^_?wC{ukAU&O-F<ZF^vjM1=X8{^{|)grG^PPShwL{b?~P#wc<fbRk6gOZfT4bnpw zKi0=K<z|E(_&EeqG3RlNYBMAL(|kuoIRpIEcAtuGZ&3{bh<&CNx55CsWjk55y0gbS zO`}SAr|5p6WF`tp+A%q9|An4C5)FeN-&N#C$)vz`jI}NW=jW<>B@Et4=50Q8))EoH zApDXe)cL4_6XR14?kRiL)#Bznr*K0u4#{zshJ~;@{Am5?HtPC>=P2Py#6ELt^?Aao zXF-_Ogc-|r)d#U`psr{0(AJQ#DBg4bv%KD=u!M&=n*97cK)GR&dsuz-H=(fC&=)<s zd-igyGUwfBbQs?eNWzJHtRZ|6;F<!Bidg?O0vtt}TchT$3P-oMKJ>-5BS_X`#?KYb zU%2kK>@MY%YMo^puA)31oGHz?U3NLkz~*IJwe3lJpErlxoQ}4|lJ4xBsY*;UD9A(V z^M`mX*|h^1&mA5Hy~$w&BCL5X!Cyb9CY{|&#uJA1+Rsb~&ELefWI}2r*ss?a)xPPR zELX0l%lug`)(0me&YJvIJ>RWeWuMvPNcELdnlKybP@B7W&cZv>$;Jz998M1t4K2)F zF~!Lm^vlt~;m6OPK@IB|Wt#ILX7!_UZD1BEj)FceIB|;1WApCHENSkPn@Sn%-Xn_J zobFGWGCFDBilhS<S13PUeeu(t;2lDB6L80KU=|Ua0rzhkDo*sqRLdF11e)fHH5orb z-}ysh=jMzZk}B={T0bIeuW$kn;=0`IN9a)7*mk5g1~%X{hW3%sjc9zW;^`xFlV{R+ znK;rH{ahlHu-2WawZWg`)XeaH|K5tIPjVO?iXE1=tL>LS-abS1OVmZv3z`>KR<6|; z`na(o$5fP-`kj{T2Z=<Z%<IQjpaLD-<<tOjlHx&TQa`O@ducgghT;6N8!=-pWH|x1 z&1L3AKH;$!Z}AjPL;;(V4vx)KPHs!Er|k507G%E|B)_(N8BoUFjtKj#!bWUA_FMy< z*<@E?^f)zy;{^)+39QqCWhof4{o3B++H94l5$jd&b=-nS!z;qTs_r8-Z8-ncJj*9K zaSDxXYI%Fygd}6@#X=d3o<A}&K_&={_DA-kg#x+Rj0^))QwpD-(%)lqewd~+q|>0m zGJU0vFOLQUPXt>6Nk|V@A2f$CX%3E(c^VQa5<W?=L*dSBI)X|;R>FcgXQ37HwEh(` z{K0rIU8|DTejn0c8WND1p(@CX>?lHO!Va#|`SJYAdbQ%OFT8k}D7_d{>)`t#mO01y zUpYgdCs;2r8s-_25(NC0KW_B--*@Z(@<gd{A&C4aPOu+bhyC_MPK&cEvA(V~<x}XK zV-Ku%s1P%9{PB@p*39%Xji!yK)<TKZ)1rsh{7!<gwR(Kd-!RC<#LgTW_&r9HdL0JZ zzglF8zqFR~x!AFJJ)9$QzO`(=(unz$YrCBU%k{uoe^DdA;io06TTrIWWYLUjEN*s1 zks%lO8nQV&RL{$)8qBZwHM1KyQ_jidN{$^s_a0wz=YbA4i2Sm7goGt<rGuln1ezO+ z{zzBfM-G(9QC~nGs;WLz%B0;XkG`4>fBq9G-khQU<>P=iylWWH2CEe8Tr1$R*do~4 zildt?^jcc?0kg|-8=so*CQ;_E(;&fy@OnulirH6zqALG8iA%`?euAy-Vx__S*OMSi z_)~7LjtG|+UHua0w$b>CECyV$HpC*bcGF&9-QTfkQ1=b&DcTJsV(dWgAB*O1#IF_n z9@~GSOaB#`=>`wV=pUGpcZL~zO$Y@2psnZoind_PG&?sY+9cok`N4ixJU>i|E>SD^ zDiL>2!RIBr!f~%i_rWF@!SSPWf3V(nm<ObDqw}E=Vblopos|6$wIt#-ls-I5U{=)* zt2o_0Gp|d!GNzOuEE!JBs^lF|0k4BsDd~J-q8u^(^DC>&3O1sZrdDf$zS_}0_fgJ5 zRpQ^z9gA(<4zOa>uF{r<*f=eAo{qHB#wZpE=WpE`atLUJDBf~`Weum&OF5ryqZNN= zFyqgtD)-p)Hg^aG@$w)dI2cxvF^f-(@))B9SQO}Q#C((tL0I^N{XsnH7`y;9tV+6# zi)ZRK<F|Lwiox6z0!(pUSIRChx%DlsKDZf|f3XR?EcZ^bXTK+~l6hR}*R>r*=EHsY z7}nlt&^UI7;Zvd(8K#lcew<8k5S>+L0dth}_*1M>fv6EEjz@_H>UFUHND6`rWjD}L zwg@LhE0VReo;qTf90w8;b4T@sJNSst!TMrX$el+7yzw7!+&HiBQ@|pqp0XjVa0K;S z0xFoCo`_mIPFWzD$PLCCrxw!<-#Q?0=FF@Xxd^{%>xSML3DA)$xN5|}e?K(R9f{jd z+-@ADqA+bAc6?2qiM{@_Kvt*;G5Wr%R@bj@WW6?Ny@>oUUy_|vGA!BIg%8@^ED!VM z_)(K*Wx(PF^J4q^qfaNCZVDUu)R|_hc*tDkANUa;J#ItmKIRYbbsq4|$-$%jimH(~ zo^`r;@9LD=7#x-2UrL08o`SAt4Z*opQuK~WT|WC61*Nq24%dE{QkXXRNyaE$Y-wUN zIh3lboY-f;2Q?(`v@z=xW;BHbXIWP^kF8}H*0xWXWyooA?euP3JhORN-AeO{>L`|L zDQ`r8u}MO%u^A>_rJ2=h2xAJ_>-PB($rNVZ*;aKwu23B6`u$8Zaz6YR<!-A#u9mgT zl7@@BsD8_+*ceiKNJGHkXi!;)G3xYb50aHd^F~BmzIQhM7=_;`1^DI>_NZ8N5Q-zl zUp>5qtrEq5-|hi+-R83Ss$j7AbO;&L`VcKkOjeO^Z{LGjXVI0X<od9QjKgX#L1!w# zdkMjJPlpw_GL92OK07ysk6Y@Zo(~`GkyrvyK<zPSax^G3<D{9fN6!JIKT=PC?#$hP z-w7&zL9MKgx6L=02wg??`^e6F7#93<U_#b7IcmQ?^h$_}Y##uKy2^k*(*k7n>4~Wp zAj^2_MS3vS7%yCSeI8zgh{9F&uljuMKp{z2Ub0s!?k<F!j_2r6k)LmLsc>MWh~quD z+aBy&p+i)c#ZFG`dS9?IV-sx=KY6sZM{I@&6d9&k)XRdUI=4X+B@c%TWMQ?Hjj`hD z#78OdmoucQgMyZe$rYa(I}y{cc_evvM5UHne*gf=-hSxGYLouXMuS3^!~XPZzrO2E z!ZcRChX?=OU0GxRt`?Ia5FqZIa54LP{A$;Xb^YS9{L{qAv^(fziOFgjdl($}7Q(h$ zO33BBQ-oFJ7H0<2-s*|XuiXx9@%~M;mHFe_89h0;G_T&UsE2rhPF&6e(m7wGpWg;! z^RtW_iyi)YOx(2<UDJ5P^D;Z6t1Yp-J-X`|MwX6|Lv_8|hNs~PXn3j84tV=|tbFus zM?k8JZa+Li#?b7*Wap0TxOOrt<+eR~0buo!y5iQTJA~nHyC?21bk}Sdhs`M`{kies zT8ea%aNtwNnONW+%jR~eSl(b{|Cx8nw_ZJoh%>-G%_mq{+y#PhwjhD^l5(a+DJr)p zjLm~jJn5LNS+?l<%j94`N-iL$93KcD3v-mSF$O(rGjZi*QClU^?ebf1d05qBPblXz z(D%ZI#vF$%RiZtMU>iAOft(Vw)4p;r_MK7ekA-=(SvGKXZ*fpYzOhj*F6t~&{^UdV zlfHni$r`gDl5Xwki<gii&i%bG$&{x99yZUd@S#Y|Y)2i0D_L4$M7z;ve3`e~Pvu&y zKa<hJaC}IZ7S2Vy)CYOgir2nh@whp5e_$;qE2Tk?`|aDmwZ8{!^!PB3uNel_QGvpz z!RFj-u=gM@`SP9Qt~b~4;hBfAp#|KM9KPE^n4xxDK2qFi_PbQ=ndG$uf$4d?npIc< zzJqeWlDcHkgNsA*5+ic=a6=;Pq4q<<lev<J`8rFL0Z{m}sU2{(@EKU+9XYwPXAv~E zSa>{)3dimf=zmMU6%1BmuR8;paBi+0*-$1n(9zzVn5J_9zUJ8ttFYD*;Cx+R^j#ST z0%>~fhT03?(^RwMr>1;=Y>&}lFTwa-(IRIJ$VAxXb=U6=(}SHpdf$^36D^u~k1D?z z2vSEPxl0ZImB`=CXi{<j2KLJxFMX9-gwr)wvnz3l$Xn_DEs<Amebd95oRX2C$NiM_ z7HX?X+iilAv~cmRzkQrxcl8>c+_Ig&DEjajepEs=2)O)onA{#G?1x4oVWEC;qwK|W zPiVG(N))5x{Eir7^^EqeeHW-MrtVwO_Qngv`-;Y^om+<!-ZVki`zU-bYJV(&Oj!_< zo7R*Q-*yot-BU55w(S-1(e6M-bW$P>?P?zs$X9uxli!-rJG3YL_<)IdIR_bUGeEBk zI5aq|b1ae;aoQo5Rlf;Vml*fpKfY}(b*6NF8n@I!skh`6CebA_y0D;H$(M*evoDsG z`@Fj@nP<v^9f%*S#xa@;zVQjhCQE3z>omCAbkNA`v`Hat{+eEM!j#_~@qN__hD@no zf!IoG8goH)+9OeT`M{~B@GFz0?p>Sq(7d?RUJ36!Acd^^Z%=GxCU6XGui`~Yt3n$u zZCEKsp_VSbZyQn{<ub<2B=3e^@P?Ab_i7(F+lbUpnoZcI)TA{M$1B+Ja>x|arU(5b z30l!&P)j^^a@<k2{h+XSNYkGLTdb7Po`DszklubP_X&f8GkX&_dr>K4HNf=vP*mSV zqM5l&c)9$L5c9wcrV49Bi{0-=?_@l^pt6<UFTNPwoal+t%SsXG1}``6_-yrGKg~4M z5HPR&%7}*J3jpm+d8p1L5RlNsl}cZlp|E{3#S7%yxs@98`tu*}j7vT2c3EwTw3(j9 zIAr0R)!J)1I**nDCzGR=C0x$C-VV@a?+L>u?%KbagwZaxG-fG0+iaOAS`UnMM@dZ> z^oP|O9>=sBw-zS`kNkUVj|htGTUlQfS4AwQtykMUp?%-IF^iVwzLg~Iiv;^u=GTN? zt|}Hrm4BTNA|`{?>z54iF4MH=s5jflg5q6^`YX8?qj7DVbrEqEiowem;-0RRl4Ct0 z@NWWrCR)*gXVet+^-9Q0yecJIJ|z)jVw;;w%FVoiXAeuEV!yoJ<8Q@AL_Isz#9bD8 zmv|6AXXCG-;5vVJkNg@cv;C#D#W~oEtNTK-Ahpi&_jTj#B6ALn_8=oZI(jtE&{94@ zlIjDDVTkt=Mo1hHNc~M|wNn34;&=RHqa4y`I=4Ed`07&0U_(Xpr1?bT!gP|p{#{nx z{Xi9qp{l(@ko2Rm9nb3$trM}xg^uCFwtxJ?N;{ax*Hl2!*|MG(x$g^8|LtX<qb6+( z9%opjD{R;Ta_Q<#+^lmGLB(3D#OqxD&0x=i6PWua+zLJ+RIY3Jx%`S(D3k!u|3W7^ z)yTq&8`*Cs6!eq4j60}FWDq$WHT0tZLGSIe^QOQK8Qzmsv%1*2M`9IX9^zqPYt<)- zGs<r{Dqp~10b_-_=JKb8K0Uukzfh2fpvBt*GKnKr9_l7vsc)Igtb9GXjg2<?EAnVB zDMJnHC!&AWG#uQgEFWAWJxL5uMyKJ3A9E2-g-+n?T70EDR60qm_-&a(daXimTre19 z2lZ!upc3OZ|66%?mYyeADaREUu>oIewFo6bQ8(q1E8kr{c<n@wB?Cvnaf9d+5!J;d z+3Fq&TT(9OHt}Zl5SQod6>kNhRJyt80vQ%PGO)!r{u?ukSR}YAE%=gWvsVUZk;2q) z5pn8#n$aeLkE{9<_GWc8lZzaJ1qCT&{kT(5h2lPrtTVa$jJpY9e|bfDNlw==)!gJv z!3T!sJtOzb9J2%3R>8i-9##b569bK>uvg4$vLKR!r7meQ$7`FWX74?P(&a;`OMwCX z%!!r<8G{ERp$l?tPXEolX>k=DcwCiRP^LzUixY4OR<U*Rm;ZM=SWpg3**Yx@pUrG7 zHYy3yOrF3460KYG3Y73SBsbzrp&~qqRuDvfqJjJhY*GKrB(C?(aXN|fNzqYhJGXuI zN~((cdG~0W#Bz0I>(f=GET_vLa)%0qrrVl^Wh?usOw@pseCD!x*_9K<3Mk;ehYQ&p zlPps>zC9n;uLW={E5XDcU#4BGR?1E8eC?T%Vdx|}<B3YwKQWiWpQfJf2XFHyBQkgz ztI^$%t~hEq@$2GuSI41{h;iW!pxuWekmPQHeKqy6VU;XvX#HUj4fwXcC~{*jelx#t zG48U4L~=F;OmRq%MmMI_4y2>#-`>qah9$cYgeS|Q!U{0uZWgjPO7bCyh$nGluFz&o zZ#BHOznR&;*y6q-$M}q0BEhTVcN(xjm**Ub`DJFGwVqHGwIaB#@^sdBvRK6wB6gvp z7O}6};o-^PZNyB;m8w4$(-jcQFtzWl&DVr_KKcN7h*BI*c9lCd$CB#z%_SUg>|*J2 z=|=jfC0~~1wy`V(<4g`UpH0XnuP=NKqm$vH?qc@QgZ~w2^hP5Foq4_n&s(+%l;Cx& z2`)~G9~_iVdkCbdQobf^F=%(70UlmM#WV!)xxy6?R31iFJ8XNuJ4xznU9ik!2WQ6i zRW_PtJglnw<4+ke_H}URUZzo$>j~X$vd0XzJ(Yz^v=x>@dIwc+&9|mE{a`D<(#0i9 zVer^XdVE5m2>2TVP&f<$yRuw-rEc~6IlfIIhfK_Ku+<w~3i9m2MjQHW_~~G(g|0qz z>C3o)6{Tjg`H#1O3eFT|XN0cLt@j-xJ)Q(HZVZzC-_E^iuM{>*%#j$a<(%;_Uw;ML zp>&Vj8N;h$u*F#%Q4iUEjpji!?7qNhg3<utDDx_qM~&YyAmX_#PNEt_ChF1N8w>~z zPCb@}Qu!T%AA+MrS2X3tO7>T~+VP<yu-GG2S%-`Eq6QllNDOBUqdfNMtk8JRoun?v zy@VT&Ptpv4nUdVxKZKYG%MlLvtgqTpb?4r8wZZdi%|le%T6*e&QRBAbfxsC=|F<SH zX=_`tUx~fp>rsb0;a>bwkP`nu0@6T8067~w3opxDgz?anhDEMVH>&di@g0Wy%hDH( zIj(zZc2QU+**Z8HvOrzeh1p=hl(>2-h7B=^rzcI|gj8Q2T2I^aYn2-_lt6er-%319 z`Me~xM9e07x#Uv{JM*(_g^~e8-{qsvfPGNIVeq=`O9TtUhS&+=6z9#{yTK_@Pg}jq zu8l0hXW>ty6h;>gwcZ90?t|b8EAz)KG^!wEMONHXY??oiNZm|MAj+!XI~CdY7avln zv7Y8KKHy4qJJG>FAoH@B+|lB6tl=ts3O5Yl142I!3M%85N-j-a{FrD7O=4oVh;>eD z>vm-@-J2-zIC(-w4{<)h`bz)wc__r}82!Yr4;%L(+`XWoP#lwvW=gEK=U`YiA~MTI z*JXz}6}dd&9VybL&cHVaJ`N}G$8Kk7XF2%&P^6hi$(2W(kW(~z1WQ@!QoaL?+8jxS zr1mA7EBK#1-_9Jja~K9G-=ze2S*(c@r~BQBPy!DSK5cF`^b4$;u~p{+zG<GME<|K) z2+<0l?nITWE{K2Hlfg1fsUXCc;QzBP?VB@*^j$PN3mOA**A+&e1W{ULk8Snlnn!@4 zKJ}D{eRzrK`$C=+mD;>R$c^Y9T|#nSQS<P0!A8|GOo%=NseZu+0uIf7$ySPVEaO1T zSZ)s}m1500<=hpPv!R(9<3w2o`@3=fAWDhKd^Emhlh@E#{`R@9Sb<SHgC(yk%0hdl ze}4yo>wXRLf{j8ICGr9PSq`3PuQ+9oOUR%Bx5USd;2g;dDtpM-cnU%E3bgwbm4>dB z8b1zwNI>z#_9el$zdyBq872G{Z5cA}4Xvae>XrVs2k$X{5JfcMgb{6DwLgB?f|{x) z@M1fvn^HJYa~qDAk;jjI&qArmxVgI!4jOxEEJFO8lWfINfM_D@Rw#Y)Xf^rGH6IQy z<5$V;D4n7W83_ej*O6uwr~vF~v`=&3)rhN`$wI*QQ8Qa^fPc%hd$;U>>5i|;v?Y=d z*dmj|xPFcuHA^doySAr`+pwDDaC$8jgC~?st;EQyDPOZd(2Ld;nP~V);<XWf;7%fY zDC(Y3vyxv;zdG`fAd>h%B=h%s^b3qP?(=UR_teZv<eU|Cm5JrKz7_gwhLL;OH48+; zjF;!7e!19;;<obLdC@R<V)B(T)3VmAak)cM=oB=Mg5NU_QyEghJc~`N5mtR6rp<UE z4!>{_J4(B%cHR!KSz*9Z1F_g9Bh&A`8qBzKZEws9T1yf7$FH(6%+~z`Egj;85VE%D zYnquSruoQ;Kdb(QybustpDDuqBID;jTzt_O&h8Miowj^F1c`6NoDBkr9Qe@`Lo4kM zW|N7j;)vX~T?=YcR9-xVEBSa)Yc8go59{v0@mjYf`!|I@#>3ZHlwHm@vOd<Q)^8{& z%BnHPrvH#eE2OuQFDUW3FBdPJ$*nSfZeQ=NgTgH55fmblF;C;4t!F6~Nqb;(A%=4x zBB@@tvl1ti`dA`y^^nHr1!0j|=7eO={V{FHkR~P8QO(Grqt8rSKFBSL4V!BET#*wZ zOVtD3M1W%^3iu=Ho7z`kJ~ceu(_LQlt&QRP`>Fr^>>CU|y=*VOHYXL<1$;w!ppi&( zz18CH?zp_?d?+j~ZW(;aZF!PdV!vA39lGy_fMEfaFUhW}__?=YHK*$e@H9kgYEQ%L z+*7z9brSAEy7tvLyF5vE=I;^N7ZkD}lgYOa#4<5e$Z-4f4={48ui#l>kLV+Nggwke zfl(PFcXT2X1y5V(zr@h$g-a%$Es^v`rx|5mtk|?Eog}Bf^4#cFRqtq%h%mZ$FV|s- zR_u3_ATbct-d<XUG$tP}Cl9w9!}!=?y{+kDfEt#c;Cq(iuViC_=K)eFP6m177kz0L z7QTe5Pme}X8kEhY(q)V;T?2)fZCEn*`Igr|2kb6{xv>N5(zK<~%f{4>mP9??KFD$3 zW}Uwurp^koU7aK<4)1o<I&-_^m69m3d$^*`JCoCYqt*JZ`Qzl)N{+D2ZY|u^+v78O z@1|%vke{i1#`4ahm8qEQjsK3TfAo2|aWH=$RACHyS`a+jwXGZ*L<ZfwL$gozq1@Zc zAKzSW(oZ6n2x&!epIq5}o=pNJ>TQ(gZ%~Q{+gwY>g469)c9tizD?KP}Ue&Efga54c z@?!jj61-LEXA$Q9g%W)D*C@g7f<)YAJ|6h?%-Tq7ch_|(7x9U8@7maan)mK1RLtSw z^1Ou_TKWGcmcWz*jW-l^&c&@-!MPN6cmS}&wAz+}gDJmjq*VQRYANPGa{~Q2#KdT% z4(DJ)3``H2xjz;~ZSg@aHa7H?YL0PKB$|Yzrs~X!t@d=&ud-R=Tb_x5NWT8!kce<O zAI^{Til-f5Qt1)a0u?})Fdt!e&|ba8KV6mR_$e9ZiMC26yhS_>e3@K|BViN2)$80i z0&?}IRl~Bj*fO~lH#g$7hf`ns$Cb+Ck}}RDT~t13fH1&g3X4S_v3w;%kk)#3uC$7; zt^XYwaS>mnAqc$osy=5iqbiIU)?6Pqx=s;7gzg&xiGX@cM@O6goi`5f0@tyULM&u_ zdh1J1Gy9&sT2xMQL7EaNPOX<B()Pr2&17XCmX(KIa8HpO6FaY{7n$}&ItIs&_#HEq z>IXV0y7Fk|J@7ZurLvd)%^9x8Ma%+Gj)+Td`%_x0d8pca#*KFM$2DrNrdNnm`1BzE z=y1m^1ut{ss2b`4vu!#lhR6slV2*+uXkg{LXwS3#gZ;fO9*-lOyspqiksLuvgtB&v z{Iv6ZRu99k&HW%SEG#TZojl<6+{UDWX=5Tu=#6>}8&n2)Ltn34N4M#SJYG{-=gh}n zVjJvd59UHhqiffKJn#joZaiBW=@Zueru{LZJj<)G-E^2zi3<RK=_=>JhgYj)LhZsK zC4(N6TDz9@!Lqy5U`+9l&hN%Z5J+o)9@Ed?TAW?s4-}FbS4Fj1vA;Tdm5whwii9<B zfC<s{lQ?9sv~&NAZjbK<$^emrLK`acgQ6Sn1^|7G=L(#)eUQiP&F~vlwd|VQ*<UUt z?5!zTuNG=lyrbp;l~Bzy-kF}ahA2jbFzM@tFobiE1jdZFSQoq|<?G*A%WYy)+#93* z0V<g0{{<?bWPw11>{8PVo9_P%DrnpM1uC$X;tGLTKK<NTuj0l`aI;2BfndSzD<@>J z=8XKKZ`6MP;CHB}1=x6ylPC@AJ8NTOs&)O4`sADkDCgur*hiGuk}eO>MezAdCn{3; z%>?NedjMwk&(@1Ccf9h6u~qU%d9*PRQC?AxLtrBTY!^f;d0&;P8{>pj6XF5R0@PJ= zy)304B9V9u<RrlYc#2Tq9k%n7?_CH$B_c-W0(@c#&M=2Pw!G?6FYRGFAzZOUpZMR9 zY1axyQ7lifbq2a3%olO7_v?D@$=A`5>sl^{wk{99LqCIovdQY{Rhdz-TpjD6xpB~9 zMCC#6C_OeRRO2`064x#4Xl){>`iPN}z$mKo<l(|;@#c!2e`_9&QnS$s!=xAd5Fd_4 zDJ<!Vg8EBXe5kq6@h~9Sk(xUeUg_W1h9p{D<=_7^y20kZq8oTW{J*6eH2)XrhIqEB zWaDr^_nSoN+Gjs=5n*H;{xp7Wp<-6NS1ZW7<kdje%cJ6)1BrAvn-dNunBj!$m8;9- z^Bb<cm@{Fk{Np9k%%zZuVD(XB#`VTmJWYUQXxGd}uf8J1{Ww{A`&MwwO%!E%X&GUW zO_lS{szxz^poci2_RTYEZ6?j*VO$#Iw?sJpOgW}Fo{;XA9M$58sC`@vdG<@)I)1(V zi<d~6O3yhsvv~tj-D5$Avp(QfM!wl`a=EAYT3<&f2m?7ikF)psqU-6JwW#rw@S4nF zLByA1X8lv2PitYI(x<;1uYj#HH9U!iTF}wq!kCx)_VTxkCn(C9IINb;OvYMHC4VVh zvP0-zrpzQV7T^dX9IwxC^Y<Ywk(mer@ei@JIW^?~&|PS-njh1lUxmq1WSkbW#b*Zw z$o;pk%oPM0j`X~^dHEve#A?$|3cNhPWT+E8{+vY}|5t7fe%Srs3OHEUUfv?vW_Hjo zE-o%fY3Xh)+elS9OA%JBy`%LHb(A*7{|)|O64yTO3C#H5mXx98b;sU}%Ds_lvK-^q z`D@@dw#iX!gRY*#OMFh`WGI_A?cq0r$5afM6FJqola@vt=XRKmi0Ki5N+jOFFZkB- z6e-;AmLs-U8~vXolHmIzwQN%0#kSY+ykFXWBzPezFx6iTupj<D2<B=V8gb|eM=&ek z3<l~HbdyywxCi$WQB#+jc~T9e;}w-cNLYG7FrD#(nH`E<ikVr9iixEq@Lsg7p~W{B zY4j_8<Z=jVnH88MB$%s4CiI54rwTrEHy>r*A31uOqB3cVp#T@r+&s$O#yJ0E`&2bP zkb_f}?WQTRkO#!zlWx{(93bUG)YPYiLBoQY)HdGW{F;p$B@A=uK{Mr1|NHB|^Ah*} z#!H~%M=FdbCrB_=SmLZ-;3^+Tfagf(anfC60A|u8w%5D*4&IMkRmp}7BwOkejx^Lh zd+(IF<0vw54`Hjhmm!p(X3@|NJ;jm$j{o_=<Uf$o+0C&b{`yoK-dw|Sa&poOP%NT# zK)Z^%4t5L{CfbwwK3#WNb<t!;=M_YnfvYF;Xb7o;@3=pImCFnq1m&POULbFdpB#+Y z?CZr`I2mXHQNfRoM9H{C2*~=V!1~X^{hM{h@Mk-A7$`cKGod7v32v4S1epK|s9+@V zn#8VTLEM3*0>Xid%@p$Wt@)?j>S3v@yG~d8%{Ioxecj%YjDan`STzrW=+KV#Pm$t} zu@VoewS*RHX4;KqtCmxXcsqUwsLLt6@rf(z^S9J#{PhHS=DP{TuRrS<Y$pCW?k9i- z2Q)J!_lWW$mLv}hLJX()T~OaGcFkP?J9su9&I9f%S{KK5OUZ*B@-a#N0Znl8{@>6< z{vXf;KecymCU0<0fsVbynJhDe)|;uu=`A(J52A;zIYLICofcLv7F(so57Npz4T~6Q zK@8Db*eil3B9VnwPrNsR!-d(aw@Tt`Ac@=`$U!j{*d2ViA!`2-NO`8u1AfLorhs~n zY`S;ryK-x&CH0@^iN$)EMAdMZhX*zhya{izR20?VKR;~}(ICl^fCbC&_CMH&1DOAy zC$O&{lCRn0`vQsyz}O+w+PI9O|9lqdgC~RwW@iLY$6J*CHPGbGv*Mo?)M5n4#bGTL zxBE|j{reAUCXkmwZEMK=r?TZ97=+uTiB39oj9)(F%j;_7&G|N};A1lYN$zLa=UWak zV!W|$5$+9HHD$`B-?-{Gm9jrhy3m`x4i+g*iJ%xVJuC69!%Ed+bd%)&JkzBz>I;5Y z=0D3+^`!b5;&4+{Z1o9t#8I2<+sL;%*iyp4YOlX34a86@Tdm#2ELFQ+Ew%Y3b4{Fg zObdvp$Yx5}>2Gnf*ilBMJEDJ%Rxi!1Sq*$o=PC~T{AOd3B^Z5RiDT7ftu{;mTGT&3 zpZ+{duK$e_vpw~SK)kbLZ}tN<kS><V!(^Q(2U(d1^4SGXklCtHe((dMp*AMx?hdiq z(b!UW`8nFD%o<`zjE&$oI)rgrq=B8=q*}V!wTrHCbThI#2^@Yxf}jL@`KR<yp3B}2 zSL=R8TMDP~2lSbSRq7@z8SW%)MKUXckNgP+%KrdM$Z#SlGNY5>-=FIITS>J!Yd@|0 zR+J&lmi(@18L8^)?}CVlGG#z3|MQxqSoLAV&Dui^?dD#nBfDbdj!VI;(xSqAv7HDn z#@8!4dj<*kYW<67knNLYe{}yI+VwlxWTCiG&-kO;))jXx;j=kWc=L#ZF{KRQwPqr3 z1Kz-Qc`mMNmCWOT^qBO4f8Kw|f^)?BZwwv9Y*4tC$00U7A)O7n2yNOb;^2s9i;)l7 zWkeMUE65P8=AYC^JeFK53>mPW6|KxqW-Pz)Q{Zqwi^kCS0Yuu{dkjwf4(*W`J-#}l ze(a;zKAGZX!+-T<w43H&c8vR4|Gi7-MhJb+$V5F~!<aRh`Cad#ZbEcT0rEoPKU@Go z^6EI-w21;NMg;k_%@KbUYOqq-=^s^uR#1{zOj&E&lIv|<>d@CCicI1Tv$QJyKY%G7 z%LgS?A$fDoyl=txJWo5HbGj>UXW(GmFL6^urFG@Dw?Zf^<^p62&Mvx$Sk1O#G{<Ay zwmx~BX)!`IWU#@=6_(`iu&bX|wqgy>4U|@^SXmFIR9tBbn4~z6|GAk}BK%^xYNQW! zOor!=r}bDN3i>ldW>d5ZAC;jY>dd2by}^+QvE^QyyBbKa1BL>x05eJUEIR%eK5rM7 zR{oVfzJ@aszCTlJzSBMYmjH#%N_LYc7_TFwuQFG^KHHUo=J}Q|wes}H2_7?LQ={Qd zhi=dGrx7ta#~Nin>XAKh^1fHzAI81sZ^)58&2UI<ryOt`P9bJ|<hxw5r}NPK{5ZXR zWXCoBEsHJRGu+mC>jba^*J9PAjgpTJACp%a=wWTF`oe+*aBfw)l_I%El5(cpdInm^ zd23|$53Ojp0`}OqNeD%-=YQ7t?99d%81`;S{U&<2I{W@$_efCqDuQx34FAy5k_<z6 z=|zQlh^<m}7<!*6CfI3<wf0KZirt84D>39=pQvrx=WU%9(87UI&=|qv3O8BK#HFFt zdd|n>5=PiY<p8F4E?Llzv3^3y5yE_1<(FSvhR}4aqI*05t~ze=$GMsXi=uC2mpx=L zI~nb8w!Jk$5i976NAc2(iI6(s2dD|6{wUymi=OVla#OK4pr^3e6eh^o3~OCt<Ddvj zkORr-(T%td$#9?rnOrZ01t{U9{9mLbAR##o6-?1_)Mio*&Pex+fQS<DjGt*JmV_=l z;Jx;=p-aFW6=XC7Pp_*i+VJ_uoRGf{73G}Io`h47Gw245JF^Y4RKaj{GM&59J}yu+ z+Dv^jRQ+P{5Z$ZYfplp=bgo_Gk~DO_Iriz}WMg7wxw2%$8+PQcw9xG%Fm+cmBAl0Y z@f+j0*~5^OZ62b_r07M|_z2+ndFSdGY-tK3Ov$IVNp2oGoGFDQvZ-d0F+%swwy(NX zM42vw3ZFpcg1oJjAp?^hL9_-Bx<4R^qlwM#B8B@N(`StAp|Lrbv?_&JsEgi!=nZ}S zwn#UFPOJ2VT3TIGoP{lG%c;wXippIR%vQ#7J_x0(qjmJsGy!~?oarxaKhE;ifX9nG zGn#p`4$Lul1TqwNcJ*KT`cqyj<KXvdIL<_{#y5@I389>=NUvId*?|+vdJ%XI$|#oO z`QKLmnip<z=jC_Jh<s05M&Fv<LJVGmVFFr*1G2~|bGx^0-@E-{bh#atBpYu8ylM<l z*k>ABL*Air_0EIh&%gGr;&b$ocY{J-{%T_Qh54@oHwkFqxma9^Jply;Taiugf;_fJ z_9w;9u6D*N1rPhxguT?=PoAf@`%IgM1)D(PvN_37ZyTa<%w~!REr9?*E@#rUQP7z0 zU{hrrADwobeWimpfg3X7gB&^7$7``;oBk`6<k_62!AD(TaBb~gHB8xNI+wAL6jv^1 zr?&R%W!0cl9Kd9l+8|czvM8pOj+v8-ql!fw<&`)!U)m7X31w@u0Xh1EyrA7j1Vuy} z1~mSh8+gkZk9D!*$5Dz2;IA}<Y~!OF%^+);r>$ja%?U+G+zcCxTPl;Wk@h5-rDe(? zuY`dorW(<|zv8LII|CxWqT>c5%tZrah|KBDI2xgkc+9hkX0Q>4iWmhXnDZ5?Vu==~ z+CDWSSip5rUF&WkJe4;eO5^;8yFdlt#mZoaH~A$nJxGbrEGas|P~b(ZDh@OPVz}X) zCN{QU>=)Z8HcOgm4;KXz#apEadEZPW1L?@SxoIiFxVX^(9$vV@*1kZ-WLE6Q`KXDY z(Dw4rY$a5ac{wcYXQ_}$&`q2urU0J%QzFhyi}-YIMIAVae~Cl{*9TXh4yoU64x6tk zHW}We*`iU;={}9WftQ#f2^%G`;w`m7Kj$cY+wlFuzw*qVLR77Pz7-&T+7g~7Rfo?3 z$3o5*icPW{5zX@ycUi27L5~Ve^r>W8h&4DODPJ$bQ&O%udd2m8^StAnn5_lJV(!YT zkP&&_iG38)`D-?FGrtCE#7{~uY@?&-k~_=DI|Pf)nXy4q$rG(whfo=74rR<e9gxZZ z-+Vcj9LE{Zsm%;wsvFULNJCXwG548;Up;p%NG3Kis+Ki3-`v;#+iq?+{M*|z;-#cm zzc<Kbu&wZ{dMkP-!qZH`e)QoD^A}=LzmS{jG3=uQ#8Ix&*fQIc`>Kak$`m@iadJ#V zM1RJPl@dUP2J|@V;rE6U8AA4Ymqx3%UhyZHk}_M(hc=PNr$r+<J5kwLSr9*{-S4wJ zlwoA_oLqk1Uc_c9;p7s|^I~qyc(cOb1`QRZXL`BplzOq=_|Qf%HlXZ!T0tBy@P@Vh z^w7mcharK8*W1Sf*=q@-YU3ew)T|9yuvyP}voP}5G4N{kYYn=cfX%>h*vlxE*Ly}F zh7h@U)e8G<Z|cU55e@7QjIG<-9c@YHZjMRdU<VH3Lt50riV6a&uxZpH99xn%E-30I zh6a)Ij8}6C!nW9b=$tyFb>MMUeq}N)EjC<QQpxZx2N(=5Y27@_THicEzvdYI?3Y8x zxlIQg^q59F)D<M&P`Qk$P1PyHJyHX1m5hZs1OL4HQ%eY1Dik|dBxQ6LO|{td*+OZu zTLosvFPrfwQW$_HeR3~oeHpr&!Hyq7CQAX0pOr9pw)IWQFx>s({ulPptlaZJz66u6 z-qm#qi;SBD=<`e$V-OSzfi>cQi{Sjv*hAcvlff6tyPZLDW51E%{zW#n!i*nip!pFf z?b1VRi-?ijyHlP+T*>v)i{Iooi-mt7W767|bcq7IUexvtXnS#7%0I1!kBFc11<0gr zwwW|r?apS4C&nYkWSK&b?22F8<i)iQ@?TS`p5Ej>{4!#k*w=Z<V|@AX#chB-UC_?a zJg1mGB)Zt+&66V$0io-`PtE?$gJ8MtQaCIBLvg*FXcK~_E9v%ku+;caU9e!r*j9VU zAv*GM@f%U^`!HQT3{+Lv%x>2zQp2eBti4<Y`<uMI{C+9#qTP5y=ev=)0g3s>hCb9C zgA}`yA4EPS^0gPuHS=!P%Sl+KKht^Zsx)^GY3qp?_RlflyV7DcbLNjXGP=wNZEFjV z$rrXcfK3KzSwp`<a*}lYL{?p~xVjc+6fdZKKUhc2;HrQAoWH?)d|P%?>@$LhbrK(% zXYa6MHb64yV6*9;8(%W%+rKX!IO{P2hYbo>cBA=32~9<9y%El>3iLE6%~#WUSazv1 zsIpqCptR(p21bO4(4;s0v7`l+7$GK{oC3G{>0f!#C?qb7b({1#-TU^o4+<uLea_P% z0jG>xDd1L^tu|C;TCE>a_zS9D^;6yGN`tKn-U3z2xJklV-}0O(F%o+gkgoN_)0$<N zVp<zLqrAfTC$^7<GTco2eS1xRD)zTpT72!1WPT%g<;;Z3q^d{t!CG{%fb4soNBm7{ zsXN{}Qj~N0NbmD@3e_FLE-c}iF#o(XuZ`{te9Cj{Jr|&remfkLin1u|*4xW;{0Hao zWWR4($^y%0#1leON#X&Y|8U<=<8$46OEXBY+K<wt*1>jJh?!8A1^A}Anp#o)7ylzR z@xrVpuqAqd`L|1MieHgR88x6+yjft$lT}l(uzz$#EmnCG@x0$zzoHaC(6(ZD+!gtx zi&h)?x+_qg9ixRmYpV_|kI<qonS^%oMyH@xK%Lq8u0ybXZP)851RLbBpOXLp*OT+~ zGq)^0?%^=|hXA2Y4JT@QTAj@~VW**>A0L*<z%5!kke1CI;kek6_heF1s)C${8(4Pv z)4U+0SP*PMbLlshL^RO(J9O6)CtoCc<xJZOt+TPyPo;sv<|U<$%2+ck8Rk=5m7%6U z?^-7P>fBa^*uEKy@h~q>K4NjY{zBLFZt<>b`6P(*MT(%7@pf#Cv+&%UkJzNwz-7Pn z8S--;pvtM<IGMh5nu*z53y-!IClMDvHUa-B^1-jj{MkFz8*{02GmNhkUw5vhs5xQp zc%FJUNbjv#imFn8DMhNJGBM+dB)6!Ug(8?$4TIYgP(#JzO=?v{ieU!DI_gx|wfU^h zK%-ie#Qfm2!NK+Q;Y~+HdnU1aBPgloH+5d@z+a*(nWsbOYL=u4BoY^}YNW5SxGCQG z3q_0pTMu3x+nn7iH^S!}K7A=k=frmaGrXsx_sY8;KwYgC2abHGPuUQA@l0-9%k7K- zyvF{8*2lMN=rj@+s$@BB#OA-ckZEi43B~JYs(;3T`YAsL?isAjXI@xqY#`rk3-wvm zLPglO7$1G{+T_4G7nSYw>)bQDbmC+uFb@ygr1IFVt$S32bem#<mE`vBJixyFu+$CZ zpoz;VUHxw-`RD70v?3=>%(JhPjv}T%lZLGvNJFlBLJ!6APQ4I%Tws$z*vQf632tbY z6>^hgHmo?@p_b!-5_&%r-r{}SOqNAy^P;bXiJ_)&KX-Q7M*Fr-Sr|(ZX4fvVRiF!X z1giUxFFI%oyE^Q(Epn43Gh|PIma#C!--Mlo(;$-Ciq#uO!q>?{0e9(>!XmK^hD2~` zJ{DuPK&vK1=eat(p#$VGX<n<=!)fLCW}bOScKq{ip_MzkcRDaClefZo_F|lkh#hd+ z2Lg3LliIK3i`jbC2myz6m)lgT@D|P4?#c@|5iHCI{dL4S<OTW(F$%@{4QNrrE@%M( z!s@W=<_lMHD|@`((y)jl26N!KoJZ?WuMg&4o6hO|Dw<#;)O*ht^{n3W<ubA=SE5w} zcmem&{DG6kIKRdTXx#^3v5Sg!9;sISjs1qh+M+sQV>n^`|2L5j@cH&4OFbD}$)AAP z)K&YAvF*<OIoFPLnN4EDWyU+X<mx&!pfl9a_QVS^1Ie{##IZleRFJ0ja8cq#wy_nR zufLt*&dT+Y#LLwjt^b)XFg7*MEN5laayt=Mx!jw7D3%09={szQ#EALba$qvC+ms?L zu#m7}d-08uHRX~(9BzIeR@Q}S!$<+bdr;}7BbG4R)=1BZ0_heN!_W!0<Vd5X*=^<f z+xN#zs-aX&V@!^7hhv!A0B#O+QsQ{wb7dzSfo7H>J7}IH@z}D(3+;L`kx;$)O?3y~ z8+e?c4`V`6I0s_#&jpp{Et{9N7FqSVfKI8iRLmny>3Y1R*-*NL5Yn0DD&{gmOAiO^ zKTkn)3BgJ-`#6|J&T#R77w92H#8*0xc-@t+6x)e3#c;UryWBZqen@fSdKl5VhGKor z#yfW+-k5ni>LzA-!Q<o*D?KbsaD+NZx|R%`T|6<ypsouTohoVTi_HWJ(hb#_J5T9| zLuv93RK;@ex!|!wr#W<YoGX7wi|@N%3?&dUE@hu`HuUX&XeK?zwi1~l5rRdC8<4Mw zq>p!+<WE|t?ySxwFWWMux__&K)<i8Nex(l<$*L+C(7$tJ8N))v*Y~|evnlSL{B5hZ zJaJBb_r5{k_VpAn3G5bK?Fx<$0GqHo=H_J2wHyhdqo&npW*7^uPXS>vh(GNMVkM^p zmpQHyt8XNBe_<n!@|+<~KYbSd;)K>Cec);|yHGzCzW$+%xWYgtytO78q^B-8U`F*7 z{gjPeE8sU6XGGiE-NeQ(jOyC)fzr^YuljMIQg-l*(SEh}$mDfVyIY?rN^sfa(e>N% zN30rFcvJx`1WZ``xSJWoHnmb(u7yEl+0058I;g4R$Md5e85nDCQ0E){9>^V2&43+1 zh!^79kQ7YJ)W+Xad6&x@Z<Kv&q)4u#Uc};cN#44=0o~y9hGm2iL0_Us6Qy&(bR@>m z|KF7$<SECoG1OJfO||gzg~J+B@;8GRhQzi12E$;e6teT!y!X5@<yg&N;#-MqeXz0g zaGDm~T3^>woe%gXa@MAlun>|MbbG!v54fGz{+q*eTQDoR<A@L%B7})raaxST9|Rbp zq`D&R8^!~-UP-}UAxQA7#l<o;5z9m-pUoq-k2Y|U=yimqKYF?e9KsQDFq0bRD$ps3 zqzZZL^3ODK>8lD7XoH_j9-GknNZE;IJl(-q(<jrbG$zVIv8+u(OaMje@H4HH@k;`( zE=k<sU2XIGgOwf^f0l|m)sr;OJNC6_FD*KhK|Q%DbT0Tu+3%oei&Vnw?-*^fnT}e5 zE@|=CmD{EG;|gg%>ZNb&qy`ER=IrH;qC6N{AJe(w9FCGLDR%REbw~g<E2M|{pIZZy z&NF1I{L-es)HX%b$}KuM;qBcXM0i8j8!V`4+0(a?dms`76Wso0GU>$AZs74(UoI@s zF!J<>en-Nq<O#9)1ZlQwEm6f|gz_D2x|1EpG7lz1b5b?zUqT9Au?9N0*Nrs&3ZpY) zRG$$v`HMm?_g^*477gLq+bX(&v-w!K1jOy1>D}ZbaR;RwYN<6|5_2&Y#IYU0eB(}3 zeT*&+)4fh2m40hoC^a^^V6a<$)Qnea{@1>Q?Z12pZXjR6?=95_GiB6D_Zfky3m-h6 z)i%t5@zsEMHDoV~86?vGBai~@wJ<O-l62&FKrnBS+xW$YeH4j)cBiNk2&37kW4oj3 zIo1tFBC^R`4IL1AHUMM+N%ot0pl%9fv~7s#Q=<yF`BnFiUx<2F)BLh9wo#hKvGwqW z#W$pY7kPFt-GI;Csd3J~q%#y)dSD{;r%VTnNJ{<BoPO==wyF1GQN#Xj!0MK826bV} z@<H(eQc5_`qDxB7tDGpT-?`wsCuE^rZ77K)u}!r?FcW>Ek5MslM9f_6=^HAzCB0KW z*ZgHm$S7`RkB|*Wi85ROq_C&={ZSk5+?MFPsVEz;eaR=u|M8*ae!h2d9n9=#A%VYn zYn3&f2QQqa$=Lki6&kPb6}~O*1){C}G@QMeda1~sv-Xy8>9f;3jM7lTn{;d}fJuN$ zU!xL=-?-(*yqG-WI*YjHw3#qr(P9f*)vqr!qmn%LLs!NujCea|`~OUvaFd2+9Wm;^ z;%DL3u7W78^ee}id23MJwE~$=F?*4;K)y=YN||V25bidKV}Zn_)3BDB5$63*%AiW} zzoHCKdRo)A)}u!nZEE{#-}(*FQ}hzGRy7~F5Ro2X__Xf&ENx-8m}4pX>FOjdxpAA{ z9Y*YB-77H3J9r?|Os!baen4+lJBL=@<>_7^WkC2+O99@%1Qwx<vXZ15{L{0Wfu)7x zOTrk|qXlbD^2JoNXftZZ=)=D*?*_6TPU>_IP~>rA4vXjcHgqlF=flgVIAK`!Aj0#S zq$n;t7QIMm;HyiA!<$H{{L-yx2nL%q6CWr~e0!Jaz>?WXA+murhdGv6(mhiXs``K- zJ~zyYa_$J9-loldAJo7sZLSVFLcpW^FQc;q`d*XfOu4NT>j%xSK3S;k=#`1=+eQ~G z-d8zza%YEgZBWfb_ds$Ytb1trDfS3MO9DGm>qaDu0ec7TY`q^nr>?xU3LI$Lw7I>6 zM$%+N*~(*)S3Ky}ZU8h!Jy$utc1E1&XasLjYx6U~7vHKwB;D7=qhB|VsE;{(GF6rW z(ckV#N~R~n_L?6{Q{0-i%*^ExGovI5_;sDkk<>7OTsjy-sHh@ZGeN)DaLa|%aqEpK zU+n5nd*N<KG;}=3MN?nGa`7{qy?4spg;Z5^a2-sV7H>%;U>5#txZaGV_)DL_F74RY z@4h#l#|xzN4&u*sJS<c#xpkjzx>Vp~@Y4DA?aRNV%L<$mLqkG}il5g#v}!FhaDOi` ztKCBts*Hg>E}2V853wo@V4vMu=5VLX)J)rwkkwe=_>aLyb>sXYR2Y)Np++#Y&5;}o z{NO-y{qH;hokqMtnN9-3Os$~4ZFTYYjlQ|UYq1BF*@u^p&z*tr(^Gp+aYff1^)Dfp z*6DUmL;9_ayNN^JSkK0${)JSbmG=J^Qib20hQ?^8H$Vpq1igqrxS>X0XBuvR*F^CT zCK`aD?gDEokfU%C0HK;TL{Iw%Ca{tK-4k~}VmmhTBO+zt3M)yal8hFF2T*03mH#mV zhkyqhZo>=r_IQT;Xnee~rUq3&I<I<AVUT4Ua~vHuIGG|rYN3Cid%wHx0woS4#-Q7c zM0au?&CnW&9}XhH4U9Iw-~wGf*@?11g?2TH#Lfk>U&4q%`Zl@jf_`#AE7CC7feUd= zjqyDiqE7DegfX3}TV+G;Zv2^8X#7}XnovgI)_A7BeDHb#O;g<>wT_cUs44!gRM0&P zW+V7_r2+x)Un&*8{wJkEUV>WOt<rLPBi}z?jNR~Hc#rz^5m7HWOAQG~P$^BpyGs_0 zpw)Up-_QKEJK)wk^3!S)YPd04YB1RmXlnh_`-a(R-PHLlDvH#3O>42_RGiO=6J>oe z;ky#z%Mk4Ou73ZaRj4WbXRX4P;cHoBC?w|pC01}-M4}nNIQ<J`z>25)KByy5e-i)w z&xtaBf$pYua~VAI>7e<4il6Q7&0|v0^0?{gn|{U(S2Q)~eORT;bgZrWAB24cSer}J zc1v-m#kG`T#oeV)phb&2!9BRU6ql6ZUZ6nH;O-Q6DeeJ+yX&9xYERGk-k<B?x;7!~ zvzeWp-MMF;dybGd@-Z(}hW|yc(2`c*==ysMUr-)?hU3aU1xWr!2@4ROe_WjvUH<nj zZU`}j<C1BG#>byjZNV#rJZ8mzE$sD`9jEM0*wSSD1ZQ&NL<XTNdZ)m|rE6*x_4nKS zmIuHGj|wDV$w&E%{rJ7qhkv0YtOypKppk{I8AOfQ_K9lyMB5_A-%&ICGe5y!>W@-{ zOtR%LI)o?^uD9N<>S$cjnI+QoC?E;nPR|ecrA4zZbv&{e{eOc?|J<hxJg=!84!g}3 zw>7fY?$6Q0@9fX*?0WQmK;N9XkB7}M5Go^91uGu_t#1u^fRd_J(JHk^V@u8S**(jj z9usTF9P+Uor0Ddq<W?=chJM@be`B7Y<AP;;Fn=o3OMJ+t<mEabeO0^P4NHLi*uW(T z7JeFJIi8z`_b>)RZ<mlUhF&3Z{kR!cxz{J1S}vq%BvUv3Er9r&4C6k*1cEm9OE~ef z0}_ERo?yUJBxr~Hqzy6()>|?Yd?k)aKV8bV6)a>&3#`;0iua)a7$-@_^VzMsSASkB zzh#0{pp<QtV;5f4;r84A=@Hb@)@!~uu_-NC;$!1-fg+&8x3XGKrA<0ZR4E|$@9)Z; zbcR^0ow&CX{_?o^Z+F0w@M8i6mE}qvcHp%Vna`GC1j}3IFsc3v#O{7p3VB3t;3|nu zOI4h4q{Mhw%B?OCSm`r;Ei4&@WO>aNf>tn``2W$#2zY6$t}42^LVUqL(82K~`{Y{i znx)tqSY;y<@3XB%HPSDeVWQ|LUT_~5yW7Qm+xq%2<T1r!p4*fTV+rjM8%}s$Ed#K~ zY}c}GH-rD@-2`u7t8T_Tnk)KYYciX=;zc%$ZbM5u``2ex+Ey(@_Ji#&FmSjnz9{bA zY*7fK^yRx6-fp)>oou9UM*P&lS$TUL!uPv<_${BvS{Al~x<z%<UOwsb{cPQ<y6|Im zcl+qXQNo!3qcrUv4}pt5w2T>V9sjG({IIziEmER<2CP1&ui}Rf;zH|Gn_pgzVsh<q z^7ncDHZ8w@#hGZBrbTJM96bBX(#6cZsL>`zUV>C~f<s!IE%j7~iO(K@u*tZA_gt1# zX>YWh-f}o24re}+B~x?5$NDwNrbTAuw32A?TX=s$sQ(M__1n#B{;1by^d($lZ%O-w zxF^!r0)YC>7OLZf-GSZf(siwqtK3mcOFU9aw{xvRqlK95YnEG%@|23ri|>d8>q+=0 zc>hzWW!n({U@Sm3)LWysUUWk(J;3-_l=AGPa^iE`7tQYp+a_n1yI-SNbsWU)v=-#f zW@S#axVsq?%GJy0HCuis#QD>bY*YIK!SgpZ?I%OM{#f%N-r)tg%qL+>gU3nYqjxT| zF1_P_&BXde)^65+lr(_LUs`HL$<EKEEVtMFR98U>dncgr_hf=!ZwwOrBlBttmtkeT z1=A}=J4?$B`b)RJ$rtt)n3l$Y9<bd%{m)PRVcIj=@v0Crv`p3C3OUyP&rb_R|6{*N zb0+8bpYjKh!3HbhqO8aE?BW8=uNA;?nr@}_F}d-&Lh9x8&J2bBal8w1e3XL8M1GZ5 zeKQ8KhMVN|74itzVoy&eBAKcf4t}>DO-h0pz=ZwDJQ`kxl<<M&JX&e?^MTWAot+jp zA@woUZp&Y`l0R6B3|=t~{;_rZmq~|d(gU|r=-B#)@zpdKW1V`nBTH@uKVGZBzi{5* z7fKow!h6KGCV$T4lAcyC&`La=k;&bq8lRb)qjL!r1a!SxL)}FA9Ao;Uj@hoikIQ;_ zd+*(}Yng4&)7Rn#=4RVOxd*{mE~TOj-b0*T!h*;QkhC*C)rTMBGXsYD8?)+~TL66a zTxiZ3X~r%)4m4`oMDt92)<jxx@E*`H)sR@jqBl~Lfs^p31T1}6F)wsxxCxBKU<`lT zX5yRY|4qE|{~G=HF%q>H%#tY2={mA@N|yg^;Ek(_r(9>Lt)3`{S>VnuY%lGiV!?6$ zrHYXhH(@Y)gIBJ+PBkz{QHj~0YJON;{wm8l;*I5AF8NRKL5YIfs`4jRR-H=fsxB>z z7@?;F@uL6Aw2CBmzIjO11qRg`7H)%sUQ~|InJ{uQUE`kjrtOVyP$Vtn(CFxr3t`Du z8u4T)4@#h9DCQm%5vm#!B#N5NvNNeN=CK@KZ|N7<BWw`lIBHs+vp(tx77OR@@0RO~ zV4<bX|H(YYF~HP{phFid<2#0(M(m2IXl9eOsZ54FnaAdFjw0%1T=ikUb?rgaAp>qr z&CbPz?tMK_N$)4~D|`i5-I_#Kmd=oYOVNFb@KANrw&lexV>;p}9<L^=4i4=+q%?M% zYntaU_ER2zP$B>Am2a#NcE^`bLX0tT31!F!EX*rQg}|Rv%~}LiYK;~pY9-Yz`;S1Y z$C?%!UtoM8aB)Yn1g+(LN!?dQxc-DEZ;?N}{sjN!v&jQAIhmHPzMjJ|M3x5SZW!ta z6@>DQ%(g(6QU^Jp8CKL^5>^W#(Cn{mpzLg2HA%xRW+G40V8T<KA6Y|nYB<{qp`#xa z(!t2$hH7vqSC$t!V^!*RCy#-R530cn_{)dF)>_+kI3dka@vGJO6j)~-?=mMMIe3w7 zb$#}vSIX9wRc2rmj{T=XZ!m%GhpNUhBi_+EQTaMxpmRPnw&`N_g`Y+w=Fy=9qg>UD zOI3;ZnU~F~lt27?zkgp}wO@SYm|+v@3^65<!%%C!ekwgkaQnr#HJH+9GwWq%SRpyd z@|{SrU}(!-etvKNg7n=j7Rb=OUNih`7+{yq7toHR8FhW~g1|^r8u2E~VIkhlbxcC? z{aZ<Cgp8&K6+uF~Z|eq26yzOvl|ArkOZ&|9Z`BeCJZ;Npl2j#H*%=}fhGismbLxy= ztE?QVXZ*YgtuC*>t?yxV?BQ_pI90qlpyqhVyxqOHdvv7$?h2H7^DKAmJf^HXgx_my z(YK@8Y)DjuuY{PP+_2qC$7MS6S^dMN^6?RgtHF;=Df=lwUH9~m`OG_#VbUtpWubdX zFa8~3kRuL-*u&EvNWy$+`?i$AI~%pH6Lh-ePekhPhF5Y1GN26o^{eHLVHx0@(mU#d zx;>|LB-+8qd$|Sg>yi@fjHKh`M{v*Qv&meyZzBpvt?Fb1Y1-C2+DK`ng5c&EH$vaZ z`p^7=HF(ZC<Tq3_F~eqkt;c;lcKE{WNEks^{e!EU(FO+<)Q6Di<rYM6LhX_^6^v?} zkA_JSYupmJfm*Cl(QROzVaN)UXqM8<T?b2k!?xE^8nx!Lzs&TBoG^<<Em13#=-UAu z*CHKsD6=i>HaSG|0`$5M444J)n>E;|`OUC^^tTZQ8KA=qRpfdJt|=8mSKSv%>=hqt zcSd-DOH`Kl+!vG3Q4j(SQ7|xzt5aEfK>Q-A;HrBcw3c=XLcMim-Qk;>b8@5aci$=) z309c&jDzw;JzT!B)MnS3(3`yF$gagB*P-jFdU4*eYQHyDx^ZyjE2bjM`SR)W|6E(# z@Wn&gjdGa{Ra9LP8+rGPvLc?`i21iei78ZUlZ<}A@5=eqqeZoXmC4cN`NLfWX5I*9 zgV!vi!n`Fiw`8Dh9_uAw;Wo&MfU$$ZmZ#{`>P$_$I!Gu!{`>c0G|p)a^{{k-fx&XJ z`TjR$`7~vc#M8nTJUX<|D=ADGCl^RFv56FR4^?MlwIq1C^RmhN{wH|V$y?Jb;C-s8 z2gXR!F@ny=UH-ctya7e(EbZgY8}GMyFi(BF)o)v>RebctI=XEdT)V^%S7@PxQg*sH zOFrI|+*9anla4kW0$2c&EicDa+(E)|68G7Jhyr)s?&y)XYLC`uU)+y*36LanybBl( z8?h1xnchimXf@qlh!xK*eQH-8X%9TLMJ4u31Am7~-sb6Yg{6V}cpivAOILX7W~yt8 ziGVI`hW??MksqDld(?W5sHEe|{bd3vy%SnNp+jEdWD2GPMos_yMoVq=2#<1mGN87} zWIeVc7SNqoeLhcDd2HCs-f5UngsyFGA(>C3aUJNTqZ3qoXJmg^iB+XDpm+;8CUxBZ z7NK;oRq%8=MJ6xNGfsw$M|ILZSqyLsVX-T<ho3Ii4uEEOK0Pd@lX&<xTlY{{xmf5l z?Y>Ux+|m@eIH2QJFV$7VB)<M_UXS(ir`R`}M?wXWdlqXB-vI|l#~7^|oZXrPn4Pq2 zKAVjT>mStwYtI>J`%~{V(?Sd($ff9~uA>8dn^Oq+%scK|<s*uRih9Eo6MQVbEZH^G zfoFCiXX6R6>WxlK!)9314z711S!7sm{%ghj;2W6yr>Hd-Ya+t-HM+tR%S!FYyD`!~ zIf9dLt()p`S(rXk^P6@hp#&l#Om)2iudtr+kO#%ZtrGINJnv?_N7B=6pwgdsA@XoN zacDH&whVb*>0o<t&65lvE`D5*xN}%~6xGv-RS~2}^aTpvVW=A&?;O6W-lE`rtdJ_n z%IjEuv`n)l75;vM#VoRVBg$uwD0DyeENQ`^CVrJ?T6adN^bpUteJ!=SihoFq&;R~r zFnm?rMg+-~apuM7(gjH2XeeMTDQ4nR)Kqv!LO<rm_meY0Befu+CxGkQI_qI)O5q9n zM*)SEA33c-yJ!!7NS1?z+#Hxt?wAJGZ+ne<Cd`=FL008Ghb?435oC_<I#$B1HRI0~ zq#gs0A)p`S=G+X%a+xN8E#%YctZRNOXt34kejG|F3&*ekODg7MY9j2(nVXZ&7rqbd z2O^ioI$9c_<q$R0{wt2)_3X325Yi%SZC|<*!wH)*Oo_94<cDs80;XgUFvNj#nPz*# z%g3&BX{CO3{?l@r7k&n+Zf&j5EoBSe0dksd8O0^=%JS?XN!zZ<kukwDK*z|a^`1`6 ztI_#A19>xYq7WTJQ1fDrmP~_;9v>8nnBmzLZf4ugl8I%5yfQ)**mQE9x3;oOc8PCY zf;1e@^RD?(P-7jqrwHxnTt)+@<<yuA7tosu&|Yz`Wq@_U)V=%aE+MaruYDD|%vf|H z4uwo?3dsW!ZwvDsmpWzOo2#gG<x%byi_u|8nBud^W8m~rp*O?<=FqHZVX0OriPnVX zhvv|wgpk{;{73EVvDiCaT>+CZ@W!%p=i`ee>}(8_&rkk+iC(@OUCY=dU);XYlTA96 zi{v<rE?TM~&z0jNOc!}V{~?gga~M~!(N6Vipv+MJ`(=Z^E9>i<w$!akNs2&lIyYWt z9+`hyF51U~>jBScP^}!67mT2#s3ibEkP!vYb0v}&F-7kt_h!rRawRPlSQTIb{kZKh zMN+%T`&PBgQD;9#S4oaWr+ecvI!0u!&tlo7xOHX|Ogv%>kh7}YnTCWRsM3%*g~lBg z@DzC=X6q--2JuD@>%TVN>yTOyrlx2e@9)`Tx&mEtul{h9G8~N5(YM$=%J~qp`ATb6 z<0LkGxns)6whJ<n5!weqtZi|#0z-2Ba5jtBXfGV8tSMe_0xE7SlNP9zF+0=2%&hi> z_V2mBj$lLF#F)mNOv;jyfNEa3wke5B!q!R$n1U?ad3HZmoS9!$;|<ika_*kEZlY8X z*F{i^N6I9}9%4AeBQZOImxZmO6i;_(Br;Tk@e)3Hs?b@cyr~Mu!oikZ>Uh(8yxN6w zO{g&4xu}Bys;+m1#hl^veDiK^`D*>vMB}y#wdr*5ajo2SVI*e?U*{Wg8cBrEf^YcT zfjo)*9{J|01Wy&I`2Z1;>kuLyUq$xrNX!TG)O3L{(eVAQ(wLjQ?KD?br{r9G)o(RF z-uqOAIt}w+g{{uTG`xZbLk+5gJ)5N@U<7Hc1bXw~P9lPzAGKfUTlev=oN5wONYy1A z%gb;m2AQAYRl^bgS6QB*kUGI{q1WV1W^&_Ic3(&V`<@Gyutc1KerzYE2P+!oXB{=i zYiMS|1DtUZ`o&g1ey7(9;1ZxQocj8daH<D%vh(Z;4jk_s$m_nrP`AtPn1t8ds(U1m z_C<u~(L_zOrL|&%Nyfl4dAe1-O;M-W$Vwx1hFxhaU)R6er6_bhne=ORWsfi`2UlBu zR$h%9mK8(5w$Cipdf1dGGVjwl4QJi8?jHO#fr_<8Q-Or02f-yzD-_AWTU)PFR<q2G z5%s$fjIWi@0Rk;=YUbo{RLJXCfjoQS1I<Q60mY!~l$zSnhVbWms1Rf|B|YoODW(fy z0@1n}L$X9|k$2DyFHCj(+dy!<^>?tO^*xGjbP#ZWTHMqIlAQ_ZMyhRC@0Qwd)=Aa7 zdm63dB-rA6n#*fH=O&xN$782cv#B}QvehauMHEq4d#yz#?s=SyW{V+dv%7&n0TGCe z?yP3<`NR=%`O5c9|EmR+-d%)X?dS#n`BX-u>K#!-?SvYM&z{~$dChr!{+ctnN2^p2 z#UC@cG>_^layFMBQ2p#@Foov~afwyEz(Xc>&GO)Xjxn&tmJ9saB}TzK#{LujxOj4> z$^FHjS~ImonKs28-#di2s9D|?jkL{lO6d<kcj1Zx0)uBwebph9mdriF<a@|1TNk&i z=3R?d_f{3pr$2qWEIX=v13|ahjRsynA2(Oq<`?VA*B;uv^uwt%O&tM=*Eh!yx$&iU z@<#W?!bq+~8udwCS}u{9o6f;((`nz!6T!1M>l~-N6FsilH+;~mG0D<yvj|}crH%5> za%>Jt+O-5n(7_*NZP(LEuV21PL7T4-_cDI$=<CL5a>dCbf4onyv`r<L->1reN@i~k zsH-AsGR%Q3sco9>JP4$~jP!E)p%XektaS8-%~rNvzN{>q!-S?&GjJCjcYQezRrlSy zY3?ns5RcL%O>gG{`XZn4m!@@C9F^Sh96WA&)&cl!Hm@Ie4tl~~D70gt9&{WESqqG^ zFCnK5q~<L98jIYyA%ZWzN7wLKEZ8YaFeR{PhUf(%>0hrwk9(t9Srw{&xMY6udACzp z>$oJ)`5x$Quy#&*s+2f=%4(PiaRQy3UA~F|x<4hfO+}t|P};~iIQJE6>KVTI^>n}= zFS@t<g}+)rSGykE^k(JzKr$<m*&ZO+#LAV@>I|M#d1l#Zu!*;X2Bjb*Gm?)sQuOpJ zOrzSAseh-E)n^A6R$tO|w>JJOXMbT^DVf35RI1dX-(iL?d&O{O)Qe$nv<PAPw~w8V zX!#@L<{56wk=c0NY(yuHuS@RG0VyU$5Hyw_6t*^PBoZHZAK*J7<s?UwC$41<mnOU} zd$}4%ZipG~`S|%d_G~m}Ni|W2yhkS-C3Ie{aC{yPl1vkVWCQ>^T!*Mi&dW0^yZao4 zm3G23+Avbj@w{udqN`V4z%v9l=r*I^!yvJ2%NA-HA2XSpHlPO(KE86w(vir;qrWwS z#`dTlrJ=(1oIuyB!hO0PCAe{jYE7pYo$ob&Z;zXQAV<6~`K8V!1|ygv0<7mGoCi&j zdJxw%#0Iu}314%xdF{~R6@SX+drV#Dd|~ef*@qsDbBq{jsshs7E)bH0%n@LYhpBbd zu$c)q{N}@US9kL_^X8$T1gvSbV#xSST6yAWeXi_@vEUUb<R}rk+!M+%#Fv?gzC6{{ z?nti3D<#sSH78w$y)Y*D0{VD^HFJF_m&E4Ei+{go+N4G9twTc0(xZIp8=A!>;dZ|< zeY8ZY{aJWN1NV$)IuQ&<!kwaNy=xRL*npfCiw-rv%<PS?-Q1}+Sq5o2YEvs*epho; z?~~EK&H_?ic$H&=TNeFb71K$5HgbD)Zde#~=vji#$zNUa`Jm@Y;moruyp$mEY$`SJ zg_vZFboP2*xPZdBnQeVpnyPa-z(7kaBU@mX1CHg;LHPyMTy-E!|1NJu+P#Y>zx?ND z@C3z40q#b`;&M+n+jB!ZA`!3~;Ru!O?CpRI;_QfeQztNK`8l6&4zxiJSDF_l*sR9& zamj(?;ut|Yz@p=RhD`H{o~{q6<ZWH8y&c{>86lmf8UAA&f#T+znBlYsP0vS?2~Nz9 zsGGw)4+NfJEjv6n1z78G67&<+dBL#1dh}_p!>3JmqptQdI8azk9@))<SH*L}&y~ju z%czRgbMEtytFuqIQsR>@5?S4=1h2%BK33Ayqoaw?br;v?M7}}ru1L|YXhIGn^Ca@| z8J6qyc+g8@-<Dl)I863uRx9yDtJSm1*L1h+HofR<emr(PnvtV5*dbEaFD(DAb*ym5 zu>lWzK$8j7>sZdudxv>~)1n~UiXH-BCo=<hA`Np_PuT*Za(5*SHhcA7oDey;$O<93 z*i_X}Dj7o2u6Cmcat>`NI(|C#tTvJO2A{$$TD&_((jJn;0gCGaZ-1TunFe$E$*t2& zw8qJyV*6Bo94V?=F3LkrHBp0@50|cc43~y_5DN=fyeVqa&z1L15Wr?E_hBB<)ra~T za<>BV8WSHSubyj@d%;HxUz5p`x}w_Diw_o+J13R%+@?s8B(iKc3tpUY>Ua<L@j_sg zxwD2;4Uapq;Pry>$KQdn9WHnQ`&yPFE?~#iZStRa&Cjf?faUcUc^6%K3^o?mskp@# zrp3Mw`MigT;93i6rB_;+IZK^Xst3IhGYR&Ho~xw$q>h~1DUln3kuzqeBBC7+dOvo3 z2=iOzO7+h-%}hL!m6`A_GG-Sa6w11#V*ZWZz+jxOw=a&a<w7UrYOS@QG)3};Lf<gr zxoluRV+GbduLLIK<m8^FZ(7VnOOzHBiCb9E``9b2q`H5jY}h>SBMR^_^_>o$la5PB zZ5EpkLSIKe0O@t7w}7ol`nwdpK7ShP#?kwn8s^;?UT(b6eUx(o>SA+@<SDB`-%Vt+ zy+ppBG}?SM-K6We`UP)wH`Hi22#dM9q(^nlEC>)b<ZpOR8Dlg;pA>A7<Dl4R!MDUx zQA2}r-jm6J=$IePep)s-C>|FNRNNFR++(ExcFOoN=GhoF4M)8jCUCkl7<R3-cS(`I zeI8ODI$Z~=zh!E2^Wsp%f4c>AbPg#Mn_|mP`nfNmQSq&p3=~}=VCQmZpiz=B&7gA- zqQ{HYX}_8A@^X^8e2K?s9kz3JM3)8<rSpOx9uijpkC)=>#qOwPdRMS=c3igpC9|lH zpD0#F9=-8XrXCTbG9DXekg#({>`e%BnH17NQe=6QBT$2H7o04Zmvqgg9S<xqy)}Yz z?~tMl>k=9lA5q9i`6FWgv-Cw>Dea(Sm-<I5?Y+Idq7DuYD=<n1OM-~usffMPYdHR) zi7GMylMe%wZ%qVBZv5W%cFRS7n-C1!Mz68>cu)@C;xq5H;QW>{g<B|s2<mbaBqNj{ zb`>3~;Kn_;Z4B34ew<{FI3j(IJ5A<XKim1UyrMNWRm8YZ<P#qc=mtmFXIts?W0y>w z=~B9eUIzT5-}cq;Q0+<{2d30DQfp7&X@;P&JOXA_$cwFPtK>)8v!m1CMcRMkHlYmu zfr~_gz*lP?4P_OjFJDIc%|}tW9p3n^jh`NJ>GHa%S@Z<bUjGPuwY!DvkL&LL4Px@1 ztN>)Ph(cPJ7R!B)>8s`Nrc`88N3i~Af!nTMy(zK?DrDev*EouZ{$epjG#hO4kU3hS zfaDVWUyWXq_hSfzM91N|AovG#bbiFOkclYWQsJ?T^=cS1CJoT-qbCe(nTdLpxc?FJ zEonOUx_G*y{3<=~eO-C4jEt1`xqPw4*|*t%kXCosIh3AofhbXRodFnRFp(FF_n+xG z6NS?uT6jhqr7L`fJc>i=KHNvkPO<62?0=Gt5n8e940Tz-F1Y^))oD3l5(Gw1iAvcq zph*jb{i`$Dbjm%3e>;FMD<AoU$99iUB!TAN^85AJ_^-A<`CGr?6>>JYz1RQ!&tE-* zf3{(LWoG@+mprTgSkT1hD9hsaZ4Yf>)(q{0SpA!rQ`ge#b<bzj6a-MvM))Zz5p%OF zrRat4SD0|)1$<=AL0yvtc$-TwZrsR#0E?|yJYwLGTJig%mOdd%`A*h73n=QX4BTtc zKV6H-Ptw~BOna7T38-!^#KeKr(gQ`E8c+EGrM{|5KXXY0iaQG}tC8cY2(qW-LrSF{ zBex5R>=tndR=s)C*pAJ`ci$Up&(T1h(b|;_tH0`r@2$b~%6kDAx4YgSz*>nLYu27G zeMC;AaOO&&avI^`#$xh;>$y0E#ER%dGCWrCo6ma*`rNNQBV1Ohcn<Qq*AUc*Tgu*6 z$)X*y;0;bk4UPZL<o!!#ZCO$<dAc}eL_u0zFln$X@7I>=^5M|{ZWvt&l{{8^$Gp%_ zeOpF2#WPLl;MRvM&03GoNR=MDwJbuxowW}rX5NQ=pD=66$9Mr=7&H0uN%Gc0F~E9E zs+hDFvkANU0;PMC*E?du>HN${7w>8|%p2xuXaSF%epGc{Lj!e}(<~jf2lpIEB^J)` zAs!jTH`<@StlE;vjB5=(4pFcnpZD_bXxBNo04k;H>bXRoDk-EWs|S~}?sV*OCfJN8 z{8#J$d0K7w;<wSi*KgyLS%XC8tks62qgaJ5BRm_>@&eRW9(!UxzF<M8SN3XD@zKx7 z?jf!3Jr8qVw#mT9CRzleJXxuSHl4HJW!^xn1H2BOM|0fBgNUX%_!66m2`UQ)VwHnE z-WXsIk<2ST+KLj^&i$l@SZL9}mD5SxoT!4aHjwyWDNK_?Dg{#w0w!3B4iY}4b=*L0 zg6uhrv+FqD>EPmCDNdS_gt9kXoI#%M;&{t*46l&xDXcGtWN_vi5b+y?D7el#6Sv3= zQvS9K{B2-UrQZ{WPLTrS<kC3bM51E@%*j0569-2ohXh2bsYs>6^6@_Yn+xD|^opd{ z#a!lbW=Wqv@sw{1qlz+?3w)|n%HhKV$o^(fu@^Zq51+b7q<fjX4o!in;N9u>qT_$Z zAwE3RF&rOcM?`)Oh>SxObiXffvok@wdlucpRI3{}0m=wnU|gLF9mhjEiXAvaFU{j9 zsy*;IU>jUGM$cIC!fo;FL+?#UiE5l)J<imNK$6pL{~Y4(>xQg8Nd97L<lxJ5W0Pc6 zS5NU-n((=Vq?C(;$7!SY9y>~c<51eG<)Ucu);1>_9*}h=sfV$EhjvMcWCC-;twP;J zF;P4BFR_ZCyP^EGRi1;6&>_%Tv3o-yKUS^CHBTC!IbMtBP1KdsBv%G649_6pMax_X z3>Nb;*|g(8+Z<$ar)Yh+;Bu=LL^!r)I0<crN~VK(Ge|N#x*Ubq&Nsrc*!Xw)0c+6% z@=`u49bb0;9l5A?t4C~}Nve6J3-EvND5jm8VZPg!sWZr{pD^iLhF>XsYzmPfF7aFp zr@xAK7h79zGM?n(4lXQeTLudbIFp3xGf{FR(!CK+WZzd^Ixte44|mWtZ<Lb)1c^MZ zYbOcw^VmIF6wgMxX5LcyxIKyl(u{2yLW~vAa~5}-9)MruyEg8Qd!_i;ez%nV2k*YV z;L+We?>t*dTzlnyt$?4GDMS)Dao;`b_BuEPp$x<M#zX`w@P@V%P&3XOa0{`keC0M* zB^EjS;pmO#q4<gQb+yO?9F$nfZm5CU?Vz6E=pbBaT_GiE7tAl95dtRne8Zrqs7dgi zXG+x&I?V29-BVM6x>tb0-wkd$6xLy{#U_fkIzE_3E4TD~fv6yagf-ksuK^N4qmnx7 zI(lrt6k&^A+4(6`=A_G~bQ9It1XvF09Ne))`I~qHFFXT^k0elLP}bA?_OdG`@eV~{ zL;zE>d%MZF57l~Eb-qG+L`K`Cadn-6+yhC3uZK5aH~i>g7p=V9^hsWZ<BKKtt2xn_ z%?|n`wr@Nq6-?6~PwgVfG6RbrX1Az~E<0v<sZ1j&jO#KiHW`tu5}Tqx5k;TleHjnD zFZ`c$)>Y%#lp%cu@dNAyd77L+P_Omf0kqD)i7z~ZZu}#>kYzPHz_ryyGk1=+1rFI= z9H`s5JYc)5k^Tnn!)y6YZg#lll7HDoCC-N9vSr`@R$l^0b8|i*@D=z{knL>Lg5{Ep z1s1MimIV;YH=xN-v^=ehq^cWS=mhXwZl%+UvqHl&*9y}{IY`GgJJ7_jF8LKMWhbC+ z=^}bpZb{53zi)-2iP*?qL;GJ68ZC1081y<CI@}3)oSqLi8!DA04&}O8v^!9xs<uAp zVJGIZ*dmsu@Z|jDb3ZGesXqa@9pB5fvkM(@i13sN6EI{nBeZ%6*PWJ&n4zEaPY;B~ z{2x$$OdjI;FBm#1Kr`#+7Yw}!Vd#zi>@5MF+s1{XT~C0JzeDXk<b_wIKBwtAr-AsX zGw(7lpW-=%j!(yVJ6=~e{n42emVSlvl%y@gm1js*BHL?%TnfQY6PrTM%~`Hu5Pctu zgsM&O9Pn~8Y$-UNw47Yp&!+8)d1pl5F1y3glHW7w0FICZKT_>}^M6?|WeF!3sdOQB z(d};gIm`BikK>7^TYoWpg57*2#ab#Px@{KW_PDXG`sdt8wDcI1!3P?g*m9Bv^7582 zqMN=*Pn1L28ImCbS$Y>h!bE(DE;BvZnVE`v4u>Y-p1;x!oRfb|!ZMxMlEkDWG^bW| z)z!${8PUBJ-h&Uh<?wb}Ed;N&J2X2`Gk4mSHkRe4w5Z=9MA#BfoIF#Ok%U!G3XUl} zaiD-v4pi-mWz@JGU4T<*xrxiJK#34f&@S3(9;6A(y?Tu=KeoAu*12`ruuLHFIFCDW zO8X}B{fjQa|3(e}d1%@)giFvaiSQhkOUYz~rV^Shk*PNWg``s*SowXQD8Y(^T%^&v zxvajqx<waT#;z9HO*CBf%*<+egimvrV<S{?6GRnZ=;+_cs9(8>CwK^qpiTe8CvwXp zeC<Ot<zsNs?X~H9JR`7H2gG<NpM6T}CLMljx%F+Ww(NXH`}nGo*6^gRJ&TD}_PRNm zp!FxX=LK4!tYq24iO_lXtS~l0C-G<!2kO0?{PuWlp!`qKQ%^+(dE@gQ!u07HC8fKg z_?EB;sL;Z=-dE|<G2S6<ZA%K~1dku-dMC#WCEnb(`VWw1Io{)i7(xyz0uAC)Cr@wA zVgKjOcp9qYIx$S!>PrmV!z(CB4r}OD%QIEpB!$P53B;~1FZcnWo%O4^se(`{0AP%; zf9KS|K}41h-L<8m?MFfP_Pn34_(@a+{$_qc!W-DkTH^L~Pn@gb-r+F7rZ!=kmq`_I z=F^#hoZrT}Q^JUAD;fXLT&|J9Oleu}(Lbhea#u|4E``YxhTK>22jsGB`dl{gVeDZK z=)5x~+}2aab&`~70Ck<-h4uF!iYEW%G(+T{v0c6QI`pBcAc?C+#8M_<Wm_HJa5cc} zct#v-G_hogPAGs8v^{k66E~-WasMpQ+cK?FMo|v{N*Tv<b3K=zC_+DzwsQ7yQsNOP znUiCAcp{bI_3Yv7CS*n_J^TX)bj|bf{#it3JyRaHt(P?=dHuC^65k}q1S|qtzB`h- zy5)y#VK8G??MO>dFyP^mJY(2Bxw%B;O)GM>2AUZ#G}R(Zs>bQ7_a0kMuU0cPMy3kF zfbmgiaLOF_Y&BlHQ|lhi$!o8dTX|GKbV$q$g_mGsR!hU_Jip(AM<zHrlSHqf$5Hs? z94{)1rRrwk?pr{3xTRy#zM*B&@x~mNMy&^5xaE(SIpPl8z!Lmburh3MC3;w=9=z=7 zXVuAUUg&A6**I@7FD^x%PUrSuIbF*0OZ?;vJ~bpCIqhMfV7dQOsOcZx<?9sDdE1>Z zo94#qL>LIY2?L?$IF?Pl8p=^~P;b8`HZ=|M`d$*Z=CRnmJ~=j6p>{M(1NL8>eOBhh zXo-L9z8CSvx*X6StU<qQwHJ|3b3^s{Xh+}!z$G<`5U(8bvqPL+wy&67GB|uCEA(*7 zR9`z3v9D5e<y7PzMZsz~Wqo>W|2<==my^LuTkO@mr3Gix#}-qmvJnmthvZ=m;V_?1 zRZP+GY_>v-iaVpRa%9?MRf3oAuq--Snl@9RA9hS-N=kf^3-4iZ7>#BWOF}UZa6ime zJ8$!MklSTqY{P~dFm8}>ic<>S;y?wcCeO~nZ>d*5=h5?N9sn@`M-;GBgSn0!yxW`R zD(6E|R${T|M%>uW97fLO)FyWg#qDlG*2@7f@c9rpi~6ox<)a&6xSGx6Y8Oki9eBbW z<TMfqy?zm|uw|Qz{;=yh(gTubXiMNZ><n`4@1{ck%};tgS`BY_I_eAr2sAqb+*R9> z6FCephi6*R2c{0hrnXRc^FDGjva-k*#RN@y9<83RupQJH@IuBNk78zNvMqYy2h&EU zy#$tm<u-&I%d1<D*#)^CLkP8$KTQLCFb=&d5VmuoCH&nr$-VGq%Er>(P*O;a_m3Rq zYR>Vu9Esf>Zz47+#(jb)B!#Mi7X9)Q4l#z6Z`>9f7kSE>d>C6i#;%hxtaeaL!u&Jb z{0Z_by4t_^k9^Did$f6A#}E>TnQ%IlpjPxxM6=p?#avTBevXsE77y?V9M$sVP%u5H zCsQ-9k3iR-qbE1VVt4mSMv>U-LE@@n6A_)vlXCO15GUe|<XU!wf@Fq@anhXND@V-g zG(jS)2MFce#`PuJn(Ty{54)E(K~HT-JSCF$sgsUZyJ9a_^zOn0xcwX?{B$wr=O(t^ z1vh|Sfg7!H*lmbl<l1~%{mgMmosZ&_01%*UMiIiZ<b%l~bjp~ZdfpXg2Jo8=R9oqo zu<e%Iy_u@7hEC9jRKhf2);XxCr{=>q(gh-+zXOs<I_<nK9CY21!5C4AQjgmDHGx-; z8M<Mb>hkTi&_@ykh1O8l+H1SB<mEQ{ScfC<ycvWxt9d22)jl}_`I6t{`Ef=)`^~-P zZrCJL<ACHOaEE93&AWuBtjEP*$c#WHkLTv);3JMTcie~nWLo{B;lb@+=Owi}i(I^P zJGHhkeY3W}H^EwQ#OwI!WQU>LdJL|(2#a6p!sp`6!%wJAniemvR3<m4{-lm}_$9y- zC0FPyBI9>75{KB+h#Fty?up)c^?}T;jK_=11y@A!mW|hgEmt(Xb7CmZ5=YvU84_3f zpoyzTGI@|atHZWgNkFSNS3)UCP%_msQ-6@wEN%NVp__qLky;HevbQ4laIjU&<r6)h ztw!Fx&{O*X92zTE95o<C7`=t+3?(Lw5hRzXq_uR)gu2q$!$O83j4*K(3SIbA3_aw+ zjNz~!Xf{JEE}Ci%(q^ffC{E!tIxXqB2ek(F*zlt$kJP~_M@jq)_g%}Rr(GFT1iHUl zXFTM<4W>C87QsKY5$1jgJA{Ddhi~XzuGeO!`hWU21Wj~cg|k^5(8bEX%`D#hy0n|$ za~(cVznY~W2+h#}kQ0XY0c@KHy?t-7OEUy8p^H}>X#{lBp=($*+5L)AGghM&Xtt2m zn-dj~$@<#`W$F<+V~;Z2*ingX!{&{4sj{uK<<%ed`6~$mKfV%chY)$5p7dxCHmH!P zxHo|$tOj<Sk5?&}yA&oU+7(*d<E{nlfCJ0^C7FUDty-S#GSH5Zf_ZZtLdnMIpu#Y> z5zfo<@0Vsp0;@NB@d{rHzg5pvG^4~0ft=(_=F5g}41QRKzxo{rdL8FCVk`Cyf3X6X zo?6TwcK(@LWvZ^ezFs1~f-GWBmWPWA!6_x*LIA(Mv=lQpH}|Sb$lrD`CU`4ln$`^Y zCRs?I#F9Z#i`<J|QK0k88hv=ztmTm;b)1!ZAJy4cLcX0dk|f@0=}{$^T1M^DVVQf* z9SqP7nVu;DR5a~Vt)<jj5hWBeVgW)z(h7P8C7AomSakr;XA?pm!oyh8ObMrKw4yH~ zih)vM8~1!htgbtBd#4>zJ!X#FMNXM+k0`R2-k-n}u6PyEd|kzFnAuNNCrd-fYz7n| zzd*wlr&Ru(j9yAT5R<)CE0pzjLOj`V)7F2Od6pntrYZO8kqL7XOjeP(b7#MwG~bdk zDjCu)Wi5o{(W|4%E@eSL_eSOu*7Kx--l2t%HN3+tx+R64A9i4?<Tg4|i1UNnhT~wL zQTapqW7R#$?6@ZCZ+3h!sx94hA+S9ViHeHqSzlkDKNUTFfi5GzHcQ0_6m5%BVZvoE zj+!Y1K7PMy=NTd;2@l^F`P0{V95Z=uli@v3pF&=`5Ap_@<@$v0MmGo=fXIFCYp&~d z1H?Fi9{3!?_lFr`5%;fQG2;UGhAq8mW&85w-^M@&gUSQ~>)myGMsTJ?;dI4bO6cW5 z-3pY<T)w$ag6taY;SY5m71DeUn$u@-cmHsh{qf<#TBfTxWq(cL{D*156oXsfxO$nU zg1L?TQvU+!eoO+I#p04WMEU$QRen5gdG&5UPi(9|3eoN?F@g-PvW*fJrgGx;XRe!e zzWA&m^1CKFQ9tDmZ2TfTPveh?O~*3l7roz2>Ir!(Ww*DX5%9-h4>L|wePI`~3d|_= zCoB>6H5b!G4HIx(Tv7KZe((2JFOPH`mI@)<OPkb5^&4RHr<atXW~?L6es>LiMOb;^ zk?lrSSY!7NV<T|9J+rcEp671-G${W5JIe5Dzy2A2;IS^JasR>(cNV`){2M<!7rv@A zU71fL4I50*(f;0Z0wwQ6+UTqK!v4R$j}sqEW@O5&Ti++(qF2JRO*BsW@XylS;G@&y zK(U+h;>Q7aNBhe`=es;FOA6>!Dp2Gs0@(`mpL}e5k=kE>8vKkt_BSQ@_2r@;45W?z zKq$;PZ*Ez(GlcaKjzaoB7#eorz4p;V2NO`5?7I38zTfL=t%z=edk{Fo`u6wv`EReI zLdbSRMMmV|5&cm#XcHqDQSIA4S4gB`S=*xGx;dTfNwQ>~{HEyA5<dwZyDKc$oPyp_ z|KBnYO?<J^uit~KQtXDZiwZSZ82!L|8UCStVN<E8O20nF8*>-^Zn}6(vKEbkd2ap7 zA*<P!-yMfvL-!4#PZBHm+Z29DtJ;-$gROy;#z|NSm9^J^8_J39s<Rd;RP&9@c8Okd z*;M&e!+vjzCgQ-xht@0td}A8551RWz?KaoM$c%kQWq)ImZ!kGyLFZ*ltu|GAGverY zOB8GBrP(z0qwlS!&#yt<zx2xUdUR)YFF0MsEwN&pa_Km)xlt?i0@$5TQY6d&thwT@ z#Di)BYu{Fwq^z|jDh1_#=`t+Iq>g<i<vG9|&r+7(tb;VI+?Ob!WHG3C?1i0d7Oyu9 z!-8xIfZs~gr!EyH{bdXJb#P8>FooPlIV$NI0H1f&JLVY}ui9@Sn@p)2&SoQMsN1%R zGC#Zb$bA}hPFK78RrdeZ6WE&m{15G$Z9S(Fyj_>tisgX6XICEks2w(bVi^+udiUsH znY^RXpLG7io}o0}|E(i1v-8KWI%P$juU+cu{W_DB<^Jc5Q=afN?oUm04#)f_y7t$G zs2B1m5h+D<anS$NC$2xN+WA?T<A0aHpCciEypK%*7c!X9PDL{kj>R@5_J0q~ZWL#x zVh0jvBRl-m-lQxRdE$R{Ylr=u*H{g)N7&WpDpig?GvTa#`c)D0gT12>)m`4$dffVz z`ayknDN!TzVC?hXd<`9BC(z*}Gnv3k)$G<(o~#14zALKdD|fsv$r<0lhK&X1gxIKL z{cd&##=SM+@l3WaHPjx#dtQTQdirZ#-Y~DN|N5Y{@wv2BEQMz_PNVQGp-GfDo6pqy zAC3+%|2)f0TURFWuAr06N3unRWT|^eDJEj2nJKYD<!?ma_7rEU>2MNhG943d=gReT zCdKw${c+$PtIy|!4^oEuYSw6zm=+>_ttc26a_^<(#2t!A=(+E7O%@kIgS$;%Q&YPh zXa6XLvoo(DQSgPll^AVZE`}dY^+Q3pA4D~%d^cmZjGS6#b_$)*(poefq<@C`k=5mM zL|}E4=8sP-vvmpgA4<@^P-%IN3=U=nqjaXMa*za0TI+-};Z0?mNpZ#W9I(24=pIjy zu`m49sQjzF;)m=s<+}51M-~aq`K-~sc!-AwLFUS&OFJ^l?B*%4Vy!1nA%km{ml?GZ zqFhIk;;ezxLD6y$#=vwAvm-AJ?xuLty9aNRnWI@mPIze(LvsVl8xurV<C4V|a#f3K z!n9bNn&Hv`^TTQBZ63IsZVd612=RH~Uf7|h^=bUo!+9G1HhMIxdf#Ru4&*sErpi1H z`lL_&9B;s-7;_vBLSRhBLS(Z*cv;RHF_VmnFJtbhyti<zXYYBG#<Ritm^>~DovefF z>eOJMdr_>~->4pTn5dage)Oabbi;YC(Vg*L`mNq7TQ8f{>X$D%P5z2SJMKPD0H=D^ zfJXB3zP``8VpJho*7t)m{E<Hhs#-@3c)ix1>^<C3Sug8F`D_-PbT4+%Emfcqi6cE_ z69~LFpIP=ZhBR(7QYcOw$oV5g&r;DEezalXRNZgO!_Y1>(FQ~kC2SDp-p<SuJNslB zrGjgkjS87yi*WuVG~;Aizh|oXC>0QZ+Kq))0w*sy_4#<yT)U~oi=hTD@$1xG!=}Qp z*umBqVVn^_#b+`B-(Yt$-5(Icj<o)@Wop5R!>FXE_yqX9eV8d#vBgSZg(e|xmg1RI zREM8+E#Rw|$YnJ!FIFkcx+pfd&GI*Q45kNb(qCJ=&}#5~!#qyo+2}dYwhOxVe|`-4 z)^tqB_xh^2{uU-ahVW<Ktws8$OWRxa%6los1yq(mJ70dz)bn8F(4eyysSWjyto{7n z&)C)$xj55M^LnLMwx9SD4n#6Xy^z-{^<%YSKPOce@4G<C7lD`*fqG1Oy)-JNfI!_S zZ?=;o9AsuDt9M;DBZ@7pJd(1Eq8<Xv_9I8nu3~Qt&lG#$dE=OFk>e@h_NhAc_t{mr z&fhNk+?IKQwK%g~Tsf4YIJo-ULOe{&vg-@U<<3nsYHM(bI`hANO*c{<2#&bVV}ht~ zpWoaP)1H3vPhZ0>Et)gp{~Wc@?j2+KZ8B|@@M;5p@4IV5S7+4Xfv@4so_EV$i=qqF zsDpc>iPCh2Uu)j;+sFpnhn3Lzx066XP!x%D84D9uAQl5F2t_5wtJ92bNpC`_pqQ1J zJ9_0lnU9dy<F%4i|NK4iMlSjC18VW@8AlwEl-=e^458`H&QF!F@sU>1{ilLUW8-gs zKbil-{+hu>#ghzOZm^6^@=#E9gWlp>erz<uO7VccWT2{p(ayTAik}NqgUj*p8m$x= zGR_i4Kh5d>{61eRa->I9`FaROe@*Z+RislAf-KM0642y7YhF6*zg8_E-hy;mQKvV% z^;3X^sM&*x$wb7`%5rqFn<6Pv*d4~yb4p!fjVg?(3uqwE#pBu%;#}^+Ss2eEf1N~d zF0ln%ycmgcRJ%}ug%GVFn6~XUq;1c>jDA#&qIvXDNt}MwtnlW-TFcijT7UZ;)rEQp z&DVySbP$~wk5PX=DQnxzVSDr!U31RBOD?snenxp&Ion+tbP<=v`X6WY)m^=(KVh+a z(x;{9m{K&6OB4;b%CX`E?*r{m64ZhZ5G=L?2CYd}i`p-kejZ&C1);nMfxn1(YlF!? zMD;9JJG|U>6!(msTcCzGb*bCbq1RNO+=Wrw(#IZ+%SMe-s)V)xWrL)Zl_5fz)qEVM z7X^5-<hmj{nF=MCdlVxu)z6qLA?X(wGRdtvNQMj=rTonn6eoI5UWqs%f}PWiiB-(G zKY^yvZ2jy8gD8lUsuMOX<k#t1C{C>02gt|otFB&)|3tWu;eLSE{Z8^e2P;@EHK1kN zkQ0|^h$7oq9gp}fFtWAHEW?i6B<(osV<nMlqic1Xy0dia7$KV*Pfc9uTMJ3y3!5bj zz%VcRK8uw!*1@QbZon(ZavvcZ^^sEZTz}1^Cl+~xUanR7MULEN*ilQcvhUf4<e;V7 zR5*EOXEOKvxbUY&k}3Ni7{;v3*Cj%icCBrbC(T|58~cXs&rcbp!`69huwhg67rwa} zZ7Vt1OzrucNk!OJ+9UnZml<_YH+A<-nbCaBM<$D2Qudhz9jj*`fH4*+wi7&(gYsu! zT63<aOV%*2g(vNF_V89E;zh0XAi2N^T>WQ`nQ83i483F@&Z+A`$TI|{=oNi4rO)Jb zvmp)miF8EGgHbkR+u6dR&x>n_<b>TB1ODRJ!Hkq3_R-I*F-AXG4#4Zw%R?+&bL%*k zPI^<4A6v^oo|~?gSUPLgYYJq3!U?u7uQ0PL2?5mOWaL?<=dN{UlveAn&sc8Z@ls_X zCpfT-de-YS$aLN;KP=MeRpLENuJ%$akodIPA0ggxbt4(-Qx7clZ$E?6mgAgOH?kFH zIkRByyaAmBIrIVX_uX@2=WOXDlXE!4?}yK4T6)aXTnSzZ6c9JoBxGf|lSsR68eX+6 z9dWu81%_=^{v_?fd~T<6Lsq<xO_vczyg+FNh_c_f*v7c#GFelkS_Lmfj!eV*zK!Lv z?a%hfgwVbOSYo>xDaX3QXVL4&rr`UaHcjUA#*RNfj!45w=5rrrimFD7{Hq;*|MHE$ zo_nX?xZKRyv4b(xRDYzj-!HJ-H*@9Eh~*zr+WBtYMD)o8=cwl8z@E^2>D0PQk?(wR zl`_0H;ZtX&9m;aT;?03-{~({1;F9k4#_FI@togE42yn~wiV=M%!O=y;r9?BRVz84n z`!aDe$N>TN`%JOf1w~rg>N7{4t<0<qWpDqj;i-c_W&Uw*oAk=tEfH(@ei1-0Sy$@E zR34O}jGiSX$sh7R-nY#+Q*}#YSvpp>+WJ;9*0>DN?4gyc#2=^RGiU{j@J4Qg)b5;2 z-TPBJ0^IAb2j7A9HoH?Zh{_5I%xB#f)|2JvQnVOOlt7aVAfKy&ny=kEpsiGrdEu6q z{D^<!U2I9iMOB~Z@?r2%ISeW1)AthbkweU)EoL`I|FEUk0@ce+dvXbZT=O#S_s-wr z3C3NekBmmT<2Mm3lY2?{eiSb(1!rfkJhZ2e>vS-jBcwy35xkSdX^qZ)Oy%hJ<Dw7a zoy-z)mtzN31Vpb?{4{MGx#uH<)k~k!QI1g2<TbaH9qIoB9^VThgScI!CNkLQ)R5+G zoCvz#1&%O&j1#7=bx#w-xJMii?lA3Y={w`Tm}+r$$<)?<-sjyiH^+(>26I1Rw(2%> zDG$rqY0R*=y-$c-RMoPEt?$dcPow>+@76XI`X%*jp5JW%k_dkE)nI!nR=eX#yKuKn zi%>LUIQuHuo(-^T3&xea?MuY_zN{XUp6P43)J<ePX(e=mJmjaisjgbN`jDWYmg80H zzF-94dL!ov@H)Y9NoArZ{F@`>*G6pf1$B}wY3aj<ULt<<`-+J%jY<NH6B>pWSLytI zly@O4FOn-vjAym>SZ^Pv_LuzSD7;OZ;AjXRzm>wfbgwc*rcHd*`&81H62s>}dV&b* z=*=Q}3h1us5AH>1bhl9+vQgQe3lfSqnX&R>!-yA%(lKyq9Lnf71#F%z_3lmNZ}e`( z2g#n6)um;6M|P@v^;D;-XBX3ub>@T6_I%T)7%(vKRAH)$F;kn5|Bz<g!<{<zmGf)G zmCWQJSi*e_b5Vj*D=X>bp5CIDmHHy(QenT4lLg({y6r*8gif<|!2I^*5ToB2`^A)` zK<mi3TGh4XK31+d{JI%>Fd@pfGm5Bk$V9oxzUiJ$Euz4)jo2~Ub;2`D>~qT7G9tn+ z#!I{wOBI?b#MUp3^q)#b4x<P~#{?`K2YuH*B`T~bl{i;(6z}U7w`q0Qvy?^?a#+nJ zKedv-ct4S;V!c>KBrsJfHp&EKUR{OE?_uCVSS{rL#v!w({X8e5rhd>BJ)&OY<@;0e zCMwlHPc~ura1!+gm%OBWyTMFzLvPbZAB=UP^~fwEw&HqtZP$U6Nqttd&@RW>FPIi` zxN~N&zT0`#c#D4q*CPUKW>9=H6*o7`Ph3P!F~8mQ_0FHN^-q<Ew`#_Y7KJc#6f-RQ zvB+qX&9%&t%{0ghzDXuz(<fHKGuEHHF}NaRDdV5x2$2=_k>|gGcg2<1TnQLO+o(x` zYi4aK1L2<$=D*AVKh+wuuAv@^9E;g2N8xBOn4pE*ohHtlGNa5);8PupJ)-KSn5qzK z^#%famQpf9g;Ti(kT?M)&EF=a+n_vIT(f!(12xVz6+5q|#4Xh{A)BU^u5!JSCIa}g z$u{f*v#KoRdHWjc4GsKp2?=WimkT(Alc9Z;b6Cv9c{l=z-jOE{v36JA_sY~v-<eyQ zi&id&7+0Es=kG_B7eXZ~8GMwaE$tlb6X#M$E>fv)KD@`+r{6P#V>y5Cn<D3%@=c^5 zPo$KG+3{&SV`ulcj%-r=p@Y#eze}xN&9sC~QL_-&UmX)9wx^GJ*4O6LJBV^WW)w9| zJ;gNxENYaj>3SMAc4Ojra3H8!mm23My1Zk{1ur-R$XilV2~xN?32g&rJ9+r1BcHuw zO9xJ%-ak3X=4+iD=b$bI<YAP#pg^qVmXY0gRLn*!D>d;LSvqCdr}Z7A=PBUkoEfrT z*?ULNMDZHiXr8kjG(pJG$ps0Ci2fgC-vQTDwmhteD1w5ZB3(g6X$ql+F1-cmO`7x) zdV+KjS5%rxlM+BtYAB%uq@xrK5Tt~XP(@lGARwW`cU^aV`&N1X-=~5n$<3TO)6d*F zbD7n|8uC9pi;wRUJclS`8ge8*Gps`x)ipy*VLibKm;1}vRi7U@+7Xe6D+f(uta(mr zr^@K<NEz973i=40pYd+}bnWVguAbpr{Ez_=rU;jU<m=atzVyRZ@UlOzjmLIAb4&Hl zQzdIt8yl07_;hPw#ha|DZsf~i;hNqACE31LIVeJ%D_>im5#g2AuRCqFX3C(w)<(^@ z)}I|3Br-d!qi-8qFq#ynq!0CLPfXQ#RxLG&sa#)E+JZm_5^hN1{d_Wpq)gK1mZ-u) z4h1sYoT(^$qJBzHA}a60VV3rHElzt^Jq&q@x<<DY3)Cp_qxRgU9D4o^oTKW!pSq%k zmgr<<Cp2kfPj%}H*?oy_vDqzDRnY6P=ewBnX&LA^(Ei5%H~Z;RW)yp`>(9%+;(Stx ze2*Vbj})-&6ftLyV(Y279PC8HzVDu{7V_=LrRQP<uCSQXp6kcpNUY$sLd{IkMJFCT zVUU!WawYGQX1h{=6J4qk`~2*ntuvpQ)eD_p^xf0*^anO?i7V42)nKR$OD6^L(y9{F ztazN}?Wv+?a5oY5UH4H`zb&7(oV;7D(}>UU+zj2x^xoC4GNfhfc(}9hI~_)!-x&1q z3tUg1KlEMgFZ>qnq{eoF`e|d6&bakgMY4oriF_>8Xs3$UJ%@j$p8q`#Q==RXii8AS z7sCpVTx8D(epT~c?e-RZr}Ki|1K!`b=Dz@hDaJQ8E$S?g0rY|?PIb>ed4FK?IxPH& zyv|o!I04E<na&o{Ft)1Rjkw3@_3k*Wx`(_)u<JUgNB>qs7Oh8NE(kOFBGBcOa0y*T zo$15QuSaR$41cOVQM+ZM?W*wFW>LJ=8Y2&~IJsTo;&pn|Y+(4g+#TYLGp96!p`z&7 z*M-$GHOu5<IDs{nPzwJwn92SkHW5BT{Di@i%`1KviT$|cIX-@czMw%jIAtV3qtb_} zjd<u>2@0Yyqocx6w6)By<>~w(f<1SKcqd52oi=2rPAIH%rIL+&PB7Fd7PS~r5bAm9 z%B2CD*;va)?)jc>X?M2ieZPw;*_GgyE?Gz3qOBdDozICl6KL9p9E*@Mf-J1QR|wi$ zpYFXc3gn1&V?Uqk7v$~AerIOe>xj|rs$A8?OYbx?!q&5U7QG22@|uQK7L8dKT>W=Z z@z2C!<3)vW`JLEfdf8<*a8}2XcgxibCJPl>j*3s}_JU0+y~XuFyB}Eabm0NppUNv) zQqiLC22B1Co@`trxjsbFC5q?7r0G9OrW0t@;~t=5I>{~i$%!R|JbCS~s;B<0We}>G z;pFZyYy7O`d68F~RPt$+vVG#1C*uYSd<9A$-7j1gDY$kGc9pJB;#5E3fj~x*jjE#X z!x)x(HbZ$Yf~JM4;1e{1)lEnUM5rKgerHzP_a1I$S6<}=Jfw>66L-iz^T7W#ZhWb6 z!6?HHNk(*55G2CuXhoi{8n2!y$*${T4Na}v*d@^%!G+9^`glTL4sqORXR0D53cSq5 z7kysKp?g<(U8k*wCz@N_uABbR_MPTKsI{!1<^73=a+K?7=e_#WqIOD;@2hx!0G~g5 zeS^pS?!~NVNLn*XkW=&i$hKg5?sKD+ugwKzLOoSkj%>Z0u{#qM{KuKA*G*k*4$eOx zyM8z)ROoqzke;RArPuXsg7c||R!dnV(kw2GKU-lC9WU?u)K61=TU_gXT$cpJZpKbW zl`HAi!|1aiQJfUC;3*O5bp5CXnK~Aa;3{TwwixSc3F2PD(~J1n`k@ueMlgRcEU-Pj z5ngzB$Rn*)TSa*9i_F;yXlWh!t@gz$zp)fQ#5^;C@zEC@+9W2(lF|eYYbuyNCkUgW zxfdgG-}dkXXNZJlh!fXV^%-GSfpPyb)g{h#?MRo^dqZvF=}pGEPn4&Qc)lC7soLaI z9whX^abL4^&Q4aPs-}kIys~bU7<PzZMSHZ_Hkd>iSE3R1VXBZ8k}8^9<kZ-{fsHF% zv~Mu=3u-N%9-nPBpyljls*C0xj9}q6=bwK{=*O99y6O2%u@SC19h_eurM?UM7ErM| z>g|@eynLv&-ys5d)I`E*;#(8dde-aLCk&&trz>30??tJTudQ7j;VE#g8}!ZHCeh?9 zwH45LG<7$yhI2Q_9%j|rU$|AVp`TWEho-2`T^K73J{BB(L_F{V{m$&m-lriSS?|i0 zOevN$*O#sUy{VpSeEe#&3!kBxcrJ89j_HWv$w%B931hV}j!5uLQ}#!-H@@BJ4HGQ6 zdf<(O<}i7QP}@tK_G~Gna^C7UAQS5VQz4|mf;!5+Gik6A#$E5Xt71O&R6jaWqB=V3 zR$JV)yupe^?wx`!H`3xVB9;Y3xANf=-B#D%WvRVSYj^y7Z04kb$G7*(KKfsGXbO)$ z857<<v5$lMR!%>@#FuHcImJ2%C+1a=)ylLV_+J}oizMKEMQ~6_KVNJ9U%k|i8w;Ll zr%QID&<jUzBFUD-sEBC(2+}i!d-z+3QcwfoRL{car}p6WnucI!64P)sc!Rhv$r#$; z$8{w+>BC3N)E_!$vdU#=zjk&IaSkSV&d$&t_s4Y!q8o(kMt91bZ(817-<5j!Hd*(V zo3KB_t_ZfnYuCWR(I;-MijMStet@Jsr-nj)GkkPHTyMyeF$?CaJxsU1`sMM9Zh{9} zkwSA_E2NFkrK8-NE>Ja%c{6ASc6hI2SxdVV94G<lh~r4DyP)-9kGNbl`&EmZJ!U@` zMw`#e@>DjHsVCZYFhb_;{2Q4o#TAKOGl)MzgAFSms@+t<$nLBq8h`x&&g(o;&oI2- zI#IRMA^Snno27`o^5bB$-*vkJ(I-D~{`cS$H+A#pKm)7kFj^p+EsqHl=oK)csyW%8 z7fIQRHk5o`XDq>v(iDY^+xe7NyF^Ed%TUh^&3&K&vcpOisZ`|2_5H!qX6$UYnQLco z>tC~YG)ioXy?9fZKG+{)Ym)CBJt4hMP%hj)+P*zTaglj0yK~$oTWm<Ou8=P#Nv52( zef?5$K;XneL95Hru)Cp(J~u|T7T=0(YW<gO{pmh{L1U9zBl%i>hHk5KJGlxPh^rZ@ zp6io+hU!9A<KDb3B30WHz~ZJbIKTJnETF{WvX%W~L@6;PC53{_Kmb2eHa0enV3&fA z$4Gg=*o}4cW7v|yclJK!79v}D=3N5K)`zSPj3;Kvl#81!#X?S>F4)=GU67PyR##US zKw&-);-tIhE(YZAgK-6H*Urg5Uphws=dfM1mMuqSBT#joxa6d-<-SJjAG%qL%>(a2 zOs`B?Q>P9j*seASpN|RuO-}HKb*#R4c$o(r9EI1$xgxjJy!g@2h>wlaeK^DJ;#g4} zVdIn&TB^v#XU<8u>K2-el$0mSlUF2=$v}<7zhkJM?}VW#n`5u;DJ}Em$Lb2W?Pn2d zTd}3s>bibLx*CWVmDDjOKM}oj{E(P?X(5fV$`t__8TPTQ{>v`!UL1%hfbMPTN1VDl zkBPKKS!(raQrFXvYZA5u*+l6aDE}M)H)8%C;n0Y$p5?ccnRrrA1q#Mh0FnTK82v^z zHFbp!WI4cfc`1s|a%bdTfx}xG$?ACLHB~$+b-_&u>Q<ME#l}{$4akJQS+!i>NeF9p z;dKA17kd)YTZ)td{(Q<Icx+2<tuMuLjs@vgx#a#ljrS{oBpw{!A&akPm6i&BeJ8QZ z{X|YTIPytTve9l>Gn%efbJK*Bg_{Fm%|kD717|}W+x23zFQe@{_3J>u;m}iqk(Tz4 zp{6U}g$)iz!r}az&)wbJl!Ak0TwGmsjg6U}va+yHtf|#o#G;`CSzswR<~f{$eAf^j z2}OLsURV=8kO=ZR7wA9wJI~}T0Fw1=<kSd8VZ{J#`)rM#HCQOE`Bjn$TSF;>1UGk< zy`iUuhK6Q+Vx?^jM~x+_yMC~A)}Xl5oZp8pAQ~!}NgJGNNm{7&1QV_l@r9F~&?zN0 zJzCYbWxrS0D=l@-^psRCWIX51o1<5BuNbAhCtd}dq<d*OUjTq^N+MbrO=q4{+RV@l z2^WxB?Q4xekl`Hm2a1~-<>4GT>`*pn3{vy)m3|$DMRSB`XNW);4aF$O_&%~VPHSLs zH6?||s1o#p%S|wn(DI_97^wx?#ITn4l5<9}L=pHqhC233P|oK(&dF-YCJE3skJkxJ z!h#iNP3d6tu6Th&G_>yZ<ww{Ug!hHsty_Vb%Ktpi`y;CO`*-!_!^;hS(7@9HOqido zd1f1Ww4qmxz7aPn>?=^l-|`Wy&vW4Jq$iN@KGHdZVia^TyKJ=%vz(jr9&0^^^lk2R zW`-=;-*dNDcI52IMi`mS50tkG=V66kG0qgRyZQ%eakalhr<`KaWKYQ{HFuj=f>Y&% z|1JsrL&*au4llp|6C-z2A){o^OUP~1Y13Ya=_&%2S64W&M*t^W*0GPqS=x4UIvqC_ zOOx$~fBsAxQ=yAWI{YY0-?otZHa>3vth7Y?O6sZN6|1y5Gb6&Sy4TR5p`z?JwO}tm z!dfhuolJ4gW*Euveo`Ok;OONs*Z6d0DFNPI3FED4K||~+-^0J)OQEa~55j{u66z5W z?jF!tx!OE>Dy4rAs~JD+jJ0Nt2Ma(=sj`8G1BSzir1B2|gKGtXdPt}g^vi3{0?mcX zI>tvdkzkZ@8>;nHuOi+PlizDXWH1dM)b#Aliw2GL>mR%|E4pO8T~W^Y%s0ic4Px5+ zIVW!1_bbpW0OiLqvGQ6r2U=A=sNp$XfE750pu9GD?pVB0Jv7UIIZCRNnXM>J*b^3j z7dxS}+J|M9YFDdIQpEgG7AGxvu`iDg{yech7XmeK%)uG?GQ19Y?e!>nnot_wo4JXG zte!t`D<kiBWqi7~^v@g-9Fq?;Z9G<NjIfCHEbr~M<MBfcfEP^cJL%4wa!!0pR3C0R z;!UNgiZh*Ccn0c%5K7B#zb?0c*vSAVS_%aPY}>rO)ow);e;ERQ)JK$GhBGv)^gKIt zEoav!^0L+aFL`XY9&|gWH=AV?W*r>QKfW~n%~|pX<5ZtqzK%bQJ-pDTiO=h;Mg+&k z_X{()me}L`ACtV%{PqavntC;VG(unYf@6sR*Gc$8eZ6C^AbL>6Z}8NVn9GSD(cvV@ z#DGgyFkV;wDW$}{4=-bEYGg?nWK$@R{-W&k!-Q$6))N;71wH1k9ZaWJ$8(GMZU?$= zqOscN5X2EX+~W+0eY9Z?Y8E<#W~}4LkG<S4<jO21P^w?Nx%}wO;*pcb769Q^n0rlX z?kjKA%Sh!1Q=1v}xa5>3nOreuuY&}BjLY0~ac%3VXCqQ3O5=u5WNlww&5`H*Cf`^L ziv1Y~n=X!RaAtFzUrtc`+;uQ0Ur3?T+_oVMm3{$C2pYy!!~Qv|Y%QhVWJL+xi>{lN zf<5cOd!V{A$tjNWh*Arzb1@ommZyVxLF^E76<GW7*xZ-CppW{QE=!3yVpx+a=InJ? zX?4O{K_TeW`DD6oO-?R$y_^_jQaL+LGnlKuvX?=X2F~8?mV8iLD^Gz?Xe7HT=Z`r% z<{(Oe9HZU!hz(LRmbpz&?0I2~F7y(#J;g{W8p`^tM!30?ng7T#@pY7)>k$;<4KKl7 zxxXCajyeSIZGU`GfxYGVxuF=C7K0R>z)YVe0_*)ME_2H|ABs-~&>bv5l(8LLT0?)G z;<LvpgPW9jVkz9rPMd%t8s=avfl|&wV^iDC%3kaWKpo@n)WJ&Q2xv2vNi~0$EFeNL zyK<XN+_7Zjp6`vc_riMV77-uNh5Cu*c&GGctl||D1UiKWOr1YaPBvwK_Z)4nUI4)m zrbKk^P{Wa>g@DGuQ{ZK&)!Hvoq~wE5!d*ssEA!XmiA#M$&d)@lZTWu0W^u=v$AGo% zFK>0R&8avgj`*T}i&d&0RS=EOlQnZo^1-WMeDJN$7tc7Bz~#XLF}I=t<Bts+iqS{) z1{JFIn&mVH<kn?hh7;}daMb*pa5J~d0t$GVnd9eJKMvIABT<QdfU5=;Ls=;P;xo^I z+o*5S6vWiBK==7!J3u%;1gKf?YVwDGrJ(a^{@p#;fZ-l2xuv!LC_{fl*(tt)Xs3bR zE8N(}5EzxzHgC9|YR;)!y)Fd->I8qY{uu6$&v_Wxu*-b@41E)PrR6!!(S|&m46oB> zztJNw3<T!{(%`k4H_AB*^L-+=2YTY!BFbhSCP9hSg>no~hda{qs`ovdoWF1mp#M;* zxmoM0wVIFlaVFt-%>~+&oB(mw&iN>bm)LQqBTt(MSRK}fv!Y`$IF-+8rCLbvLqL&- zP~~~Mx<kzEFWeB>+%53*4=m*Z+7Xd;_&@k`WDX>bZ~VQj&#!Qk4vzB%F=sT>5ye31 zbwj$j*&0ivw#1MiCnRxMBOPS4Ew3`GNOH3<#(2S~+Q<8J^GZR9P5F>xg3i=>M)umr zggYXL->21b5}7IPE9AQ;+P|lXj2O&Yh(h?M{25d+yq0zJ?3IMRI9QSvwd8|ga83kR zst^d0z~%rpX!hDymA$;0ZtZ54Fsye9rvN-gm!#~`?!p5;$tz|1(HMb;i!43`nSdD! zCVNa<lhMcQ=!^)uft_W&XbACHd10KoVNP-DogA3vLOc$#x?s|tkA)Nf?L#y_iQUg5 zI|CaRy#K$?GW;}7YMD}}Z&{_8XQcU0^yDXfXD<%&*%M-ci-;tFhwYeS3kS+$dXsYk zq|UKQN%X=kB{t<TgD}_!W;f$A1xWTv_N-UE<pP=`=sNxWa`T1hLq^AnL5XNXo>H>1 zee@eSURSqy1N5X?=@<2<)wPtxa7*H^r=os_qin|yueB)i%>yh0BwBqTo_nrus6Y&E zHsyp$ghkpT^ZhVDL@GMyEfH9ut;B|7=4X#dS{2f>NXfbPS~~$spI^3WI1^=m2ltj$ zAaSct#ZKlmG~qHlTU2N5*&QhzJ8Cn>8)tWXdxtjv2T^JmZ&@KmbaDVnvRzA*-hNt5 zDhCI=pA(S-wA&AZ72}>NC~S6Dz_jw+&Ev}l*pqeE-%IaFVJ|kXtapNlhPqvFDMpRR z;qn+IfGv(1|1J!C|8n7)dVP#KK$VjTP*$8Kzrt#o_XW^58^T~f&H|8tig7+rsU9&M zUPCAsTu(z3`o$UYpg4LGF)Re|@|yZn6QJs)7a%hskL{Wc^b(xLJwPCf3}JONTNw5= z8;z;Mt266ht!q|H?B>+?V>D|f^{@~E3B1||u|*l0UV*UJF=&>+^pd6{k*bY1zS+zh z^qXj<l@f2Zn4f=y09DPUO(E?655e}q%2v+-zBXQWNJA*)%b`OIQR+$x1~G`z*9h?P zwz{X!G#)HI)bBhpamV?+Yx-coNiat-8HI-p0xYDR`BW~I^?f5_X0!%p2BOgL!3a%4 zK(h38td+QG32{M8IT1~I-w!M?QJNY&ZJoacN~_0lUG=Z<N&IcC%MTI%tlUU$QO*aY zA@qyq)KCbXQjVVb51$#!?K=ks;Tr+ZD$<(GiiyKLhq>D#5-UiCXj@ejT)ie8p3HHU z9Zsbw)pMGl;G6>;D%1fVcl0NS>7^$!1riSP&v^nt%?G`PU^UYk?Sv6GK!GsewdaYM zQ{j2!jP4aeQs%=0cd^wE?~!7C=EKbE3w`300TVccWwgqm?0$?SV+XNiQ)=+<{=F%A zDbaC0t<)kzAQAy0@z0C0GdY$FwDv*3OVeNa6o&lsdrMggfS4B2u0$kSU*mDUmctjS z-2c84f>8^0$wJKnCjGjC+k(W?l5aq~K@#mecxN2|K1{H3jBUvSHW_ycN}HeAb^76R zM>{9x4Rc^lBlzp)#ic$$aAwDJ1ms63p4<Bt&`#$Z<e@ZJuI0kWeSHt9dpJv&UL`mT zikMw{DvTF5pNVgQ__}+^J5Rad(G@T>5{3t3{+%HDS;hN_omwLJyDUvf!BS$*5d67n z-T<!C{gm}bx}3^(e5ucEz-gaGP??`YfY>29Q&KE#KyboNH&f-?UIqi4pTc~%FMoLa zWBp^r7FakLzlpZQ!#MDqI0AsEGqAOEckWjI<aJDc=fK=WSh~)IwAijZz%sk?p8?!_ z>OzNps;8I8G0*ZH&oyF{b3J*azW|9Ed`R<b<y``GPHZYj;`R|po$n|-0Ni`0_=tg& zw$%KIB)}GuzEwa)t=May-MQvC1GvzUI{-;87b>*nIy<rnj5&9S{NleF_s2%r$r3Sy zLx)<<?(R3dZPR`{>2=xMJ59@h%slu^Nw0LLM@Olf;e!0VLt(`X67!RtE26R~j>wo` zSu<6)^)ZC@_?Fa{UE%%#=Fq7Pw1a2Ru&ym=RkBr;M{O)=8T4ZG8$vW<6|tPYcYRdX z_N^tet9Hla+}O$^**%Ua7lh<t3d-a3-@*SJge`G-_O;Kyt;TL*&WlzE4!~%OfpJ;q z*be(jZ8g@<!A+#K-cQE7bG&L$_kHQiHdu~#vP_65oU}U3YCC$-1)e_27UQ#Gl^(ZL zxSZv`5E;ZCJKb<%e=jc3TZYwm-eJ3i`oHJ=K6$OCb%m99egUdm+7>3AvVI%6w2_p! zi)2|^4M_Sh1)ld_SgyxbvvsYQCQTZFB*a>1;4JYK_1IMkRn&);xTSX3V)Wfudw2T| zzc$G=tJoPZwxc?2VA*NZ2ZiOqe*1Mw`i+kiWwMsB18Yv{sPpsE3&KW|qVO|Iuq;@p zYP#{HWGqUyLTpmhXeL>X#czHRNpkqweUytS$;8>6Tzz|8s4Gec8yys^f=cP~PiI|Q zv-+a?mL)P}u(vI0ZKL?z{(hclMN$7Z|FPcH{(sXMShK7}=K8YAI!Uw)7TqR2kcDb3 zg`aB=8Wxx-^D@x46^hNNFDMGVtSLKCCe)QYRov|1L6u>_CHqQT3M9rdS)1DxTf7=H za5eF*bXfyvMaFo*-(k_5eR3EX?JpfH6S>Q4xd8%u*rYQ2!sWvhmDF|(i<q#iIvJw@ z$uZ_EbbnVrGbheLuwH0JvVRbu2)I=`Bgm>~OsM`fP_wVcnpg&lZ9C@3-^LLMOJ^6| zR6-VUTXub@j#3Vm;TaI+3@mkkAp=(sWhT?B3%6N+!{Z&1u+f@=F>wse1nbvoMwmfa zMz_e6$*%XAU~Qv#T)l&oI72~+w$s>t)AfbBdCY7{1gJHZY$x5er@-7Lv?A27(g#{e z+lbjndOIY&3X1~ezjsUbE8L92E%RHscK&A0pkraPIqWi7LD7g#kX0MbznEY;BaV|{ zE|_$wUzALpNp^(E><^5c{LsF?WbbGmxaWj;i$L|a))r6NsxBu~57!8*XiNLMXY6aB zgIZN=WgO#~xc{j!KUC-I97Vy&c3q2ToPUr{(VwdeMl8*Km)Y;oq|>F>QCq=?WwyZJ zR^wL9{m$`(a8*&S?lKj}eq_{gjD!c%g|3)g$u6O;)aXqtc)E7fmW(L7n<f+hpI3E! zbo#%v^v^l(M#z(53u`@$#wKBiRklePNzQ0TRLU44qi(z7!kC|tpYh%sV4|uoxyh!s zj;kG<(OI_v{6?Kc6W4@V<F;d_Wtisg5=T|P>?|e7%;e<%I>!aihQ@^HX(ydn+}d}F zBUd+wCK)Z*6@P5EiI3{)cg+hzwuTzJv`X#E?k_n^PVFZ@lKAGfeRa$hCX?dmX3vI; zy5ql|b^Fy?$}nNIY|T`9HA`qr2J`qgOWL>;#utqlO6Mq^@7@6f`@2>WtFa*QC-#d@ z$hWebg^s94GjV<&*A_Qc96WD3^?h1ERdaNL;P$npJQue|_hgcn*4|=K1NK28i+wTV z$lp!k5{77<LZaK|14QJ$1D3}8G2>F-Pu_HriBztY-P~g#B!`-UBm{?2)4#8Qzb!ze zRb}$3(R#msapBu6|E?Bry7UqXyjP<i81$U~hXnjnCc?Vt2c4~BTmq3rUDL^3LQ3AU zEUKvPbY1@S{@WR`{ih>y7DJUn_G|Q3w~Io#bi~6~bIVkwuZEs0*i4%_ztp+8c(>dy zz5w-O#REJ`7PiyBF(DzPjT(wR2EE@&&Dmn)Z3<$Y6eqrAnO`+&iwoo^XdBaY<FRs$ zo%V30YP+n`*~KAc<|x<}Fs;k)BN;=E_O2-EQk^&D|GeDiC(X6@r>FVv)ohd<jbVA2 zb^8bZB_9T19Vc_A`Oj_MUFm2euCL`@ah)IR%6p60gm#YKozp1$j*aSkO1po|+9|&l zVlrUH(q+u{d0G1Gcbpa+IdPcZvBWNnPrC!)yOqU2H9!EkWY@9=a`Cah^jd9qz`4k~ z!CR7|l~SRB08=Df?xwf6ggDCPv$t&3Ifzo<UR6bPOiAFAB)R_^_dornoVxX!ZpnPf zNZig)P&{YLXTPE784uHS_7-8|w(ilCvE(s4Z46Vfn3O8a5tR-IUeK9&zuS3pfp^$- zMz$aAtgc^O*TF576>NvdsXzFSr~G@a#(@*Jp>`Z3)~NtwQ8Ct-{Kq0vaLRQL5MOW% zxqoMIhYU!nb;V1`eDlY+lo9`iF}KiS);}d#zpLxTvtL0T3L86$P07d#ie)c!Ey7M- zfz?SZZLhWyC4rUVyvi%5i#z0s0IMwIl1U!yuAU~=W(3F2SD<2YmXcdS&eH8gk?AlG z{^i=gBfN7r4DoO#7k;_l70|0AHARlAmf~hzcT|@@;Bx94S~HRx0Bg@=1`XiAMSBCj z0VZ3m*g3G73+E9lh~60LUGg%zuJez0;V&wT*8oKD#FC>w^P$Z2XC?y5WieA8J+8vC z;F@XT&TNz!z`gG(Rf?aL&Id@fu(;MevR%Wwp<C3C=v)HNEXb_<M!+pEdm1aQ&Ze2V zpIJfyt-c1kkZ9Gnd@xuSapw(S+L~Q#S99It%^!~##=Xc|6|P(@gmoos4#^ayIn({k zq5lv#j6DoDJ&jGy!k4XgtYqDdU4zv&v~2|#fFhNp)4Q2tI~w+j`ga2dwun;zbPQy5 zB^MqasOmPws<Ljf&rIeW+bpU}&AakXW&d-U4Sh<>kt$@2<5J3$>at(+%3_wEeNn7b zMeq`FYci$DYdOndhF|<iacj(|BsgobsPCIh&AeZ&?K*_`8@KhK(VQhYbQktSrlt)N zWFYkf5xnl!wZILZcbs8s8SA0N(kzIGbh$Wg8n>;Q-$|=0=wIkqlJ%Gwarq6j+MDBx zS7tE&WhusOy&mNBjsdS6^kR*0s4KvcD#BOkf{ZE0<t!;SlKOB$3X(Jl3fwmRUC0u0 zzY)~=DWR?`#Z+3$@vW(JXhd01|5TNE#&%H*5T3Lt`=!2eT<iJ*)V3+gN%^34(*8sI zpX>;WXiQL<8%odG(G_(6=2pL7<T$goCDm`$LmLxm<@};(0nk^><!O!11pKh=rC(@$ zL4Lft5yA+2L(ZMPnq*a?7gr%^ITRO|!Q6lZVun%Y+Wy$vLw?4cpmn5Q(P}~sF2LtE zA&{K*_~OG^qCX$Z4;K|umQbd;z4$2D86+V)?qcifIOalfv507>F3zyk{#D@bHJXgO zFv4JCE*8V?Ip~m1T<}_y<FwT%ZA`mduhz)OHgU@_BnnqoGgcB%1pdwR1r$~zgKQ%{ z>yYB2V!z>F<B`CD9qyE-O`$F^Nx$`_{u!D1yKT&C(!ax<vX#P5#K5m>uy9E{6do$K zl)R=Y8a}DG=u{-@(+UdA*t|#_)u~dfi~U`UZxN>BbYIpd!jYVfV|V;w>KDa1K#Ps7 zF1WbmJo9Cp`8Og&U!^);ls%t=@QKCB<pjBbB#Q4EgVqgarrt`929HS(sQpT#aUI60 z0!b;Kn(dvMuGEojmz~MfrcIk-m(qITaBbyp4PO`iUBfc6;ml|u84A#1V##T=ev*At zM&&mYq+DdWs~S#bU#ildCWwZwPBxU<Y$q&Xm&AYP$l{LHm!1Yb4w)9;M|X~Ib&tK3 z+(s-}h93DHfgLHvDju_pts$1u8`@)?sAk%lbKjbYcKnt!yk8kv8rKN>=1g)nqoEf% zCo;YkY*GCN<6@@Sx|V^4<vNcIug-DoK&X7@grMDT#B03k%xvBJjH0gq#deRS?KY+~ zTVPUt)uqNR`WI`Ip{)ajp)CLp)4P#-$8PrCy>b=u8+O!D6v))Aj}m>xvYBf)2^(~S zS6+Dk21`oWo8xkvUNlL+i3b5?3`;uUMAZ;KF!39EeVl%S_HgHT*9QCW{a>*K-noAE z6K%+~;`hI!<Atxx6e&#^%TiTGf7*(F4lH>ynRoOoBN%^&*EooB?^qKH%`39(wPS}4 z9bxow)piKva`3i++H-*ex%|1nH~6{k{`uR_+0NIA3oIleB*f3<Wbf?g<O{qKx*-<K z&t>c6>}Ka}@6H7_59D&Q@wfL@x8nkHSy|n&v2}Iy_JFzDSy^%MbNTvv0&uyszFz^n z{I9S5e^2TRwQ;n+<?Z3%>;?b@@caw<O=n-IjVAye=Isnj=Hu$@YwHAfKW97e?d#wF zir;YniHO@e2#DK(#05ldhzJSXkq{OWuoJTtwGq2vBPuB>4t(7a_y+KOQDEPELqSng zKmw$qEFc0>QV~!P7P%oHq#!P=D0)-urjUdvSFpv;>y^coMO7qKR0Kp7l!5DSDoP04 zys4-xAgLk(5?2yeQBV{S;|k^v{2SfBiSgHTVxp1?DnK_B0Wl>76#)?yAq4?RkeHZ& zq==%BlA?r)vVzD>0J(n>*~Z=7!`H^w*~1+m^1+ZrghhnKl!b%^M1*dD1Vki+Bn2de zm4JmvD2gfyiwfPmp{(#P$iDV>eZRv5R_E*N`<={O`nKNo_U;$-ojiOm2;UGA5fJ(g z;ew6t1tB598^VI3pbHAx02n)axU;RjzOBvoZvhhX7ju+6Y++D)cVFNNsJ*X^osF-} zcR>Sy+W2~S8`*pN0LuWT5f%f9hzS8#{r}GU7o?wz7l7K>0$|`jAqxo#0Yv(nyC9*P zqGF0SgamGYR73?tlmNadh)M_vD2a=Rt4Q3GP`Rlr%oWViN8fwsXdjJ_tDZyPs%lrT zxV%EumHw9O6Q;(GZ$VT~o?tm~=+L2)>S{`QhYlSLKXiyv?>H6k&dSVE9q`{_A3fEZ zhl;RlbHEE~Pc>7YLx*S>zyBOQl#+J-@9wa74=*5&1;s1x?aS5VJ-w-ZbEzjj#+Uxt ztE;@TkJIm5ca*HjNe@7;e%r}dm+I;*Ls)!b)J0jV>YlzufBZhj1@^g159oXR_Q(9i z;<VDGYqs4=si}iFEZaMRW~9cF{g=vyW;PcVkZsqG-Tir6;kN^}e#+X2wFL>u1C#E5 zR_;U|YOzi~eqhEDNL_kT(r2CzqLlua_CNbM+@hV9{F&(d-9Yuw;U`V1jd2~<{#U<> z@8}%)KhSw3Lot0GcWrBTFSph9#=+|gBcA?xR~qMf_W}CV`P<}X{Vy^%tq!M&{gRUW zQ5q*7etF!eH_M6b?vq#vp+ORLkG0idHi-kS{$5XYnW9OgiCg=U>_W@9wT|zbvaqB7 z0~_v`dlpjC!z~l<A+%_@Fx6q^4(bDM_#dJ+h`eWEE<M~l@%|=oxjHT&n@%_Dp)^_X zLDa}W6co8daZ>xXXhqFKF?f!CGdJUklwqGA;UydS<w8xp+;z5td*1XN4O6^^<-pXt zzC$-XZh~EG?pNj%_3s({r5E&nZm(Ss39F`en|~GisVoYKZhF*Iarslf(eQ_Ks(}Bo zus*RcJcEZTpL@A~U!af#{tmQ!awy{|KE`7y_TUOAiQCkD=npKUjqVsG(oDtZlcsJ4 z!+G;GC%LewgX>FG!C_91OV$J+<rxD3JXETRwT0?YDdo}qar&IC^o4J4oH~HLjnC9C zn7wn+p2gYGiaHmxu|=N;8;SG;T&5Z@po}gLe!T~2%sT!4njrLl2x|hhlH%=X5tY|_ z397Vx<#jTa+L*PQv_+3IS)2)Ya`DHw2{iPzk0)zV$bnGC6Xk;$B-dVWv+F~*=e_bo zdg?pS-55@9p{nY44wp#7Th(i2?~C1~0@)IObNKY{daX2S17j^10b7{CVsWW{+AW`e zjna+Vxp+3bfbUhcGm`-4(E)9wTKWU0w#e5WTL%f)Q~BTv^iZ2VsI+)U_lno&g)3<N z8mGZi$>(pgEA(ln-jaPu6wwlw#VzBYFAf9(2zQ43r91hoW8bg;MmxOWWQ8!wiFP-S z`}Xuv)3f76F5VM6u6kB+=%&VqNM<BE=|K9(Qyiwioz{9^L2byH4~fprUL((l-j=Qj z6~Vv+sZ@F6AFk3Fads4C9xb485Lc*K7TWC$(#EHFy*RLhG3@;x^4dze;?VF-$}+y9 zCgS~}HJ{T(mfLe8dZ8ml)y{|~P0t>^oCpfX4WLIT*^$?Kd7cNAPb&9_2Or3SOtIri z=3jjoufNcN5=0xUcV`1Y(ai&H#)u#Uu;eFcFL%Oml0zf-GZH*wx8RKM5_GnX_A0Df zRlDs2`Jm;iUI8>vWaQiF4jzV@xZ*f%nck*_31S-d`7Ko1PJwNK-yP4Z-Mx85f^H{} z`f^vkdah-A08odFwc9WULXF@7pk5b!>lu8sz^`=Rk4{omMTQ2V)xKYq+iLz!iTQ+Z ze1<-PHFZQa3FboK>#7e;3+glhFZJtegD(Fpk^R>oj2m&!Tvy~pMx0E1rzKMnGM%$V z=SFIXAYuoGNUmN35tN=68ww2;o@c>y<zd}v42@u06RVq<9C)joD>o{|aIGH)qU@)+ zmqiIe2bcatNQJ2>eX_2HkZ*|@&a4F#MquV69H1VoMM(TmurJaRhFb;^syYW!&Mz44 z&`!-5I94XxgNhI3mNJA!Mn>wIm^^y*ii^+6%*;%XJ~cB9pSlLl9?5PelktmUh0cMM zyPskYy!T0bB7Zfkuk-xP3cvg^LK+5hj*&6Es!F1{t&RKQ#U>1&*WgF1Sdf7Q@Jtco zyt+D5$LW!+Wa#i0S7ll_p9|HhPbmTV5>pMKZqlHX^&G!<`2^49%NK=&y7jh48eh^K zV6Fgf)HtCo?;LUT=+O`D?PcHIefeUidB*5|30O;^zk@KJhG}wpxsZ>QUI<Qs;W`JT zgiL7OPCr->D`Vp?Hm02U^2LNVR72xL-xKRP-odCY>AxmoJ3%2DY%4x?L^0Z`j_0A& z=Pz+zJyo@aj_O{O6SsX%H*UcOJXWh!cWGN!@-{7giLQ%z?`ziM=;)J6UmT<b)7QVU z8`d8>HNE7p$e}ZSA8bNvA8W)$eI`G(w0btpmiL9*&2wnE;>ekfPFLLIXV|QRgRU(* zeEMD64DjOf&Lb8@rmjCCo%5Jf?}{_c+$rCKy!F@d^4Z(Cy*J{!x-Ki7InGhRE_b&J z`J=PH#Pj31>pB%+6B*zEp8_K#>Ty@5_#TMTtOkpjSZ=1kAW+32Uqmvv1vFm}M;B_y zVPjC~fro@lxaE(2qfQvW)UW9B-N&5(+R!}LAaSR$j2x)aK%Y5A3Jr0CfR{Zd6GCz^ zE^kVD&MMBu1Z-h=US!N=t%5}fPO19D{;oXejnv3DJWVM^6*cUcaaIzkrksMsL|j~U zx>|+613cf0V}H@RPn@D+`I<*?DtDXWUuO$(7p+HE4Rd4&f5mz7uPNh0a($KF@QAte z<@Sh`5l6Kf#D`Y%ISq4`mO5%V!p&33;`%vghv3(nxlfwh!N!awoN)8pQq!DOu%VZs zrA+*JWQYVr#=m=um=HY7|Ch6t*9J(JXC1LQdak3b6MZtjFje3JoHTqInd-egid<L; zDv4^4*coV=WMI56dcCq{6MPpHbf0rktxJt==Kkkb?@DCfT%M@B_d(_<qb%gE^rN+h z`$T`;$EkGH??VrFOg^TTnjRedIw|>rGu=jGvejmLMe;Tep7m_f!%)G`lkd9t`sTY9 zK!Soh=Xg1EaP#J%hZv?aUkKWU7(s~h>+DO0&W_?|m?Grlp6lz8I`iY{I6f5IDP!Fc zL>GPqU=&tQOe${pfUzxNe8el)hbPt}LQ&_Kj_$Ksa*VZ*nFP!$c>U-Smp9&nhD+B5 ztUKFD$5!8EL?EhtudUN1d{on+F@)ms5{xEJ1y8!I>st*>{oS7qrY&E$pF6MQV_#yi zW4P|JwaaH<8EvthS36gLA$pb`b#YnR&wbqF@^#`A4`+>lf$6}U!5TnsoS2~z6Q}$7 zaq`m8Nq)0?J)9x;Ja)}oc}E3D=zSJYjU}hQzIHSbtK8o_h0$Ka`d=Lp<$NRAUg#jC zy~Ul~ay4`6{9V?FhFQ=yUbloXgM^4EUguYG7}Y4qx6<>7f^f!AJKKKZMZKBB{;jk> zHv}Rk6w|vF;RwoOKMtmU8b5xOUDpFtFdBKEx@jv|W5BiBxU!p(&e$jf&N<SrHL~$y z@8yavW4I#h6|paq6cN|?O=uownS;@pA>|e6!{2;~kTKeidhX}&a%c;u=8{IMGk?yA zF|;4@rA~@*NX~(a994FYLp9>$8@8Y!KHcg?Wf8t~p6zInhn3FOYhlIKk}K%z^5pcT z(>{HdzlzP1cr6_kHFg{)3pRSn&ZvJ>cQPPf+gZ7Pazo7Z@;TD(VPoIwL%VvzEk3ww zi2sD1KjNBk`qQ7*??&VX!hbwA#`6KgttGjwm-Msi-1^@P#cDR@?Pwl;`i7H*h*>a^ zfYOf=7PqSR(Xmf#wj`%2v~wI-q5657$9bp<&NhXdzHjb9h#EZSQc={A<EFuJ+A=OK z?%7osp{31dZs}bSy%FF2T`tPX7}I-I4y9%T^jUS$&!0Yzzu&w|Qxc3YSgXCfaKfg7 z%Y?cqk|FeFfx+XPRwJ?cGpCF6pFc-A?d#mz820arzI_o1Il=MWqkob=K1=h6O8EAv zxW60<F-pE_y9&&DT#D;Y?<w*5_>1aSDYbF*NSIm<7^i}p-<AOt6YsN6>~zS6w|LqX zqs}j6GxBiC9JX*wM6BSauNcZsE3Qwx!1U9*D0|vpta1}YS&=Wt$&BC8Pc@O<ZXS@E z^KH8^r82~Fv+%ee)BWAjF3aS*G!;|nkKTLbb$)UikX|78^Y0+A*F1>vy5@?xXPc&O zmgsZ}l=x*-$RQT^29;XZ?I-kT&yB4T(nx0>iv79k2@6n@w_@vi|I$nCuW-dvje2&w zUJ-m8{zLpcl^8q=u7RnW@(b&`XcCQYbyinDybS~tDQUYUgpN{uOTzGLOxs?`x>a7S zTXKcygExbiTMdNjld&E9quy^}ee|@@fmVhGIP&SC&yo6&g1%wPuS=%Z(33WW$BkYU z_9TcN*_=|y<^1Ecf(exKnLz#Qd9zwX#+uCYKDs}yMrj;RRL!J6?)vc^11QgnA%3a6 zU!SCS=a=$kmNSQgmj*JaI-7pPux#fjwJdaXuEu{Y*g+5t%`F_eq!Pl1;$>1)qnpQ_ zY86t2(pK>2cwzbaVr$2@*SI!O5<01+BqpV|hBv>C?gT}mFkM@Pz|#=UzDrkm9LAXl zLI-;Wa0RW{dW||nQy3<?7wqv##a~5I-g!gaUVJ`jk$&vPa^lSHqgG<lCqsQ#Wlw8M z-aF&Kvt(M@oh~gWE^P?y1g)9;6=Sn`Q|!F?rnq;;^Ux2{uf@v`ZdV0>-A_gSDOs5l zjGt0oX;gf0#cBXF&PT-9cBKk&e@tEGa?S~My+k#Cp-E3vV%rA)ZVDEh+lMThF*GGC zOn$O=wJ#JL)RWVICN?sfw3r-GtXfuP0ppjsNEv(oj!JLoQ`8pcT~k2+2(5Dk53h09 z$@;Ph?B$nYYt$1Op5z26P8DhZt=5!5g+Qn$drRD77T>1rvXxt_56oxVZSOHt^mU1F za?RGu<>=Q!?qic4V}kdYgf_yz*q<z}cs`I}btraY>vhJh2=NNeprd@5A^cc8w~0)5 zbu=a^udDt(g-Lz2pxUR9=s+9grYpIek@|s@e15?zxmWt@n;68cT62QlcZ#cti~M_w zDqnZ8aXTeo)xh(@_l0>jpT4!EF#Vn~v&G83*Izu3`F*-^aI#rOoh*LJC9-K^G>toN zpx#}NhtnQJsz&zS`n0pVb#W<cNDTr>bnK3ONg{kM981^jzjT38^XSScj(htX%Tv3Q zk#iohwElri7cXCH!LttHxd-v13T9U?nvmwk*SM}PUD$Dc|E`s_+xNyfjt%wCA2;kg ztk1sNJK~Lb;dg@$W9)NWOcwtmC?V2?A(6<;aIe+%VZJ3E_n3{1jS_cBNlBaFQ`1v_ ztSu)7<JmE&W~;SSarpl5@Ge|G!Q1Wj&9kW^^qicI;)d6ln3#-FLnpo8*Z?mA`;L9E zIc4Rnd!Ei;=Q=<2{3PGWCB~$u=fz^iTJD~>9mNB<X30bZ`%cin5rLDj%$MIxWE988 z8?Xy25nq9vEk56`Xb{<v3?6T6qPL|s5Op1uM#iQNJWOrid?RShboT5+_E_;NJFXp_ z^EW&bSgWNPu1h<{^6Zeb!}u}B{o<=7x`sWCXe8gUZ(Ho_MnAr0uFJq>a{Kni%qy=+ z`ooy~6Bu*{&CFZJu5?d98>XJzLro6-gPqpzWA2^$OBm@T0ipAdEgvl49%{!FLEZJH zia+y>S*vQ#hqoA#zZz?vD#YF6lDS{e4M*T7U1}hPb(r~5tW*LFA(L$?$Sgt`7-IIg z8PUKcR-rDBOgQ_l-$sUqBYvT)DLuwQm$$wLHB_rne+hbqY`1@}d3WrhV1=nXy;z3% zTd(V*8PPJMlec*5({C(8oP<wAt_!q%-Yw`>iq@fi7jWF3FWSd0C`)roVbkT5A(hIJ ze~0rT^neCAU(h)dq5eJki@12WkcTMJccvn<AV~Y-;AktfuFfL2G=>?|mRDqUr$qlk zZ#I=JM-v8K<B|mhR}dE9hW%oQfxNBmuo5}xPg+LSY2Ga8kPX=$@!k8ED%it!Oww@0 zZgrVPl;$@}Ha6ltUT_8}-lWpNBO(gT!@gOJUAUHq0<@1e9sk`w7~L#c(XHRRu`K+# z$IE8EEQ|zNhS_9CUH`a+k~pgaJ^9jzlJBC)=GC#1Rl}41KO>L7V^x_e-*sx|i>K3{ zI`x7P&?z(XzLczU0c(BQr%i@@>zpeIzUF6p^MI<|kZQKVa--()Tj9O*+MG}y4WOGz zF|c!~h76?c4z0eisLArhD-Z6zzq9bM<AGyuKzqv=ie{%RT6q~&>gQ<|Flg8`<)t61 zqC4Y?l5#ynwiBR$@0`!oSUge@t>m@(j7y@@m%Z3;GRsS|rod}q&jV#Wc4x=rYuVXi zozLC<{q(kas;}&CMtYx{nza6<!j<L1VexgZlb&X5KYA_8AGu)d@??7Z**VY7YcIrd zYSGDgLzXSZFqprR1+Cb{KT;lz=p>Qyp1gF+wnz#e>Ifh)y6_uWtcsk`esMfEqW7Zh zqgge#u+L(p>m>maY(;H`{b=PNDl8=9jttwogjKKntmuDlHCY(K)RvN1dWI#8ez@H& z?F;cmxylwkRN2}zHM|eesd?@>^Ds#hV*hoMK%T&6Am~xL6fx&94T}P{#E$**r4U0} z1YH8L{x>O_zEBF{Ud-Ry5n%fVkM5SG5?D-u>r)!RNm(Skamy)tpZozRqDO7lFzQjW zHBKS-y`{(Xc{HAb-!P;a0=N#j4hg)2PUo&nxt#tlDbcVk9r=;5<)7U}6y)oU{n2~2 zBGWarL6}6YT`?33bjipn8h{6y5@0NUCSJINOvLjc`BdkKpVq*J^}HU5ut2C^DiN;r z>-LN&cQ|LeaZAo6=0~U6anB3Z1FVXj>NNFu)rL^#8s1cj5^`A%zRSHh+8gn>Dc~!M zMoDQYA7`&l61R56lj7|=8oxAlxwTLIVm*8<w4CkYpIX~Ep(H>5*eoK-&OQ4$5<gcO z^YTuLSfJ@P&Vl$0qIi8sG=Of3XpjR18@}`%)l!@?w75jK`{3-kbHD?>5Ld5Wz2VTv z|8M>Or~XJVs%dE{wI>QZd-~Lxy3(?EKqKK1>zv|RCP4y-UEdHt-9$l-^f&GUu`Q7L z+MX@%H==S4GxmF}SJTN)Sj~6CcSwK}$*3GNdLwc{@!R3i_=EGS05@`Pj{h-ZRUxAO z<~r|1i5IfWTK7bED`HC}rwnHt5FAl)+5<R|LQx@!zDBL9*%_sT`SQ+mA{<^L=&E3{ zE%ckjPZ<76iP!sLo0{3aw@?#K@Q>xOu~2B3_f@~@XYPFV;#HCJfWJjCCch4>m1_TV z-vAM3F)(1na#qMhM~kk9Kh@vDBRhX|5wLEsl>wN8OXw?u<iEx9pXB;EuDUq>`g;D^ zcU!m2Ui-heUz7^&9gE6Z$*(ICUnPSBYt%4jL62W2Ot@ye)-}9Vu-joUlaQ5M+*g8x z;9NNoe!Qu$>QRp0rlND96xvkj_xXw&s2Z5N^UyVSf_~`W)zc-ekq)M?(?ts+wE9_n zBp5#k=Hd!4AY0~nkbx1^vH2T4hh5HBBTU6s^X1CecsbqNCKmSMeSMvJ&bMq14Wh)w za|6u^PC2oeM+MhZUab7Y*cW^DFQ*2CBY*!>Js0LMSJ*9`N3HREG6wnB2mSq{Pxq(? zVJf0$?Lqnp#(Z}xM)F1W$_D0e^$#^aA)hcm4*evrz<c{~Q`42{Grb=N+(GT%HAssm zHNSVyU7x)xIOU11qn652qWYA!2HB%&xKg%}N^wDZQS3xq>{9fZaO?hT`;FPGCHmW7 zLAsB$zsPOl1SIo?ITOdCj?fH{j`!RE2omG+&@87f&)J8;Jt1SHh~QE)(q`Eo>=bHv z3O;CiY*n9JLQtBuetEyDkmjuBKwe+^fEdUyIK@8DlC-3YkO?<GCG(Ntep&zZ_i5r| zEjxzh6WY*N#@6-g8QBe+o?7fV55~hy8Wzkuc8OAM7~Y$`=jPOIP6aDsScU#hp8TZS ze+IXTshzaDi$qiGMGu#`bphGEV!a&2is=4{D~YHgQL~Zi$gGRWqto{~YgdGJfh`qa z$Tr+pNch)J2#1k7zNgWR;R0hp_xdf0ZzeULFi_N)ji!trZ=<tpt~9qrmbivm8l6iw zSFW1S;{3(-{hbrd^`J~ESGL!W(7<U}SfFRtZkJ~awIcQX#rZ;DsZQB8##9kREgk9j z*gEWJtEJekAtJ=7hCBezDcvjxtws=h-*44@PKi346RT1{IoGgBU#@=W35^Ekrd_6e z+4&8>V)~0!%rT3gL%ZAS$}=Kfpa0He{D%;Ki`1o0*3?d&-F-}mZ>pjS&;kDuvB59e zp(9sbc-*LwQMu7zO@1;})FjPSk{aIaADI8nIrUT_2A{oJ?Y1s7Kk@|@Sm|su?S`BS zJX>8k_s6xQZzn`nNsSAV?U%0?gzQGY?57A6ruw{6K=q1kyyWy?#b?{vI&0g^llupz z;14r6-J)Cw$YQBQ&(-R?6n!(?+j?ZTR^pPg3zLTSF1w`kJK1|`OI22iE98L<`{^vu zIn}Zz`8(W_0Wng?My4t!y(<e_@B*f#%n#T`jn2yy#hz`==wZ;toEhJBO&afHvTFV| zM1ulxI(7S<*~<QUjDl-I`{1S(xz{Q0J4a<(L>nfM^2jJ&%wBIuHtE*%yaBBk&l06- z*e7_eF#-6f8|qspI3Hl|=d&@nZR1(#@L{Z!9yFR7`PRqb^V=NRcdgQ#DSq>@_0+O= zPr1n_UTxkR(G>DoWLOa3Zw_Nm-f+PQ&T*ZNp5%)U6%X!-__zE2PYNV6g#HFhxlq6* zmF1;OF?4#iBG!Eg@HY_I>LRfov$NrAcD_WB!-kHs3$oRaAs~qZIEoy-ib_=_Rqy*1 zBt_@Z^d}DK+9uV4su-?sSNL95()<76lKLpdDfYyKxFLS!*WM04-*Kv<TnIdxYL<m5 z;EwN<_2IFqiH&j2hRAl8BzX9<Mq7g)Qf0L}u;gRE>HGH%q#N6>zTDML9ctwu<Sh)P zh9A*;*6+gx5j1;fU$B1Rt&a}v5<v?&^Z}e%zPh{NzF9mgTPgslw-&C?*yq+TUvJJ# z*S_~0I#^X{v<Azu=~elUMf|rw(;uaPLv<6@Wb3OTuq@Kcm5GP8ttHzJ^UJnX^kP!Z zBdKP|$EOO2-xOPD66uTpi2|aC#0*E#(cMhy?5O$Jm|#^*77}J7me`pZF8asH5pVA= zyBo5ykmUP}+vui}IJ}9N)!r%o4Qny@y*njGAMF3y81FA{B!7fEQ&c(7<;1(`*qUo{ z7CG52)371xF!%3w9h5)2dbnO!)uu%sgX<eH>PBe5M%^6oTAUyc^Z*<rI{Ee^6LgmY zWVOd}&AG6<T$k<1Y8lGb!#yFJm8qk(Oz!n7Llu3~)BLhh@pONT^JY5zWY50`VN^F8 z`_7U!t+`58K=ZzqI;OY+MVc0J0Lhri`FjM^6QEa()VKG;@THCvwO3=)i6(fRb!PRH z8b7IgjYjnGKekb}^C79vln*p%7s4K@$<If*EPy?9Dsl@J%mxkpVYA>~_pVfu0c)V? zkjs27S<gtO$%#&@1&4y=Z`~j{m=X{@PO;I;{}JoI?^voeiiTA+3ixS7&7brAahfUj z7-gETN{u$1KB2P|Lm*YlvgAFn7|Alb<C%Mk1albbP!+Z=Lty4rOU_r1x-oSm!GD8o z?n#QFnsu(?tH;bM7m?9lqyF4#UAjd>IXwFWB8$Ua?1Vd5YIj<S<*)+cTQ)QAmU?`| zt0auK21uZj4cc_`+$ZCS0lgXizk|+4A=&OQY1K~57bpMlLi8sovd_)EmgG$xB`d7w zK*<I;zEto6G+ukVAjpCpXU4qX;2H1=GtiN04;{#hDQJh}mCi-X{Xe?iDk`pS3ENF@ z0zrdYg1ZKHhY&2dy9IY`2o_v|2X}|YoyOhWwQ;w`8aeFm{9DEu|GDdnb<tz3IcL?Z z_o=slZ%;y5|1W9Pzk|qU|F=VOIah1`^n2RdKGgi#;CNNLkS5f^oN84O*0qITg_!?b zzoy@?qSju+`!<OEaPj|=F8}w{i(nT=uNOmPGg7Nv^b1<_i_G=(cJs&)5Yt3hThoSk z>(#ifbGB2=yw~N0Aw&DLb)6-Hok;n!MMlA-5gkO#tzLxDVi4|1v^CMSS+~P!vggMn z!Iu05yP|HJ<+)@|5A%AI5~mw;!FJ2F+M0?VCAbqke1hEc@}=)_cRUXkxGRP``A4kF z<Whm*&#?segaW1qOKkrq*C4inOGOoc*U<O-=*y8iW5f%2Ih<=n7x-q^9Q_S-?Y3Ao zyW?IfW_A)3LZzz^4kxo2i&bSEX|DBgl(DSs*`a0$5Re#H|Ir*BmnNmX-y1>N`m=&# zoqW-)?BZ!@Ioa@nzP&wJ>4~DObO?2na(Y%2iMO+Ovs6wcFDV}Ky+_uii$^0EhEa@K zKsnSv=L@^T#>pX1o-@qvlUD?d@kL!7lHe$v<vW*Er)9&sZwNJ97Tdu^>%F9nCq8)> z7b}X{(w;0!9($vh9!>zUW~$V`g)?@&wi?kAhq8JO+X?(@F&wFZmP*yej>{BLQ@qrO zEEzC1rB`k9+n$;O`%;vO5x{FWT?a9_lk__*Ap`rT(@;v8uK)n-#q0u$k%Wq{@BPA8 z-N)`y5tr%>=t%_rrq=I>-};feYMC9DXx)0{#T^J{(SBJF#qS5}y@VoL%NlH^N3YF9 zsO|q*0%+DSW79f$o<Fb?C<jQ)uWz=6J0iLUrQkK6)ZQ~|XMXB>YP-K)(nr16-)t)) zL~Is{?4n4%pTh1lbCkQBMIjZ)^loyDd`G1Bb}c)K{56kV-(Ni9^{$lo=c_@H7fo6; zo-AP$4@5+?IHe{vme1wqUi}!I8kcP&OhRAPii_UCSDd`@l*n}^hV{{ZC!)W_(4U52 z9WNimCkNSNz9e-#5aXUkIhKDk7eEPw6{{+Odn*nMLh^G9^8aQ&GQz=H2(kBI1uTHv z2fpA0OgtYmK3(oqBCOA_+Ae!~Jf+Hd*af4AF0>K?1+I9sb1{a*{UYR~xkbM@omLpH z-YuUyN*6U=EY#8%?SX}jPh4L)`^U?%{im@Y+823)qB7-k*HzIIAB&n1YuE0R5goOF z9toMNSg;vE(pt}tcS{pn2Nf)a)2=N1A&y}1>hzmi)onDEwa%_`Zl-XvoxKepF#EUP zLN4o`Wd{Pku5&FFoCWCN)nVf}!atp}n}*(?&2i^D#lLfG5m<61UGF=bkW{hsw-MH) zcuS{1P8*a6U0iDTb|J<-IcGtqm_5m#0}{IPoal6y1tDI;Cs}XnAL$FmH;Y;AJe5*7 zW3vUZ>ha?`&}JD2o2Ix^YSWwWd<uFy=YI;Dag!~R$}T${$R=T=*ZUISzEly&NAu!R zc-0RegP|rp#9Bo<b%@prF9G*Io~2a7r|;Dd<_dUYJ5Y%3q?q3kNBuHvCd@J^ZTuX! zMasSrXXL(li_E0d;z&K-vY)3-5(1pTxp#Q9y1(d-FD;)Z@p|@y6?53)YrEO+0MALb zI<4ZQd0PVr{|NNfxc$8}?t%6Z7S#QyM#@<{jXV$@<<;+D~@8y7TNe5josl>|b_v zhoh6_zP)J7GPuV%^DM>FtPoc}yT$zj)!Sr+{uI(nb+zwzm?=lEMC&)IpbvLY{ye#T z>cK(u7ynQqvZ5Cf+jX-hpIHx=!|j1bh&QpG8(-){bo7_VDMIJ327y-}rFfmHPaw&r zXW{NU=dkKXFaKeT9C|VELxfT`?-GFC6#|#|pFFw1?@uahDmAFcn0=Q+@_w{yHg-JT zvFB8xZ|Ictn#b7CY~irsclVw?>$Su5b-kqqZ=6;ksMu9T5J!zG*g$U{V*Ydfujh>P zuK3&%z*;-H^esst9l|W}t6HRwR$-*ksls1guZ(J`5dM{z#oUeS30}GyL$q9j(7VVo zimTNTpzPVrpQ-chM2?hmZL~iNxi#UwCj=Wsb{iU?rY6=OhO(s`UuXX*dN*@PkSSr& z77aR}RR-QNBHIvbod<F6cIOmW5LE`&P|2pV;h%1V?eC6V3iuJ3-b;pF5cjsG#I#b) zNfWk!mHjksZU@B23MGz`wrE!OmdKL{{<K%?J3b7_e7Xb|c%S`|32TYCs&iS~^|-v< zFc#Ur5ivk)0GDx-4UEMAG|#|7@!|7Bwy{4qk~Klyevl<;xfDH*r-Yfy)%8w|-}>GM zVr{pv;iMQNs%LFbgU-ZwgxnHNM=e*ueH>kn^N7;YX-o`P`oHuz-Ti;mB4Pkf#BDPy zog8$H;Em)M)SIx=8c6TrH{)9ayR<ObT9(csjSWiUi`v9TM-}|%302hC{mtZU)thq- z`t)bo#iS5)yBni9Azs9C3IvrR?%(e7q&|Ps{ZYoRDR|W@6li;slW{hWnf$L?o|j~K z06$Tu(`c9GVgSOsCJnt)I_yoyC`cqU2=SQ;qRAQF7pJ#-_<n_o>Wfh2RFzQRi}o-3 zq@?zKQ#guq#lC|rAy0(o!IeE}vA9SE#j%pBjTFOuqgsyF-%IXj{phc4NZg7WjHfWt z*Vt!$X))hBSrqld7|e)Z{jQapPRBQlwyR8HGi@@67ys}gHX67nCIZXg`MIA!*q1jn zcey=<7Ho&5$s=CFoq8;<ctv%(VH=8VAc6Twxz~VJmh{kDe{AK)$4_?#H`0s_&+Zf$ zpqbrx2UQznke55MlmhARc$VV`?vVyFC9=#m==9gGG4c{ByX((Cd^pbqhI+}_xKLOO zoXIm6{q!`mXfy_o`Bop=D!E_i%VGx1d$Y6iDOq_;x1!`|)c6)E!h_tJuA7$*go|q- z+(sKo@b}QZjvlD@?x<^*gH_Q+Gf}O}UXruCL7*9Sk}&6yeN4LWP~ybIm6!Q{;*m_J zR5ro#=BJM9JNd+8Qkx!FX1l3rFY3)_WW?(G5wX>(8b?o-Lz3;w`5m$HXKJ!!7Q9xZ zQuoM9W8<P9rj&4%D-HHc{Y>^$2?k}Q{fhcnuoK(Q9(>ijnS}bGh5D|3N{l*Rdo^{w z3OM-^_fz5Iim-UxCTv3%ls%yc$$%2;;?|;GLy-ZjV|{Z2bv9C84zzO|RsEgMBR*oJ z6psVo^)FPG8?;pgL8%LZ_I==$E9(<{0gvB^H14!X{2H7N!VNapM*WTYZ8a6!q?D#K z<!`AhPc9PAVOUq)z|k+|>YF1Y?o$c~I-UxH)Yen(4>Ht36$k7ZLEuyUSftgm%Q~GK z?aFV+(aeG=Di7eRHdW~0st?lgpcrr)hRH?Mj%2}>9HAjneEb#ERkJGN&_BH57x$#A z8$cCVTpacyQI^h#r4=qM0k2qt)a591OPK%wNTmxzP2#eVUs<Mw$A2c2@Lt`t#={6u zWA!un-mjE?gkD~9vP~8_;WLokK?Rqb+X)sgzemNben@90n;V_`0yT*~S%S-KN4YHR z;X>^rZ({O%)JDbq;&E3Re1C8)xrnnu2xe}EO)feV%<8_$mngpL=uY1!?Z%<06A62= zcAVyHGU&|*3i+ZwCx$M%)3$`&|7f}eJAGNCJEBqq_^;4JVCYtnX8C=^J4X8|-7&<y z8Bqjuae5m|fisX5Nj;WoIQYO~*sn(Mr_KH&F7s&bt>A;2I*~UwC;-^t9Xo5%#F>>% z!mr+&GovgrV?t=6)Iolt`6JXd%_Me_8reed<5w0u`Q4si>MN^9tuY5kaDioA$2;rf z`zjU&sZfMUW*yySxMY2_d>Wk1{g{YLuwu3PYJ>rOA`nv6qi3)M_K2OI583NU+pOb| zQ*NRrJDwl-Tqq0EzrICBb{#66YV>sRqjw+2=yaiAP%)yO8Li9^$&vI-j~>RMy!YX> zATc$Ah5V<N4IBGDQ~gQu3z&?@&&Pn$9N4dsHPJVGT3|V6&z|YC`}^Ce7>*ABYG`Qf z$y7w>RNaQ#3Xu_as-3N=!2Gqo&=G0@6vjD?ua)ctkY$;jC4v;XX2_m!4tFOsiZkht z3Zu_y{7~k%I{duk;JhD{qvC1QRlPn`3-c3cE&1CMBz!V8S*TpQT8y@Bt*v_frK{U| zsf^i^F_8%vT&|YiwrhMG9JUWCl;<e5t2KUp812j!J=AQ!aAsVO4J<sB-t79Ts41L( z5S}x_Cf(g^4($4{Gt!}BfioL|C-6TT`J=y94WmUpcj)r*P?xX-s+;o(rZV<A{&#$( z2chF!BYjhk-4=H}!>&=BBI?Zm(qPL3jbFeQyg)T5c&bH@IP*E`0m`HQ)oQ0}QZ&p1 zup>&jk7Mlr#MO5TTkZ6Uk1s#(OV&X0&TY>tR*n4b<8~GnFmdZwOc|)0nhk%o8mVjn zdilKW@zs_zBxHg=v=UQS1wxb*x*t6u4fXiD@PS3>nX@Z(!H;>6siQxWkB-#Bg;wHh z+_<fp5#ic5N*c=bW^5h$J?Nj}GY`g_p8oeI_nSM)T+W+jp=R||^!za%45LviwEUp` zfIn(w?6sM5l<xE0?@f-o)hLM{D|b(u7*3Dk1OUbExY}8F<MjQ_K_n@H7R@`S_VZyp zb`BQR=UwjCTzs<;bO+UBc-thNV7q7y2Z2ZElji9kTXKQNkFx7^yFSxcE}3U5U4<LB zcbj;tJI|OpY)E8bJn6K#PAr%JVUZ7Z;{0+-46$mR?uKl8UTp{ahrzX`bC>bEPA-#O z>ZKP&5K$dWqsGzK+@qMRuu$lZp2fF~zWc|^2#2+69AR?Td8>jHwFa-oA0kBo7EJ6K zc0E<`id~RE7&LHYn?C!)z15k`-#h^#vtl=(&iSXVnujz!|A-K7ye+Ty%*5`ln=1C0 zm}Jmxsz`!c9o?B-12qj+K8Xm*=w&j_YF9otMz0SvdXPxW3gZH&&L*NP-$u;%!n&U9 zIxI%_5o%TrP3Qsjr|q8Fh^j?xWZg*YEW6)ZdU2B-0A>)a4y5d9TiYYH)|BkUv#14s z)*|w;SCBM*A}+p^6`dtxk3|PrH)xley9XXyg|$4SSBvC0m*wH2%QYQ~5#S-b{wgM9 z*5#Xiuj`C@9{USTKEgEEi~aX){N?V+K&?u9O{RAH-Z#fXXw>Ao_LS}=A*w5>7q^gq zBl|?3*>nF^A;_;cuVz?HFr;XNv^CgzgVt|6tK*e<$4x6h%el6I%yVey!yI?VE0Na? zKDqGWfpfjFMn=eyD`C@UL$~JZA;1ZJm{@hyo0<4?y2kcV&VJ$miStIQht062?quU6 zp^4=2Ca>QRFAqoq=8ApaSaj6lp7Q#0<)LtkPZ`qrZw-ej0$`_s4?IX8;@w-}hp58x zRU>m?h%oFz$O|rKVt>tJ=g7I9AyxN^9t6s<PDB?np5vE4<P&h(HvOKQ*m>0CTxb(N z{j8b3UV!wvACQygDLLLu4HUH|lsRVquy4S)Er9;t;znp_C$m5}u>jMCUmaQ5ZsjiQ z3a+6WncnRQOTSLXaAu3G+(pO@`4b>!)tRy%d@~PEyXdK;exkjB(^H#;OD^qu;J#<> z`jM1py_uR+Q2Uc%zV6+TTHQ~Ujb7@`TgU_c9Y{OAOd|Tj(kAe{q)*CUQppMy>vHTM zmwtu2>5xGon3k!#XQFQl$C}E4?o6<eZQN>WAR)o{NpQjUobp928h@3)N#-_&wi8E@ zGmf{|I~XgHEG^OxatYpc38N6;qb%WlH<FyV{W3>iL`}C5&KMhZ^-qy3`K_cRZN||U zp_KEcW}(kV9opX^t6AJd<?CK*2*#;%-l)YZqhD7gkF_{>)>cGU%sAMdLIejg0?%r8 zmCqXL7nM_gkDsPd%&&aN8-R3;HZw3ZL;0da?o@@H)S3FdnC8{598_rOlK1K^jtkXr z$P_Wnha|-dAyVz{U$0%>_UIL;nE3hBA<_#wnXDKpVOrc=Gp$MTSCcAc5Zzz}RjUuV ze4Vk3<upWFmR79VVt@wcO_cxhEMYNL%^$+t;V{tb@iOmx(KXCJDcbDCwZ#HZWLhDr z7yI;msMza$0Y&o7Ipr03mD#2D`!AYmgPQAqJ1|WOT_hI#4?DfCXB^gQoCsyp7d1Iw z71>VdwQ`B}+7_$m<b1RT!?iqbDX;=Z`ZY9zDxmb5jIX5R2;Nf)>hrnZQKSD{8YYL9 zC1L1#>Vq;bEej>)7o}3J;(9R+s7Pt*kkX@m9*12~NEm?fWwwcX8x2%-S4l9wD9M&E zY47zU<5DnK0S1Q{aldHV3zL_1%%R6Fy=Vsupi^zXw%;=`KkkR|oQ6kS7C*^sES4!I zCf;?fa?=MXpZ}hya_uF%d>UmtSZi1Fj2UG3jpdm4HW><NJ9lpq(=B*Dg7Sq6jf$#I z#%fJJ@?qW$-wt}@(#LZQQChTNeeu!ouCrnWTKGw)KS6~&u7|RQd+u8cv<Hn%7?|%z z7)IFbe8_pTRuB(|`O?1KniO1uQ_sgXJ{vnI-VktL+;<DrZ0;(VRHE&twjsPZ^Y3yn zpIUvKkLN(2D68Q7pSG-Daxf@6XlBjaRjkErVeT=Zy+<ph@4M<(Ny)F>n-QB1P+1g+ zoG|=eSxLbm{e!OdbV54nj*feOaN2eFsW*3>pATkoRV%$K_$5U^-_=1EGLKaf%jtnU z16Tp#F7#@r#*yCeJ#+E~^H&K!$kg$5#75UQao83Eg`{Oqufn156fOnj!h#5=ZNW7l zs`q{%k;*j_A6mM^#9{esrjC2|F{6gn8wKmrzM!y6O}0X~GIy9PW(Zg~?R12fKG@>T zYj+cg`mKJQ@$*xu?wWW#XXEe5>hC(PCeq8}&-~x>|CDV3MVqWj0j{OXDW2SHCqggx zzWA#Z1XqoWy^(i&#%Jk&J<dvEs@N1k%j*@wkJO=-=ER4GM=I)MzH1ow;Z@2w5SvX6 zbu~?hZ27g3Et8R&8q%n`vXC0ufu+!ce0{3$ZYC_$tVlasWut2x7Smd`5{uW`_i1lx zMB<*ltCUJOM*<Ewl9i%PSB&*Hwc%9l1t<Gk;t$Iy+VNEHOaD%I|H_Gp4+&|7+U&Jl zi1HLsDzWtiN2OLF2Nb_uK3TtaLZ5x|tnS8xe_<U8IZ2F;15lCMsS65t;#kc31AL36 zK{oFi?At@Dt;4IY4MQCX0Ft=Uy?dqNe=L>)`)dk<v9ho4f?i>X&IBT%SHdYB(hY_9 zj-@`VasIW6hm;yE5tqZ|&%5mgudBKO&d2s_#ZhD<LaD*hb|85B@;@lUNM8jXo_hFT zt~@;tzP*io)T~e)93D;#u~~@CiZIZ44dN_IGHLgLjGwYWb~?Fnv6j*McS?$k9K7qh zbsBPbjKWtiFrm$YSri|1P1j&P16egrrHn{&@LR(4NX9umKfdsQ6`LL^X;|&$NuT7S z>(xD431|TSP0T)vd`5Y-fc|Mxd)eLHAa|A<s%?IEjXszZsAp^n<=srr+bu2qOvX}K z*;L%V8wn@C-GCIRa$W7BMn~#95XkK|ROo=_W$C~AdREfa9V+u!`gNctqASpj<-=~K zv^^l1ikn}{lk|k;7Q8@mRk31A`e2*b>3Y>N2akXM9X0cn?tNN>@l;tJB6pYv$gs4Y zzF-<d^PjVs2BvVm`1(!vZ(Je2tZ%G{s_}-;O>LLvGotaEDZF|UEI8{7A3}e>-G@6G zdF&M>Ikci$T=b%mvgj-s8T5DE8;4`w`srms_>zgP{a25K7BDEBW=`^K3hEH%SV-WE z1Yx56-J7>c{h^=K9e?%E40gNEB@ePR_|?;wuFTp$O~T82cGp*xFWdbY%O+7V7O~;D zTt4v!r2Z<!u4s7Snymb0?v5D{)BT8Z7VPXdW9>K+gu4hG>)}yUcguth7Ttq`h)k_R zk}H4@WzRw#Yrdq^^+K5F`j0h`Ktr$3`)dv#xrA=v_Fn5$e9<rtSS|CPUK1<(o0NZ^ zG~Z7x^UsT>3VgnZGO>3B<FlpLWatcO#DCKm)Ysh-esKF4lQIk@{;Hn{SbP!R>>j9& zvKoa95ikbWkH2s8HHi!~wCP2j)1Y)5eX)HANUV{r()B2Wa6cwG1!%9?@ONi~T$K0u ztwRY+m`|gQ$v}whJCIhR`I~T@?JL+ISnr}R5drjPsWnZ~=kc=cC#|{+qIHA25pz5d zZQVZS14SZJ+k)IzeGex$9h<bh@=gez9@xS0)B#6dC^tN^UNXqXwX4<@tv}PtLMt8h z={awLEoa5CMoq$MY1s3jHV1wl3ml^^Nz1U`KQN#FD5>?)mefL?Pb$1wv%`U@ZE1_( zs3E6c_n&3#b^Ah2M)(q-$X(xeb%;%&y;ZT_lkjhKbaRk8mQJGxMF7kyR>5^`mrRDJ zF=9t=0B-$qGg^utNst<v);}`55ky{YuvgY}mbj5lu&9lTgR`@hVnGj5^E@9Mgdz(k zAw9CQJWyRM4HR4Z3eVe?`mAZL7oFD3Q$(oDR(Q+=!Z$ru<kwi62o{BJ9$uL#ozV5Y z0`{;k^++z~(RZV)RKkVx2j>YZ8}h3NuY|Ea`%^@UuvRE9L2fbJ$e`a0PLFZ*@?Y%0 zslG<4=ri@VSJXUf5o?9RZfWtrTjX8f%96^&I<Xwj_hVi(8a$?+nmO;-)n=OCcWSx7 zr_b@=qcPaQWg=rpemi!EQ*0xjCt1Scm3|T<`I%~ZwDJp2T@v?|p>*&kv%A4=R6l0Y zxR2P=&+XNpGO84Ovn%t2C4KAA4z@iJ7d&s$3fn8hwHmZETPl%Yy`p*_Y8EQiVP~%r zT3$zW{kxKHyZV4Wfy^B1{Tf##CsiuGfynLC7ngc@j?nb*#J^}$Bl4L5#m%HvuB~L= z^RThN1^bNOtFmhsU0zJ<XZ;m^P<$|HMv&3MMCVD@`Sx=kl=YylmNnNIYu*dg8{h{D znBYne;o!@PVlk%#KP>o)onJF|(XC-CwLmD^eqtNJQdkF-pueKDt}llAgIA2!v+Vky z<O0%I17j#722Nk1kBKR~7c0Lq&kh%zGh?SkqGa)h!jtu8FWpn3T2hc9+l=(()-aK~ z#2Q)@TWpB>)K(EFkY$Faz3K#!tuuG^uksKBevo?=T7VC)+i4BJB)KdxG8uN;mdst_ zY7<E?Hsi8VG0bBQryFR7TLDrB&ns|s8XX>tcz%h?!F=c=)Gy#XpvhYB9e6Q5CSJu7 z+gy-S<L3>nsa72yme;0#nP1>;@S4N2rwW@0$c}m=vCIihko$JD2Z&fHnP#`Yo!F6N zsIM-a&TU&>PZi9lR^=-)9{>D7|KZW+$?-<U=jtIX<$3u#<A_xNTTxcj6cdNzS+7p@ zc%P(S5d*chjzsx`SHl<D^Zs;u->#tAm~N|nb<A}f;cbn>4(Sc&%lnGHd((Ejyl7zr zhOAcHnGxUnsi+v3oG>;2?P<gMn8PTV4bKn2aqVAdG{e?P>R-JZd~Mqi1Ya&tA@a%x zY|{O_^gvOgN&Ay2+≺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%0D) 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Ík6#$ipkQkxAu2TAe%G(^0-ESV(|q@n?`UaV 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 O>^XS>oM2DB|NKAUGDv;^ literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-go/assets/vim-go.png b/sources_non_forked/vim-go/assets/vim-go.png new file mode 100644 index 0000000000000000000000000000000000000000..cb26e2c073ecba2bf5f97686dc3b8184868ab12f GIT binary patch literal 29252 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 literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-go/assets/vim-go.svg b/sources_non_forked/vim-go/assets/vim-go.svg new file mode 100644 index 00000000..8471db59 --- /dev/null +++ b/sources_non_forked/vim-go/assets/vim-go.svg @@ -0,0 +1,821 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="173.53481mm" + height="147.26407mm" + viewBox="0 0 614.88711 521.80181" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="vim-go.svg" + style="enable-background:new" + inkscape:export-filename="F:\Go\src\github.com\egonelbre\vim-go\assets\vim-go.png" + inkscape:export-xdpi="46.84" + inkscape:export-ydpi="46.84"> + <defs + id="defs4"> + <linearGradient + id="gopher-iris" + osb:paint="solid" + gradientTransform="translate(-9.2596241,38.869516)"> + <stop + style="stop-color:#394455;stop-opacity:1;" + offset="0" + id="stop4317" /> + </linearGradient> + <linearGradient + id="docker-iris" + osb:paint="solid"> + <stop + style="stop-color:#394d54;stop-opacity:1;" + offset="0" + id="stop4311" /> + </linearGradient> + <linearGradient + id="docker-jaw" + osb:paint="solid"> + <stop + style="stop-color:#d4edf1;stop-opacity:1;" + offset="0" + id="stop4305" /> + </linearGradient> + <linearGradient + id="docker-eye" + osb:paint="solid"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4299" /> + </linearGradient> + <linearGradient + id="docker-line" + osb:paint="solid"> + <stop + style="stop-color:#394d54;stop-opacity:1;" + offset="0" + id="stop4293" /> + </linearGradient> + <linearGradient + id="docker-body" + osb:paint="solid"> + <stop + style="stop-color:#24b8eb;stop-opacity:1;" + offset="0" + id="stop4287" /> + </linearGradient> + <linearGradient + id="gopher-limbs" + osb:paint="solid"> + <stop + style="stop-color:#e1d6b9;stop-opacity:1;" + offset="0" + id="stop4269" /> + </linearGradient> + <linearGradient + id="gopher-nose" + osb:paint="solid"> + <stop + style="stop-color:#e1d0cb;stop-opacity:1;" + offset="0" + id="stop4263" /> + </linearGradient> + <linearGradient + id="gopher-body" + osb:paint="solid" + gradientTransform="matrix(-0.18574987,-0.98259706,0.98259706,-0.18574987,-1213.2665,1828.8814)"> + <stop + style="stop-color:#96d6ff;stop-opacity:1;" + offset="0" + id="stop4334" /> + </linearGradient> + <linearGradient + id="linearGradient4253"> + <stop + style="stop-color:#bce8ff;stop-opacity:1;" + offset="0" + id="stop4194" /> + </linearGradient> + <linearGradient + id="linearGradient4182"> + <stop + style="stop-color:#2e3436;stop-opacity:1;" + offset="0" + id="stop4184" /> + </linearGradient> + <linearGradient + id="gopher-eye" + osb:paint="solid" + gradientTransform="translate(381.30424,802.02286)"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4178" /> + </linearGradient> + <linearGradient + id="gopher-lines" + osb:paint="solid" + gradientTransform="matrix(2.0620253,3.9293227,1.3839016,-0.24027903,2506.9621,8572.3972)"> + <stop + style="stop-color:#394655;stop-opacity:1;" + offset="0" + id="stop4166" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-lines" + id="linearGradient4168" + x1="776.14288" + y1="39.505058" + x2="822.42859" + y2="39.505058" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.92105265,0,0,0.92105265,79.548449,262.52483)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-eye" + id="linearGradient4180" + x1="776.14288" + y1="90.770309" + x2="822.42859" + y2="90.770309" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.92105266,0,0,0.92105266,124.54841,215.30684)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-body" + id="linearGradient4336" + x1="-628.69226" + y1="371.77307" + x2="-151.41731" + y2="371.77307" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,-681.83098,347.55492)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-nose" + id="linearGradient4265" + x1="198.05417" + y1="374.50043" + x2="263.28683" + y2="374.50043" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.65610141,0,0,0.65610141,185.97779,480.81383)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-limbs" + id="linearGradient4271" + x1="730.36273" + y1="373.60995" + x2="831.0592" + y2="373.60995" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.90381797,-0.29515654,-0.62039307,-0.90381797,-597.71307,820.3894)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-limbs" + id="linearGradient4273" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.54351115,-0.65417141,-1.0770811,0.54351115,655.01412,667.6722)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-limbs" + id="linearGradient4275" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-0.94401471,-0.3302474,-0.32955964,0.94401471,1151.0861,721.50542)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-limbs" + id="linearGradient4279" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.89463991,0.4064691,0.49110603,-0.89463991,-749.6705,579.40921)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-limbs" + id="linearGradient4281" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.49170605,0.377674,2.0076181,-0.49170605,229.12024,357.65841)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-iris" + id="linearGradient4319" + x1="427.26477" + y1="316.13431" + x2="488.88409" + y2="316.13431" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-1,0,0,1,744.54563,401.01143)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#gopher-iris" + id="linearGradient4321" + gradientTransform="matrix(5.6994379,2.2315229,-1.9072375,4.8711945,4487.6828,1182.8772)" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.76274166" + inkscape:cx="499.78979" + inkscape:cy="92.336365" + inkscape:document-units="px" + inkscape:current-layer="layer11" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="1018" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="true" + inkscape:snap-global="false" + showguides="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0"> + <inkscape:grid + type="xygrid" + id="grid4305" + originx="-15.732723" + originy="-274.01154" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer11" + inkscape:label="background" + style="display:none" + transform="translate(-15.732722,-256.54886)"> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d3e5de;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4347" + width="614.88708" + height="521.80182" + x="15.732722" + y="256.54886" + inkscape:export-filename="vim-go.png" + inkscape:export-xdpi="46.84" + inkscape:export-ydpi="46.84" /> + </g> + <g + inkscape:groupmode="layer" + id="layer6" + inkscape:label="shadow" + transform="translate(-15.732722,-256.54886)"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2e4233;fill-opacity:0.10714285;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 287.3893,695.44531 c -50.0612,-2.78118 -62.1134,11.12305 -91.7793,11.12305 -29.6659,0 -47.28069,-6.48881 -76.01953,-1.85352 -28.738834,4.6353 -40.790093,3.70867 -55.623042,16.6875 -14.832949,12.97883 -21.926707,11.85327 -18.541016,20.39454 1.318705,3.32677 3.956373,1.53579 10.703125,0.83984 115.165183,-11.87969 237.050993,16.53486 337.406243,16.77539 83.20192,0.19942 110.33047,-21.09623 105.22253,-34.76541 -16.86616,-45.13499 -81.24683,-23.67849 -211.36901,-29.20139 z" + id="path4349" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csssssssc" /> + </g> + <g + inkscape:groupmode="layer" + id="layer1" + inkscape:label="cape-back" + style="display:inline" + sodipodi:insensitive="true" + transform="translate(-15.732722,-256.54886)"> + <path + style="fill:#0c7a31;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 260.24444,535.87695 c -20.68496,5.13447 -3.94094,36.63825 -23.78246,45.53288 -18.22356,8.16932 -29.87743,27.29784 -48.21487,37.53094 -24.3143,13.56845 -47.25416,17.93122 -70.94376,35.71927 -11.54022,8.66532 -48.036929,3.46906 -49.132109,17.96915 56.226929,-8.73065 86.269619,15.95087 120.882979,20.57024 30.54605,4.07656 53.64011,2.39756 79.48357,-7.50413 89.71977,-34.37532 52.16171,-111.74704 51.81195,-135.28471 -17.69563,-3.28964 -42.98659,-18.78289 -60.1053,-14.53364 z" + id="path4321" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssscsscs" /> + </g> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="gopher-body" + style="display:inline;opacity:1" + sodipodi:insensitive="true" + transform="translate(-15.732722,-256.54886)"> + <g + style="display:inline;opacity:1" + transform="matrix(-0.34823803,-0.28093567,-0.33018747,0.52325377,856.33627,409.62314)" + id="g4537"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4275);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 419.84023,584.57289 c -1.11092,4.23495 -3.11543,7.14238 -5.84936,9.02308 -2.73394,1.8807 -6.19236,2.76095 -10.13743,3.23943 -3.94504,0.47846 -8.37351,0.59759 -13.05363,0.66122 -4.6801,0.0636 -9.60653,0.0259 -14.5852,-0.15006 -4.97865,-0.17599 -9.67742,-0.66266 -13.94891,-1.44453 -4.27148,-0.78187 -8.12262,-1.83504 -11.28827,-3.15781 -3.16564,-1.32277 -5.63542,-2.92368 -7.07427,-4.89074 -1.43884,-1.96709 -1.83785,-4.30021 -0.94134,-7.07932 0.89648,-2.77911 2.64686,-4.65171 5.05838,-5.71202 2.41152,-1.06032 5.47772,-1.29847 8.97039,-1.04717 3.49268,0.25132 7.40119,0.98198 11.60615,1.60695 4.20496,0.62498 8.71575,1.10136 13.55734,0.95747 4.84159,-0.14387 9.82241,-1.20624 14.59946,-2.18657 4.77703,-0.9803 9.35663,-1.80521 13.2055,-1.76209 3.8489,0.0431 6.93814,0.92314 8.72484,2.84805 1.78673,1.92488 0.0493,13.32997 1.15633,9.09414 z" + id="path4539" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssssssssssssssssc" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 411.66722,570.50504 c -3.64483,-0.3204 -7.91192,0.0353 -12.44327,0.67313 -5.17866,0.72899 -10.69026,1.78243 -16.25596,1.96339 -5.56571,0.181 -10.75654,-0.27799 -15.6406,-0.87383 -4.8841,-0.59575 -9.46828,-1.26261 -13.59381,-1.35067 -4.12552,-0.0881 -7.77812,0.41271 -10.6665,1.77043 -2.88834,1.35772 -5.00621,3.55109 -6.11385,6.60546 -1.10762,3.05438 -0.68341,5.7953 0.96623,8.19507 1.64966,2.39979 4.51594,4.46252 8.19691,6.21125 3.681,1.74874 8.16283,3.1933 13.12136,4.28264 4.95854,1.08935 10.4013,1.79657 16.15733,2.05756 5.756,0.26106 11.2421,0.29972 16.33832,0.21929 5.09618,-0.0804 9.79866,-0.25121 13.94009,-0.87517 1.57579,-0.23741 3.06793,-0.55279 4.47088,-0.96129 2.8331,-0.82603 3.60613,-5.66983 1.06694,-4.35369 -2.35253,1.21937 -5.13009,1.88834 -8.23473,2.27934 -3.78352,0.47652 -8.03435,0.60519 -12.52976,0.67623 -4.49538,0.071 -9.22983,0.0403 -14.01368,-0.12137 -4.78387,-0.16172 -9.29761,-0.62006 -13.39935,-1.36274 -4.10176,-0.74271 -7.79879,-1.74643 -10.8363,-3.01023 -3.03748,-1.2638 -5.40588,-2.79646 -6.78423,-4.6796 -1.37835,-1.88316 -1.75885,-4.11616 -0.89417,-6.78092 0.86467,-2.66475 2.54876,-4.4645 4.86314,-5.48862 2.31437,-1.0241 5.2526,-1.265 8.60072,-1.03925 3.34811,0.22576 7.09649,0.90864 11.13305,1.49473 4.03653,0.5862 8.37113,1.03632 13.02879,0.89877 4.65766,-0.13756 9.45383,-1.14909 14.04535,-2.09377 4.59152,-0.94468 8.9823,-1.75345 12.66755,-1.73592 0.46066,0.002 0.91144,0.0161 1.3482,0.0436 1.1223,0.0708 2.1698,0.20509 3.10067,0.47739 1.0735,0.314 2.95461,-2.6047 -0.11758,-2.94357 -0.49859,-0.055 -1.54942,0.19872 -1.52174,-0.17766 z" + id="path4541" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csscsscssssssssssssssssssssccsssc" /> + </g> + <g + transform="matrix(-0.20408679,0.36109427,0.8060854,0.48598006,286.09208,226.24278)" + id="g4640" + style="display:inline;opacity:1"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 767.29926,387.32674 c 11.1235,7.96555 31.77795,11.29978 44.73159,15.54502 12.95363,4.24526 18.14889,9.35948 22.12936,13.37285 3.98046,4.01338 5.94428,7.14463 4.71807,9.52723 -1.2262,2.38259 -5.54351,3.99405 -14.00119,4.81166 -8.45765,0.81761 -15.90978,0.12055 -23.02358,-1.72572 -7.11381,-1.84628 -13.80694,-4.86649 -21.70559,-8.603 -7.89866,-3.73649 -17.3272,-8.0507 -25.81115,-14.18439 -8.48395,-6.13369 -17.62324,-13.90003 -23.14238,-24.13356 -5.51915,-10.23352 -5.78201,-21.34406 -5.37146,-30.88264 0.41055,-9.53859 1.51092,-17.55377 2.71572,-23.74931 1.20482,-6.19553 2.71509,-10.67437 4.77102,-13.66952 2.05591,-2.99513 4.65165,-4.52673 7.71923,-4.52673 3.06759,0 5.70357,1.83092 7.62535,5.49926 1.9218,3.66832 3.04778,9.24444 3.28639,16.76004 0.23861,7.51561 -0.67126,17.08072 0.34029,27.19831 1.01155,10.1176 3.89485,20.79494 15.01833,28.7605 z" + id="path4642" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4281);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 760.81735,387.61463 c 8.35351,7.22933 23.40419,11.34465 36.92829,14.85447 13.52408,3.50986 21.76315,7.50998 26.41399,11.29491 4.65086,3.78492 7.04347,6.96136 6.89289,9.28045 -0.15059,2.31908 -3.07202,3.85186 -9.99413,4.53735 -6.92209,0.68549 -13.12478,-0.17957 -19.18856,-2.15841 -6.06375,-1.97886 -12.01277,-5.06603 -19.62326,-8.64782 -7.61047,-3.5818 -16.94465,-7.61787 -24.98938,-13.21535 -8.04472,-5.59749 -15.82286,-12.65396 -20.9022,-21.24583 -5.07935,-8.59186 -6.01346,-17.801 -5.99188,-25.91871 0.0216,-8.1177 0.93462,-15.14861 1.86635,-20.66954 0.93173,-5.52092 2.01706,-9.59713 3.38259,-12.30465 1.36554,-2.70753 3.03466,-4.06947 5.01979,-4.01398 1.98511,0.0555 3.57672,1.84704 4.61437,5.2751 1.03765,3.42807 1.44745,8.54444 1.4737,15.15288 0.0262,6.60845 -0.43638,14.76057 0.91317,23.27473 1.34954,8.51418 4.83074,17.27506 13.18427,24.5044 z" + id="path4644" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + </g> + <g + style="display:inline;opacity:1" + id="g4594" + transform="matrix(-0.13664232,-0.29657059,-0.88136995,0.09664282,727.56031,790.52022)"> + <path + sodipodi:nodetypes="sssssssssssssssss" + inkscape:connector-curvature="0" + id="path4588" + d="m 767.29926,387.32674 c 11.1235,7.96555 31.77795,11.29978 44.73159,15.54502 12.95363,4.24526 18.14889,9.35948 22.12936,13.37285 3.98046,4.01338 5.94428,7.14463 4.71807,9.52723 -1.2262,2.38259 -5.54351,3.99405 -14.00119,4.81166 -8.45765,0.81761 -15.90978,0.12055 -23.02358,-1.72572 -7.11381,-1.84628 -13.80694,-4.86649 -21.70559,-8.603 -7.89866,-3.73649 -17.3272,-8.0507 -25.81115,-14.18439 -8.48395,-6.13369 -17.62324,-13.90003 -23.14238,-24.13356 -5.51915,-10.23352 -5.78201,-21.34406 -5.37146,-30.88264 0.41055,-9.53859 1.51092,-17.55377 2.71572,-23.74931 1.20482,-6.19553 2.71509,-10.67437 4.77102,-13.66952 2.05591,-2.99513 4.65165,-4.52673 7.71923,-4.52673 3.06759,0 5.70357,1.83092 7.62535,5.49926 1.9218,3.66832 3.04778,9.24444 3.28639,16.76004 0.23861,7.51561 -0.67126,17.08072 0.34029,27.19831 1.01155,10.1176 3.89485,20.79494 15.01833,28.7605 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + sodipodi:nodetypes="sssssssssssssssss" + inkscape:connector-curvature="0" + id="ellipse4590" + d="m 760.81735,387.61463 c 8.35351,7.22933 23.40419,11.34465 36.92829,14.85447 13.52408,3.50986 21.76315,7.50998 26.41399,11.29491 4.65086,3.78492 7.04347,6.96136 6.89289,9.28045 -0.15059,2.31908 -3.07202,3.85186 -9.99413,4.53735 -6.92209,0.68549 -13.12478,-0.17957 -19.18856,-2.15841 -6.06375,-1.97886 -12.01277,-5.06603 -19.62326,-8.64782 -7.61047,-3.5818 -16.94465,-7.61787 -24.98938,-13.21535 -8.04472,-5.59749 -15.82286,-12.65396 -20.9022,-21.24583 -5.07935,-8.59186 -6.01346,-17.801 -5.99188,-25.91871 0.0216,-8.1177 0.93462,-15.14861 1.86635,-20.66954 0.93173,-5.52092 2.01706,-9.59713 3.38259,-12.30465 1.36554,-2.70753 3.03466,-4.06947 5.01979,-4.01398 1.98511,0.0555 3.57672,1.84704 4.61437,5.2751 1.03765,3.42807 1.44745,8.54444 1.4737,15.15288 0.0262,6.60845 -0.43638,14.76057 0.91317,23.27473 1.34954,8.51418 4.83074,17.27506 13.18427,24.5044 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4271);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + </g> + <g + style="display:inline" + id="g4533-2" + transform="matrix(-0.60102903,0.32221978,0.53870829,0.77401445,526.12645,47.501077)" /> + <g + style="opacity:1" + transform="matrix(-0.32879267,0.17361606,0.20143296,0.28338802,143.13323,319.59452)" + id="g4404"> + <path + sodipodi:nodetypes="sssssssssssssssss" + inkscape:connector-curvature="0" + id="path4406" + d="m -626.54672,402.3529 c 2.22767,10.86299 0.34493,21.82632 -3.86747,31.42527 -4.21252,9.59894 -10.55173,17.86115 -17.72096,24.29983 -7.1694,6.43883 -15.25476,11.10591 -24.5716,13.61353 -9.31698,2.50761 -20.94966,4.46936 -31.63903,1.98398 -10.68939,-2.48537 -18.0688,-9.22838 -24.09401,-15.89285 -6.02508,-6.66442 -12.35923,-14.47524 -22.96531,-22.06805 -10.60584,-7.59266 -20.8648,-15.59839 -25.16123,-23.3775 -4.29632,-7.77931 -7.008,-15.66934 -7.81517,-23.39095 -0.80717,-7.7215 0.35908,-14.55922 3.12288,-20.54462 2.76393,-5.98548 7.12557,-11.1208 12.7854,-15.40902 5.65998,-4.28811 12.61751,-7.73606 20.64204,-10.24271 8.02465,-2.50651 17.11262,-4.07552 27.13941,-4.41504 10.0268,-0.3395 20.06604,0.59388 29.76158,2.87504 9.69543,2.2813 19.05511,5.92037 27.47739,11.02309 8.42215,5.10286 15.89307,11.69212 21.60465,19.6287 5.71147,7.93674 13.0738,19.62846 15.30143,30.4913 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-body);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csssccscsccscscccsccscsssscscscc" + inkscape:connector-curvature="0" + id="path4408" + d="m -784.21409,457.33922 c -0.56136,0.0656 -1.08141,0.1809 -1.55606,0.33615 -0.63289,0.20699 -1.18396,0.48516 -1.6349,0.82686 -0.45093,0.3417 -0.80184,0.74659 -1.02778,1.21891 -0.22595,0.47234 -0.32669,1.01119 -0.27449,1.62035 0.0522,0.60917 0.25282,1.23371 0.57968,1.84938 0.32687,0.61567 0.98957,1.25218 1.83531,1.84156 0.84574,0.58937 1.35671,1.20529 1.82543,1.72857 0.46713,0.52147 1.13451,0.85371 2.02424,0.92674 0.10253,0.008 0.12328,-0.30471 0.0344,-0.32876 -0.78083,-0.20262 -1.25826,-0.72023 -1.71877,-1.11076 -0.4254,-0.46645 -0.87231,-1.01406 -1.62104,-1.54604 -0.74871,-0.53197 -1.47289,-1.09304 -1.77689,-1.63886 -0.30398,-0.54584 -0.49685,-1.10009 -0.55469,-1.64239 -0.0579,-0.54231 0.0245,-1.0222 0.21918,-1.44322 0.19469,-0.42103 0.50198,-0.78371 0.90168,-1.08623 0.39973,-0.30252 0.89062,-0.54587 1.4577,-0.7237 0.28355,-0.0889 0.5872,-0.16119 0.90722,-0.21465 0.32002,-0.0535 0.6576,-0.0885 1.01178,-0.10163 0.70839,-0.0255 1.4163,0.0392 2.10043,0.1987 0.68412,0.15947 1.34499,0.41522 1.93838,0.77329 0.59338,0.35806 1.11885,0.81986 1.52108,1.37653 0.40222,0.55667 0.92117,1.37523 1.07925,2.13677 0.12981,0.62539 0.0734,1.25844 -0.13288,1.83379 -0.0385,0.10712 0.4977,0.29416 0.62787,-0.0111 0.24265,-0.5698 0.23445,-1.24057 0.1026,-1.8741 -0.17834,-0.85666 -0.69031,-1.76937 -1.13671,-2.40019 -0.4464,-0.6308 -1.03123,-1.15292 -1.68895,-1.55276 -0.65772,-0.39984 -1.38674,-0.68003 -2.14271,-0.85021 -0.75599,-0.17016 -1.54036,-0.23166 -2.32498,-0.19142 -0.19617,0.0101 -0.38815,0.0268 -0.57528,0.0484 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + transform="matrix(13.851095,0,0,13.851095,10133.213,-6001.611)" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -753.77185,413.0219 c -0.13663,-2.61847 2.18018,-4.94804 7.2193,-6.20054 7.65443,-1.90257 20.03831,1.84566 27.93811,5.67152 4.33357,2.09883 8.88981,3.89076 12.66635,7.19411 1.28185,1.12133 2.51799,2.28349 3.36855,4.40869 -1.65849,0.577 -4.10492,-0.92134 -5.87278,-2.13046 -6.96771,-4.76531 -14.69502,-8.08983 -22.67695,-9.12646 -6.71591,-0.87187 -8.86923,-3.11022 -14.75541,-2.56175 -3.72583,0.34716 -4.90626,2.13878 -7.88716,2.74489 z" + id="path4365-1-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssscsssc" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -720.16989,411.68353 c 0.28532,-2.32502 0.86962,3.90377 -0.31886,5.45995 -4.46007,5.84 -8.20289,12.32072 -12.42083,18.36519 -1.37385,1.96787 -3.29463,0.0414 -2.42738,-2.09874 0.88118,-2.1739 2.06053,-3.99898 3.34915,-5.8153 1.20809,-1.70147 2.81353,-3.0576 3.88834,-4.85958 2.06619,-3.46267 2.39577,-6.62873 4.25443,-10.2393 0.63712,-1.23818 3.5225,0.42546 3.67386,-0.80905 z" + id="path4367-9-2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssss" /> + </g> + <g + style="display:inline;opacity:1" + id="g4198" + transform="matrix(0.69027452,0,0,0.73815345,642.18876,259.65104)"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -140.71724,398.66408 c -9.31409,71.69689 -25.7611,141.32 -83.87724,188.8641 -73.31672,59.97949 -208.09131,67.90599 -303.42706,10.99618 -27.57065,-16.45805 -49.52457,-62.17665 -53.04177,-91.74122 -7.35191,-61.79791 19.82699,-103.64945 13.47928,-160.67805 -5.05249,-45.39216 -29.63784,-82.95495 -27.30836,-137.00138 1.56315,-36.26681 11.06536,-78.46439 40.50727,-100.88356 38.57103,-29.370718 83.60539,-46.188952 134.68095,-45.031125 72.73731,1.648875 151.17838,6.326503 212.18714,49.939365 43.544,31.12796 68.50323,82.53699 72.90385,135.3004 4.52019,54.19698 -0.16075,104.48555 -6.10406,150.23529 z" + id="path4188" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4336);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -158.93683,464.92976 c -15.56115,65.9367 -58.42288,127.39267 -134.42207,151.72082 -70.61462,22.6045 -163.49236,17.29949 -232.18476,-25.54762 -26.14623,-16.30879 -46.09162,-61.46233 -48.95901,-89.47579 -6.03547,-58.9646 19.04741,-102.17429 13.30293,-156.59502 -4.7951,-45.42661 -28.02123,-78.34585 -27.29597,-132.22289 0.47399,-35.21112 8.99044,-76.95773 37.82112,-98.79995 36.52466,-27.671205 78.3526,-45.238515 126.45621,-45.012482 76.22124,0.358155 162.16208,5.533182 222.84373,56.658952 55.47879,46.74224 63.38318,129.04796 60.81019,193.3049 -2.12217,52.99813 -7.67242,100.63054 -18.37237,145.96908 z" + id="ellipse4190" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssss" /> + </g> + <g + id="g4376" + transform="matrix(0.40138799,-0.13710458,0.13710458,0.40138799,470.81791,82.723801)" + style="opacity:1"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-body);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -626.57295,401.69566 c 2.24713,11.35067 0.36741,22.38948 -3.843,32.03835 -4.21053,9.64886 -10.54997,17.90531 -17.7192,24.34399 -7.1694,6.43883 -15.25457,11.1106 -24.57171,13.61082 -9.31727,2.5002 -20.94956,4.47176 -31.64526,1.82793 -10.69571,-2.64383 -18.09209,-9.81214 -24.14818,-17.25062 -6.05597,-7.43843 -12.44269,-16.56671 -23.09665,-25.35944 -10.65372,-8.79255 -20.95218,-17.78817 -25.30072,-26.87318 -4.34843,-9.08528 -7.1154,-18.36084 -7.98,-27.52156 -0.86459,-9.1606 0.24716,-17.36404 2.9617,-24.58398 2.71467,-7.22004 7.03243,-13.45488 12.66059,-18.5369 5.6283,-5.08191 12.56665,-9.01064 20.59229,-11.48936 8.02576,-2.47858 17.13537,-3.50537 27.20916,-2.66707 10.0738,0.83832 20.1809,3.47234 29.95223,7.6529 9.77122,4.18068 19.21426,9.9086 27.71179,16.89733 8.49741,6.98886 16.03465,15.24007 21.79567,24.41557 5.7609,9.17565 13.1742,22.14471 15.42129,33.49522 z" + id="path4398" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -784.27135,455.90422 c -0.56339,0.0147 -1.08437,0.10666 -1.55902,0.26191 -0.63289,0.20699 -1.18231,0.52669 -1.63059,0.93484 -0.44828,0.40815 -0.79558,0.90361 -1.01756,1.4752 -0.22199,0.5716 -0.31844,1.21792 -0.26185,1.93717 0.0566,0.71926 0.26134,1.4471 0.59196,2.157 0.33063,0.7099 0.99621,1.41858 1.84494,2.08284 0.84872,0.66425 1.36325,1.36931 1.83382,1.93901 0.46898,0.56774 1.13678,0.9105 2.02675,0.98962 0.10256,0.009 0.12294,-0.31321 0.034,-0.33899 -0.78143,-0.21746 -1.26048,-0.77583 -1.72293,-1.21489 -0.42768,-0.5236 -0.87838,-1.16625 -1.63058,-1.78505 -0.75217,-0.61879 -1.47924,-1.25213 -1.78697,-1.89162 -0.30772,-0.63951 -0.50455,-1.29287 -0.56648,-1.9378 -0.062,-0.64492 0.0165,-1.22191 0.20772,-1.73042 0.1912,-0.50852 0.49539,-0.94884 0.89287,-1.30706 0.3975,-0.35822 0.88707,-0.63484 1.45426,-0.80994 0.2836,-0.0875 0.58767,-0.1494 0.90851,-0.1822 0.32084,-0.0328 0.65966,-0.0369 1.01552,-0.008 0.71174,0.0585 1.42446,0.24383 2.11396,0.53794 0.6895,0.29412 1.35628,0.69807 1.95502,1.19025 0.59873,0.49218 1.12894,1.07271 1.53474,1.71893 0.4058,0.64623 0.9285,1.5589 1.08808,2.35795 0.13104,0.65619 0.075,1.29927 -0.13103,1.88026 -0.0384,0.10817 0.49808,0.30362 0.62824,-0.002 0.24262,-0.57052 0.23429,-1.24452 0.10166,-1.89748 -0.17938,-0.88293 -0.69436,-1.871 -1.14416,-2.58711 -0.44981,-0.71609 -1.03943,-1.35821 -1.70275,-1.89855 -0.66333,-0.54034 -1.3987,-0.97968 -2.16052,-1.29649 -0.76184,-0.31679 -1.55154,-0.51173 -2.33984,-0.56369 -0.19709,-0.013 -0.38986,-0.0163 -0.57767,-0.0116 z" + id="path4369" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csssccscsccscscccsccscsssscscscc" + transform="matrix(13.851095,0,0,13.851095,10133.213,-6001.611)" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -730.27274,382.91266 c 1.8068,-2.76405 6.31309,-3.63001 13.24575,-1.6171 10.53068,3.05761 22.43414,14.97755 28.94834,24.04709 3.57338,4.97534 7.6424,9.78266 9.64772,15.62449 0.68055,1.98294 1.27611,3.97774 0.68898,6.70435 -2.4056,-0.49416 -4.1871,-3.62313 -5.37952,-6.01329 -4.69962,-9.4202 -11.38574,-17.86492 -20.09536,-24.13889 -7.3284,-5.27852 -8.20487,-8.9719 -15.61502,-12.25742 -4.69053,-2.07967 -7.44128,-1.02076 -11.44089,-2.34923 z" + id="path4365-1" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssscsssc" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m -689.31909,403.49962 c 2.08771,-2.1886 -1.9021,4.5559 -4.48533,5.36905 -9.69439,3.05157 -19.01784,7.22624 -28.57811,10.64488 -3.11327,1.11257 -3.94795,-2.11026 -1.30738,-3.72982 2.68251,-1.64492 5.45711,-2.73872 8.35507,-3.75217 2.71578,-0.94874 5.64428,-1.2851 8.27731,-2.4236 5.06052,-2.18718 7.83343,-5.20599 12.75841,-7.67984 1.68866,-0.84854 3.86766,2.73608 4.97603,1.5739 z" + id="path4367-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssss" /> + </g> + <g + id="g4634" + transform="matrix(0.13058783,-0.42795023,-0.60869797,-0.11092817,632.15501,956.21909)" + style="display:inline;opacity:1"> + <path + sodipodi:nodetypes="sssssssssssssssss" + inkscape:connector-curvature="0" + id="path4636" + d="m 423.50332,581.83521 c -0.004,4.40048 -1.19837,7.58856 -3.37524,9.82844 -2.17687,2.23987 -5.33154,3.55156 -9.14619,4.44292 -3.81465,0.89135 -8.28246,1.39523 -13.05675,1.83828 -4.77428,0.44304 -9.85163,0.79076 -14.95001,1.09928 -5.09838,0.30851 -9.94541,0.34741 -14.40217,0.0862 -4.45676,-0.26122 -8.52354,-0.79908 -11.99271,-1.71189 -3.46915,-0.91282 -6.33736,-2.21356 -8.3562,-4.09288 -2.01885,-1.87935 -3.18709,-4.34475 -3.25466,-7.51083 -0.0676,-3.16607 0.9983,-5.4859 2.92534,-7.0838 1.92703,-1.5979 4.71248,-2.46394 8.09977,-2.84688 3.38729,-0.38293 7.37282,-0.28336 11.77044,-0.16051 4.39762,0.12284 9.21051,0.23456 14.33166,-0.12202 5.12115,-0.35659 10.27171,-1.47349 15.16022,-2.54099 4.88852,-1.06749 9.50395,-2.05149 13.43823,-2.27114 3.9343,-0.21967 7.17754,0.32322 9.39823,2.04598 2.22069,1.72276 3.41425,4.59936 3.41004,8.99986 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4279);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + sodipodi:nodetypes="csscsscssssssssssssssssssssccsssc" + inkscape:connector-curvature="0" + id="path4638" + d="m 411.91406,568.54883 c -3.75011,-0.0271 -8.08701,0.53975 -12.76172,1.28711 -5.34251,0.85413 -11.10706,1.92059 -17.00976,2.32617 -5.9027,0.40562 -11.41103,0.38326 -16.44727,0.41406 -5.03624,0.0309 -9.6045,0.1607 -13.50781,0.85938 -3.9033,0.69867 -7.13503,1.96743 -9.4082,3.96875 -2.27316,2.00131 -3.58535,4.71676 -3.65235,8.17578 -0.067,3.45901 1.21821,6.3073 3.54297,8.58008 2.32476,2.27278 5.68789,3.9795 9.76172,5.25 4.07385,1.27051 8.85237,2.11894 14.05664,2.59765 5.20427,0.47871 10.83381,0.56134 16.70313,0.22266 5.86931,-0.33868 11.47146,-0.78653 16.60547,-1.34961 5.13399,-0.56309 9.79334,-1.22365 13.70703,-2.34375 1.48913,-0.4262 2.86677,-0.9287 4.12695,-1.51953 2.54507,-1.19325 2.05015,-6.17249 -0.0996,-4.54102 -1.99172,1.51153 -4.14364,1.68162 -7.15735,2.35061 -3.67269,0.81527 -8.18136,0.99111 -12.55008,1.3428 -4.3687,0.35167 -8.7789,1.78431 -13.31332,2.07736 -4.53444,0.29304 -8.86787,0.32801 -12.93181,0.0702 -4.06396,-0.25785 -7.85651,-0.78075 -11.12475,-1.64296 -3.26823,-0.86221 -5.99695,-2.08037 -7.8846,-3.81399 -1.88765,-1.73365 -2.92537,-3.9871 -2.97865,-6.80086 -0.0533,-2.81374 0.90176,-4.8192 2.66881,-6.10562 1.76704,-1.28641 5.61732,-0.58475 8.69196,-0.71399 3.07463,-0.12925 6.90624,-0.54484 10.78772,-0.41733 3.88147,0.12754 6.54592,-0.48119 11.04844,-1.2139 4.50252,-0.73264 9.15212,-2.3434 13.88736,-3.72101 4.73523,-1.37761 9.22461,-2.34259 13.00861,-2.55385 0.473,-0.0264 0.93707,-0.0422 1.38868,-0.0449 1.16046,-0.007 2.25007,0.0442 3.25,0.23633 1.15313,0.22156 2.31543,-2.86146 -0.83789,-2.92773 -0.51177,-0.0108 -1.03459,-0.045 -1.57032,-0.0488 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer9" + inkscape:label="gopher-shadow" + style="display:inline;opacity:0.06000001" + sodipodi:insensitive="true" + transform="translate(-15.732722,-256.54886)"> + <ellipse + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path4544" + cx="-467.52527" + cy="482.66467" + rx="22.450642" + ry="20.682871" + transform="scale(-1,1)" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 234.60547,309.98047 c -6.62163,-0.0703 -10.7426,0.83465 -15.61133,3.26758 -5.0378,2.51742 -10.044,7.91661 -11.55273,12.45898 -2.26972,6.83348 -0.42196,14.92592 5.01757,21.97656 3.19606,4.1427 6.84938,6.56071 14.60938,9.66993 3.20846,1.28553 7.68985,3.50108 9.95898,4.92382 5.6211,3.52442 9.83526,5.31873 13.54102,5.76563 2.42194,0.29208 3.11523,0.63719 3.11523,1.55469 0,0.89182 -0.7061,1.28567 -2.89062,1.61328 -1.58919,0.23867 -3.77121,0.24076 -4.84961,0.004 -1.95019,-0.42833 -1.9703,-0.40483 -3.65625,4.68555 -3.87667,11.7048 -5.82609,25.85658 -5.80859,42.15625 0.0196,18.31899 1.82597,28.89111 9.58007,56.04688 5.56137,19.47655 7.15656,26.40249 8.58008,37.26171 2.05331,15.66359 1.31467,26.60445 -3.90625,57.79102 -4.8641,29.05517 -5.15869,31.69637 -5.18359,46.54297 -0.0239,14.28001 0.63486,19.84952 3.52539,29.8125 5.44577,18.77032 13.72789,34.11825 23.9082,44.30078 8.00321,8.00498 22.62783,16.26261 41.23438,23.2832 5.47456,2.06566 5.83617,2.12101 6.46679,0.99414 1.72277,-3.07839 3.2087,-3.7772 9.33203,-3.79882 -38.68101,-33.75954 -34.48259,-82.29367 -25.52281,-108.9339 7.33431,-21.80723 31.77025,-53.23407 31.77025,-53.23407 l -22.41052,-1.98245 c 0,0 -7.25969,-42.63753 -13.15682,-59.9065 -22.58603,-66.14023 -29.82384,-120.35922 4.37069,-158.19894 5.84309,-6.46598 12.5988,-11.21335 19.60937,-14.69727 -9.02679,1.89877 -18.30173,4.80561 -26.41601,8.32813 -6.65247,2.88791 -19.01394,9.90994 -18.99415,10.78906 0.009,0.39075 0.30731,1.97487 0.66407,3.52148 0.79845,3.46141 -0.0807,5.55969 -2.20117,5.25782 -1.1871,-0.16901 -1.49742,-0.76108 -1.83008,-3.48633 -0.63121,-5.17109 -3.20076,-9.39815 -9.06836,-14.91797 -9.25402,-8.70552 -17.29671,-12.21829 -29.22461,-12.76172 -1.05756,-0.0482 -2.05405,-0.0778 -3,-0.0879 z m 1.38086,24.10156 c 1.88404,0.0642 3.99413,0.41696 5.88476,1.04492 3.99187,1.32589 12.35644,6.69047 14.31446,9.17969 3.00519,3.82048 1.04901,4.01008 -3.4043,0.33008 -1.74522,-1.44216 -3.36983,-2.6211 -3.60937,-2.6211 -0.23954,0 -2.78812,1.91597 -5.66407,4.25782 -2.87594,2.34185 -5.59815,4.25776 -6.04883,4.25976 -1.88842,0.007 -0.56519,-2.08264 3.10938,-4.91015 4.64288,-3.57262 5.88952,-5.38766 4.12891,-6.00977 -0.64649,-0.22845 -2.92374,-1.13445 -5.06055,-2.01367 -3.0123,-1.23949 -4.52138,-1.50334 -6.71875,-1.17383 -3.06661,0.45987 -3.82178,-0.39095 -1.46485,-1.65234 0.9899,-0.52978 2.64916,-0.75563 4.53321,-0.69141 z m 103.78515,383.73633 c -0.005,0.0152 -0.007,0.0256 -0.0117,0.041 l -0.70118,2.28906 5.65625,1.01562 c 0.0901,0.0162 0.20551,0.0326 0.29688,0.0488 -1.81728,-1.11236 -3.56263,-2.24473 -5.24024,-3.39453 z" + id="path4271" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssscssssssssssscsccsscscssssssscsssscscsssscccccccc" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 328.4205,548.25967 -4.47623,14.88037 c 2.60939,0.0254 9.84161,-6.41982 16.75619,-6.818 76.94638,-4.43102 125.04829,-0.40565 187.26295,-5.40532 1.45456,-0.11689 3.76527,-0.10936 5.20677,0.2079 5.21485,1.14773 8.09003,14.3736 9.3628,13.60525 0.6055,-14.12878 -2.32372,-19.14168 -5.81784,-22.69773 z" + id="path4275" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccsssccc" /> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="gopher-face" + style="display:inline" + sodipodi:insensitive="true" + transform="translate(-15.732722,-256.54886)"> + <g + id="g4818" + transform="matrix(-0.65610141,0,0,0.65610141,655.70091,210.42145)"> + <path + sodipodi:nodetypes="sssssssssssssssss" + inkscape:connector-curvature="0" + id="path4812" + d="m 547.42756,318.16456 c -0.44046,14.77191 -4.12869,29.02667 -10.38967,42.25266 -6.26099,13.22599 -15.09198,25.42687 -25.80466,35.99686 -10.71268,10.57 -23.30432,19.50822 -37.11826,26.08983 -13.81394,6.58161 -28.85103,10.80263 -44.50193,11.8618 -15.65091,1.05917 -30.4406,-1.15844 -43.81781,-6.16756 -13.37721,-5.00911 -25.3405,-12.8075 -35.30087,-22.80416 -9.96037,-9.99666 -17.91599,-22.19037 -23.26581,-35.90798 -5.34983,-13.71761 -8.0915,-28.95913 -7.64195,-44.98105 0.44955,-16.02192 4.04447,-31.2937 10.1422,-45.07896 6.09773,-13.78526 14.69591,-26.08175 25.16951,-36.25747 10.4736,-10.17571 22.82245,-18.23043 36.46168,-23.66123 13.63924,-5.4308 28.57214,-8.24285 44.22923,-8.02541 15.6571,0.21745 30.56095,3.42714 44.11009,8.94154 13.54914,5.5144 25.7404,13.33722 35.92568,22.91495 10.18529,9.57774 18.36233,20.91345 23.87736,33.53282 5.51504,12.61936 8.36566,26.52144 7.92521,41.29336 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + sodipodi:nodetypes="sssssssssssssssss" + inkscape:connector-curvature="0" + id="ellipse4814" + d="m 539.72249,314.79002 c 10e-4,13.89984 -3.01572,27.53808 -8.51346,40.35257 -5.49774,12.81449 -13.48047,24.80543 -23.37659,35.2527 -9.89612,10.44726 -21.70519,19.34133 -34.78531,25.87862 -13.08011,6.53727 -27.4256,10.71236 -42.3773,11.7667 -14.9517,1.05435 -29.09103,-1.11258 -41.85904,-5.93108 -12.76803,-4.81852 -24.16883,-12.28715 -33.66552,-21.79076 -9.49671,-9.50362 -17.08979,-21.04298 -22.23241,-33.95465 -5.14261,-12.91166 -7.83328,-27.19561 -7.52333,-42.13595 0.30995,-14.94034 3.58995,-29.10832 9.22975,-41.85842 5.63981,-12.7501 13.63743,-24.08168 23.39638,-33.47108 9.75897,-9.38941 21.27795,-16.83842 34.00359,-21.94183 12.72563,-5.10342 26.66067,-7.86812 41.28534,-7.94317 14.62467,-0.0751 28.55938,2.53224 41.26083,7.24431 12.70145,4.71207 24.16709,11.5339 33.81555,20.03646 9.64847,8.50257 17.47884,18.68937 22.90117,30.21241 5.42232,11.52304 8.43889,24.38332 8.44035,38.28317 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-eye);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <circle + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4319);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path4828" + cx="458.07443" + cy="316.13431" + r="30.809652" /> + <circle + r="15.152287" + cy="301.99216" + cx="444.43738" + id="circle4830" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-eye);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + </g> + <g + transform="matrix(-0.49821858,-0.255998,-0.255998,0.49821858,841.05915,359.59091)" + id="g4822"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 544.2609,323.96628 c -5.95391,12.33766 -15.20034,24.2228 -25.89846,35.91934 -10.69814,11.69654 -22.74349,23.28172 -34.52447,34.21851 -11.78099,10.93679 -23.27607,21.15489 -34.23709,29.30247 -10.96102,8.14759 -21.47285,14.18083 -32.04267,16.95199 -10.56982,2.77117 -20.29711,2.02561 -29.30402,-1.67713 -9.00692,-3.70274 -20.58076,-7.76561 -27.66538,-16.71749 -7.08461,-8.95188 -12.84054,-20.18257 -16.5035,-33.03389 -3.66297,-12.85133 -5.229,-27.32914 -3.92417,-42.72858 1.30484,-15.39944 5.36688,-30.24976 11.81788,-43.75488 6.45101,-13.5051 15.29008,-25.65823 26.00811,-35.78271 10.71803,-10.12447 28.44246,-20.29305 42.24879,-25.86698 13.80633,-5.57394 28.83304,-8.62768 44.20973,-8.80364 15.3767,-0.17594 29.62737,2.52591 41.94358,7.37479 12.31622,4.84887 22.69735,11.85058 30.35956,20.34718 7.66222,8.49661 12.60139,18.48263 14.06496,29.34879 1.4636,10.86615 -0.59894,22.56457 -6.55285,34.90223 z" + id="path4824" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 538.18032,322.65868 c -5.17728,11.63182 -13.27733,23.10077 -22.96883,34.40428 -9.69151,11.30351 -20.93897,22.46482 -32.34413,32.7753 -11.40514,10.31051 -22.90789,19.71873 -33.85893,27.13351 -10.95103,7.41476 -21.39599,12.82014 -31.59528,15.28718 -10.19931,2.46703 -19.30202,1.76338 -27.56839,-1.62958 -8.26637,-3.39295 -19.13397,-6.9512 -25.3913,-15.16185 -6.25732,-8.21068 -11.24381,-18.53447 -14.30417,-30.37519 -3.06035,-11.84072 -4.18965,-25.20221 -2.68634,-39.42576 1.5033,-14.22354 5.50837,-27.94818 11.67956,-40.43838 6.17119,-12.4902 14.50792,-23.74111 24.54768,-33.13895 10.03978,-9.39782 26.99021,-19.0621 39.83566,-24.2929 12.84546,-5.2308 26.78412,-8.15811 41.0009,-8.45853 14.21678,-0.30038 27.34319,2.03758 38.64284,6.33106 11.29965,4.29349 20.7704,10.54463 27.74089,18.16875 6.97048,7.62413 11.43794,16.6127 12.81335,26.51165 1.37541,9.89894 -0.36624,20.67759 -5.54351,32.30941 z" + id="path4826" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + <circle + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4321);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path4828-0" + cx="438.70038" + cy="219.30804" + r="27.721321" + transform="matrix(0.98640333,0.16434257,-0.16434257,0.98640333,0,0)" /> + <circle + r="13.633434" + cy="205.95601" + cx="431.24106" + id="circle4830-3" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + transform="matrix(0.98640333,0.16434257,-0.16434257,0.98640333,0,0)" /> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer7" + inkscape:label="gopher-mouth" + style="display:inline" + sodipodi:insensitive="true" + transform="translate(-15.732722,-256.54886)"> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 477.59321,477.72343 -6.36763,0.0828 -3.71113,-0.0821 c -1.18372,-0.0262 -2.23819,0.53559 -3.00662,1.36379 -0.76845,0.82822 -1.14658,1.97521 -1.32551,3.22687 l -1.01303,7.08562 -1.40711,7.111 c -0.25342,1.28069 0.0841,2.40965 0.70518,3.23132 0.6211,0.82165 1.57363,1.28978 2.69674,1.31649 l 3.7446,0.0891 7.40657,-0.17258 c 1.42055,-0.0331 2.74014,-0.58514 3.70785,-1.43299 0.96771,-0.84787 1.54004,-2.00084 1.65553,-3.2592 l 0.6476,-7.05621 0.52522,-7.04505 c 0.0935,-1.25398 -0.46676,-2.37726 -1.25366,-3.18163 -0.78689,-0.80437 -1.85738,-1.2842 -3.00457,-1.27716 z" + id="rect4659" + inkscape:connector-curvature="0" + sodipodi:nodetypes="scssscssscssscsss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 476.43064,479.86835 -5.19684,0.0698 -2.47497,-0.10149 c -0.94018,-0.0386 -1.80825,0.43586 -2.46124,1.11384 -0.65298,0.67797 -1.03424,1.61771 -1.21175,2.64338 l -1.0026,5.79325 -1.25494,5.80832 c -0.22406,1.03701 0.002,1.97056 0.48938,2.64162 0.48783,0.67105 1.26653,1.03411 2.19892,1.07115 l 2.54193,0.101 5.88547,-0.12754 c 1.11447,-0.0242 2.17518,-0.47212 2.97321,-1.1643 0.79803,-0.69218 1.30904,-1.6349 1.43939,-2.66511 l 0.73009,-5.77006 0.63032,-5.76301 c 0.11259,-1.02637 -0.28558,-1.94744 -0.89178,-2.6062 -0.60618,-0.65877 -1.45658,-1.05733 -2.39458,-1.04471 z" + id="rect4661" + inkscape:connector-curvature="0" + sodipodi:nodetypes="scssscssscssscsss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 447.45177,471.71537 c 0.17729,2.27145 1.57656,4.32647 3.56538,6.17684 1.98881,1.85037 4.73553,3.49055 7.9169,4.83408 3.18137,1.34353 6.76993,2.37673 10.40491,2.92876 3.63499,0.55204 7.31771,0.61337 10.93742,0.17695 3.61969,-0.43645 6.8614,-1.30517 9.67542,-2.37849 2.81402,-1.07332 5.17844,-2.3467 7.04073,-3.75925 1.86231,-1.41254 3.23922,-2.97722 4.10853,-4.72358 0.86932,-1.74636 1.22997,-3.67959 0.91461,-5.76285 -0.31535,-2.08326 -1.29186,-4.11481 -2.79935,-5.98131 -1.5075,-1.86649 -3.53491,-3.56576 -5.91642,-4.97983 -2.3815,-1.41407 -5.11304,-2.54212 -8.12844,-3.28158 -3.0154,-0.73946 -6.31783,-1.09096 -9.93094,-0.97174 -3.6131,0.11924 -7.2186,0.69446 -10.6419,1.64517 -3.4233,0.95069 -6.6496,2.2832 -9.33875,3.91065 -2.68913,1.62746 -4.89892,3.50256 -6.18894,5.61926 -1.32139,2.16817 -1.77021,4.61153 -1.61916,6.54692 z" + id="ellipse4650" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4265);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 455.1011,471.20532 c 0.31019,1.80429 1.36577,3.48937 2.98663,4.99917 1.62086,1.5098 3.80505,2.84719 6.28703,3.91437 2.48197,1.06719 5.24944,1.8562 8.07117,2.27071 2.82174,0.4145 5.70079,0.45265 8.53169,0.10713 2.83089,-0.34553 5.35911,-1.02976 7.553,-1.90451 2.19389,-0.87475 4.04484,-1.93848 5.497,-3.12538 1.45217,-1.1869 2.50911,-2.50179 3.13219,-3.93394 0.62308,-1.43214 0.81446,-2.98543 0.48985,-4.63056 -0.32461,-1.64514 -1.13916,-3.22548 -2.3414,-4.6674 -1.20224,-1.44192 -2.78948,-2.74346 -4.65903,-3.82078 -1.86955,-1.07733 -4.01937,-1.92982 -6.38974,-2.4811 -2.37037,-0.55129 -4.96168,-0.80162 -7.76722,-0.68542 -2.80553,0.11621 -5.57317,0.58631 -8.1874,1.34158 -2.61424,0.75528 -5.07126,1.79757 -7.14628,3.06167 -2.07504,1.26412 -3.75959,2.75051 -4.8326,4.37276 -1.07302,1.62225 -1.53509,3.37741 -1.22489,5.1817 z" + id="ellipse4652" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + <path + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 465.13937,460.19393 c 0.45232,1.29294 1.43586,2.44115 2.79664,3.4102 1.36078,0.96906 3.0934,1.76079 4.97332,2.36791 1.87992,0.60712 3.89927,1.0315 5.87533,1.25741 1.97606,0.2259 3.90879,0.25223 5.71982,0.052 1.81102,-0.20028 3.33955,-0.60742 4.63321,-1.17435 1.29367,-0.56695 2.35232,-1.29343 3.18646,-2.14861 0.83413,-0.85519 1.44471,-1.8405 1.79916,-2.93195 0.35445,-1.09146 0.45213,-2.29028 0.21175,-3.55738 -0.24038,-1.2671 -0.80099,-2.48156 -1.64917,-3.57911 -0.84818,-1.09755 -1.9831,-2.07741 -3.35494,-2.8723 -1.37184,-0.7949 -2.98056,-1.40441 -4.76729,-1.7664 -1.78672,-0.36199 -3.75169,-0.47615 -5.82322,-0.29097 -2.07153,0.18518 -4.05358,0.65136 -5.84566,1.3298 -1.79207,0.67844 -3.39432,1.56902 -4.69144,2.60198 -1.29713,1.03296 -2.28898,2.20893 -2.84443,3.45293 -0.55546,1.24399 -0.67186,2.55593 -0.21954,3.84888 z" + id="path4648" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssssssssssss" /> + </g> + <g + inkscape:groupmode="layer" + id="layer12" + inkscape:label="gopher-hands" + style="display:inline" + sodipodi:insensitive="true" + transform="translate(-15.732722,-256.54886)"> + <g + id="g4533" + transform="matrix(-0.28489616,-0.34500545,-0.42832103,0.44649678,715.99765,474.46827)"> + <path + sodipodi:nodetypes="sssssssssssssssss" + inkscape:connector-curvature="0" + id="ellipse4523" + d="m 423.50332,581.83521 c -0.004,4.40048 -1.19837,7.58856 -3.37524,9.82844 -2.17687,2.23987 -5.33154,3.55156 -9.14619,4.44292 -3.81465,0.89135 -8.28246,1.39523 -13.05675,1.83828 -4.77428,0.44304 -9.85163,0.79076 -14.95001,1.09928 -5.09838,0.30851 -9.94541,0.34741 -14.40217,0.0862 -4.45676,-0.26122 -8.52354,-0.79908 -11.99271,-1.71189 -3.46915,-0.91282 -6.33736,-2.21356 -8.3562,-4.09288 -2.01885,-1.87935 -3.18709,-4.34475 -3.25466,-7.51083 -0.0676,-3.16607 0.9983,-5.4859 2.92534,-7.0838 1.92703,-1.5979 4.71248,-2.46394 8.09977,-2.84688 3.38729,-0.38293 7.37282,-0.28336 11.77044,-0.16051 4.39762,0.12284 9.21051,0.23456 14.33166,-0.12202 5.12115,-0.35659 10.27171,-1.47349 15.16022,-2.54099 4.88852,-1.06749 9.50395,-2.05149 13.43823,-2.27114 3.9343,-0.21967 7.17754,0.32322 9.39823,2.04598 2.22069,1.72276 3.41425,4.59936 3.41004,8.99986 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4273);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <path + sodipodi:nodetypes="ssscsscssssssssssssssssssssccsss" + inkscape:connector-curvature="0" + id="path4521" + d="m 411.91406,568.54883 c -3.75011,-0.0271 -8.08701,0.53975 -12.76172,1.28711 -5.34251,0.85413 -11.10706,1.92059 -17.00976,2.32617 -5.9027,0.40562 -11.41103,0.38326 -16.44727,0.41406 -5.03624,0.0309 -9.6045,0.1607 -13.50781,0.85938 -3.9033,0.69867 -7.13503,1.96743 -9.4082,3.96875 -2.27316,2.00131 -3.58535,4.71676 -3.65235,8.17578 -0.067,3.45901 1.21821,6.3073 3.54297,8.58008 2.32476,2.27278 5.68789,3.9795 9.76172,5.25 4.07385,1.27051 8.85237,2.11894 14.05664,2.59765 5.20427,0.47871 10.83381,0.56134 16.70313,0.22266 5.86931,-0.33868 11.47146,-0.78653 16.60547,-1.34961 5.13399,-0.56309 9.79334,-1.22365 13.70703,-2.34375 1.48913,-0.4262 2.86677,-0.9287 4.12695,-1.51953 2.54507,-1.19325 2.05015,-6.17249 -0.0996,-4.54102 -1.99172,1.51153 -4.55969,2.50355 -7.57031,3.20703 -3.66893,0.85731 -7.96668,1.34146 -12.5586,1.76758 -4.59191,0.42612 -9.47527,0.75991 -14.3789,1.05664 -4.90363,0.29673 -9.56506,0.33523 -13.85156,0.084 -4.28652,-0.25124 -8.19851,-0.76855 -11.53516,-1.64649 -3.33664,-0.87795 -6.09539,-2.12996 -8.03711,-3.9375 -1.94173,-1.80756 -3.06587,-4.17751 -3.13086,-7.22265 -0.065,-3.04513 0.96102,-5.2776 2.81445,-6.81446 1.85342,-1.53686 4.53117,-2.36997 7.78907,-2.73828 3.2579,-0.36831 7.09262,-0.27244 11.32226,-0.1543 4.22963,0.11816 8.85767,0.22578 13.7832,-0.11718 4.92553,-0.34297 9.88026,-1.41664 14.58204,-2.44336 4.70178,-1.02671 9.13982,-1.97234 12.92382,-2.1836 0.473,-0.0264 0.93707,-0.0422 1.38868,-0.0449 1.16046,-0.007 2.25007,0.0442 3.25,0.23633 1.15313,0.22156 2.31543,-2.86146 -0.83789,-2.92773 -0.51177,-0.0108 -1.03459,-0.045 -1.57032,-0.0488 z" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="cape-front" + style="display:inline" + transform="translate(-15.732722,-256.54886)"> + <path + sodipodi:nodetypes="cssscscc" + inkscape:connector-curvature="0" + id="path4248" + d="m 250.62773,531.91504 c -9.09672,21.35801 -15.29674,29.07226 -30.27188,44.83759 -11.50237,12.10933 -28.85117,24.46609 -43.81134,39.61682 -13.55246,13.72509 -26.12338,21.00434 -64.22257,32.01103 -11.97434,3.45934 -44.031036,6.55017 -51.472472,37.30246 C 107.21772,654.7909 183.17617,662.32228 228.40418,636.09787 266.34279,614.10005 317.82474,552.6315 355.9453,547.7268 284.49621,547.05928 263.34291,542.49874 250.62773,531.91504 Z" + style="display:inline;fill:#019833;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + style="fill:#019833;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 473.29262,543.99873 73.7751,-5.10117 c 0,0 2.29258,1.0455 2.68673,2.11494 7.36409,19.98076 -12.72148,60.84328 -12.72148,60.84328 0,-2.97132 13.53121,-43.94425 -5.91529,-53.46522 -16.4456,-8.05173 -38.16124,-2.06803 -57.82506,-4.39183 z" + id="path4265" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccscsc" /> + <path + style="display:inline;fill:#019432;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 249.90625,533.57227 c -8.70868,20.08478 -14.97837,27.83833 -29.55078,43.17968 -11.50237,12.10933 -28.85038,24.46646 -43.81055,39.61719 -13.55246,13.72509 -26.12346,21.00503 -64.22265,32.01172 -10.63128,3.07133 -37.077893,5.86957 -48.087895,27.97656 2.731585,-3.48747 7.206694,-4.8761 9.881319,-8.70029 4.506995,-6.44411 60.824806,-11.61546 75.673426,-21.06752 9.77176,-6.22033 32.61216,-17.69963 44.08393,-25.40211 11.47178,-7.70248 50.16856,-39.82139 59.98047,-41.62695 30.99143,-5.70295 56.04882,-31.95703 56.04882,-31.95703 0,0 -5.76873,-1.34099 -7.30468,-1.69727 -26.4653,-1.9743 -39.57284,-5.58234 -48.29883,-11.28125 -1.77957,-0.42346 -3.78649,-0.89828 -4.39258,-1.05273 z" + id="path4280" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssscsssscccc" /> + <path + style="fill:#01a939;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 250.88543,527.29897 c 4.9284,1.23444 7.57648,5.23948 12.39942,6.83706 14.83134,4.91283 28.22069,8.13985 43.80356,9.2706 19.18619,1.39223 40.09821,1.50171 59.33179,1.15882 36.63136,-0.65304 73.4946,-1.92414 110.08831,-3.70824 19.9513,-0.97271 40.58394,-2.2893 60.49061,-3.94 3.86874,-0.3208 7.97563,-6.05622 11.58825,-4.6353 2.39418,0.94168 2.01049,3.29975 2.64058,5.79412 2.44082,4.93143 0.14511,6.64447 -5.65353,7.64824 -19.43937,3.05253 -39.20884,3.55847 -58.86827,4.40354 -48.01128,2.06378 -96.10464,2.11621 -144.15772,1.62235 -17.00379,-0.17475 -34.11943,0.52285 -50.98827,-1.62235 -13.27515,-1.68819 -26.90453,-3.45163 -39.16825,-8.80707 -4.12399,-1.80091 -7.99437,-2.72852 -8.97266,-7.12095 -0.30759,-1.38101 1.19417,-2.17728 1.88173,-3.29956 0.57446,-0.93767 0.21317,-2.26036 1.23886,-2.84803 1.34064,-0.76812 2.84679,-1.12864 4.34559,-0.75323 z" + id="path4267" + inkscape:connector-curvature="0" + sodipodi:nodetypes="sssssssccssssssss" /> + <path + style="fill:#019d35;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 245.9043,528.82812 c -0.24767,0.63868 -0.21658,1.44068 -0.60352,2.07227 -0.68756,1.12228 -2.18845,1.91782 -1.88086,3.29883 0.97829,4.39243 4.84867,5.32018 8.97266,7.12109 12.26372,5.35544 25.89282,7.11845 39.16797,8.80664 16.86884,2.1452 33.98449,1.4483 50.98828,1.62305 48.05308,0.49386 96.14692,0.44073 144.1582,-1.62305 19.65943,-0.84507 39.42782,-1.34981 58.86719,-4.40234 5.79864,-1.00377 8.09512,-2.71701 5.6543,-7.64844 -0.0557,-0.22031 -0.0962,-0.43699 -0.13868,-0.65429 0.48647,4.64963 -6.66572,4.9037 -11.87478,5.92187 -33.64204,6.57569 -68.48165,3.5437 -102.75586,4.0957 -42.87828,0.69057 -93.34812,6.52037 -135.57053,-0.98242 -17.79033,-3.16129 -43.90403,-10.17243 -54.98437,-17.62891 z" + id="path4340" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csssssscccsssc" /> + </g> + <g + inkscape:groupmode="layer" + id="layer8" + inkscape:label="vim" + transform="translate(-15.732722,-256.54886)"> + <g + id="g4330"> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#005d04;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4293" + width="194.71968" + height="194.71968" + x="-29.381023" + y="744.44128" + transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" /> + <rect + transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" + y="753.35699" + x="-20.465342" + height="176.88821" + width="176.88821" + id="rect4283" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#019833;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <g + id="text4285" + style="font-style:normal;font-weight:normal;font-size:203.27047729px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#fefefe;fill-opacity:1;stroke:#005d04;stroke-width:4;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="matrix(1.0880646,0,-0.29154603,1.0880646,-528.83975,-369.0604)"> + <path + sodipodi:nodetypes="cccccccccccccccsc" + inkscape:connector-curvature="0" + id="path4324" + style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-family:Eczar;-inkscape-font-specification:'Eczar Ultra-Bold';fill:#fefefe;fill-opacity:1;stroke:#005d04;stroke-width:5.01092911;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 202.34975,1029.0537 -56.02157,-157.11507 -17.82505,-3.05571 0.25466,-14.0054 89.88914,0 1.52787,8.1486 c -2.7162,2.2069 -5.77193,4.32893 -9.16717,6.36609 -3.22549,2.03714 -6.70561,3.98941 -10.44038,5.85679 l 26.38345,87.17129 39.56921,-89.71773 -21.89934,-3.81964 0.25464,-14.0054 72.06411,0 -68.4991,168.82868 0.25465,0.2547 c -6.28122,1.0184 -13.49612,1.9522 -21.6447,2.8011 -8.14859,0.8487 -16.38207,1.6126 -24.70042,2.2917 z" /> + </g> + </g> + <use + x="0" + y="0" + xlink:href="#g4330" + id="use4338" + transform="matrix(0.4546439,-0.10745401,-0.02175104,0.44922994,711.99298,282.73776)" + width="100%" + height="100%" /> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="palette" + style="display:inline" + sodipodi:insensitive="true" + transform="translate(-15.732722,-256.54886)"> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4168);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4162" + width="40.789474" + height="40.789474" + x="779.60529" + y="21.967466" /> + <rect + y="21.967466" + x="824.60529" + height="40.789474" + width="40.789474" + id="rect4170" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4180);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052742;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bce8ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4208" + width="40.789474" + height="40.789474" + x="779.60529" + y="86.967468" /> + <rect + y="-127.75694" + x="824.60529" + height="40.789474" + width="40.789474" + id="rect4223" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#abccd9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + transform="scale(1,-1)" /> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b0cb;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4227" + width="40.789474" + height="40.789474" + x="779.60529" + y="131.96747" /> + <rect + y="131.96747" + x="824.60529" + height="40.789474" + width="40.789474" + id="rect4231" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e1d0cb;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f5c3d2;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4233" + width="40.789474" + height="40.789474" + x="869.60529" + y="131.96747" /> + <rect + y="176.96747" + x="779.60529" + height="40.789474" + width="40.789474" + id="rect4248" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cec4ad;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <rect + transform="scale(1,-1)" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#96d6ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4263" + width="40.789474" + height="40.789474" + x="869.60529" + y="-127.75694" /> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2ce;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4267" + width="40.789474" + height="40.789474" + x="824.60529" + y="176.96747" /> + <rect + y="-327.75693" + x="779.60529" + height="40.789474" + width="40.789474" + id="rect4280" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#24b8eb;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + transform="scale(1,-1)" /> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#8aa9ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4284" + width="40.789474" + height="40.789474" + x="824.60529" + y="286.96747" /> + <rect + y="331.96747" + x="779.60529" + height="40.789474" + width="40.789474" + id="rect4297" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4edf1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#394d54;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4301" + width="40.789474" + height="40.789474" + x="779.60529" + y="241.96747" /> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d6e2ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect4303" + width="40.789474" + height="40.789474" + x="824.60529" + y="331.96747" /> + </g> +</svg> diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index 33fccd3a..126ac807 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -18,8 +18,9 @@ function! go#cmd#Build(bang, ...) let goargs = map(copy(a:000), "expand(v:val)") " escape all shell arguments before we pass it to make - let goargs = go#util#Shelllist(goargs, 1) - + if !has('nvim') + let goargs = go#util#Shelllist(goargs, 1) + endif " create our command arguments. go build discards any results when it " compiles multiple packages. So we pass the `errors` package just as an " placeholder with the current folder (indicated with '.') diff --git a/sources_non_forked/vim-go/autoload/go/complete.vim b/sources_non_forked/vim-go/autoload/go/complete.vim index 5ebad4da..17834536 100644 --- a/sources_non_forked/vim-go/autoload/go/complete.vim +++ b/sources_non_forked/vim-go/autoload/go/complete.vim @@ -1,3 +1,5 @@ +let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix' + function! s:gocodeCurrentBuffer() let buf = getline(1, '$') if &encoding != 'utf-8' @@ -32,7 +34,7 @@ function! s:gocodeCommand(cmd, preargs, args) let old_gopath = $GOPATH let $GOPATH = go#path#Detect() - let socket_type = get(g:, 'go_gocode_socket_type', 'unix') + let socket_type = get(g:, 'go_gocode_socket_type', s:sock_type) let cmd = printf('%s -sock %s %s %s %s', \ go#util#Shellescape(bin_path), \ socket_type, diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim index 2c783939..b7e22a1c 100644 --- a/sources_non_forked/vim-go/autoload/go/def.vim +++ b/sources_non_forked/vim-go/autoload/go/def.vim @@ -113,8 +113,8 @@ function! s:jump_to_declaration(out, mode) " modes of switchbuf which we need based on the split mode let old_switchbuf = &switchbuf - let l:fname = fnamemodify(expand("%"), ':p:gs?\\?/?') - if filename != l:fname + normal! m' + if filename != fnamemodify(expand("%"), ':p:gs?\\?/?') " jump to existing buffer if, 1. we have enabled it, 2. the buffer is loaded " and 3. there is buffer window number we switch to if get(g:, 'go_def_reuse_buffer', 0) && bufloaded(filename) != 0 && bufwinnr(filename) != -1 @@ -134,7 +134,7 @@ function! s:jump_to_declaration(out, mode) endif " open the file and jump to line and column - exec 'edit '.filename + exec 'edit' filename endif call cursor(line, col) @@ -248,7 +248,7 @@ function! go#def#Stack(...) let target = s:go_stack[s:go_stack_level] " jump - exec 'edit '.target["file"] + exec 'edit' target["file"] call cursor(target["line"], target["col"]) normal! zz else diff --git a/sources_non_forked/vim-go/autoload/go/doc.vim b/sources_non_forked/vim-go/autoload/go/doc.vim index 70250109..a65351f3 100644 --- a/sources_non_forked/vim-go/autoload/go/doc.vim +++ b/sources_non_forked/vim-go/autoload/go/doc.vim @@ -85,6 +85,7 @@ function! go#doc#Open(newmode, mode, ...) endif let command = printf("%s %s", bin_path, join(a:000, ' ')) + let out = go#util#System(command) else " check if we have 'gogetdoc' and use it automatically let bin_path = go#path#CheckBinPath('gogetdoc') @@ -95,11 +96,27 @@ function! go#doc#Open(newmode, mode, ...) let offset = go#util#OffsetCursor() let fname = expand("%:p:gs!\\!/!") let pos = shellescape(fname.':#'.offset) - let command = printf("%s -pos %s", bin_path, pos) + + if &modified + " gogetdoc supports the same archive format as guru for dealing with + " modified buffers. + " use the -modified flag + " write each archive entry on stdin as: + " filename followed by newline + " file size followed by newline + " file contents + let in = "" + let sep = go#util#LineEnding() + let content = join(getline(1, '$'), sep) + let in = fname . "\n" . strlen(content) . "\n" . content + let command .= " -modified" + let out = go#util#System(command, in) + else + let out = go#util#System(command) + endif endif - let out = go#util#System(command) if go#util#ShellError() != 0 call go#util#EchoError(out) return diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim index e47b52d2..b55ba83d 100644 --- a/sources_non_forked/vim-go/autoload/go/fmt.vim +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim @@ -115,7 +115,7 @@ function! go#fmt#Format(withGoimport) if !exists('b:goimports_vendor_compatible') let out = go#util#System(bin_path . " --help") if out !~ "-srcdir" - call go#util#EchoWarning("vim-go: goimports does not support srcdir. update with: :GoUpdateBinaries") + call go#util#EchoWarning(printf("vim-go: goimports (%s) does not support srcdir. Update with: :GoUpdateBinaries", bin_path)) else let b:goimports_vendor_compatible = 1 endif diff --git a/sources_non_forked/vim-go/autoload/go/path.vim b/sources_non_forked/vim-go/autoload/go/path.vim index 16c4d926..75c46616 100644 --- a/sources_non_forked/vim-go/autoload/go/path.vim +++ b/sources_non_forked/vim-go/autoload/go/path.vim @@ -151,7 +151,7 @@ function! go#path#CheckBinPath(binpath) " if it's in PATH just return it if executable(binpath) - if v:version == 704 && has('patch235') + if exists('*exepath') let binpath = exepath(binpath) endif let $PATH = old_path diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 39d0b670..19682c42 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -582,8 +582,9 @@ CTRL-t Enables or disables automatic highlighting of |:GoSameIds| while moving the cursor. This basically toggles the option |'g:go_auto_sameids'| on/off. - If enabled it starts highlighting whenever your cursor is. If disabled it - clears and stops automatic highlighting. + If enabled it starts highlighting whenever your cursor is staying at the + same position for a configurable period of time (see 'updatetime'). If + disabled it clears and stops automatic highlighting. *:GoMetaLinter* :GoMetaLinter [path] @@ -695,8 +696,8 @@ CTRL-t Toggles |'g:go_asmfmt_autosave'|. - *:GoMetalinterAutoSaveToggle* -:GoMetalinterAutoSaveToggle + *:GoMetaLinterAutoSaveToggle* +:GoMetaLinterAutoSaveToggle Toggles |'g:go_metalinter_autosave'|. @@ -995,7 +996,8 @@ updated. By default it's disabled. *'g:go_auto_sameids'* Use this option to highlight all uses of the identifier under the cursor -(:GoSameIds) automatically. By default it's disabled. +(:GoSameIds) automatically. By default it's disabled. The delay can be +configured with the 'updatetime' setting. > let g:go_auto_sameids = 0 < @@ -1230,6 +1232,12 @@ Highlights field names. By default it's disabled. > Highlights build constraints. By default it's disabled. > let g:go_highlight_build_constraints = 0 +< + *'g:go_highlight_generate_tags'* + +Highlights go:generate directives. By default it's disabled. > + + let g:go_highlight_generate_tags = 0 < *'g:go_highlight_string_spellcheck'* @@ -1456,8 +1464,7 @@ Vim becomes slow while editing Go files~ Don't enable these options: > - let g:go_highlight_structs = 0 - let g:go_highlight_interfaces = 0 + let g:go_highlight_types = 0 let g:go_highlight_operators = 0 < diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim index 89c1a984..c54de24c 100644 --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim @@ -71,7 +71,7 @@ command! -nargs=* -bang -complete=customlist,go#package#Complete GoImportAs call " -- linters command! -nargs=* GoMetaLinter call go#lint#Gometa(0, <f-args>) -command! -nargs=0 GoMetalinterAutoSaveToggle call go#lint#ToggleMetaLinterAutoSave() +command! -nargs=0 GoMetaLinterAutoSaveToggle call go#lint#ToggleMetaLinterAutoSave() command! -nargs=* GoLint call go#lint#Golint(<f-args>) command! -nargs=* -bang GoVet call go#lint#Vet(<bang>0, <f-args>) command! -nargs=* -complete=customlist,go#package#Complete GoErrCheck call go#lint#Errcheck(<f-args>) diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim index 987485a0..e7e61ff3 100644 --- a/sources_non_forked/vim-go/syntax/go.vim +++ b/sources_non_forked/vim-go/syntax/go.vim @@ -125,12 +125,14 @@ hi def link goComplexes Type " Predefined functions and values -syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/ -syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/ -syn keyword goBoolean iota true false nil +syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/ +syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/ +syn keyword goBoolean true false +syn keyword goPredefinedIdentifiers nil iota -hi def link goBuiltins Keyword -hi def link goBoolean Boolean +hi def link goBuiltins Keyword +hi def link goBoolean Boolean +hi def link goPredefinedIdentifiers goBoolean " Comments; their contents syn keyword goTodo contained TODO FIXME XXX BUG @@ -175,7 +177,7 @@ else endif if g:go_highlight_format_strings != 0 - syn match goFormatSpecifier /%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)*[vTtbcdoqxXUeEfgGsp]/ contained containedin=goString + syn match goFormatSpecifier /\([^%]\(%%\)*\)\@<=%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)*[vTtbcdoqxXUeEfgGsp]/ contained containedin=goString hi def link goFormatSpecifier goSpecialString endif @@ -313,7 +315,7 @@ hi def link goMethod Type " Fields; if g:go_highlight_fields != 0 - syn match goField /\.\w\+\([\ \n\r\:\)\[,]\)\@=/hs=s+1 + syn match goField /\.\w\+\([.\ \n\r\:\)\[,]\)\@=/hs=s+1 endif hi def link goField Identifier diff --git a/sources_non_forked/vim-snipmate/autoload/snipMate.vim b/sources_non_forked/vim-snipmate/autoload/snipMate.vim index 74366fa8..76cc6481 100644 --- a/sources_non_forked/vim-snipmate/autoload/snipMate.vim +++ b/sources_non_forked/vim-snipmate/autoload/snipMate.vim @@ -488,8 +488,18 @@ fun! snipMate#WordBelowCursor() abort endf fun! snipMate#GetSnippetsForWordBelowCursorForComplete(word) abort - let snippets = map(snipMate#GetSnippetsForWordBelowCursor(a:word, 0), 'v:val[0]') - return filter(snippets, 'v:val =~# "\\V\\^' . escape(a:word, '"\') . '"') + let matches = snipMate#GetSnippetsForWordBelowCursor(a:word, 0) + let snippets = [] + for [trigger, dict] in matches + if get(g:snipMate, 'description_in_completion', 0) + call extend(snippets, map(keys(dict), + \ '{ "word" : trigger, "menu" : v:val, "dup" : 1 }')) + else + call add(snippets, { "word" : trigger }) + endif + endfor + return filter(snippets, + \ 'v:val.word =~# "\\V\\^' . escape(a:word, '"\') . '"') endf fun! snipMate#CanBeTriggered() abort diff --git a/sources_non_forked/vim-snipmate/doc/snipMate.txt b/sources_non_forked/vim-snipmate/doc/snipMate.txt index 230fe686..c97205a6 100644 --- a/sources_non_forked/vim-snipmate/doc/snipMate.txt +++ b/sources_non_forked/vim-snipmate/doc/snipMate.txt @@ -160,6 +160,12 @@ g:snipMate.override maps and other settings work. Note: Load order is determined by 'runtimepath'. +g:snipMate.description_in_completion + If set to 1 (default is 0), snippet + descriptions will be included in the popup + menu used for snippet completion, like with + <Plug>snipMateShow. + g:snipMate['no_match_completion_feedkeys_chars'] A string inserted when no match for a trigger is found. By default a tab is inserted diff --git a/sources_non_forked/vim-snippets/UltiSnips/all.snippets b/sources_non_forked/vim-snippets/UltiSnips/all.snippets index 0e286e5a..8b7079e2 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/all.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/all.snippets @@ -73,4 +73,27 @@ snippet modeline "Vim modeline" vim`!v ':set '. (&expandtab ? printf('et sw=%i ts=%i', &sw, &ts) : printf('noet sts=%i sw=%i ts=%i', &sts, &sw, &ts)) . (&tw ? ' tw='. &tw : '') . ':'` endsnippet +######### +# DATES # +######### +snippet date "YYYY-MM-DD" w +`date +%Y-%m-%d` +endsnippet + +snippet ddate "Month DD, YYYY" w +`date +%B\ %d,\ %Y` +endsnippet + +snippet diso "ISO format datetime" w +`date +%Y-%m-%dT%H:%M:%S%:z` +endsnippet + +snippet time "hh:mm" w +`date +%H:%M` +endsnippet + +snippet datetime "YYYY-MM-DD hh:mm" w +`date +%Y-%m-%d\ %H:%M` +endsnippet + # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/html.snippets b/sources_non_forked/vim-snippets/UltiSnips/html.snippets index 4e92a960..084d9f78 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/html.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/html.snippets @@ -239,6 +239,18 @@ snippet script "XHTML <script>" w </script> endsnippet +snippet span "<span>" w +<span> ${0:${VISUAL}} </span> +endsnippet + +snippet span. "<span> with class" w +<span`!p snip.rv=' class="' if t[1] else ""`${1:name}`!p snip.rv = '"' if t[1] else ""`> ${0:${VISUAL}} </span> +endsnippet + +snippet span# "<span> with ID & class" w +<span`!p snip.rv=' id="' if t[1] else ""`${1:name}`!p snip.rv = '"' if t[1] else ""``!p snip.rv=' class="' if t[2] else ""`${2:name}`!p snip.rv = '"' if t[2] else ""`> ${0:${VISUAL}} </span> +endsnippet + snippet style "XHTML <style>" w <style type="text/css" media="screen"> ${0:${VISUAL}} diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets index 4537baea..f468d0aa 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets @@ -46,7 +46,7 @@ for (var ${2:i} = ${1:Things.length} - 1; $2 >= 0; $2--) { } endsnippet -snippet fun "function (fun)" +snippet fun "function (fun)" w function ${1:function_name}(${2:argument}) { ${VISUAL}$0 } diff --git a/sources_non_forked/vim-snippets/snippets/elixir.snippets b/sources_non_forked/vim-snippets/snippets/elixir.snippets index 0a3efbdc..46ac7c86 100644 --- a/sources_non_forked/vim-snippets/snippets/elixir.snippets +++ b/sources_non_forked/vim-snippets/snippets/elixir.snippets @@ -48,6 +48,21 @@ snippet fori for ${1:item} <- ${2:items}, into: ${3} do ${0} end +snippet wi + with( + ${1:item} <- ${2:items} + ) do + ${0} + end +snippet wie + with( + ${1:item} <- ${2:items} + ) do + ${3} + else + ${4} -> + ${0} + end snippet df def ${1:name}, do: ${2} snippet def diff --git a/sources_non_forked/vim-snippets/snippets/eruby.snippets b/sources_non_forked/vim-snippets/snippets/eruby.snippets index adad8cb0..64f79ef3 100644 --- a/sources_non_forked/vim-snippets/snippets/eruby.snippets +++ b/sources_non_forked/vim-snippets/snippets/eruby.snippets @@ -1,6 +1,7 @@ # .erb and .rhmtl files # Includes html.snippets +extends html # Rails ***************************** snippet rc diff --git a/sources_non_forked/vim-snippets/snippets/javascript/bemjson.snippets b/sources_non_forked/vim-snippets/snippets/javascript/bemjson.snippets new file mode 100644 index 00000000..e96c70d9 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/javascript/bemjson.snippets @@ -0,0 +1,52 @@ +# Snippet for bemjson. https://en.bem.info/platform/bemjson/ + +# Blocks +snippet b + { + block : '${1:name}', + content : [ + '${2:content}' + ] + } + +# btc - BEM block with text content +snippet btc + { + block : '${1:name}', + content: '${2:content}' + } + +# bwm - BEM block with modifier. +snippet bwm + { + block : '${1:name}', + mods: { ${2:modName}: '${3:modVal}' }, + content : [ + '${4:content}' + ] + } + +# Elems + +# e - BEM elem +snippet e + { + elem : '${1:name}', + content : [ + '${2:content}' + ] + } + + +# mo - Mods +snippet mo + mods : { ${1:modName} : '${2:modVal}' }, + +mi - BEM mix mod +snippet mi + mix : [ { ${1:block} : '${2:block}' } ], + +# a - BEM attrs mod +snippet a + attrs : { ${1:attr} : '${2:val}' }, + diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets index db04e545..f24e6f77 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets @@ -262,6 +262,9 @@ snippet cd # console.error snippet ce console.error(${0}); +# console.warn +snippet cw + console.warn(${0}); # console.trace snippet ct console.trace(${0:label}); diff --git a/sources_non_forked/vim-snippets/snippets/lfe.snippets b/sources_non_forked/vim-snippets/snippets/lfe.snippets new file mode 100644 index 00000000..b716e6ef --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/lfe.snippets @@ -0,0 +1,18 @@ +snippet defmo + (defmodule ${1:`vim_snippets#Filename()`} + (export ${2:all})) + $0 +snippet def + (defun $1 ($2) + $0) +snippet ltest + (defmodule ${1:`vim_snippets#Filename()`} + (behaviour ltest-unit) + (export all)) + + (include-lib "ltest/include/ltest-macros.lfe") + + $0 +snippet test + (deftest $1 + $0) diff --git a/sources_non_forked/vim-snippets/snippets/perl.snippets b/sources_non_forked/vim-snippets/snippets/perl.snippets index 65120a25..2ed2932a 100644 --- a/sources_non_forked/vim-snippets/snippets/perl.snippets +++ b/sources_non_forked/vim-snippets/snippets/perl.snippets @@ -84,7 +84,9 @@ snippet fore ${1:expression} foreach @${2:array}; # Package snippet package - package ${1:`substitute(vim_snippets#Filename('', 'Page Title'), '^.', '\u&', '')`}; + package ${1:`expand('%:p:s?.*lib/??:r:gs?/?::?')`}; + use strict; + use warnings; ${0} @@ -93,7 +95,9 @@ snippet package __END__ # Package syntax perl >= 5.14 snippet packagev514 - package ${1:`substitute(vim_snippets#Filename('', 'Page Title'), '^.', '\u&', '')`} ${2:0.99}; + package ${1:`expand('%:p:s?.*lib/??:r:gs?/?::?')`} ${2:0.99}; + use v5.14; + use warnings; ${0} diff --git a/sources_non_forked/vim-snippets/snippets/stylus.snippets b/sources_non_forked/vim-snippets/snippets/stylus.snippets index 205f8479..3f54f781 100644 --- a/sources_non_forked/vim-snippets/snippets/stylus.snippets +++ b/sources_non_forked/vim-snippets/snippets/stylus.snippets @@ -379,6 +379,8 @@ snippet d:mis display -moz-inline-stack snippet d:b display block +snippet d:f + display flex snippet d:cp display compact snippet d:ib From 754e831d9e7e30bfdad1777d40c48ef337bac171 Mon Sep 17 00:00:00 2001 From: Chuan Jin <chuan.jin.813@gmail.com> Date: Mon, 24 Oct 2016 22:00:55 +0200 Subject: [PATCH 188/254] Update extended.vim Should be my_configs.vim with path --- vimrcs/extended.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vimrcs/extended.vim b/vimrcs/extended.vim index 499959a2..7d5bf3f9 100644 --- a/vimrcs/extended.vim +++ b/vimrcs/extended.vim @@ -36,7 +36,7 @@ colorscheme peaksea " => Fast editing and reloading of vimrc configs """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" map <leader>e :e! ~/.vim_runtime/my_configs.vim<cr> -autocmd! bufwritepost vimrc source ~/.vim_runtime/my_configs.vim +autocmd! bufwritepost ~/.vim_runtime/my_configs.vim source ~/.vim_runtime/my_configs.vim """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" From bf879c50251b5f3b1cf6c07b6c029bfff77cc2a6 Mon Sep 17 00:00:00 2001 From: Julen Pardo <julen.pardo@outlook.es> Date: Sun, 30 Oct 2016 14:55:53 +0100 Subject: [PATCH 189/254] Set HTML syntax for Twig files --- vimrcs/filetypes.vim | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vimrcs/filetypes.vim b/vimrcs/filetypes.vim index 8c4eb9db..f1e572f9 100644 --- a/vimrcs/filetypes.vim +++ b/vimrcs/filetypes.vim @@ -65,3 +65,9 @@ au FileType gitcommit call setpos('.', [0, 1, 1, 0]) if exists('$TMUX') set term=screen-256color endif + + +"""""""""""""""""""""""""""""" +" => Twig section +"""""""""""""""""""""""""""""" +autocmd BufRead *.twig set syntax=html filetype=html From 1494e2edfa68cd96251fbc09fcde4abd02c58778 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Wed, 9 Nov 2016 18:22:55 +0100 Subject: [PATCH 190/254] Updated vim plugins --- .../ctrlp.vim/autoload/ctrlp.vim | 40 +- sources_non_forked/ctrlp.vim/doc/ctrlp.cnx | 3 +- sources_non_forked/ctrlp.vim/doc/ctrlp.txt | 3 +- sources_non_forked/ctrlp.vim/plugin/ctrlp.vim | 2 +- sources_non_forked/lightline.vim/README.md | 104 ++--- .../lightline.vim/autoload/lightline.vim | 10 +- .../lightline/colorscheme/Dracula.vim | 36 ++ .../autoload/lightline/colorscheme/one.vim | 63 +++ .../lightline.vim/doc/lightline.txt | 110 ++--- sources_non_forked/nerdtree/CHANGELOG | 4 + sources_non_forked/nerdtree/README.markdown | 14 +- .../nerdtree/autoload/nerdtree.vim | 32 +- .../nerdtree/lib/nerdtree/nerdtree.vim | 4 + .../nerdtree/nerdtree_plugin/fs_menu.vim | 2 +- .../nerdtree/plugin/NERD_tree.vim | 4 +- .../nerdtree/syntax/nerdtree.vim | 4 +- sources_non_forked/syntastic/README.markdown | 92 ++-- .../syntastic/autoload/syntastic/log.vim | 4 +- .../syntastic/autoload/syntastic/util.vim | 44 +- .../syntastic/doc/syntastic-checkers.txt | 312 ++++++++++++- .../syntastic/doc/syntastic.txt | 81 ++-- .../syntastic/plugin/syntastic.vim | 57 ++- .../syntastic/plugin/syntastic/checker.vim | 47 +- .../syntastic/plugin/syntastic/loclist.vim | 8 +- .../syntastic/plugin/syntastic/modemap.vim | 11 +- .../syntastic/plugin/syntastic/registry.vim | 103 ++++- .../syntax_checkers/asciidoc/proselint.vim | 23 + .../syntax_checkers/haskell/ghc-mod.vim | 94 ---- .../syntax_checkers/help/proselint.vim | 23 + .../syntax_checkers/html/htmlhint.vim | 46 ++ .../syntax_checkers/html/proselint.vim | 23 + .../syntax_checkers/markdown/proselint.vim | 23 + .../syntastic/syntax_checkers/nasm/nasm.vim | 2 +- .../syntax_checkers/nroff/proselint.vim | 23 + .../syntax_checkers/pod/proselint.vim | 23 + .../syntax_checkers/rst/proselint.vim | 23 + .../syntax_checkers/tex/proselint.vim | 23 + .../syntax_checkers/texinfo/proselint.vim | 23 + .../syntax_checkers/text/proselint.vim | 45 ++ .../syntastic/syntax_checkers/vim/vimlint.vim | 3 +- .../syntax_checkers/xhtml/proselint.vim | 23 + sources_non_forked/tabular/.gitignore | 1 + sources_non_forked/tabular/LICENSE.md | 24 + sources_non_forked/tabular/README.md | 29 ++ .../tabular/after/plugin/TabularMaps.vim | 73 ++++ .../tabular/autoload/tabular.vim | 409 ++++++++++++++++++ sources_non_forked/tabular/doc/Tabular.txt | 260 +++++++++++ sources_non_forked/tabular/plugin/Tabular.vim | 346 +++++++++++++++ sources_non_forked/vim-flake8/README.mdown | 14 + .../vim-fugitive/plugin/fugitive.vim | 8 +- sources_non_forked/vim-go/CHANGELOG.md | 10 + sources_non_forked/vim-go/LICENSE | 2 + .../vim-go/autoload/go/complete.vim | 5 + sources_non_forked/vim-go/autoload/go/def.vim | 2 - .../vim-go/autoload/go/tool.vim | 3 + .../vim-go/autoload/go/util.vim | 25 ++ sources_non_forked/vim-go/doc/vim-go.txt | 6 + sources_non_forked/vim-go/plugin/go.vim | 4 + sources_non_forked/vim-go/syntax/go.vim | 8 +- sources_non_forked/vim-pug/syntax/pug.vim | 8 +- .../vim-snippets/UltiSnips/all.snippets | 4 +- .../vim-snippets/UltiSnips/html.snippets | 6 +- .../UltiSnips/javascript.snippets | 10 - .../UltiSnips/php-laravel.snippets | 8 +- .../UltiSnips/php-symfony2.snippets | 2 +- .../vim-snippets/pythonx/vimsnippets.py | 2 +- .../vim-snippets/snippets/arduino.snippets | 32 +- .../vim-snippets/snippets/c.snippets | 10 +- .../vim-snippets/snippets/elixir.snippets | 4 + .../vim-snippets/snippets/html.snippets | 2 + .../vim-snippets/snippets/java.snippets | 8 + ...n.snippets => javascript-bemjson.snippets} | 2 +- ...ipt.d3.snippets => javascript-d3.snippets} | 0 .../snippets/javascript-mocha.snippets | 4 + .../snippets/javascript.es6.react.snippets | 81 ++++ .../javascript/javascript-react.snippets | 83 ++++ .../javascript/javascript.es6.snippets | 24 + .../snippets/javascript/javascript.snippets | 19 +- .../vim-snippets/snippets/php.snippets | 12 +- .../vim-snippets/snippets/ps1.snippets | 58 +++ .../vim-snippets/snippets/stylus.snippets | 4 + 81 files changed, 2756 insertions(+), 470 deletions(-) create mode 100644 sources_non_forked/lightline.vim/autoload/lightline/colorscheme/Dracula.vim create mode 100644 sources_non_forked/lightline.vim/autoload/lightline/colorscheme/one.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/asciidoc/proselint.vim delete mode 100644 sources_non_forked/syntastic/syntax_checkers/haskell/ghc-mod.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/help/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/html/htmlhint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/html/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/markdown/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/nroff/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/pod/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/rst/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/tex/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/texinfo/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/text/proselint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/xhtml/proselint.vim create mode 100644 sources_non_forked/tabular/.gitignore create mode 100644 sources_non_forked/tabular/LICENSE.md create mode 100644 sources_non_forked/tabular/README.md create mode 100644 sources_non_forked/tabular/after/plugin/TabularMaps.vim create mode 100644 sources_non_forked/tabular/autoload/tabular.vim create mode 100644 sources_non_forked/tabular/doc/Tabular.txt create mode 100644 sources_non_forked/tabular/plugin/Tabular.vim rename sources_non_forked/vim-snippets/snippets/{javascript/bemjson.snippets => javascript-bemjson.snippets} (97%) rename sources_non_forked/vim-snippets/snippets/{javascript/javascript.d3.snippets => javascript-d3.snippets} (100%) create mode 100644 sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/javascript/javascript-react.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/ps1.snippets diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index 568b0f3a..b6cd9a62 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -98,6 +98,7 @@ let [s:pref, s:bpref, s:opts, s:new_opts, s:lc_opts] = \ 'bufname_mod': ['s:bufname_mod', ':t'], \ 'bufpath_mod': ['s:bufpath_mod', ':~:.:h'], \ 'formatline_func': ['s:flfunc', 's:formatline(v:val)'], + \ 'user_command_async': ['s:usrcmdasync', 0], \ }, { \ 'open_multiple_files': 's:opmul', \ 'regexp': 's:regexp', @@ -212,11 +213,13 @@ el en let g:ctrlp_builtins = len(g:ctrlp_types)-1 -let s:coretypes = filter([ - \ ['files', 'fil'], - \ ['buffers', 'buf'], - \ ['mru files', 'mru'], -\ ], 'index(g:ctrlp_types, v:val[1])!=-1') +let s:coretype_names = { + \ 'fil' : 'files', + \ 'buf' : 'buffers', + \ 'mru' : 'mru files', + \ } + +let s:coretypes = map(copy(g:ctrlp_types), '[s:coretype_names[v:val], v:val]') " Get the options {{{2 fu! s:opts(...) @@ -326,11 +329,11 @@ fu! s:Open() cal s:setupblank() endf -fu! s:Close(exit) +fu! s:Close() cal s:buffunc(0) if winnr('$') == 1 bw! - elsei a:exit + el try | bun! cat | clo! | endt cal s:unmarksigns() @@ -431,6 +434,11 @@ fu! s:GlobPath(dirs, depth) en endf +fu! ctrlp#addfile(ch, file) + call add(g:ctrlp_allfiles, a:file) + cal s:BuildPrompt(1) +endf + fu! s:UserCmd(lscmd) let [path, lscmd] = [s:dyncwd, a:lscmd] let do_ign = @@ -446,7 +454,13 @@ fu! s:UserCmd(lscmd) if (has('win32') || has('win64')) && match(&shell, 'sh') != -1 let path = tr(path, '\', '/') en - if has('patch-7.4-597') && !(has('win32') || has('win64')) + if s:usrcmdasync && v:version >= 800 && exists('*job_start') + if exists('s:job') + call job_stop(s:job) + en + let g:ctrlp_allfiles = [] + let s:job = job_start([&shell, &shellcmdflag, printf(lscmd, path)], {'callback': 'ctrlp#addfile'}) + elsei has('patch-7.4-597') && !(has('win32') || has('win64')) let g:ctrlp_allfiles = systemlist(printf(lscmd, path)) el let g:ctrlp_allfiles = split(system(printf(lscmd, path)), "\n") @@ -658,7 +672,7 @@ fu! s:Update(str) let pat = s:matcher == {} ? s:SplitPattern(str) : str let lines = s:nolim == 1 && empty(str) ? copy(g:ctrlp_lines) \ : s:MatchedItems(g:ctrlp_lines, pat, s:mw_res) - if empty(str) | call clearmatches() | en + if empty(str) | cal clearmatches() | en cal s:Render(lines, pat) return lines endf @@ -923,7 +937,7 @@ fu! s:PrtExit() let bw = bufwinnr('%') exe bufwinnr(s:bufnr).'winc w' if bufnr('%') == s:bufnr && bufname('%') == 'ControlP' - noa cal s:Close(1) + noa cal s:Close() noa winc p els exe bw.'winc w' @@ -2562,6 +2576,10 @@ fu! ctrlp#init(type, ...) cal s:SetWD(a:0 ? a:1 : {}) cal s:MapNorms() cal s:MapSpecs() + if empty(g:ctrlp_types) && empty(g:ctrlp_ext_vars) + call ctrlp#exit() + retu + en if type(a:type) == 0 let type = a:type el @@ -2588,7 +2606,7 @@ if has('autocmd') aug CtrlPAug au! au BufEnter ControlP cal s:checkbuf() - au BufLeave ControlP noa cal s:Close(0) + au BufLeave ControlP noa cal s:Close() au VimLeavePre * cal s:leavepre() aug END en diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx b/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx index ac4fa3b6..c2d69729 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx @@ -885,7 +885,8 @@ MRU mode options:~ 在匹é…窗å£å’Œæ示符é¢æ¿ä¹‹é—´åˆ‡æ¢ç„¦ç‚¹ã€‚ <esc>, - <c-c> + <c-c>, + <c-g> 退出CtrlP。 移动:~ diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt index 416fd000..012e7beb 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt @@ -943,7 +943,8 @@ Once inside the prompt:~ Toggle the focus between the match window and the prompt. <esc>, - <c-c> + <c-c>, + <c-g> Exit CtrlP. Moving:~ diff --git a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim index 5ab368aa..f31b64a2 100644 --- a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim @@ -17,7 +17,7 @@ let [g:ctrlp_lines, g:ctrlp_allfiles, g:ctrlp_alltags, g:ctrlp_alldirs, if !exists('g:ctrlp_map') | let g:ctrlp_map = '<c-p>' | en if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en -com! -n=? -com=dir CtrlP cal ctrlp#init('fil', { 'dir': <q-args> }) +com! -n=? -com=dir CtrlP cal ctrlp#init(0, { 'dir': <q-args> }) com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init('mru', { 'dir': <q-args> }) com! -bar CtrlPBuffer cal ctrlp#init('buf') diff --git a/sources_non_forked/lightline.vim/README.md b/sources_non_forked/lightline.vim/README.md index 31f79fda..2b80f35b 100644 --- a/sources_non_forked/lightline.vim/README.md +++ b/sources_non_forked/lightline.vim/README.md @@ -415,15 +415,15 @@ let g:lightline = { \ [ 'fugitive', 'readonly', 'filename', 'modified' ] ] \ }, \ 'component_function': { - \ 'fugitive': 'LightLineFugitive', - \ 'readonly': 'LightLineReadonly', - \ 'modified': 'LightLineModified' + \ 'fugitive': 'LightlineFugitive', + \ 'readonly': 'LightlineReadonly', + \ 'modified': 'LightlineModified' \ }, \ 'separator': { 'left': '⮀', 'right': '⮂' }, \ 'subseparator': { 'left': 'â®', 'right': '⮃' } \ } -function! LightLineModified() +function! LightlineModified() if &filetype == "help" return "" elseif &modified @@ -435,7 +435,7 @@ function! LightLineModified() endif endfunction -function! LightLineReadonly() +function! LightlineReadonly() if &filetype == "help" return "" elseif &readonly @@ -445,7 +445,7 @@ function! LightLineReadonly() endif endfunction -function! LightLineFugitive() +function! LightlineFugitive() return exists('*fugitive#head') ? fugitive#head() : '' endfunction ``` @@ -464,16 +464,16 @@ let g:lightline = { \ [ 'fugitive', 'filename' ] ] \ }, \ 'component_function': { - \ 'fugitive': 'LightLineFugitive', - \ 'readonly': 'LightLineReadonly', - \ 'modified': 'LightLineModified', - \ 'filename': 'LightLineFilename' + \ 'fugitive': 'LightlineFugitive', + \ 'readonly': 'LightlineReadonly', + \ 'modified': 'LightlineModified', + \ 'filename': 'LightlineFilename' \ }, \ 'separator': { 'left': '⮀', 'right': '⮂' }, \ 'subseparator': { 'left': 'â®', 'right': '⮃' } \ } -function! LightLineModified() +function! LightlineModified() if &filetype == "help" return "" elseif &modified @@ -485,7 +485,7 @@ function! LightLineModified() endif endfunction -function! LightLineReadonly() +function! LightlineReadonly() if &filetype == "help" return "" elseif &readonly @@ -495,21 +495,21 @@ function! LightLineReadonly() endif endfunction -function! LightLineFugitive() +function! LightlineFugitive() return exists('*fugitive#head') ? fugitive#head() : '' endfunction -function! LightLineFilename() - return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . +function! LightlineFilename() + return ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') . \ ('' != expand('%:t') ? expand('%:t') : '[No Name]') . - \ ('' != LightLineModified() ? ' ' . LightLineModified() : '') + \ ('' != LightlineModified() ? ' ' . LightlineModified() : '') endfunction ``` ![lightline.vim - tutorial](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/tutorial/14.png) Oops! We forgot the cool mark for the branch component! (work with the patched font for vim-powerline) ```vim -function! LightLineFugitive() +function! LightlineFugitive() if exists("*fugitive#head") let branch = fugitive#head() return branch !=# '' ? 'â­  '.branch : '' @@ -528,7 +528,7 @@ let g:lightline = { \ 'left': [ [ 'mode', 'paste' ], \ [ 'my_component' ] ] }, \ 'component_function': { - \ 'my_component': 'LightLineComponent', ... + \ 'my_component': 'LightlineComponent', ... ``` This is the end of the tutorial. For more information, see `:help lightline`. Good luck with your nice statuslines. @@ -555,37 +555,37 @@ let g:lightline = { \ 'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ] ] \ }, \ 'component_function': { - \ 'modified': 'LightLineModified', - \ 'readonly': 'LightLineReadonly', - \ 'fugitive': 'LightLineFugitive', - \ 'filename': 'LightLineFilename', - \ 'fileformat': 'LightLineFileformat', - \ 'filetype': 'LightLineFiletype', - \ 'fileencoding': 'LightLineFileencoding', - \ 'mode': 'LightLineMode', + \ 'modified': 'LightlineModified', + \ 'readonly': 'LightlineReadonly', + \ 'fugitive': 'LightlineFugitive', + \ 'filename': 'LightlineFilename', + \ 'fileformat': 'LightlineFileformat', + \ 'filetype': 'LightlineFiletype', + \ 'fileencoding': 'LightlineFileencoding', + \ 'mode': 'LightlineMode', \ }, \ 'separator': { 'left': '⮀', 'right': '⮂' }, \ 'subseparator': { 'left': 'â®', 'right': '⮃' } \ } -function! LightLineModified() +function! LightlineModified() return &ft =~ 'help\|vimfiler\|gundo' ? '' : &modified ? '+' : &modifiable ? '' : '-' endfunction -function! LightLineReadonly() +function! LightlineReadonly() return &ft !~? 'help\|vimfiler\|gundo' && &readonly ? 'â­¤' : '' endfunction -function! LightLineFilename() - return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . +function! LightlineFilename() + return ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') . \ (&ft == 'vimfiler' ? vimfiler#get_status_string() : \ &ft == 'unite' ? unite#get_status_string() : \ &ft == 'vimshell' ? vimshell#get_status_string() : \ '' != expand('%:t') ? expand('%:t') : '[No Name]') . - \ ('' != LightLineModified() ? ' ' . LightLineModified() : '') + \ ('' != LightlineModified() ? ' ' . LightlineModified() : '') endfunction -function! LightLineFugitive() +function! LightlineFugitive() if &ft !~? 'vimfiler\|gundo' && exists("*fugitive#head") let branch = fugitive#head() return branch !=# '' ? 'â­  '.branch : '' @@ -593,19 +593,19 @@ function! LightLineFugitive() return '' endfunction -function! LightLineFileformat() +function! LightlineFileformat() return winwidth(0) > 70 ? &fileformat : '' endfunction -function! LightLineFiletype() +function! LightlineFiletype() return winwidth(0) > 70 ? (&filetype !=# '' ? &filetype : 'no ft') : '' endfunction -function! LightLineFileencoding() +function! LightlineFileencoding() return winwidth(0) > 70 ? (&fenc !=# '' ? &fenc : &enc) : '' endfunction -function! LightLineMode() +function! LightlineMode() return winwidth(0) > 60 ? lightline#mode() : '' endfunction ``` @@ -640,12 +640,12 @@ let g:lightline = { \ 'right': [ [ 'syntastic', 'lineinfo' ], ['percent'], [ 'fileformat', 'fileencoding', 'filetype' ] ] \ }, \ 'component_function': { - \ 'fugitive': 'LightLineFugitive', - \ 'filename': 'LightLineFilename', - \ 'fileformat': 'LightLineFileformat', - \ 'filetype': 'LightLineFiletype', - \ 'fileencoding': 'LightLineFileencoding', - \ 'mode': 'LightLineMode', + \ 'fugitive': 'LightlineFugitive', + \ 'filename': 'LightlineFilename', + \ 'fileformat': 'LightlineFileformat', + \ 'filetype': 'LightlineFiletype', + \ 'fileencoding': 'LightlineFileencoding', + \ 'mode': 'LightlineMode', \ 'ctrlpmark': 'CtrlPMark', \ }, \ 'component_expand': { @@ -657,15 +657,15 @@ let g:lightline = { \ 'subseparator': { 'left': '|', 'right': '|' } \ } -function! LightLineModified() +function! LightlineModified() return &ft =~ 'help' ? '' : &modified ? '+' : &modifiable ? '' : '-' endfunction -function! LightLineReadonly() +function! LightlineReadonly() return &ft !~? 'help' && &readonly ? 'RO' : '' endfunction -function! LightLineFilename() +function! LightlineFilename() let fname = expand('%:t') return fname == 'ControlP' && has_key(g:lightline, 'ctrlp_item') ? g:lightline.ctrlp_item : \ fname == '__Tagbar__' ? g:lightline.fname : @@ -673,12 +673,12 @@ function! LightLineFilename() \ &ft == 'vimfiler' ? vimfiler#get_status_string() : \ &ft == 'unite' ? unite#get_status_string() : \ &ft == 'vimshell' ? vimshell#get_status_string() : - \ ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . + \ ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') . \ ('' != fname ? fname : '[No Name]') . - \ ('' != LightLineModified() ? ' ' . LightLineModified() : '') + \ ('' != LightlineModified() ? ' ' . LightlineModified() : '') endfunction -function! LightLineFugitive() +function! LightlineFugitive() try if expand('%:t') !~? 'Tagbar\|Gundo\|NERD' && &ft !~? 'vimfiler' && exists('*fugitive#head') let mark = '' " edit here for cool mark @@ -690,19 +690,19 @@ function! LightLineFugitive() return '' endfunction -function! LightLineFileformat() +function! LightlineFileformat() return winwidth(0) > 70 ? &fileformat : '' endfunction -function! LightLineFiletype() +function! LightlineFiletype() return winwidth(0) > 70 ? (&filetype !=# '' ? &filetype : 'no ft') : '' endfunction -function! LightLineFileencoding() +function! LightlineFileencoding() return winwidth(0) > 70 ? (&fenc !=# '' ? &fenc : &enc) : '' endfunction -function! LightLineMode() +function! LightlineMode() let fname = expand('%:t') return fname == '__Tagbar__' ? 'Tagbar' : \ fname == 'ControlP' ? 'CtrlP' : diff --git a/sources_non_forked/lightline.vim/autoload/lightline.vim b/sources_non_forked/lightline.vim/autoload/lightline.vim index 14d1d2ab..2bb89b8c 100644 --- a/sources_non_forked/lightline.vim/autoload/lightline.vim +++ b/sources_non_forked/lightline.vim/autoload/lightline.vim @@ -2,7 +2,7 @@ " Filename: autoload/lightline.vim " Author: itchyny " License: MIT License -" Last Change: 2016/09/04 13:01:40. +" Last Change: 2016/10/05 08:00:00. " ============================================================================= let s:save_cpo = &cpo @@ -191,10 +191,6 @@ function! lightline#colorscheme() abort let s:lightline.colorscheme = 'default' let s:lightline.palette = g:lightline#colorscheme#{s:lightline.colorscheme}#palette finally - let s:highlight = {} - call lightline#highlight('normal') - call lightline#link() - let s:_ = 0 if has('win32') && !has('gui_running') && &t_Co < 256 for u in values(s:lightline.palette) for v in values(u) @@ -204,6 +200,10 @@ function! lightline#colorscheme() abort endfor endfor endif + let s:highlight = {} + call lightline#highlight('normal') + call lightline#link() + let s:_ = 0 endtry endfunction diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/Dracula.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/Dracula.vim new file mode 100644 index 00000000..42f83f69 --- /dev/null +++ b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/Dracula.vim @@ -0,0 +1,36 @@ +" ============================================================================= +" Filename: autoload/lightline/colorscheme/Dracula.vim +" Author: itchyny +" License: MIT License +" Last Change: 2016/11/06 01:08:03. +" ============================================================================= + +let s:black = [ '#282a36', 235 ] +let s:gray = [ '#44475a', 236 ] +let s:white = [ '#f8f8f2', 231 ] +let s:darkblue = [ '#6272a4', 61 ] +let s:cyan = [ '#8be9fd', 117 ] +let s:green = [ '#50fa7b', 84 ] +let s:orange = [ '#ffb86c', 215 ] +let s:purple = [ '#bd93f9', 141 ] +let s:red = [ '#ff79c6', 212 ] +let s:yellow = [ '#f1fa8c', 228 ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:black, s:purple ], [ s:cyan, s:gray ] ] +let s:p.normal.right = [ [ s:black, s:purple ], [ s:white, s:darkblue ] ] +let s:p.inactive.right = [ [ s:black, s:gray ], [ s:white, s:black ] ] +let s:p.inactive.left = [ [ s:cyan, s:black ], [ s:white, s:black ] ] +let s:p.insert.left = [ [ s:black, s:green ], [ s:cyan, s:gray ] ] +let s:p.replace.left = [ [ s:black, s:red ], [ s:cyan, s:gray ] ] +let s:p.visual.left = [ [ s:black, s:orange ], [ s:cyan, s:gray ] ] +let s:p.normal.middle = [ [ s:white, s:gray ] ] +let s:p.inactive.middle = [ [ s:white, s:gray ] ] +let s:p.tabline.left = [ [ s:darkblue, s:gray ] ] +let s:p.tabline.tabsel = [ [ s:cyan, s:black ] ] +let s:p.tabline.middle = [ [ s:darkblue, s:gray ] ] +let s:p.tabline.right = copy(s:p.normal.right) +let s:p.normal.error = [ [ s:red, s:black ] ] +let s:p.normal.warning = [ [ s:yellow, s:black ] ] + +let g:lightline#colorscheme#Dracula#palette = lightline#colorscheme#flatten(s:p) diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/one.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/one.vim new file mode 100644 index 00000000..f50de8c1 --- /dev/null +++ b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/one.vim @@ -0,0 +1,63 @@ +" ============================================================================= +" Filename: autoload/lightline/colorscheme/one.vim +" Author: Zoltan Dalmadi +" License: MIT License +" Last Change: 2016/11/2 17:34:27. +" ============================================================================= + +" Common colors +let s:fg = '#abb2bf' +let s:blue = '#61afef' +let s:green = '#98c379' +let s:purple = '#c678dd' +let s:red1 = '#e06c75' +let s:red2 = '#be5046' +let s:yellow = '#e5c07b' + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} + +if &background ==# 'light' + " Light variant + let s:bg = '#fafafa' + let s:gray1 = '#494b53' + let s:gray2 = '#f0f0f0' + let s:gray3 = '#d0d0d0' + + let s:p.normal.left = [ [ s:bg, s:green, 'bold' ], [ s:gray1, s:gray3 ] ] + let s:p.normal.middle = [ [ s:gray1, s:gray2 ] ] + let s:p.inactive.left = [ [ s:bg, s:gray3 ], [ s:bg, s:gray3 ] ] + let s:p.inactive.middle = [ [ s:gray3, s:gray2 ] ] + let s:p.inactive.right = [ [ s:bg, s:gray3 ], [ s:bg, s:gray3 ] ] + let s:p.insert.left = [ [ s:bg, s:blue, 'bold' ], [ s:gray1, s:gray3 ] ] + let s:p.replace.left = [ [ s:bg, s:red1, 'bold' ], [ s:gray1, s:gray3 ] ] + let s:p.visual.left = [ [ s:bg, s:purple, 'bold' ], [ s:gray1, s:gray3 ] ] +else + " Dark variant + let s:bg = '#282c34' + let s:gray1 = '#5c6370' + let s:gray2 = '#2c323d' + let s:gray3 = '#3e4452' + + let s:p.normal.left = [ [ s:bg, s:green, 'bold' ], [ s:fg, s:gray3 ] ] + let s:p.normal.middle = [ [ s:fg, s:gray2 ] ] + let s:p.inactive.left = [ [ s:gray1, s:bg ], [ s:gray1, s:bg ] ] + let s:p.inactive.middle = [ [ s:gray1, s:gray2 ] ] + let s:p.inactive.right = [ [ s:gray1, s:bg ], [ s:gray1, s:bg ] ] + let s:p.insert.left = [ [ s:bg, s:blue, 'bold' ], [ s:fg, s:gray3 ] ] + let s:p.replace.left = [ [ s:bg, s:red1, 'bold' ], [ s:fg, s:gray3 ] ] + let s:p.visual.left = [ [ s:bg, s:purple, 'bold' ], [ s:fg, s:gray3 ] ] +endif + +" Common +let s:p.normal.right = [ [ s:bg, s:green, 'bold' ], [ s:bg, s:green, 'bold' ] ] +let s:p.normal.error = [ [ s:red2, s:bg ] ] +let s:p.normal.warning = [ [ s:yellow, s:bg ] ] +let s:p.insert.right = [ [ s:bg, s:blue, 'bold' ], [ s:bg, s:blue, 'bold' ] ] +let s:p.replace.right = [ [ s:bg, s:red1, 'bold' ], [ s:bg, s:red1, 'bold' ] ] +let s:p.visual.right = [ [ s:bg, s:purple, 'bold' ], [ s:bg, s:purple, 'bold' ] ] +let s:p.tabline.left = [ [ s:bg, s:gray3 ] ] +let s:p.tabline.tabsel = [ [ s:bg, s:purple, 'bold' ] ] +let s:p.tabline.middle = [ [ s:gray3, s:gray2 ] ] +let s:p.tabline.right = copy(s:p.normal.right) + +let g:lightline#colorscheme#one#palette = lightline#colorscheme#fill(s:p) diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index f4bc29be..b86be500 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -4,7 +4,7 @@ Version: 0.1 Author: itchyny (https://github.com/itchyny) License: MIT License Repository: https://github.com/itchyny/lightline.vim -Last Change: 2016/09/13 23:56:56. +Last Change: 2016/10/24 08:12:28. CONTENTS *lightline-contents* @@ -151,10 +151,10 @@ OPTIONS *lightline-option* \ [ 'myreadonly', 'filename', 'modified' ] ], \ }, \ 'component_function': { - \ 'myreadonly': 'LightLineReadonly' + \ 'myreadonly': 'LightlineReadonly' \ }, \ } - function! LightLineReadonly() + function! LightlineReadonly() return &ft !~? 'help' && &readonly ? 'RO' : '' endfunction < @@ -223,7 +223,7 @@ OPTIONS *lightline-option* The colorscheme for lightline.vim. Currently, wombat, solarized, powerline, jellybeans, Tomorrow, Tomorrow_Night, Tomorrow_Night_Blue, Tomorrow_Night_Eighties, - PaperColor, seoul256, landscape and 16color are available. + PaperColor, seoul256, landscape, one, Dracula, and 16color are available. The default value is: > let g:lightline.colorscheme = 'default' @@ -299,16 +299,16 @@ nice. \ 'lineinfo': 'î‚¡ %3l:%-2v', \ }, \ 'component_function': { - \ 'readonly': 'LightLineReadonly', - \ 'fugitive': 'LightLineFugitive' + \ 'readonly': 'LightlineReadonly', + \ 'fugitive': 'LightlineFugitive' \ }, \ 'separator': { 'left': 'î‚°', 'right': '' }, \ 'subseparator': { 'left': '', 'right': '' } \ } - function! LightLineReadonly() + function! LightlineReadonly() return &readonly ? 'î‚¢' : '' endfunction - function! LightLineFugitive() + function! LightlineFugitive() if exists('*fugitive#head') let branch = fugitive#head() return branch !=# '' ? 'î‚ '.branch : '' @@ -324,16 +324,16 @@ look nice. \ 'lineinfo': 'â­¡ %3l:%-2v', \ }, \ 'component_function': { - \ 'readonly': 'LightLineReadonly', - \ 'fugitive': 'LightLineFugitive' + \ 'readonly': 'LightlineReadonly', + \ 'fugitive': 'LightlineFugitive' \ }, \ 'separator': { 'left': '⮀', 'right': '⮂' }, \ 'subseparator': { 'left': 'â®', 'right': '⮃' } \ } - function! LightLineReadonly() + function! LightlineReadonly() return &readonly ? 'â­¤' : '' endfunction - function! LightLineFugitive() + function! LightlineFugitive() if exists('*fugitive#head') let branch = fugitive#head() return branch !=# '' ? 'â­  '.branch : '' @@ -655,22 +655,22 @@ In order to define your own component: \ 'left': [ [ 'mode', 'paste' ], [ 'myfilename' ] ] \ }, \ 'component_function': { - \ 'myfilename': 'LightLineFilename', - \ 'myreadonly': 'LightLineReadonly', - \ 'mymodified': 'LightLineModified', + \ 'myfilename': 'LightlineFilename', + \ 'myreadonly': 'LightlineReadonly', + \ 'mymodified': 'LightlineModified', \ } \ } - function! LightLineFilename() - return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . + function! LightlineFilename() + return ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') . \ (&ft == 'vimfiler' ? vimfiler#get_status_string() : \ &ft == 'unite' ? unite#get_status_string() : \ '' != expand('%:t') ? expand('%:t') : '[No Name]') . - \ ('' != LightLineModified() ? ' ' . LightLineModified() : '') + \ ('' != LightlineModified() ? ' ' . LightlineModified() : '') endfunction - function! LightLineReadonly() + function! LightlineReadonly() return &ft !~? 'help' && &readonly ? 'RO' : '' endfunction - function! LightLineModified() + function! LightlineModified() return &modifiable && &modified ? '+' : '' endfunction < @@ -710,25 +710,25 @@ A nice example for non-patched font users. \ 'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ] ] \ }, \ 'component_function': { - \ 'fugitive': 'LightLineFugitive', - \ 'filename': 'LightLineFilename' + \ 'fugitive': 'LightlineFugitive', + \ 'filename': 'LightlineFilename' \ } \ } - function! LightLineModified() + function! LightlineModified() return &ft =~ 'help\|vimfiler' ? '' : &modified ? '+' : &modifiable ? '' : '-' endfunction - function! LightLineReadonly() + function! LightlineReadonly() return &ft !~? 'help\|vimfiler' && &readonly ? 'RO' : '' endfunction - function! LightLineFilename() - return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . + function! LightlineFilename() + return ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') . \ (&ft == 'vimfiler' ? vimfiler#get_status_string() : \ &ft == 'unite' ? unite#get_status_string() : \ &ft == 'vimshell' ? vimshell#get_status_string() : \ '' != expand('%:t') ? expand('%:t') : '[No Name]') . - \ ('' != LightLineModified() ? ' ' . LightLineModified() : '') + \ ('' != LightlineModified() ? ' ' . LightlineModified() : '') endfunction - function! LightLineFugitive() + function! LightlineFugitive() if &ft !~? 'vimfiler' && exists('*fugitive#head') return fugitive#head() endif @@ -743,27 +743,27 @@ A nice example for |vim-powerline| font users: \ 'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ] ] \ }, \ 'component_function': { - \ 'fugitive': 'LightLineFugitive', - \ 'filename': 'LightLineFilename' + \ 'fugitive': 'LightlineFugitive', + \ 'filename': 'LightlineFilename' \ }, \ 'separator': { 'left': '⮀', 'right': '⮂' }, \ 'subseparator': { 'left': 'â®', 'right': '⮃' } \ } - function! LightLineModified() + function! LightlineModified() return &ft =~ 'help\|vimfiler' ? '' : &modified ? '+' : &modifiable ? '' : '-' endfunction - function! LightLineReadonly() + function! LightlineReadonly() return &ft !~? 'help\|vimfiler' && &readonly ? 'â­¤' : '' endfunction - function! LightLineFilename() - return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . + function! LightlineFilename() + return ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') . \ (&ft == 'vimfiler' ? vimfiler#get_status_string() : \ &ft == 'unite' ? unite#get_status_string() : \ &ft == 'vimshell' ? vimshell#get_status_string() : \ '' != expand('%:t') ? expand('%:t') : '[No Name]') . - \ ('' != LightLineModified() ? ' ' . LightLineModified() : '') + \ ('' != LightlineModified() ? ' ' . LightlineModified() : '') endfunction - function! LightLineFugitive() + function! LightlineFugitive() if &ft !~? 'vimfiler' && exists('*fugitive#head') let branch = fugitive#head() return branch !=# '' ? 'â­  '.branch : '' @@ -784,12 +784,12 @@ For users who uses lots of plugins: \ 'right': [ [ 'syntastic', 'lineinfo' ], ['percent'], [ 'fileformat', 'fileencoding', 'filetype' ] ] \ }, \ 'component_function': { - \ 'fugitive': 'LightLineFugitive', - \ 'filename': 'LightLineFilename', - \ 'fileformat': 'LightLineFileformat', - \ 'filetype': 'LightLineFiletype', - \ 'fileencoding': 'LightLineFileencoding', - \ 'mode': 'LightLineMode', + \ 'fugitive': 'LightlineFugitive', + \ 'filename': 'LightlineFilename', + \ 'fileformat': 'LightlineFileformat', + \ 'filetype': 'LightlineFiletype', + \ 'fileencoding': 'LightlineFileencoding', + \ 'mode': 'LightlineMode', \ 'ctrlpmark': 'CtrlPMark', \ }, \ 'component_expand': { @@ -801,15 +801,15 @@ For users who uses lots of plugins: \ 'subseparator': { 'left': '|', 'right': '|' } \ } - function! LightLineModified() + function! LightlineModified() return &ft =~ 'help' ? '' : &modified ? '+' : &modifiable ? '' : '-' endfunction - function! LightLineReadonly() + function! LightlineReadonly() return &ft !~? 'help' && &readonly ? 'RO' : '' endfunction - function! LightLineFilename() + function! LightlineFilename() let fname = expand('%:t') return fname == 'ControlP' && has_key(g:lightline, 'ctrlp_item') ? g:lightline.ctrlp_item : \ fname == '__Tagbar__' ? g:lightline.fname : @@ -817,12 +817,12 @@ For users who uses lots of plugins: \ &ft == 'vimfiler' ? vimfiler#get_status_string() : \ &ft == 'unite' ? unite#get_status_string() : \ &ft == 'vimshell' ? vimshell#get_status_string() : - \ ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . + \ ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') . \ ('' != fname ? fname : '[No Name]') . - \ ('' != LightLineModified() ? ' ' . LightLineModified() : '') + \ ('' != LightlineModified() ? ' ' . LightlineModified() : '') endfunction - function! LightLineFugitive() + function! LightlineFugitive() try if expand('%:t') !~? 'Tagbar\|Gundo\|NERD' && &ft !~? 'vimfiler' && exists('*fugitive#head') let mark = '' " edit here for cool mark @@ -834,19 +834,19 @@ For users who uses lots of plugins: return '' endfunction - function! LightLineFileformat() + function! LightlineFileformat() return winwidth(0) > 70 ? &fileformat : '' endfunction - function! LightLineFiletype() + function! LightlineFiletype() return winwidth(0) > 70 ? (&filetype !=# '' ? &filetype : 'no ft') : '' endfunction - function! LightLineFileencoding() + function! LightlineFileencoding() return winwidth(0) > 70 ? (&fenc !=# '' ? &fenc : &enc) : '' endfunction - function! LightLineMode() + function! LightlineMode() let fname = expand('%:t') return fname == '__Tagbar__' ? 'Tagbar' : \ fname == 'ControlP' ? 'CtrlP' : @@ -1189,10 +1189,10 @@ Problem 12: *lightline-problem-12* > let g:lightline = { \ 'component': { - \ 'modified': '%#ModifiedColor#%{LightLineModified()}', + \ 'modified': '%#ModifiedColor#%{LightlineModified()}', \ } \ } - function! LightLineModified() + function! LightlineModified() let map = { 'V': 'n', "\<C-v>": 'n', 's': 'n', 'v': 'n', "\<C-s>": 'n', 'c': 'n', 'R': 'n'} let mode = get(map, mode()[0], mode()[0]) let bgcolor = {'n': [240, '#585858'], 'i': [31, '#0087af']} @@ -1211,7 +1211,7 @@ Problem 13: *lightline-problem-13* Add the following settings to your .vimrc(_vimrc). > - augroup LightLineColorscheme + augroup LightlineColorscheme autocmd! autocmd ColorScheme * call s:lightline_update() augroup END diff --git a/sources_non_forked/nerdtree/CHANGELOG b/sources_non_forked/nerdtree/CHANGELOG index a06c1669..a23884a9 100644 --- a/sources_non_forked/nerdtree/CHANGELOG +++ b/sources_non_forked/nerdtree/CHANGELOG @@ -1,4 +1,8 @@ Next + - Reuse/reopen existing window trees where possible #244 + - Remove NERDTree.previousBuf() + - Change color of arrow (Leeiio) #630 + - Improved a tip in README.markdown (ggicci) #628 - Shorten delete confimration of empty directory to 'y' (mikeperri) #530 - Fix API call to open directory tree in window (devm33) #533 - Change default arrows on non-Windows platforms (gwilk) #546 diff --git a/sources_non_forked/nerdtree/README.markdown b/sources_non_forked/nerdtree/README.markdown index b25b97ef..4f5133a2 100644 --- a/sources_non_forked/nerdtree/README.markdown +++ b/sources_non_forked/nerdtree/README.markdown @@ -101,15 +101,13 @@ Stick this in your vimrc: Note: Now start vim with plain `vim`, not `vim .` --- -> How can I open NERDTree on startup, and have my cursor start in the other window? +> How can I open NERDTree automatically when vim starts up on opening a directory? -Stick this in your vimrc: + autocmd StdinReadPre * let s:std_in=1 + autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif - autocmd vimenter * NERDTree - autocmd vimenter * wincmd p +This window is tab-specific, meaning it's used by all windows in the tab. This trick also prevents NERDTree from hiding when first selecting a file. - *via [stackoverflow/Yohann](http://stackoverflow.com/questions/4277808/nerdtree-auto-focus-to-file-when-opened-in-new-tab/19330023#19330023)* - --- > How can I map a specific key or shortcut to open NERDTree? @@ -134,5 +132,5 @@ See here: https://github.com/scrooloose/nerdtree/issues/433#issuecomment-9259069 Use these variables in your vimrc. Note that below are default arrow symbols - let g:NERDTreeDirArrowExpandable = 'â–º' - let g:NERDTreeDirArrowCollapsible = 'â–¼' + let g:NERDTreeDirArrowExpandable = 'â–¸' + let g:NERDTreeDirArrowCollapsible = 'â–¾' diff --git a/sources_non_forked/nerdtree/autoload/nerdtree.vim b/sources_non_forked/nerdtree/autoload/nerdtree.vim index 3ad2a031..e0d86efa 100644 --- a/sources_non_forked/nerdtree/autoload/nerdtree.vim +++ b/sources_non_forked/nerdtree/autoload/nerdtree.vim @@ -13,9 +13,37 @@ endfunction "FUNCTION: nerdtree#checkForBrowse(dir) {{{2 "inits a window tree in the current buffer if appropriate function! nerdtree#checkForBrowse(dir) - if a:dir != '' && isdirectory(a:dir) - call g:NERDTreeCreator.CreateWindowTree(a:dir) + if !isdirectory(a:dir) + return endif + + if s:reuseWin(a:dir) + return + endif + + call g:NERDTreeCreator.CreateWindowTree(a:dir) +endfunction + +"FUNCTION: s:reuseWin(dir) {{{2 +"finds a NERDTree buffer with root of dir, and opens it. +function! s:reuseWin(dir) abort + let path = g:NERDTreePath.New(fnamemodify(a:dir, ":p")) + + for i in range(1, bufnr("$")) + unlet! nt + let nt = getbufvar(i, "NERDTree") + if empty(nt) + continue + endif + + if nt.isWinTree() && nt.root.path.equals(path) + call nt.setPreviousBuf(bufnr("#")) + exec "buffer " . i + return 1 + endif + endfor + + return 0 endfunction " FUNCTION: nerdtree#completeBookmarks(A,L,P) {{{2 diff --git a/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim b/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim index 73a30f7a..1404cee0 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim @@ -186,6 +186,10 @@ function! s:NERDTree.previousBuf() return self._previousBuf endfunction +function! s:NERDTree.setPreviousBuf(bnum) + let self._previousBuf = a:bnum +endfunction + "FUNCTION: s:NERDTree.render() {{{1 "A convenience function - since this is called often function! s:NERDTree.render() diff --git a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim index dff4027e..e563a947 100644 --- a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim +++ b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim @@ -74,7 +74,7 @@ endfunction function! s:promptToRenameBuffer(bufnum, msg, newFileName) echo a:msg if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' - let quotedFileName = fnameescape(a:newFilename) + let quotedFileName = fnameescape(a:newFileName) " 1. ensure that a new buffer is loaded exec "badd " . quotedFileName " 2. ensure that all windows which display the just deleted filename diff --git a/sources_non_forked/nerdtree/plugin/NERD_tree.vim b/sources_non_forked/nerdtree/plugin/NERD_tree.vim index a27714f4..451b431b 100644 --- a/sources_non_forked/nerdtree/plugin/NERD_tree.vim +++ b/sources_non_forked/nerdtree/plugin/NERD_tree.vim @@ -68,8 +68,8 @@ call s:initVariable("g:NERDTreeShowLineNumbers", 0) call s:initVariable("g:NERDTreeSortDirs", 1) if !nerdtree#runningWindows() - call s:initVariable("g:NERDTreeDirArrowExpandable", "â–º") - call s:initVariable("g:NERDTreeDirArrowCollapsible", "â–¼") + call s:initVariable("g:NERDTreeDirArrowExpandable", "â–¸") + call s:initVariable("g:NERDTreeDirArrowCollapsible", "â–¾") else call s:initVariable("g:NERDTreeDirArrowExpandable", "+") call s:initVariable("g:NERDTreeDirArrowCollapsible", "~") diff --git a/sources_non_forked/nerdtree/syntax/nerdtree.vim b/sources_non_forked/nerdtree/syntax/nerdtree.vim index efdd9436..e93ca1df 100644 --- a/sources_non_forked/nerdtree/syntax/nerdtree.vim +++ b/sources_non_forked/nerdtree/syntax/nerdtree.vim @@ -72,8 +72,8 @@ hi def link NERDTreeDir Directory hi def link NERDTreeUp Directory hi def link NERDTreeFile Normal hi def link NERDTreeCWD Statement -hi def link NERDTreeOpenable Title -hi def link NERDTreeClosable Title +hi def link NERDTreeOpenable Directory +hi def link NERDTreeClosable Directory hi def link NERDTreeIgnore ignore hi def link NERDTreeRO WarningMsg hi def link NERDTreeBookmark Statement diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index 1cf31e6f..e5c8396a 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -26,20 +26,21 @@ 4. [FAQ](#faq) 4.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo) 4.2. [Syntastic supports several checkers for my filetype, how do I tell it which one(s) to use?](#faqcheckers) -4.3. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate) -4.4. [How can I pass additional arguments to a checker?](#faqargs) -4.5. [I run a checker and the location list is not updated...](#faqloclist) -4.5. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist) -4.6. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext) -4.7. [The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?](#faqbdelete) -4.8. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig) -4.9. [What is the difference between syntax checkers and style checkers?](#faqstyle) -4.10. [How can I check scripts written for different versions of Python?](#faqpython) -4.11. [How can I check scripts written for different versions of Ruby?](#faqruby) -4.12. [The `perl` checker has stopped working...](#faqperl) -4.13. [What happened to the `rustc` checker?](#faqrust) -4.14. [What happened to the `tsc` checker?](#faqtsc) -4.15. [What happened to the `xcrun` checker?](#faqxcrun) +4.3. [How can I run checkers for "foreign" filetypes against the current file?](#faqforeign) +4.4. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate) +4.5. [How can I pass additional arguments to a checker?](#faqargs) +4.6. [I run a checker and the location list is not updated...](#faqloclist) +4.6. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist) +4.7. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext) +4.8. [The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?](#faqbdelete) +4.9. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig) +4.10. [What is the difference between syntax checkers and style checkers?](#faqstyle) +4.11. [How can I check scripts written for different versions of Python?](#faqpython) +4.12. [How can I check scripts written for different versions of Ruby?](#faqruby) +4.13. [The `perl` checker has stopped working...](#faqperl) +4.14. [What happened to the `rustc` checker?](#faqrust) +4.15. [What happened to the `tsc` checker?](#faqtsc) +4.16. [What happened to the `xcrun` checker?](#faqxcrun) 5. [Resources](#otherresources) - - - @@ -65,9 +66,9 @@ MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug (formerly Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity, -Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, -VHDL, VimL, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, z80, Zope -page templates, and Zsh. See the [manual][checkers] for details about the +Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, +Vim help, VimL, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, z80, +Zope page templates, and Zsh. See the [manual][checkers] for details about the corresponding supported checkers (`:help syntastic-checkers` in Vim). A number of third-party Vim plugins also provide checkers for syntastic, for @@ -264,13 +265,36 @@ For example to run `phpcs` and `phpmd`: ``` This works for any checkers available for the current filetype, even if they -aren't listed in `g:syntastic_<filetype>_checkers`. You can't run checkers for -"foreign" filetypes though (e.g. you can't run, say, a Python checker if the -filetype of the current file is `php`). +aren't listed in `g:syntastic_<filetype>_checkers`. + +<a name="faqforeign"></a> + +__4.3. Q. How can I run checkers for "foreign" filetypes against the current +file?__ + +A. You need to qualify the name of the "foreign" checker with the name +of its filetype. For example to check `tex` files with the checker +`language_check` (which normally acts only on files of type `text`), you can +add `text/language_check` to the list fo checkers for `tex`: +```vim +let g:syntastic_tex_checkers = ['lacheck', 'text/language_check'] +``` + +This also works with `:SyntasticCheck`, e.g. the following command runs +`text/language_check` against the current file regardless of the current +filetype: +```vim +:SyntasticCheck text/language_check +``` + +Of course, the checkers specified this way need to be known to syntastic, and +they need to be shown as available when you run `:SyntasticInfo`. You can't +just make up a combination of a filetype and a program name and expect it to +work as a checker. <a name="faqaggregate"></a> -__4.3. Q. I have enabled multiple checkers for the current filetype. How can I +__4.4. Q. I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?__ A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`: @@ -282,7 +306,7 @@ See `:help syntastic-aggregating-errors` for more details. <a name="faqargs"></a> -__4.4. Q. How can I pass additional arguments to a checker?__ +__4.5. Q. How can I pass additional arguments to a checker?__ A. In most cases a command line is constructed using an internal function named `makeprgBuild()`, which provides a number of options that allow you to @@ -306,8 +330,8 @@ list of options should be included in the [manual][checkers] <a name="faqloclist"></a> -__4.5. Q. I run a checker and the location list is not updated...__ -__4.5. Q. I run`:lopen` or `:lwindow` and the error window is empty...__ +__4.6. Q. I run a checker and the location list is not updated...__ +__4.6. Q. I run`:lopen` or `:lwindow` and the error window is empty...__ A. By default the location list is changed only when you run the `:Errors` command, in order to minimise conflicts with other plugins. If you want the @@ -319,7 +343,7 @@ let g:syntastic_always_populate_loc_list = 1 <a name="faqlnext"></a> -__4.6. Q. How can I jump between the different errors without using the location +__4.7. Q. How can I jump between the different errors without using the location list at the bottom of the window?__ A. Vim provides several built-in commands for this. See `:help :lnext` and @@ -331,7 +355,7 @@ mappings (among other things). <a name="faqbdelete"></a> -__4.7. Q. The error window is closed automatically when I `:quit` the current buffer +__4.8. Q. The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?__ A. There is no safe way to handle that situation automatically, but you can @@ -343,7 +367,7 @@ cabbrev <silent> bd <C-r>=(getcmdtype()==#':' && getcmdpos()==1 ? 'lclose\|bdele <a name="faqconfig"></a> -__4.8. My favourite checker needs to load a configuration file from the +__4.9. My favourite checker needs to load a configuration file from the project's root rather than the current directory...__ A. You can set up an `autocmd` to search for the configuration file in the @@ -363,7 +387,7 @@ autocmd FileType javascript let b:syntastic_javascript_jscs_args = <a name="faqstyle"></a> -__4.9. Q. What is the difference between syntax checkers and style checkers?__ +__4.10. Q. What is the difference between syntax checkers and style checkers?__ A. The errors and warnings they produce are highlighted differently and can be filtered by different rules, but otherwise the distinction is pretty much @@ -393,7 +417,7 @@ See `:help syntastic_quiet_messages` for more information. <a name="faqpython"></a> -__4.10. Q. How can I check scripts written for different versions of Python?__ +__4.11. Q. How can I check scripts written for different versions of Python?__ A. Install a Python version manager such as [virtualenv][virtualenv] or [pyenv][pyenv], activate the environment for the relevant version @@ -409,7 +433,7 @@ scripts. <a name="faqruby"></a> -__4.11. Q. How can I check scripts written for different versions of Ruby?__ +__4.12. Q. How can I check scripts written for different versions of Ruby?__ A. Install a Ruby version manager such as [rvm][rvm] or [rbenv][rbenv], activate the environment for the relevant version of Ruby, and install in it @@ -424,7 +448,7 @@ scripts. <a name="faqperl"></a> -__4.12. Q. The `perl` checker has stopped working...__ +__4.13. Q. The `perl` checker has stopped working...__ A. The `perl` checker runs `perl -c` against your file, which in turn __executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use` @@ -440,14 +464,14 @@ let g:syntastic_enable_perl_checker = 1 <a name="faqrust"></a> -__4.13. Q. What happened to the `rustc` checker?__ +__4.14. Q. What happened to the `rustc` checker?__ A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the checker should be picked up automatically by syntastic. <a name="faqtsc"></a> -__4.14. Q. What happened to the `tsc` checker?__ +__4.15. Q. What happened to the `tsc` checker?__ A. It didn't meet people's expectations and it has been removed. The plugin [tsuquyomi][tsuquyomi] comes packaged with a checker for TypeScript. If you @@ -455,7 +479,7 @@ install this plugin the checker should be picked up automatically by syntastic. <a name="faqxcrun"></a> -__4.15. Q. What happened to the `xcrun` checker?__ +__4.16. Q. What happened to the `xcrun` checker?__ A. The `xcrun` checker used to have a security problem and it has been removed. A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you diff --git a/sources_non_forked/syntastic/autoload/syntastic/log.vim b/sources_non_forked/syntastic/autoload/syntastic/log.vim index 5ad562d2..d6d41a26 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/log.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/log.vim @@ -21,7 +21,7 @@ function! syntastic#log#warn(msg) abort " {{{2 endfunction " }}}2 function! syntastic#log#error(msg) abort " {{{2 - execute "normal \<Esc>" + execute 'normal! \<Esc>' echohl ErrorMsg echomsg 'syntastic: error: ' . a:msg echohl None @@ -68,7 +68,7 @@ function! syntastic#log#debug(level, msg, ...) abort " {{{2 let leader = s:_log_timestamp() call s:_logRedirect(1) - if a:0 > 0 + if a:0 " filter out dictionary functions echomsg leader . a:msg . ' ' . \ strtrans(string(type(a:1) == type({}) || type(a:1) == type([]) ? diff --git a/sources_non_forked/syntastic/autoload/syntastic/util.vim b/sources_non_forked/syntastic/autoload/syntastic/util.vim index 535d2671..90216946 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/util.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/util.vim @@ -102,6 +102,10 @@ function! syntastic#util#rmrf(what) abort " {{{2 endif endfunction " }}}2 +function! syntastic#util#getbufvar(buf, name, ...) abort " {{{2 + return a:0 ? s:_getbufvar(a:buf, a:name, a:1) : getbufvar(a:buf, a:name) +endfunction " }}}2 + " Search the first 5 lines of the file for a magic number and return a map " containing the args and the executable " @@ -126,9 +130,19 @@ function! syntastic#util#parseShebang() abort " {{{2 return { 'exe': '', 'args': [] } endfunction " }}}2 +" Get the value of a Vim variable. Allow buffer variables to override global ones. +function! syntastic#util#bufRawVar(buf, name, ...) abort " {{{2 + return s:_getbufvar(a:buf, a:name, get(g:, a:name, a:0 ? a:1 : '')) +endfunction "}}}2 + +" Get the value of a syntastic variable. Allow buffer variables to override global ones. +function! syntastic#util#bufVar(buf, name, ...) abort " {{{2 + return call('syntastic#util#bufRawVar', [a:buf, 'syntastic_' . a:name] + a:000) +endfunction "}}}2 + " Get the value of a Vim variable. Allow local variables to override global ones. function! syntastic#util#rawVar(name, ...) abort " {{{2 - return get(b:, a:name, get(g:, a:name, a:0 > 0 ? a:1 : '')) + return get(b:, a:name, get(g:, a:name, a:0 ? a:1 : '')) endfunction " }}}2 " Get the value of a syntastic variable. Allow local variables to override global ones. @@ -165,11 +179,6 @@ function! syntastic#util#compareLexi(a, b) abort " {{{2 return 0 endfunction " }}}2 -" strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen() -" and hope for the best :) -let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen') -lockvar s:_width - function! syntastic#util#screenWidth(str, tabstop) abort " {{{2 let chunks = split(a:str, "\t", 1) let width = s:_width(chunks[-1]) @@ -391,9 +400,6 @@ function! syntastic#util#setWids() abort " {{{2 endfor endfunction " }}}2 -let s:_str2float = function(exists('*str2float') ? 'str2float' : 'str2nr') -lockvar s:_str2float - function! syntastic#util#str2float(val) abort " {{{2 return s:_str2float(a:val) endfunction " }}}2 @@ -515,6 +521,11 @@ function! s:_translateElement(key, term) abort " {{{2 return ret endfunction " }}}2 +" strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen() +" and hope for the best :) +let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen') +lockvar s:_width + " @vimlint(EVL103, 1, a:flags) function! s:_delete_dumb(what, flags) abort " {{{2 if !exists('s:rmrf') @@ -561,6 +572,9 @@ function! s:_rmrf(what) abort " {{{2 endif endfunction " }}}2 +let s:_str2float = function(exists('*str2float') ? 'str2float' : 'str2nr') +lockvar s:_str2float + function! s:_float2str_smart(val) abort " {{{2 return printf('%.1f', a:val) endfunction " }}}2 @@ -572,6 +586,18 @@ endfunction " }}}2 let s:_float2str = function(has('float') ? 's:_float2str_smart' : 's:_float2str_dumb') lockvar s:_float2str +function! s:_getbufvar_dumb(buf, name, ...) abort " {{{2 + let ret = getbufvar(a:buf, a:name) + if a:0 && type(ret) == type('') && ret ==# '' + unlet! ret + let ret = a:1 + endif + return ret +endfunction "}}}2 + +let s:_getbufvar = function(v:version > 703 || (v:version == 703 && has('patch831')) ? 'getbufvar' : 's:_getbufvar_dumb') +lockvar s:_getbufvar + " }}}1 let &cpo = s:save_cpo diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index 4541ddf2..1dff751e 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -117,6 +117,7 @@ SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* Vala.....................................|syntastic-checkers-vala| Verilog..................................|syntastic-checkers-verilog| VHDL.....................................|syntastic-checkers-vhdl| + Vim help.................................|syntastic-checkers-help| VimL.....................................|syntastic-checkers-vim| xHTML....................................|syntastic-checkers-xhtml| @@ -353,6 +354,7 @@ SYNTAX CHECKERS FOR ASCIIDOC *syntastic-checkers-asciidoc* The following checkers are available for AsciiDoc (filetype "asciidoc"): 1. Asciidoc.................|syntastic-asciidoc-asciidoc| + 2. proselint................|syntastic-asciidoc-proselint| ------------------------------------------------------------------------------ 1. Asciidoc *syntastic-asciidoc-asciidoc* @@ -374,6 +376,27 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +------------------------------------------------------------------------------ +2. proselint *syntastic-asciidoc-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-help-proselint|, |syntastic-html-proselint|, +|syntastic-markdown-proselint|, |syntastic-nroff-proselint|, +|syntastic-pod-proselint|, |syntastic-rst-proselint|, +|syntastic-tex-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + ============================================================================== SYNTAX CHECKERS FOR ASSEMBLY LANGUAGES *syntastic-checkers-asm* @@ -2586,10 +2609,12 @@ The following checkers are available for HTML (filetype "html"): 1. ESLint...................|syntastic-html-eslint| 2. gjslint..................|syntastic-html-gjslint| 3. HTML tidy................|syntastic-html-tidy| - 4. JSHint...................|syntastic-html-jshint| - 5. textlint.................|syntastic-html-textlint| - 6. Validator................|syntastic-html-validator| - 7. W3.......................|syntastic-html-w3| + 4. HTMLHint.................|syntastic-html-htmlhint| + 5. JSHint...................|syntastic-html-jshint| + 6. proselint................|syntastic-html-proselint| + 7. textlint.................|syntastic-html-textlint| + 8. Validator................|syntastic-html-validator| + 9. W3.......................|syntastic-html-w3| ------------------------------------------------------------------------------ 1. ESLint *syntastic-html-eslint* @@ -2679,7 +2704,25 @@ List of additional empty tags, to be added to "--new-empty-tags". See also: |syntastic-xhtml-tidy|. ------------------------------------------------------------------------------ -4. jshint *syntastic-html-jshint* +4. HTMLHint *syntastic-html-htmlhint* + +Name: HTMLHint +Maintainer: LCD 47 <lcd047@gmail.com> + +"JSHint" is a static code analysis tool for HTML. See the project's page for +details: + + http://htmlhint.com/ + +Syntastic requires "HTMLHint" version 0.9.13 or later. + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +------------------------------------------------------------------------------ +5. jshint *syntastic-html-jshint* Name: JSHint Maintainer: LCD 47 <lcd047@gmail.com> @@ -2725,7 +2768,28 @@ in "JSHint". If that is undesirable, your only other option is to leave See also: |syntastic-javascript-jshint|, |syntastic-xhtml-jshint|. ------------------------------------------------------------------------------ -5. textlint *syntastic-html-textlint* +6. proselint *syntastic-html-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-markdown-proselint|, |syntastic-nroff-proselint|, +|syntastic-pod-proselint|, |syntastic-rst-proselint|, +|syntastic-tex-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + +------------------------------------------------------------------------------ +7. textlint *syntastic-html-textlint* Name: textlint Maintainer: LCD 47 <lcd047@gmail.com> @@ -2750,7 +2814,7 @@ work: See also: |syntastic-markdown-textlint|, |syntastic-text-textlint|. ------------------------------------------------------------------------------ -6. Validator *syntastic-html-validator* +8. Validator *syntastic-html-validator* Name: validator Maintainer: LCD 47 <lcd047@gmail.com> @@ -2823,7 +2887,7 @@ You can lookup the meaning of these codes in cURL's manual: http://curl.haxx.se/docs/manpage.html#EXIT ------------------------------------------------------------------------------ -7. W3 *syntastic-html-w3* +9. W3 *syntastic-html-w3* Name: w3 Maintainer: Martin Grenfell <martin.grenfell@gmail.com> @@ -2949,6 +3013,14 @@ Name: javac Maintainers: Jochen Keil <jochen.keil@gmail.com> Dmitry Geurkov <d.geurkov@gmail.com> +Note~ + +This checker is not suitable for use with large Java projects. The design +of "javac" makes this checker prone to running into various limitations of +your shell, Vim, and your Java compiler. You are strongly advised to use +something like Eclim (http://eclim.org/) instead of syntastic for projects of +any substantial size or complexity. + Commands~ The following commands are available: @@ -3684,7 +3756,8 @@ SYNTAX CHECKERS FOR MARKDOWN *syntastic-checkers-markdown* The following checkers are available for Markdown (filetype "markdown"): 1. Markdown lint tool.......|syntastic-markdown-mdl| - 2. textlint.................|syntastic-markdown-textlint| + 2. proselint................|syntastic-markdown-proselint| + 3. textlint.................|syntastic-markdown-textlint| ------------------------------------------------------------------------------ 1. Markdown lint tool *syntastic-markdown-mdl* @@ -3721,7 +3794,28 @@ to a set of valid "markdownlint-cli" options): > let g:syntastic_markdown_mdl_args = "" < ------------------------------------------------------------------------------ -2. textlint *syntastic-markdown-textlint* +2. proselint *syntastic-markdown-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-nroff-proselint|, +|syntastic-pod-proselint|, |syntastic-rst-proselint|, +|syntastic-tex-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + +------------------------------------------------------------------------------ +3. textlint *syntastic-markdown-textlint* Name: textlint Maintainer: LCD 47 <lcd047@gmail.com> @@ -3836,6 +3930,7 @@ The following checkers are available for nroff (filetype "nroff"): 1. Igor.....................|syntastic-nroff-igor| 2. mandoc...................|syntastic-nroff-mandoc| + 3. proselint................|syntastic-nroff-proselint| ------------------------------------------------------------------------------ 1. Igor *syntastic-nroff-igor* @@ -3875,6 +3970,27 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +------------------------------------------------------------------------------ +3. proselint *syntastic-nroff-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-markdown-proselint|, +|syntastic-pod-proselint|, |syntastic-rst-proselint|, +|syntastic-tex-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + ============================================================================== SYNTAX CHECKERS FOR OBJECTIVE-C *syntastic-checkers-objc* @@ -4362,6 +4478,7 @@ SYNTAX CHECKERS FOR POD *syntastic-checkers-pod* The following checkers are available for POD (filetype "pod"): 1. Pod::Checker.............|syntastic-pod-podchecker| + 2. proselint................|syntastic-pod-proselint| ------------------------------------------------------------------------------ 1. Pod::Checker *syntastic-pod-podchecker* @@ -4381,6 +4498,27 @@ accepts the standard options described at |syntastic-config-makeprg|. See also: |syntastic-perl-podchecker|. +------------------------------------------------------------------------------ +2. proselint *syntastic-pod-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-markdown-proselint|, +|syntastic-nroff-proselint|, |syntastic-rst-proselint|, +|syntastic-tex-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + ============================================================================== SYNTAX CHECKERS FOR PUG (FORMERLY JADE) *syntastic-checkers-pug* @@ -5034,12 +5172,34 @@ SYNTAX CHECKERS FOR RESTRUCTUREDTEXT *syntastic-checkers-rst* The following checkers are available for reStructuredText (filetype "rst"): - 1. rst2pseudoxml............|syntastic-rst-rst2pseudoxml| - 2. rstcheck.................|syntastic-rst-rstcheck| - 3. Sphinx...................|syntastic-rst-sphinx| + 1. proselint................|syntastic-rst-proselint| + 2. rst2pseudoxml............|syntastic-rst-rst2pseudoxml| + 3. rstcheck.................|syntastic-rst-rstcheck| + 4. Sphinx...................|syntastic-rst-sphinx| ------------------------------------------------------------------------------ -1. rst2pseudoxml *syntastic-rst-rst2pseudoxml* +1. proselint *syntastic-rst-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-markdown-proselint|, +|syntastic-nroff-proselint|, |syntastic-pod-proselint|, +|syntastic-tex-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + +------------------------------------------------------------------------------ +2. rst2pseudoxml *syntastic-rst-rst2pseudoxml* Name: rst2pseudoxml Maintainer: James Rowe <jnrowe@gmail.com> @@ -5057,7 +5217,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -2. rstcheck *syntastic-rst-rstcheck* +3. rstcheck *syntastic-rst-rstcheck* Name: rstcheck Maintainer: Steven Myint <git@stevenmyint.com> @@ -5073,7 +5233,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -3. Sphinx *syntastic-rst-sphinx* +4. Sphinx *syntastic-rst-sphinx* Name: sphinx Maintainer: Buck Evan <buck@yelp.com> @@ -5892,6 +6052,7 @@ The following checkers are available for TeX (filetype "tex"): 1. ChkTeX...................|syntastic-tex-chktex| 2. lacheck..................|syntastic-tex-lacheck| + 3. proselint................|syntastic-tex-proselint| ------------------------------------------------------------------------------ 1. ChkTeX *syntastic-tex-chktex* @@ -5937,12 +6098,34 @@ Limitations~ At the time of this writing "lacheck" can't expand "\def" commands. As a result, most "\input" commands using macros are signaled as errors. +------------------------------------------------------------------------------ +3. proselint *syntastic-tex-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-markdown-proselint|, +|syntastic-nroff-proselint|, |syntastic-pod-proselint|, +|syntastic-rst-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + ============================================================================== SYNTAX CHECKERS FOR TEXINFO *syntastic-checkers-texinfo* The following checkers are available for Texinfo (filetype "texinfo"): 1. Makeinfo.................|syntastic-texinfo-makeinfo| + 2. proselint................|syntastic-texinfo-proselint| ------------------------------------------------------------------------------ 1. Makeinfo *syntastic-texinfo-makeinfo* @@ -5960,6 +6143,27 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +------------------------------------------------------------------------------ +2. proselint *syntastic-texinfo-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-markdown-proselint|, +|syntastic-nroff-proselint|, |syntastic-pod-proselint|, +|syntastic-rst-proselint|, |syntastic-tex-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + ============================================================================== SYNTAX CHECKERS FOR TEXT *syntastic-checkers-text* @@ -5968,7 +6172,8 @@ The following checkers are available for plain text (filetype "text"): 1. atdtool..................|syntastic-text-atdtool| 2. Igor.....................|syntastic-text-igor| 3. language-check...........|syntastic-text-language_check| - 4. textlint.................|syntastic-text-textlint| + 4. proselint................|syntastic-text-proselint| + 5. textlint.................|syntastic-text-textlint| ------------------------------------------------------------------------------ 1. atdtool *syntastic-text-atdtool* @@ -6031,7 +6236,28 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -4. textlint *syntastic-text-textlint* +4. proselint *syntastic-text-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-markdown-proselint|, +|syntastic-nroff-proselint|, |syntastic-pod-proselint|, +|syntastic-rst-proselint|, |syntastic-tex-proselint|, +|syntastic-texinfo-proselint|, |syntastic-xhtml-proselint|. + +------------------------------------------------------------------------------ +5. textlint *syntastic-text-textlint* Name: textlint Maintainer: LCD 47 <lcd047@gmail.com> @@ -6394,6 +6620,34 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +============================================================================== +SYNTAX CHECKERS FOR VIM HELP *syntastic-checkers-help* + +The following checkers are available for Vim help (filetype "help"): + + 1. proselint................|syntastic-help-proselint| + +------------------------------------------------------------------------------ +1. proselint *syntastic-help-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-html-proselint|, +|syntastic-markdown-proselint|, |syntastic-nroff-proselint|, +|syntastic-pod-proselint|, |syntastic-rst-proselint|, +|syntastic-tex-proselint|, |syntastic-texinfo-proselint|, +|syntastic-text-proselint|, |syntastic-xhtml-proselint|. + ============================================================================== SYNTAX CHECKERS FOR VIML *syntastic-checkers-vim* @@ -6479,6 +6733,7 @@ The following checkers are available for xHTML (filetype "xhtml"): 1. HTML Tidy................|syntastic-xhtml-tidy| 2. jshint...................|syntastic-xhtml-jshint| + 3. proselint................|syntastic-xhtml-proselint| ------------------------------------------------------------------------------ 1. HTML tidy *syntastic-xhtml-tidy* @@ -6553,6 +6808,27 @@ in "JSHint". If that is undesirable, your only other option is to leave < See also: |syntastic-html-jshint|, |syntastic-javascript-jshint|. +------------------------------------------------------------------------------ +3. proselint *syntastic-xhtml-proselint* + +Name: proselint +Maintainer: LCD 47 <lcd047@gmail.com> + +"proselint" is a linter for prose. See the page for details: + + http://proselint.com/ + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|, +|syntastic-html-proselint|, |syntastic-markdown-proselint|, +|syntastic-nroff-proselint|, |syntastic-pod-proselint|, +|syntastic-rst-proselint|, |syntastic-tex-proselint|, +|syntastic-texinfo-proselint|, |syntastic-text-proselint|. + ============================================================================== SYNTAX CHECKERS FOR XML *syntastic-checkers-xml* diff --git a/sources_non_forked/syntastic/doc/syntastic.txt b/sources_non_forked/syntastic/doc/syntastic.txt index 8f3473bc..ed47fb0b 100644 --- a/sources_non_forked/syntastic/doc/syntastic.txt +++ b/sources_non_forked/syntastic/doc/syntastic.txt @@ -48,19 +48,20 @@ CONTENTS *syntastic-contents* 7.Compatibility with other software............|syntastic-compatibility| 7.1.airline................................|syntastic-airline| 7.2.The csh and tcsh shells................|syntastic-csh| - 7.3.Eclim..................................|syntastic-eclim| - 7.4.ferret.................................|syntastic-ferret| - 7.5.The fish shell.........................|syntastic-fish| - 7.6.The fizsh shell........................|syntastic-fizsh| - 7.7.flagship...............................|syntastic-flagship| - 7.8.powerline..............................|syntastic-powerline| - 7.9.The PowerShell shell...................|syntastic-powershell| - 7.10.python-mode...........................|syntastic-pymode| - 7.11.vim-auto-save.........................|syntastic-vim-auto-save| - 7.12.vim-go................................|syntastic-vim-go| - 7.13.vim-virtualenv........................|syntastic-vim-virtualenv| - 7.14.YouCompleteMe.........................|syntastic-ycm| - 7.15.The zsh shell and MacVim..............|syntastic-zsh| + 7.3.EasyGrep...............................|syntastic-easygrep| + 7.4.Eclim..................................|syntastic-eclim| + 7.5.ferret.................................|syntastic-ferret| + 7.6.The fish shell.........................|syntastic-fish| + 7.7.The fizsh shell........................|syntastic-fizsh| + 7.8.flagship...............................|syntastic-flagship| + 7.9.powerline..............................|syntastic-powerline| + 7.10.The PowerShell shell..................|syntastic-powershell| + 7.11.python-mode...........................|syntastic-pymode| + 7.12.vim-auto-save.........................|syntastic-vim-auto-save| + 7.13.vim-go................................|syntastic-vim-go| + 7.14.vim-virtualenv........................|syntastic-vim-virtualenv| + 7.15.YouCompleteMe.........................|syntastic-ycm| + 7.16.The zsh shell and MacVim..............|syntastic-zsh| 8.About........................................|syntastic-about| 9.License......................................|syntastic-license| @@ -301,12 +302,22 @@ the order specified. The set by |'syntastic_aggregate_errors'| still apply. Example: > :SyntasticCheck flake8 pylint < +You can also run checkers for filetypes different from the current filetype +by qualifying their names with their respective filetypes, like this: +"<filetype>/<checker>". + +Example: > + :SyntasticCheck lacheck text/language_check +< :SyntasticInfo *:SyntasticInfo* The command takes an optional argument, and outputs information about the checkers available for the filetype named by said argument, or for the current filetype if no argument was provided. +Example: > + :SyntasticInfo python +< :SyntasticReset *:SyntasticReset* Resets the list of errors and turns off all error notifiers. @@ -761,6 +772,10 @@ If neither |'g:syntastic_<filetype>_checkers'| nor |'b:syntastic_checkers'| is set, a default list of checker is used. Beware however that this list deliberately kept minimal, for performance reasons. +You can specify checkers for other filetypes anywhere in these lists, by +qualifying their names with their respective filetypes: > + let g:syntastic_tex_checkers = ["lacheck", "text/language_check"] +< Take a look elsewhere in this manual to find out what checkers and filetypes are supported by syntastic: |syntastic-checkers|. @@ -854,9 +869,8 @@ omitting the filename from the command line: > let g:syntastic_sml_smlnj_fname = "" < *syntastic-config-no-makeprgbuild* -For checkers that do not use the "makeprgBuild()" function you will have to -look at the source code of the checker in question. If there are specific -options that can be set they are normally documented in this manual (see +For checkers that do not use the "makeprgBuild()" function any specific +options that can be set should be documented in this manual (see |syntastic-checkers|). ------------------------------------------------------------------------------ @@ -1017,7 +1031,16 @@ such as "zsh", "bash", "ksh", or even the original Bourne "sh": > let g:syntastic_shell = "/bin/sh" < ------------------------------------------------------------------------------ -7.3. Eclim *syntastic-eclim* +7.3. EasyGrep *syntastic-easygrep* + +The "EasyGrep" Vim plugin (https://github.com/dkprice/vim-easygrep) can use +either |quickfix| lists, or location lists (see |location-list|). Syntastic can +be run along with "EasyGrep" provided that the latter is configured to use +|quickfix| lists (which is the default at the time of this writing): > + let g:EasyGrepWindow = 0 +< +------------------------------------------------------------------------------ +7.4. Eclim *syntastic-eclim* Syntastic can be used together with "Eclim" (see http://eclim.org/). However, by default Eclim disables syntastic's checks for the filetypes it supports, in @@ -1030,7 +1053,7 @@ run Eclim's validation for others. Please consult Eclim's documentation for details. ------------------------------------------------------------------------------ -7.4. ferret *syntastic-ferret* +7.5. ferret *syntastic-ferret* At the time of this writing syntastic conflicts with the "ferret" Vim plugin (https://github.com/wincent/ferret). The "ferret" plugin assumes control over @@ -1038,7 +1061,7 @@ loclist windows even when configured to use |quickfix| lists. This interferes with syntastic's functioning. ------------------------------------------------------------------------------ -7.5. The fish shell *syntastic-fish* +7.6. The fish shell *syntastic-fish* At the time of this writing the "fish" shell (see http://fishshell.com/) doesn't support the standard UNIX syntax for file redirections, and thus it @@ -1048,7 +1071,7 @@ original Bourne "sh": > let g:syntastic_shell = "/bin/sh" < ------------------------------------------------------------------------------ -7.6. The fizsh shell *syntastic-fizsh* +7.7. The fizsh shell *syntastic-fizsh* Using syntastic with the "fizsh" shell (see https://github.com/zsh-users/fizsh) is possible, but potentially problematic. In order to do it you'll need to set @@ -1061,7 +1084,7 @@ interactive features of "fizsh". Using a more traditional shell such as "zsh", let g:syntastic_shell = "/bin/sh" < ------------------------------------------------------------------------------ -7.7. flagship *syntastic-flagship* +7.8. flagship *syntastic-flagship* The "flagship" Vim plugin (https://github.com/tpope/vim-flagship) has its own mechanism of showing flags on the |'statusline'|. To allow "flagship" @@ -1071,7 +1094,7 @@ described in the |syntastic-statusline-flag| section above: > autocmd User Flags call Hoist("window", "SyntasticStatuslineFlag") < ------------------------------------------------------------------------------ -7.8. powerline *syntastic-powerline* +7.9. powerline *syntastic-powerline* The "powerline" Vim plugin (https://github.com/powerline/powerline) comes packaged with a syntastic segment. To customize this segment create a file @@ -1088,7 +1111,7 @@ packaged with a syntastic segment. To customize this segment create a file } < ------------------------------------------------------------------------------ -7.9. The PowerShell shell *syntastic-powershell* +7.10. The PowerShell shell *syntastic-powershell* At the time of this writing syntastic is not compatible with using "PowerShell" (https://msdn.microsoft.com/en-us/powershell) as Vim's 'shell'. @@ -1099,7 +1122,7 @@ You may still run Vim from "PowerShell", but you do have to point Vim's set shell=/bin/sh < ------------------------------------------------------------------------------ -7.10. python-mode *syntastic-pymode* +7.11. python-mode *syntastic-pymode* Syntastic can be used along with the "python-mode" Vim plugin (see https://github.com/klen/python-mode). However, they both run syntax checks by @@ -1110,14 +1133,14 @@ for python in syntastic (see |'syntastic_mode_map'|), or disable lint checks in let g:pymode_lint_on_write = 0 < ------------------------------------------------------------------------------ -7.11. vim-auto-save *syntastic-vim-auto-save* +7.12. vim-auto-save *syntastic-vim-auto-save* Syntastic can be used together with the "vim-auto-save" Vim plugin (see https://github.com/907th/vim-auto-save). However, syntastic checks in active mode only work with "vim-auto-save" version 0.1.7 or later. ------------------------------------------------------------------------------ -7.12. vim-go *syntastic-vim-go* +7.13. vim-go *syntastic-vim-go* Syntastic can be used along with the "vim-go" Vim plugin (see https://github.com/fatih/vim-go). However, both "vim-go" and syntastic run @@ -1134,7 +1157,7 @@ stick with |quickfix| lists: > let g:go_list_type = "quickfix" < ------------------------------------------------------------------------------ -7.13. vim-virtualenv *syntastic-vim-virtualenv* +7.14. vim-virtualenv *syntastic-vim-virtualenv* At the time of this writing, syntastic can't run checkers installed in Python virtual environments activated by "vim-virtualenv" (see @@ -1142,7 +1165,7 @@ https://github.com/jmcantrell/vim-virtualenv). This is a limitation of "vim-virtualenv". ------------------------------------------------------------------------------ -7.14. YouCompleteMe *syntastic-ycm* +7.15. YouCompleteMe *syntastic-ycm* Syntastic can be used together with the "YouCompleteMe" Vim plugin (see http://valloric.github.io/YouCompleteMe/). However, by default "YouCompleteMe" @@ -1153,7 +1176,7 @@ have to set |g:ycm_show_diagnostics_ui| to 0. E.g.: > let g:ycm_show_diagnostics_ui = 0 < ------------------------------------------------------------------------------ -7.15. The zsh shell and MacVim *syntastic-zsh* +7.16. The zsh shell and MacVim *syntastic-zsh* If you're running MacVim together with the "zsh" shell (http://www.zsh.org/) you need to be aware that MacVim does not source your .zshrc file, but will diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 94b141ac..73563a67 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.7.0-226' +let g:_SYNTASTIC_VERSION = '3.8.0-3' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 @@ -57,7 +57,7 @@ elseif executable('uname') try let g:_SYNTASTIC_UNAME = split(syntastic#util#system('uname'), "\n")[0] catch /\m^Vim\%((\a\+)\)\=:E484/ - call syntastic#log#error("your shell " . syntastic#util#var('shell') . " can't handle traditional UNIX syntax for redirections") + call syntastic#log#error("can't run external programs (misconfigured shell options?)") finish catch /\m^Vim\%((\a\+)\)\=:E684/ let g:_SYNTASTIC_UNAME = 'Unknown' @@ -136,9 +136,9 @@ let s:_DEBUG_DUMP_OPTIONS = [ \ 'shellxquote' \ ] for s:feature in [ - \ 'shellxescape', - \ 'shellslash', \ 'autochdir', + \ 'shellslash', + \ 'shellxescape', \ ] if exists('+' . s:feature) @@ -178,11 +178,20 @@ let s:_quit_pre = [] " @vimlint(EVL103, 1, a:cmdLine) " @vimlint(EVL103, 1, a:argLead) function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) abort " {{{2 - let checker_names = [] - for ft in s:_resolve_filetypes([]) - call extend(checker_names, s:registry.getNamesOfAvailableCheckers(ft)) - endfor - return join(checker_names, "\n") + let names = [] + + let sep_idx = stridx(a:argLead, '/') + if sep_idx >= 1 + let ft = a:argLead[: sep_idx-1] + call extend(names, map( s:registry.getNamesOfAvailableCheckers(ft), 'ft . "/" . v:val' )) + else + for ft in s:registry.resolveFiletypes(&filetype) + call extend(names, s:registry.getNamesOfAvailableCheckers(ft)) + endfor + call extend(names, map( copy(s:registry.getKnownFiletypes()), 'v:val . "/"' )) + endif + + return join(names, "\n") endfunction " }}}2 " @vimlint(EVL103, 0, a:cursorPos) " @vimlint(EVL103, 0, a:cmdLine) @@ -220,7 +229,7 @@ endfunction " }}}2 function! SyntasticInfo(...) abort " {{{2 call s:modemap.modeInfo(a:000) - call s:registry.echoInfoFor(s:_resolve_filetypes(a:000)) + call s:registry.echoInfoFor(a:000) call s:_explain_skip(a:000) call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, s:_DEBUG_DUMP_OPTIONS) call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES) @@ -312,7 +321,7 @@ function! s:BufEnterHook(fname) abort " {{{2 " TODO: this is needed because in recent versions of Vim lclose " can no longer be called from BufWinLeave " TODO: at this point there is no b:syntastic_loclist - let loclist = filter(copy(getloclist(0)), 'v:val["valid"] == 1') + let loclist = filter(copy(getloclist(0)), 'v:val["valid"]') let owner = str2nr(getbufvar(buf, 'syntastic_owner_buffer')) let buffers = syntastic#util#unique(map(loclist, 'v:val["bufnr"]') + (owner ? [owner] : [])) if !empty(get(w:, 'syntastic_loclist_set', [])) && !empty(loclist) && empty(filter( buffers, 'syntastic#util#bufIsActive(v:val)' )) @@ -384,14 +393,12 @@ function! s:UpdateErrors(buf, auto_invoked, checker_names) abort " {{{2 return endif - let run_checks = !a:auto_invoked || s:modemap.doAutoChecking() + let run_checks = !a:auto_invoked || s:modemap.doAutoChecking(a:buf) if run_checks call s:CacheErrors(a:buf, a:checker_names) call syntastic#util#setLastTick(a:buf) - else - if a:auto_invoked - return - endif + elseif a:auto_invoked + return endif let loclist = g:SyntasticLoclist.current(a:buf) @@ -453,20 +460,17 @@ function! s:CacheErrors(buf, checker_names) abort " {{{2 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd())) " }}}3 - let filetypes = s:_resolve_filetypes([]) - let aggregate_errors = syntastic#util#var('aggregate_errors') || len(filetypes) > 1 + let clist = s:registry.getCheckers(getbufvar(a:buf, '&filetype'), a:checker_names) + + let aggregate_errors = + \ syntastic#util#var('aggregate_errors') || len(syntastic#util#unique(map(copy(clist), 'v:val.getFiletype()'))) > 1 let decorate_errors = aggregate_errors && syntastic#util#var('id_checkers') let sort_aggregated_errors = aggregate_errors && syntastic#util#var('sort_aggregated_errors') - let clist = [] - for type in filetypes - call extend(clist, s:registry.getCheckers(type, a:checker_names)) - endfor - let names = [] let unavailable_checkers = 0 for checker in clist - let cname = checker.getFiletype() . '/' . checker.getName() + let cname = checker.getCName() if !checker.isAvailable() call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'CacheErrors: Checker ' . cname . ' is not available') let unavailable_checkers += 1 @@ -687,11 +691,6 @@ endfunction " }}}2 " Utilities {{{1 -function! s:_resolve_filetypes(filetypes) abort " {{{2 - let type = len(a:filetypes) ? a:filetypes[0] : &filetype - return split( get(g:syntastic_filetype_map, type, type), '\m\.' ) -endfunction " }}}2 - function! s:_ignore_file(filename) abort " {{{2 let fname = fnamemodify(a:filename, ':p') for pattern in g:syntastic_ignore_files diff --git a/sources_non_forked/syntastic/plugin/syntastic/checker.vim b/sources_non_forked/syntastic/plugin/syntastic/checker.vim index 22ad8205..345d2f03 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/checker.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/checker.vim @@ -15,7 +15,7 @@ function! g:SyntasticChecker.New(args, ...) abort " {{{2 if a:0 " redirected checker - let newObj._exec = get(a:args, 'exec', a:1['_exec']) + let newObj._exec_default = get(a:args, 'exec', a:1['_exec_default']) let filetype = a:1['_filetype'] let name = a:1['_name'] @@ -31,7 +31,10 @@ function! g:SyntasticChecker.New(args, ...) abort " {{{2 let newObj._enable = a:1['_enable'] endif else - let newObj._exec = get(a:args, 'exec', newObj._name) + let newObj._exec_default = get(a:args, 'exec', newObj._name) + if newObj._exec_default ==# '' + let newObj._exec_default = '<dummy>' + endif let prefix = 'SyntaxCheckers_' . newObj._filetype . '_' . newObj._name . '_' if has_key(a:args, 'enable') @@ -62,23 +65,24 @@ function! g:SyntasticChecker.getName() abort " {{{2 return self._name endfunction " }}}2 +function! g:SyntasticChecker.getCName() abort " {{{2 + return self._filetype . '/' . self._name +endfunction " }}}2 + " Synchronise _exec with user's setting. Force re-validation if needed. " " XXX: This function must be called at least once before calling either " getExec() or getExecEscaped(). Normally isAvailable() does that for you " automatically, but you should keep still this in mind if you change the " current checker workflow. -function! g:SyntasticChecker.syncExec() abort " {{{2 - let user_exec = - \ expand( exists('b:syntastic_' . self._name . '_exec') ? b:syntastic_{self._name}_exec : - \ syntastic#util#var(self._filetype . '_' . self._name . '_exec'), 1 ) - - if user_exec !=# '' && user_exec !=# self._exec - let self._exec = user_exec - if has_key(self, '_available') - " we have a new _exec on the block, it has to be validated - call remove(self, '_available') - endif +function! g:SyntasticChecker.syncExec(...) abort " {{{2 + if a:0 + let self._exec = a:1 + else + let suffix = self._name . '_exec' + let self._exec = expand( + \ syntastic#util#var(self._filetype . '_' . suffix, + \ syntastic#util#var(suffix, self._exec_default)), 1 ) endif endfunction " }}}2 @@ -92,7 +96,7 @@ endfunction " }}}2 function! g:SyntasticChecker.getLocListRaw() abort " {{{2 let checker_start = reltime() - let name = self._filetype . '/' . self._name + let name = self.getCName() if has_key(self, '_enable') let status = syntastic#util#var(self._enable, -1) @@ -150,7 +154,7 @@ function! g:SyntasticChecker.getVersion(...) abort " {{{2 call self.setVersion(parsed_ver) else call syntastic#log#ndebug(g:_SYNTASTIC_DEBUG_LOCLIST, 'checker output:', split(version_output, "\n", 1)) - call syntastic#log#error("checker " . self._filetype . "/" . self._name . ": can't parse version string (abnormal termination?)") + call syntastic#log#error("checker " . self.getCName() . ": can't parse version string (abnormal termination?)") endif endif return get(self, '_version', []) @@ -164,8 +168,8 @@ function! g:SyntasticChecker.setVersion(version) abort " {{{2 endfunction " }}}2 function! g:SyntasticChecker.log(msg, ...) abort " {{{2 - let leader = self._filetype . '/' . self._name . ': ' - if a:0 > 0 + let leader = self.getCName() . ': ' + if a:0 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, leader . a:msg, a:1) else call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, leader . a:msg) @@ -187,10 +191,15 @@ endfunction " }}}2 function! g:SyntasticChecker.isAvailable() abort " {{{2 call self.syncExec() + if !has_key(self, '_available') - let self._available = self._isAvailableFunc() + let self._available = {} endif - return self._available + if !has_key(self._available, self._exec) + let self._available[self._exec] = self._isAvailableFunc() + endif + + return self._available[self._exec] endfunction " }}}2 function! g:SyntasticChecker.isDisabled() abort " {{{2 diff --git a/sources_non_forked/syntastic/plugin/syntastic/loclist.vim b/sources_non_forked/syntastic/plugin/syntastic/loclist.vim index d4a20b98..3ad93750 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/loclist.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/loclist.vim @@ -10,7 +10,7 @@ let g:SyntasticLoclist = {} function! g:SyntasticLoclist.New(rawLoclist) abort " {{{2 let newObj = copy(self) - let llist = filter(copy(a:rawLoclist), 'v:val["valid"] == 1') + let llist = filter(copy(a:rawLoclist), 'v:val["valid"]') for e in llist if get(e, 'type', '') ==# '' @@ -28,8 +28,8 @@ function! g:SyntasticLoclist.New(rawLoclist) abort " {{{2 endfunction " }}}2 function! g:SyntasticLoclist.current(...) abort " {{{2 - let buf = a:0 > 1 ? a:1 : bufnr('') - let loclist = getbufvar(buf, 'syntastic_loclist') + let buf = a:0 ? a:1 : bufnr('') + let loclist = syntastic#util#getbufvar(buf, 'syntastic_loclist', {}) if type(loclist) != type({}) || empty(loclist) unlet! loclist let loclist = g:SyntasticLoclist.New([]) @@ -281,7 +281,7 @@ endfunction " }}}2 " "would return all errors for buffer 10. " -"Note that all comparisons are done with ==? +"Note that all string comparisons are done with ==? function! g:SyntasticLoclist.filter(filters) abort " {{{2 let conditions = values(map(copy(a:filters), 's:_translate(v:key, v:val)')) let filter = len(conditions) == 1 ? diff --git a/sources_non_forked/syntastic/plugin/syntastic/modemap.vim b/sources_non_forked/syntastic/plugin/syntastic/modemap.vim index 40445b6e..74b09a71 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/modemap.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/modemap.vim @@ -29,7 +29,8 @@ function! g:SyntasticModeMap.synch() abort " {{{2 endfunction " }}}2 function! g:SyntasticModeMap.allowsAutoChecking(filetype) abort " {{{2 - let fts = split(a:filetype, '\m\.') + let registry = g:SyntasticRegistry.Instance() + let fts = registry.resolveFiletypes(a:filetype) if self.isPassive() return self._isOneFiletypeActive(fts) @@ -38,13 +39,13 @@ function! g:SyntasticModeMap.allowsAutoChecking(filetype) abort " {{{2 endif endfunction " }}}2 -function! g:SyntasticModeMap.doAutoChecking() abort " {{{2 - let local_mode = get(b:, 'syntastic_mode', '') +function! g:SyntasticModeMap.doAutoChecking(buf) abort " {{{2 + let local_mode = getbufvar(a:buf, 'syntastic_mode') if local_mode ==# 'active' || local_mode ==# 'passive' return local_mode ==# 'active' endif - return self.allowsAutoChecking(&filetype) + return self.allowsAutoChecking(getbufvar(a:buf, '&filetype')) endfunction " }}}2 function! g:SyntasticModeMap.isPassive() abort " {{{2 @@ -96,7 +97,7 @@ function! g:SyntasticModeMap.modeInfo(filetypes) abort " {{{2 echomsg 'Local mode: ' . b:syntastic_mode endif - echomsg 'The current file will ' . (self.doAutoChecking() ? '' : 'not ') . 'be checked automatically' + echomsg 'The current file will ' . (self.doAutoChecking(bufnr('')) ? '' : 'not ') . 'be checked automatically' endif endfunction " }}}2 diff --git a/sources_non_forked/syntastic/plugin/syntastic/registry.vim b/sources_non_forked/syntastic/plugin/syntastic/registry.vim index a24e283a..69ef5817 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/registry.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/registry.vim @@ -43,6 +43,7 @@ let s:_DEFAULT_CHECKERS = { \ 'handlebars': ['handlebars'], \ 'haskell': ['hdevtools', 'hlint'], \ 'haxe': ['haxe'], + \ 'help': [], \ 'hss': ['hss'], \ 'html': ['tidy'], \ 'jade': ['jade_lint'], @@ -188,24 +189,39 @@ endfunction " }}}2 " not checked for availability (that is, the corresponding IsAvailable() are " not run). function! g:SyntasticRegistry.getCheckers(ftalias, hints_list) abort " {{{2 - let ft = s:_normalise_filetype(a:ftalias) - call self._loadCheckersFor(ft, 0) - - let checkers_map = self._checkerMap[ft] - if empty(checkers_map) - return [] - endif - - call self._checkDeprecation(ft) + let ftlist = self.resolveFiletypes(a:ftalias) let names = - \ !empty(a:hints_list) ? syntastic#util#unique(a:hints_list) : - \ exists('b:syntastic_checkers') ? b:syntastic_checkers : - \ exists('g:syntastic_' . ft . '_checkers') ? g:syntastic_{ft}_checkers : - \ get(s:_DEFAULT_CHECKERS, ft, 0) + \ !empty(a:hints_list) ? a:hints_list : + \ exists('b:syntastic_checkers') ? b:syntastic_checkers : [] - return type(names) == type([]) ? - \ self._filterCheckersByName(checkers_map, names) : [checkers_map[keys(checkers_map)[0]]] + let cnames = [] + if !empty(names) + for name in names + if name !~# '/' + for ft in ftlist + call add(cnames, ft . '/' . name) + endfor + else + call add(cnames, name) + endif + endfor + else + for ft in ftlist + call self._sanityCheck(ft) + let defs = + \ exists('g:syntastic_' . ft . '_checkers') ? g:syntastic_{ft}_checkers : + \ get(s:_DEFAULT_CHECKERS, ft, []) + call extend(cnames, map(copy(defs), 'stridx(v:val, "/") < 0 ? ft . "/" . v:val : v:val' )) + endfor + endif + let cnames = syntastic#util#unique(cnames) + + for ft in syntastic#util#unique(map( copy(cnames), 'v:val[: stridx(v:val, "/")-1]' )) + call self._loadCheckersFor(ft, 0) + endfor + + return self._filterCheckersByName(cnames) endfunction " }}}2 " Same as getCheckers(), but keep only the available checkers. This runs the @@ -242,8 +258,12 @@ function! g:SyntasticRegistry.getNamesOfAvailableCheckers(ftalias) abort " {{{2 return keys(filter( copy(self._checkerMap[ft]), 'v:val.isAvailable()' )) endfunction " }}}2 +function! g:SyntasticRegistry.resolveFiletypes(ftalias) abort " {{{2 + return map(split( get(g:syntastic_filetype_map, a:ftalias, a:ftalias), '\m\.' ), 's:_normalise_filetype(v:val)') +endfunction " }}}2 + function! g:SyntasticRegistry.echoInfoFor(ftalias_list) abort " {{{2 - let ft_list = syntastic#util#unique(map( copy(a:ftalias_list), 's:_normalise_filetype(v:val)' )) + let ft_list = syntastic#util#unique(self.resolveFiletypes(empty(a:ftalias_list) ? &filetype : a:ftalias_list[0])) if len(ft_list) != 1 let available = [] let active = [] @@ -257,8 +277,8 @@ function! g:SyntasticRegistry.echoInfoFor(ftalias_list) abort " {{{2 else let ft = ft_list[0] let available = self.getNamesOfAvailableCheckers(ft) - let active = map(self.getCheckersAvailable(ft, []), 'v:val.getName()') - let disabled = map(self.getCheckersDisabled(ft, []), 'v:val.getName()') + let active = map(self.getCheckersAvailable(ft, []), 'ft ==# v:val.getFiletype() ? v:val.getName() : v:val.getCName()') + let disabled = map(self.getCheckersDisabled(ft, []), 'ft ==# v:val.getFiletype() ? v:val.getName() : v:val.getCName()') endif let cnt = len(available) @@ -274,7 +294,7 @@ function! g:SyntasticRegistry.echoInfoFor(ftalias_list) abort " {{{2 let cnt = len(disabled) let plural = cnt != 1 ? 's' : '' if len(disabled) - let cklist = join(sort(disabled)) + let cklist = join(sort(disabled, 's:_compare_checker_names')) echomsg 'Checker' . plural . ' disabled for security reasons: ' . cklist endif @@ -321,8 +341,20 @@ function! g:SyntasticRegistry._registerChecker(checker) abort " {{{2 let self._checkerMap[ft][name] = a:checker endfunction " }}}2 -function! g:SyntasticRegistry._filterCheckersByName(checkers_map, list) abort " {{{2 - return filter( map(copy(a:list), 'get(a:checkers_map, v:val, {})'), '!empty(v:val)' ) +function! g:SyntasticRegistry._findChecker(cname) abort " {{{2 + let sep_idx = stridx(a:cname, '/') + if sep_idx > 0 + let ft = a:cname[: sep_idx-1] + let name = a:cname[sep_idx+1 :] + else + let ft = &filetype + let name = a:cname + endif + return get(self._checkerMap[ft], name, {}) +endfunction "}}}2 + +function! g:SyntasticRegistry._filterCheckersByName(cnames) abort " {{{2 + return filter( map(copy(a:cnames), 'self._findChecker(v:val)'), '!empty(v:val)' ) endfunction " }}}2 function! g:SyntasticRegistry._loadCheckersFor(filetype, force) abort " {{{2 @@ -338,7 +370,14 @@ function! g:SyntasticRegistry._loadCheckersFor(filetype, force) abort " {{{2 endfunction " }}}2 " Check for obsolete variable g:syntastic_<filetype>_checker -function! g:SyntasticRegistry._checkDeprecation(filetype) abort " {{{2 +function! g:SyntasticRegistry._sanityCheck(filetype) abort " {{{2 + if exists('g:syntastic_' . a:filetype . '_checkers') && + \ type(g:syntastic_{a:filetype}_checkers) != type([]) + + unlet! g:syntastic_{a:filetype}_checkers + call syntastic#log#error('variable g:syntastic_' . a:filetype . '_checkers has to be a list of strings') + endif + if exists('g:syntastic_' . a:filetype . '_checker') && \ !exists('g:syntastic_' . a:filetype . '_checkers') && \ type(g:syntastic_{a:filetype}_checker) == type('') @@ -375,6 +414,26 @@ function! s:_disabled_by_ycm(filetype) abort " {{{2 return index(s:_YCM_TYPES, a:filetype) >= 0 endfunction " }}}2 +function! s:_compare_checker_names(a, b) abort " {{{2 + if a:a ==# a:b + return 0 + endif + + if stridx(a:a, '/') < 0 + if stridx(a:b, '/') < 0 + return a:a < a:b ? -1 : 1 + else + return -1 + endif + else + if stridx(a:b, '/') < 0 + return 1 + else + return a:a < a:b ? -1 : 1 + endif + endif +endfunction " }}}2 + " }}}1 " vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/asciidoc/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/asciidoc/proselint.vim new file mode 100644 index 00000000..7bc719fc --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/asciidoc/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_asciidoc_proselint_checker') + finish +endif +let g:loaded_syntastic_asciidoc_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'asciidoc', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/haskell/ghc-mod.vim b/sources_non_forked/syntastic/syntax_checkers/haskell/ghc-mod.vim deleted file mode 100644 index 928e5b30..00000000 --- a/sources_non_forked/syntastic/syntax_checkers/haskell/ghc-mod.vim +++ /dev/null @@ -1,94 +0,0 @@ -"============================================================================ -"File: ghc-mod.vim -"Description: Syntax checking plugin for syntastic.vim -"Maintainer: Anthony Carapetis <anthony.carapetis at gmail dot com> -"License: This program is free software. It comes without any warranty, -" to the extent permitted by applicable law. You can redistribute -" it and/or modify it under the terms of the Do What The Fuck You -" Want To Public License, Version 2, as published by Sam Hocevar. -" See http://sam.zoy.org/wtfpl/COPYING for more details. -" -"============================================================================ - -if exists('g:loaded_syntastic_haskell_ghc_mod_checker') - finish -endif -let g:loaded_syntastic_haskell_ghc_mod_checker = 1 - -let s:ghc_mod_new = -1 - -let s:save_cpo = &cpo -set cpo&vim - -function! SyntaxCheckers_haskell_ghc_mod_IsAvailable() dict " {{{1 - if !executable(self.getExec()) - return 0 - endif - - " ghc-mod 5.0.0 and later needs the "version" command to print the - " version. But the "version" command appeared in 4.1.0. Thus, we need to - " know the version in order to know how to find out the version. :) - - " Try "ghc-mod version". - let version_output = split(syntastic#util#system(self.getExecEscaped() . ' version'), '\n', 1) - let ver = filter(copy(version_output), 'v:val =~# ''\m\sversion''') - if !len(ver) - " That didn't work. Try "ghc-mod" alone. - let version_output = split(syntastic#util#system(self.getExecEscaped()), '\n', 1) - let ver = filter(copy(version_output), 'v:val =~# ''\m\sversion''') - endif - let parsed_ver = len(ver) ? syntastic#util#parseVersion(ver[0]) : [] - - if len(parsed_ver) - " Encouraged by the great success in finding out the version, now we - " need either a Vim that can handle NULs in system() output, or a - " ghc-mod that has the "--boundary" option. - call self.setVersion(parsed_ver) - let s:ghc_mod_new = syntastic#util#versionIsAtLeast(parsed_ver, [2, 1, 2]) - else - call syntastic#log#ndebug(g:_SYNTASTIC_DEBUG_LOCLIST, 'checker output:', version_output) - call syntastic#log#error("checker haskell/ghc_mod: can't parse version string (abnormal termination?)") - let s:ghc_mod_new = -1 - endif - - " ghc-mod 5.4.0 wants to run in the root directory of the project; - " syntastic can't cope with the resulting complications - " - " References: - " https://hackage.haskell.org/package/ghc-mod-5.4.0.0/changelog - let s:ghc_mod_bailout = syntastic#util#versionIsAtLeast(parsed_ver, [5, 4]) - - return (s:ghc_mod_new >= 0) && (v:version >= 704 || s:ghc_mod_new) && !s:ghc_mod_bailout -endfunction " }}}1 - -function! SyntaxCheckers_haskell_ghc_mod_GetLocList() dict " {{{1 - let makeprg = self.makeprgBuild({ - \ 'exe': self.getExecEscaped() . ' check' . (s:ghc_mod_new ? ' --boundary=""' : '') }) - - let errorformat = - \ '%-G%\s%#,' . - \ '%f:%l:%c:%trror: %m,' . - \ '%f:%l:%c:%tarning: %m,'. - \ '%f:%l:%c: %trror: %m,' . - \ '%f:%l:%c: %tarning: %m,' . - \ '%f:%l:%c:%m,' . - \ '%E%f:%l:%c:,' . - \ '%Z%m' - - return SyntasticMake({ - \ 'makeprg': makeprg, - \ 'errorformat': errorformat, - \ 'preprocess': 'iconv', - \ 'postprocess': ['compressWhitespace'], - \ 'returns': [0] }) -endfunction " }}}1 - -call g:SyntasticRegistry.CreateAndRegisterChecker({ - \ 'filetype': 'haskell', - \ 'name': 'ghc_mod', - \ 'exec': 'ghc-mod' }) - -let &cpo = s:save_cpo -unlet s:save_cpo - -" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/help/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/help/proselint.vim new file mode 100644 index 00000000..53ea3854 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/help/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_help_proselint_checker') + finish +endif +let g:loaded_syntastic_help_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'help', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/html/htmlhint.vim b/sources_non_forked/syntastic/syntax_checkers/html/htmlhint.vim new file mode 100644 index 00000000..3518b7ee --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/html/htmlhint.vim @@ -0,0 +1,46 @@ +"============================================================================ +"File: html.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_html_htmlhint_checker') + finish +endif +let g:loaded_syntastic_html_htmlhint_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_html_htmlhint_IsAvailable() dict + if !executable(self.getExec()) + return 0 + endif + return syntastic#util#versionIsAtLeast(self.getVersion(), [0, 9, 13]) +endfunction + +function! SyntaxCheckers_html_htmlhint_GetLocList() dict + let makeprg = self.makeprgBuild({ 'args_before': '--format unix' }) + + let errorformat = '%f:%l:%c: %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'returns': [0, 1] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'html', + \ 'name': 'htmlhint'}) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/html/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/html/proselint.vim new file mode 100644 index 00000000..fc364df6 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/html/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_html_proselint_checker') + finish +endif +let g:loaded_syntastic_html_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'html', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/markdown/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/markdown/proselint.vim new file mode 100644 index 00000000..3f275749 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/markdown/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_markdown_proselint_checker') + finish +endif +let g:loaded_syntastic_markdown_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'markdown', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim b/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim index e309c1f3..7ea86d1a 100644 --- a/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim +++ b/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim @@ -20,7 +20,7 @@ set cpo&vim function! SyntaxCheckers_nasm_nasm_GetLocList() dict let makeprg = self.makeprgBuild({ - \ 'args_after': '-X gnu -f elf' . + \ 'args_after': '-X gnu' . \ ' -I ' . syntastic#util#shescape(expand('%:p:h', 1) . syntastic#util#Slash()) . \ ' ' . syntastic#c#NullOutput() }) diff --git a/sources_non_forked/syntastic/syntax_checkers/nroff/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/nroff/proselint.vim new file mode 100644 index 00000000..d969490e --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/nroff/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_nroff_proselint_checker') + finish +endif +let g:loaded_syntastic_nroff_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'nroff', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/pod/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/pod/proselint.vim new file mode 100644 index 00000000..bcb67b2f --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/pod/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_pod_proselint_checker') + finish +endif +let g:loaded_syntastic_pod_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'pod', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/rst/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/rst/proselint.vim new file mode 100644 index 00000000..07e8b648 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/rst/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_rst_proselint_checker') + finish +endif +let g:loaded_syntastic_rst_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'rst', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/tex/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/tex/proselint.vim new file mode 100644 index 00000000..657503a3 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/tex/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_tex_proselint_checker') + finish +endif +let g:loaded_syntastic_tex_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'tex', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/texinfo/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/texinfo/proselint.vim new file mode 100644 index 00000000..1afac027 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/texinfo/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_texinfo_proselint_checker') + finish +endif +let g:loaded_syntastic_texinfo_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'texinfo', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/text/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/text/proselint.vim new file mode 100644 index 00000000..9aa95132 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/text/proselint.vim @@ -0,0 +1,45 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_text_proselint_checker') + finish +endif +let g:loaded_syntastic_text_proselint_checker = 1 + +if !exists('g:syntastic_text_proselint_sort') + let g:syntastic_text_proselint_sort = 1 +endif + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_text_proselint_GetLocList() dict + let makeprg = self.makeprgBuild({}) + + let errorformat = '%f:%l:%c: %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'defaults': { 'type': 'W', 'subtype': 'Style' }, + \ 'preprocess': 'iconv', + \ 'returns': [0, 1] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'text', + \ 'name': 'proselint'}) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim b/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim index 0e03ed0b..19cab49e 100644 --- a/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim @@ -99,8 +99,7 @@ endfunction " }}}2 call g:SyntasticRegistry.CreateAndRegisterChecker({ \ 'filetype': 'vim', - \ 'name': 'vimlint', - \ 'exec': '' }) + \ 'name': 'vimlint' }) let &cpo = s:save_cpo unlet s:save_cpo diff --git a/sources_non_forked/syntastic/syntax_checkers/xhtml/proselint.vim b/sources_non_forked/syntastic/syntax_checkers/xhtml/proselint.vim new file mode 100644 index 00000000..aea24a81 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/xhtml/proselint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: proselint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_xhtml_proselint_checker') + finish +endif +let g:loaded_syntastic_xhtml_proselint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'xhtml', + \ 'name': 'proselint', + \ 'redirect': 'text/proselint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/tabular/.gitignore b/sources_non_forked/tabular/.gitignore new file mode 100644 index 00000000..0a56e3fc --- /dev/null +++ b/sources_non_forked/tabular/.gitignore @@ -0,0 +1 @@ +/doc/tags diff --git a/sources_non_forked/tabular/LICENSE.md b/sources_non_forked/tabular/LICENSE.md new file mode 100644 index 00000000..2cc76e9d --- /dev/null +++ b/sources_non_forked/tabular/LICENSE.md @@ -0,0 +1,24 @@ +Copyright (c) 2016, Matthew J. Wozniski +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of the contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/sources_non_forked/tabular/README.md b/sources_non_forked/tabular/README.md new file mode 100644 index 00000000..adbfeb00 --- /dev/null +++ b/sources_non_forked/tabular/README.md @@ -0,0 +1,29 @@ +Tabular +============== +Sometimes, it's useful to line up text. Naturally, it's nicer to have the +computer do this for you, since aligning things by hand quickly becomes +unpleasant. While there are other plugins for aligning text, the ones I've +tried are either impossibly difficult to understand and use, or too simplistic +to handle complicated tasks. This plugin aims to make the easy things easy +and the hard things possible, without providing an unnecessarily obtuse +interface. It's still a work in progress, and criticisms are welcome. + +See [Aligning Text with Tabular.vim](http://vimcasts.org/episodes/aligning-text-with-tabular-vim/) +for a screencast that shows how Tabular.vim works. + +See [doc/Tabular.txt](http://raw.github.com/godlygeek/tabular/master/doc/Tabular.txt) +for detailed documentation. + +Installation +============== +If you don't have a preferred installation method, I recommend installing +[pathogen.vim](https://github.com/tpope/vim-pathogen), and then simply +copy and paste: + + mkdir -p ~/.vim/bundle + cd ~/.vim/bundle + git clone git://github.com/godlygeek/tabular.git + +Once help tags have been generated (either using Pathogen's `:Helptags` +command, or by pointing vim's `:helptags` command at the directory where you +installed Tabular), you can view the manual with `:help tabular`. diff --git a/sources_non_forked/tabular/after/plugin/TabularMaps.vim b/sources_non_forked/tabular/after/plugin/TabularMaps.vim new file mode 100644 index 00000000..998346fc --- /dev/null +++ b/sources_non_forked/tabular/after/plugin/TabularMaps.vim @@ -0,0 +1,73 @@ +" Copyright (c) 2016, Matthew J. Wozniski +" All rights reserved. +" +" Redistribution and use in source and binary forms, with or without +" modification, are permitted provided that the following conditions are met: +" * Redistributions of source code must retain the above copyright notice, +" this list of conditions and the following disclaimer. +" * Redistributions in binary form must reproduce the above copyright +" notice, this list of conditions and the following disclaimer in the +" documentation and/or other materials provided with the distribution. +" * The names of the contributors may not be used to endorse or promote +" products derived from this software without specific prior written +" permission. +" +" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS +" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +" NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, +" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +" OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +if !exists(':Tabularize') || get(g:, 'no_default_tabular_maps', 0) + finish " Tabular.vim wasn't loaded or the default maps are unwanted +endif + +let s:save_cpo = &cpo +set cpo&vim + +AddTabularPattern! assignment /[|&+*/%<>=!~-]\@<!\([<>!=]=\|=\~\)\@![|&+*/%<>=!~-]*=/l1r1 +AddTabularPattern! two_spaces / /l0 + +AddTabularPipeline! multiple_spaces / / map(a:lines, "substitute(v:val, ' *', ' ', 'g')") | tabular#TabularizeStrings(a:lines, ' ', 'l0') + +AddTabularPipeline! argument_list /(.*)/ map(a:lines, 'substitute(v:val, ''\s*\([(,)]\)\s*'', ''\1'', ''g'')') + \ | tabular#TabularizeStrings(a:lines, '[(,)]', 'l0') + \ | map(a:lines, 'substitute(v:val, ''\(\s*\),'', '',\1 '', "g")') + \ | map(a:lines, 'substitute(v:val, ''\s*)'', ")", "g")') + +function! SplitCDeclarations(lines) + let rv = [] + for line in a:lines + " split the line into declaractions + let split = split(line, '\s*[,;]\s*') + " separate the type from the first declaration + let type = substitute(split[0], '\%(\%([&*]\s*\)*\)\=\k\+$', '', '') + " add the ; back on every declaration + call map(split, 'v:val . ";"') + " add the first element to the return as-is, and remove it from the list + let rv += [ remove(split, 0) ] + " transform the other elements by adding the type on at the beginning + call map(split, 'type . v:val') + " and add them all to the return + let rv += split + endfor + return rv +endfunction + +AddTabularPipeline! split_declarations /,.*;/ SplitCDeclarations(a:lines) + +AddTabularPattern! ternary_operator /^.\{-}\zs?\|:/l1 + +AddTabularPattern! cpp_io /<<\|>>/l1 + +AddTabularPattern! pascal_assign /:=/l1 + +AddTabularPattern! trailing_c_comments /\/\*\|\*\/\|\/\//l1 + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/sources_non_forked/tabular/autoload/tabular.vim b/sources_non_forked/tabular/autoload/tabular.vim new file mode 100644 index 00000000..f60a73ca --- /dev/null +++ b/sources_non_forked/tabular/autoload/tabular.vim @@ -0,0 +1,409 @@ +" Tabular: Align columnar data using regex-designated column boundaries +" Maintainer: Matthew Wozniski (godlygeek@gmail.com) +" Date: Thu, 03 May 2012 20:49:32 -0400 +" Version: 1.0 +" +" Long Description: +" Sometimes, it's useful to line up text. Naturally, it's nicer to have the +" computer do this for you, since aligning things by hand quickly becomes +" unpleasant. While there are other plugins for aligning text, the ones I've +" tried are either impossibly difficult to understand and use, or too simplistic +" to handle complicated tasks. This plugin aims to make the easy things easy +" and the hard things possible, without providing an unnecessarily obtuse +" interface. It's still a work in progress, and criticisms are welcome. +" +" License: +" Copyright (c) 2012, Matthew J. Wozniski +" All rights reserved. +" +" Redistribution and use in source and binary forms, with or without +" modification, are permitted provided that the following conditions are met: +" * Redistributions of source code must retain the above copyright notice, +" this list of conditions and the following disclaimer. +" * Redistributions in binary form must reproduce the above copyright +" notice, this list of conditions and the following disclaimer in the +" documentation and/or other materials provided with the distribution. +" * The names of the contributors may not be used to endorse or promote +" products derived from this software without specific prior written +" permission. +" +" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS +" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +" NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, +" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +" OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +" Stupid vimscript crap {{{1 +let s:savecpo = &cpo +set cpo&vim + +" Private Functions {{{1 + +" Return the number of bytes in a string after expanding tabs to spaces. {{{2 +" This expansion is done based on the current value of 'tabstop' +if exists('*strdisplaywidth') + " Needs vim 7.3 + let s:Strlen = function("strdisplaywidth") +else + function! s:Strlen(string) + " Implement the tab handling part of strdisplaywidth for vim 7.2 and + " earlier - not much that can be done about handling doublewidth + " characters. + let rv = 0 + let i = 0 + + for char in split(a:string, '\zs') + if char == "\t" + let rv += &ts - i + let i = 0 + else + let rv += 1 + let i = (i + 1) % &ts + endif + endfor + + return rv + endfunction +endif + +" Align a string within a field {{{2 +" These functions do not trim leading and trailing spaces. + +" Right align 'string' in a field of size 'fieldwidth' +function! s:Right(string, fieldwidth) + let spaces = a:fieldwidth - s:Strlen(a:string) + return matchstr(a:string, '^\s*') . repeat(" ", spaces) . substitute(a:string, '^\s*', '', '') +endfunction + +" Left align 'string' in a field of size 'fieldwidth' +function! s:Left(string, fieldwidth) + let spaces = a:fieldwidth - s:Strlen(a:string) + return a:string . repeat(" ", spaces) +endfunction + +" Center align 'string' in a field of size 'fieldwidth' +function! s:Center(string, fieldwidth) + let spaces = a:fieldwidth - s:Strlen(a:string) + let right = spaces / 2 + let left = right + (right * 2 != spaces) + return repeat(" ", left) . a:string . repeat(" ", right) +endfunction + +" Remove spaces around a string {{{2 + +" Remove all trailing spaces from a string. +function! s:StripTrailingSpaces(string) + return matchstr(a:string, '^.\{-}\ze\s*$') +endfunction + +" Remove all leading spaces from a string. +function! s:StripLeadingSpaces(string) + return matchstr(a:string, '^\s*\zs.*$') +endfunction + +" Split a string into fields and delimiters {{{2 +" Like split(), but include the delimiters as elements +" All odd numbered elements are delimiters +" All even numbered elements are non-delimiters (including zero) +function! s:SplitDelim(string, delim) + let rv = [] + let beg = 0 + + let len = len(a:string) + let searchoff = 0 + + while 1 + let mid = match(a:string, a:delim, beg + searchoff, 1) + if mid == -1 || mid == len + break + endif + + let matchstr = matchstr(a:string, a:delim, beg + searchoff, 1) + let length = strlen(matchstr) + + if length == 0 && beg == mid + " Zero-length match for a zero-length delimiter - advance past it + let searchoff += 1 + continue + endif + + if beg == mid + let rv += [ "" ] + else + let rv += [ a:string[beg : mid-1] ] + endif + + let rv += [ matchstr ] + + let beg = mid + length + let searchoff = 0 + endwhile + + let rv += [ strpart(a:string, beg) ] + + return rv +endfunction + +" Replace lines from `start' to `start + len - 1' with the given strings. {{{2 +" If more lines are needed to show all strings, they will be added. +" If there are too few strings to fill all lines, lines will be removed. +function! s:SetLines(start, len, strings) + if a:start > line('$') + 1 || a:start < 1 + throw "Invalid start line!" + endif + + if len(a:strings) > a:len + let fensave = &fen + let view = winsaveview() + call append(a:start + a:len - 1, repeat([''], len(a:strings) - a:len)) + call winrestview(view) + let &fen = fensave + elseif len(a:strings) < a:len + let fensave = &fen + let view = winsaveview() + sil exe (a:start + len(a:strings)) . ',' . (a:start + a:len - 1) . 'd_' + call winrestview(view) + let &fen = fensave + endif + + call setline(a:start, a:strings) +endfunction + +" Runs the given commandstring argument as an expression. {{{2 +" The commandstring expression is expected to reference the a:lines argument. +" If the commandstring expression returns a list the items of that list will +" replace the items in a:lines, otherwise the expression is assumed to have +" modified a:lines itself. +function! s:FilterString(lines, commandstring) + exe 'let rv = ' . a:commandstring + + if type(rv) == type(a:lines) && rv isnot a:lines + call filter(a:lines, 0) + call extend(a:lines, rv) + endif +endfunction + +" Public API {{{1 + +if !exists("g:tabular_default_format") + let g:tabular_default_format = "l1" +endif + +let s:formatelempat = '\%([lrc]\d\+\)' + +function! tabular#ElementFormatPattern() + return s:formatelempat +endfunction + +" Given a list of strings and a delimiter, split each string on every +" occurrence of the delimiter pattern, format each element according to either +" the provided format (optional) or the default format, and join them back +" together with enough space padding to guarantee that the nth delimiter of +" each string is aligned. +function! tabular#TabularizeStrings(strings, delim, ...) + if a:0 > 1 + echoerr "TabularizeStrings accepts only 2 or 3 arguments (got ".(a:0+2).")" + return 1 + endif + + let formatstr = (a:0 ? a:1 : g:tabular_default_format) + + if formatstr !~? s:formatelempat . '\+' + echoerr "Tabular: Invalid format \"" . formatstr . "\" specified!" + return 1 + endif + + let format = split(formatstr, s:formatelempat . '\zs') + + let lines = map(a:strings, 's:SplitDelim(v:val, a:delim)') + + " Strip spaces + " - Only from non-delimiters; spaces in delimiters must have been matched + " intentionally + " - Don't strip leading spaces from the first element; we like indenting. + for line in lines + if len(line) == 1 && s:do_gtabularize + continue " Leave non-matching lines unchanged for GTabularize + endif + + if line[0] !~ '^\s*$' + let line[0] = s:StripTrailingSpaces(line[0]) + endif + if len(line) >= 3 + for i in range(2, len(line)-1, 2) + let line[i] = s:StripLeadingSpaces(s:StripTrailingSpaces(line[i])) + endfor + endif + endfor + + " Find the max length of each field + let maxes = [] + for line in lines + if len(line) == 1 && s:do_gtabularize + continue " non-matching lines don't affect field widths for GTabularize + endif + + for i in range(len(line)) + if i == len(maxes) + let maxes += [ s:Strlen(line[i]) ] + else + let maxes[i] = max( [ maxes[i], s:Strlen(line[i]) ] ) + endif + endfor + endfor + + let lead_blank = empty(filter(copy(lines), 'v:val[0] =~ "\\S"')) + + " Concatenate the fields, according to the format pattern. + for idx in range(len(lines)) + let line = lines[idx] + + if len(line) == 1 && s:do_gtabularize + let lines[idx] = line[0] " GTabularize doesn't change non-matching lines + continue + endif + + for i in range(len(line)) + let how = format[i % len(format)][0] + let pad = format[i % len(format)][1:-1] + + if how =~? 'l' + let field = s:Left(line[i], maxes[i]) + elseif how =~? 'r' + let field = s:Right(line[i], maxes[i]) + elseif how =~? 'c' + let field = s:Center(line[i], maxes[i]) + endif + + let line[i] = field . (lead_blank && i == 0 ? '' : repeat(" ", pad)) + endfor + + let lines[idx] = s:StripTrailingSpaces(join(line, '')) + endfor +endfunction + +" Apply 0 or more filters, in sequence, to selected text in the buffer {{{2 +" The lines to be filtered are determined as follows: +" If the function is called with a range containing multiple lines, then +" those lines will be used as the range. +" If the function is called with no range or with a range of 1 line, then +" if GTabularize mode is being used, +" the range will not be adjusted +" if "includepat" is not specified, +" that 1 line will be filtered, +" if "includepat" is specified and that line does not match it, +" no lines will be filtered +" if "includepat" is specified and that line does match it, +" all contiguous lines above and below the specified line matching the +" pattern will be filtered. +" +" The remaining arguments must each be a filter to apply to the text. +" Each filter must either be a String evaluating to a function to be called. +function! tabular#PipeRange(includepat, ...) range + exe a:firstline . ',' . a:lastline + \ . 'call tabular#PipeRangeWithOptions(a:includepat, a:000, {})' +endfunction + +" Extended version of tabular#PipeRange, which +" 1) Takes the list of filters as an explicit list rather than as varargs +" 2) Supports passing a dictionary of options to control the routine. +" Currently, the only supported option is 'mode', which determines whether +" to behave as :Tabularize or as :GTabularize +" This allows me to add new features here without breaking API compatibility +" in the future. +function! tabular#PipeRangeWithOptions(includepat, filterlist, options) range + let top = a:firstline + let bot = a:lastline + + let s:do_gtabularize = (get(a:options, 'mode', '') ==# 'GTabularize') + + if !s:do_gtabularize + " In the default mode, apply range extension logic + if a:includepat != '' && top == bot + if top < 0 || top > line('$') || getline(top) !~ a:includepat + return + endif + while top > 1 && getline(top-1) =~ a:includepat + let top -= 1 + endwhile + while bot < line('$') && getline(bot+1) =~ a:includepat + let bot += 1 + endwhile + endif + endif + + let lines = map(range(top, bot), 'getline(v:val)') + + for filter in a:filterlist + if type(filter) != type("") + echoerr "PipeRange: Bad filter: " . string(filter) + endif + + call s:FilterString(lines, filter) + + unlet filter + endfor + + call s:SetLines(top, bot - top + 1, lines) +endfunction + +" Part of the public interface so interested pipelines can query this and +" adjust their behavior appropriately. +function! tabular#DoGTabularize() + return s:do_gtabularize +endfunction + +function! s:SplitDelimTest(string, delim, expected) + let result = s:SplitDelim(a:string, a:delim) + + if result !=# a:expected + echomsg 'Test failed!' + echomsg ' string=' . string(a:string) . ' delim=' . string(a:delim) + echomsg ' Returned=' . string(result) + echomsg ' Expected=' . string(a:expected) + endif +endfunction + +function! tabular#SplitDelimUnitTest() + let assignment = '[|&+*/%<>=!~-]\@<!\([<>!=]=\|=\~\)\@![|&+*/%<>=!~-]*=' + let two_spaces = ' ' + let ternary_operator = '^.\{-}\zs?\|:' + let cpp_io = '<<\|>>' + let pascal_assign = ':=' + let trailing_c_comments = '\/\*\|\*\/\|\/\/' + + call s:SplitDelimTest('a+=b', assignment, ['a', '+=', 'b']) + call s:SplitDelimTest('a-=b', assignment, ['a', '-=', 'b']) + call s:SplitDelimTest('a!=b', assignment, ['a!=b']) + call s:SplitDelimTest('a==b', assignment, ['a==b']) + call s:SplitDelimTest('a&=b', assignment, ['a', '&=', 'b']) + call s:SplitDelimTest('a|=b', assignment, ['a', '|=', 'b']) + call s:SplitDelimTest('a=b=c', assignment, ['a', '=', 'b', '=', 'c']) + + call s:SplitDelimTest('a b c', two_spaces, ['a', ' ', 'b', ' ', 'c']) + call s:SplitDelimTest('a b c', two_spaces, ['a b', ' ', ' c']) + call s:SplitDelimTest('ab c', two_spaces, ['ab', ' ', '', ' ', 'c']) + + call s:SplitDelimTest('a?b:c', ternary_operator, ['a', '?', 'b', ':', 'c']) + + call s:SplitDelimTest('a<<b<<c', cpp_io, ['a', '<<', 'b', '<<', 'c']) + + call s:SplitDelimTest('a:=b=c', pascal_assign, ['a', ':=', 'b=c']) + + call s:SplitDelimTest('x//foo', trailing_c_comments, ['x', '//', 'foo']) + call s:SplitDelimTest('x/*foo*/',trailing_c_comments, ['x', '/*', 'foo', '*/', '']) + + call s:SplitDelimTest('#ab#cd#ef', '[^#]*', ['#', 'ab', '#', 'cd', '#', 'ef', '']) + call s:SplitDelimTest('#ab#cd#ef', '#\zs', ['#', '', 'ab#', '', 'cd#', '', 'ef']) +endfunction + +" Stupid vimscript crap, part 2 {{{1 +let &cpo = s:savecpo +unlet s:savecpo + +" vim:set sw=2 sts=2 fdm=marker: diff --git a/sources_non_forked/tabular/doc/Tabular.txt b/sources_non_forked/tabular/doc/Tabular.txt new file mode 100644 index 00000000..a4192ad9 --- /dev/null +++ b/sources_non_forked/tabular/doc/Tabular.txt @@ -0,0 +1,260 @@ +*Tabular.txt* Configurable, flexible, intuitive text aligning + + *tabular* *tabular.vim* + + #|#|#|#|#| #| #| ~ + #| #|#|#| #|#|#| #| #| #| #|#|#| #| #|#| ~ + #| #| #| #| #| #| #| #| #| #| #|#| ~ + #| #| #| #| #| #| #| #| #| #| #| ~ + #| #|#|#| #|#|#| #|#|#| #| #|#|#| #| ~ + + For Vim version 7.0 or newer + + By Matt Wozniski + mjw@drexel.edu + + Reference Manual ~ + + *tabular-toc* + +1. Description |tabular-intro| +2. Walkthrough |tabular-walkthrough| +3. Scripting |tabular-scripting| + +The functionality mentioned here is a plugin, see |add-plugin|. +You can avoid loading this plugin by setting the "Tabular_loaded" global +variable in your |vimrc| file: > + :let g:tabular_loaded = 1 + +============================================================================== +1. Description *tabular-intro* + +Sometimes, it's useful to line up text. Naturally, it's nicer to have the +computer do this for you, since aligning things by hand quickly becomes +unpleasant. While there are other plugins for aligning text, the ones I've +tried are either impossibly difficult to understand and use, or too simplistic +to handle complicated tasks. This plugin aims to make the easy things easy +and the hard things possible, without providing an unnecessarily obtuse +interface. It's still a work in progress, and criticisms are welcome. + +============================================================================== +2. Walkthrough *tabular-walkthrough* *:Tabularize* + +Tabular's commands are based largely on regular expressions. The basic +technique used by Tabular is taking some regex to match field delimiters, +splitting the input lines at those delimiters, trimming unnecessary spaces +from the non-delimiter parts, padding the non-delimiter parts of the lines +with spaces to make them the same length, and joining things back together +again. + +For instance, consider starting with the following lines: +> + Some short phrase,some other phrase + A much longer phrase here,and another long phrase +< +Let's say we want to line these lines up at the commas. We can tell +Tabularize to do this by passing a pattern matching , to the Tabularize +command: +> + :Tabularize /, + + Some short phrase , some other phrase + A much longer phrase here , and another long phrase +< +I encourage you to try copying those lines to another buffer and trying to +call :Tabularize. You'll want to take notice of two things quickly: First, +instead of requiring a range, Tabularize tries to figure out what you want to +happen. Since it knows that you want to act on lines matching a comma, it +will look upwards and downwards for lines around the current line that match a +comma, and consider all contiguous lines matching the pattern to be the range +to be acted upon. You can always override this by specifying a range, though. + +The second thing you should notice is that you'll almost certainly be able to +abbreviate :Tabularize to :Tab - using this form in mappings and scripts is +discouraged as it will make conflicts with other scripts more likely, but for +interactive use it's a nice timesaver. Another convenience feature is that +running :Tabularize without providing a new pattern will cause it to reuse the +last pattern it was called with. + +So, anyway, now the commas line up. Splitting the lines on commas, Tabular +realized that 'Some short phrase' would need to be padded with spaces to match +the length of 'A much longer phrase here', and it did that before joining the +lines back together. You'll also notice that, in addition to the spaces +inserting for padding, extra spaces were inserted between fields. That's +because by default, Tabular prints things left-aligned with one space between +fields. If you wanted to print things right-aligned with no spaces between +fields, you would provide a different format to the Tabularize command: +> + :Tabularize /,/r0 + + Some short phrase, some other phrase + A much longer phrase here,and another long phrase +< +A format specifier is either l, r, or c, followed by one or more digits. If +the letter is l, the field will be left aligned, similarly for r and right +aligning and c and center aligning. The number following the letter is the +number of spaces padding to insert before the start of the next field. +Multiple format specifiers can be added to the same command - each field will +be printed with the next format specifier in the list; when they all have been +used the first will be used again, and so on. So, the last command right +aligned every field, then inserted 0 spaces of padding before the next field. +What if we wanted to right align the text before the comma, and left align the +text after the comma? The command would look like this: +> + :Tabularize /,/r1c1l0 + + Some short phrase , some other phrase + A much longer phrase here , and another long phrase +< +That command would be read as "Align the matching text, splitting fields on +commas. Print everything before the first comma right aligned, then 1 space, +then the comma center aligned, then 1 space, then everything after the comma +left aligned." Notice that the alignment of the field the comma is in is +irrelevant - since it's only 1 cell wide, it looks the same whether it's right, +left, or center aligned. Also notice that the 0 padding spaces specified for +the 3rd field are unused - but they would be used if there were enough fields +to require looping through the fields again. For instance: +> + abc,def,ghi + a,b + a,b,c + + :Tabularize /,/r1c1l0 + + abc , def, ghi + a , b + a , b , c +< +Notice that now, the format pattern has been reused; field 4 (the second comma) +is right aligned, field 5 is center aligned. No spaces were inserted between +the 3rd field (containing "def") and the 4th field (the second comma) because +the format specified 'l0'. + +But, what if you only wanted to act on the first comma on the line, rather than +all of the commas on the line? Let's say we want everything before the first +comma right aligned, then the comma, then everything after the comma left +aligned: +> + abc,def,ghi + a,b + a,b,c + + :Tabularize /^[^,]*\zs,/r0c0l0 + + abc,def,ghi + a,b + a,b,c +< +Here, we used a Vim regex that would only match the first comma on the line. +It matches the beginning of the line, followed by all the non-comma characters +up to the first comma, and then forgets about what it matched so far and +pretends that the match starts exactly at the comma. + +But, now that this command does exactly what we want it to, it's become pretty +unwieldy. It would be unpleasant to need to type that more than once or +twice. The solution is to assign a name to it. +> + :AddTabularPattern first_comma /^[^,]*\zs,/r0c0l0 +< +Now, typing ":Tabularize first_comma" will do the same thing as typing the +whole pattern out each time. Of course this is more useful if you store the +name in a file to be used later. + +NOTE: In order to make these new commands available every time vim starts, +you'll need to put those new commands into a .vim file in a plugin directory +somewhere in your 'runtimepath'. In order to make sure that Tabular.vim has +already been loaded before your file tries to use :AddTabularPattern or +:AddTabularPipeline, the new file should be installed in an after/plugin +directory in 'runtimepath'. In general, it will be safe to find out where the +TabularMaps.vim plugin was installed, and place other files extending +Tabular.vim in the same directory as TabularMaps.vim. For more information, +and some suggested best practices, check out the |tabular-scripting| section. + +Lastly, we'll approach the case where tabular cannot achieve your desired goal +just by splitting lines appart, trimming whitespace, padding with whitespace, +and rejoining the lines. As an example, consider the multiple_spaces command +from TabularMaps.vim. The goal is to split using two or more spaces as a +field delimiter, and join fields back together, properly lined up, with only +two spaces between the end of each field and the beginning of the next. +Unfortunately, Tabular can't do this with only the commands we know so far: +> + :Tabularize / / +< +The above function won't work, because it will consider "a b" as 5 fields +delimited by two pairs of 2 spaces ( 'a', ' ', '', ' ', 'b' ) instead of as +3 fields delimited by one set of 2 or more spaces ( 'a', ' ', 'b' ). +> + :Tabularize / \+/ +< +The above function won't work either, because it will leave the delimiter as 4 +spaces when used against "a b", meaning that we would fail at our goal of +collapsing everything down to two spaces between fields. So, we need a new +command to get around this: +> + :AddTabularPipeline multiple_spaces / \{2,}/ + \ map(a:lines, "substitute(v:val, ' \{2,}', ' ', 'g')") + \ | tabular#TabularizeStrings(a:lines, ' ', 'l0') +< +Yeah. I know it looks complicated. Bear with me. I probably will try to add +in some shortcuts for this syntax, but this verbose will be guaranteed to +always work. + +You should already recognize the name being assigned. The next thing to +happen is / \{2,}/ which is a pattern specifying which lines should +automatically be included in the range when no range is given. Without this, +there would be no pattern to use for extending the range. Everything after +that is a | separated list of expressions to be evaluated. In the context in +which they will be evaluated, a:lines will be set to a List of Strings +containing the text of the lines being filtered as they procede through the +pipeline you've set up. The \ at the start of the lines are just vim's line +continuation marker; you needn't worry much about them. So, the first +expression in the pipeline transforms each line by replacing every instance of +2 or more spaces with exactly two spaces. The second command in the pipeline +performs the equivalent of ":Tabularize / /l0"; the only difference is that +it is operating on a List of Strings rather than text in the buffer. At the +end of the pipeline, the Strings in the modified a:lines (or the return value +of the last expression in the pipeline, if it returns a List) will replace the +chosen range. + +============================================================================== +3. Extending *tabular-scripting* + +As mentioned above, the most important consideration when extending Tabular +with new maps or commands is that your plugin must be loaded after Tabular.vim +has finished loading, and only if Tabular.vim has loaded successfully. The +easiest approach to making sure it loads after Tabular.vim is simply putting +the new file (we'll call it "tabular_extra.vim" as an example) into an +"after/plugin/" directory in 'runtimepath', for instance: +> + ~/.vim/after/plugin/tabular_extra.vim +< +The default set of mappings, found in "TabularMaps.vim", is installed in +the after/plugin/ subdirectory of whatever directory Tabular was installed to. + +The other important consideration is making sure that your commands are only +called if Tabular.vim was actually loaded. The easiest way to do this is by +checking for the existence of the :Tabularize command at the start of your +plugin. A short example plugin would look like this: +> + " after/plugin/my_tabular_commands.vim + " Provides extra :Tabularize commands + + if !exists(':Tabularize') + finish " Give up here; the Tabular plugin musn't have been loaded + endif + + " Make line wrapping possible by resetting the 'cpo' option, first saving it + let s:save_cpo = &cpo + set cpo&vim + + AddTabularPattern! asterisk /*/l1 + + AddTabularPipeline! remove_leading_spaces /^ / + \ map(a:lines, "substitute(v:val, '^ *', '', '')") + + " Restore the saved value of 'cpo' + let &cpo = s:save_cpo + unlet s:save_cpo +< +============================================================================== +vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl: diff --git a/sources_non_forked/tabular/plugin/Tabular.vim b/sources_non_forked/tabular/plugin/Tabular.vim new file mode 100644 index 00000000..e73329ac --- /dev/null +++ b/sources_non_forked/tabular/plugin/Tabular.vim @@ -0,0 +1,346 @@ +" Tabular: Align columnar data using regex-designated column boundaries +" Maintainer: Matthew Wozniski (godlygeek@gmail.com) +" Date: Thu, 03 May 2012 20:49:32 -0400 +" Version: 1.0 +" +" Long Description: +" Sometimes, it's useful to line up text. Naturally, it's nicer to have the +" computer do this for you, since aligning things by hand quickly becomes +" unpleasant. While there are other plugins for aligning text, the ones I've +" tried are either impossibly difficult to understand and use, or too simplistic +" to handle complicated tasks. This plugin aims to make the easy things easy +" and the hard things possible, without providing an unnecessarily obtuse +" interface. It's still a work in progress, and criticisms are welcome. +" +" License: +" Copyright (c) 2012, Matthew J. Wozniski +" All rights reserved. +" +" Redistribution and use in source and binary forms, with or without +" modification, are permitted provided that the following conditions are met: +" * Redistributions of source code must retain the above copyright notice, +" this list of conditions and the following disclaimer. +" * Redistributions in binary form must reproduce the above copyright +" notice, this list of conditions and the following disclaimer in the +" documentation and/or other materials provided with the distribution. +" * The names of the contributors may not be used to endorse or promote +" products derived from this software without specific prior written +" permission. +" +" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS +" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +" NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, +" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +" OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +" Abort if running in vi-compatible mode or the user doesn't want us. +if &cp || exists('g:tabular_loaded') + if &cp && &verbose + echo "Not loading Tabular in compatible mode." + endif + finish +endif + +let g:tabular_loaded = 1 + +" Stupid vimscript crap {{{1 +let s:savecpo = &cpo +set cpo&vim + +" Private Things {{{1 + +" Dictionary of command name to command +let s:TabularCommands = {} + +" Generate tab completion list for :Tabularize {{{2 +" Return a list of commands that match the command line typed so far. +" NOTE: Tries to handle commands with spaces in the name, but Vim doesn't seem +" to handle that terribly well... maybe I should give up on that. +function! s:CompleteTabularizeCommand(argstart, cmdline, cursorpos) + let names = keys(s:TabularCommands) + if exists("b:TabularCommands") + let names += keys(b:TabularCommands) + endif + + let cmdstart = substitute(a:cmdline, '^\s*\S\+\s*', '', '') + + return filter(names, 'v:val =~# ''^\V'' . escape(cmdstart, ''\'')') +endfunction + +" Choose the proper command map from the given command line {{{2 +" Returns [ command map, command line with leading <buffer> removed ] +function! s:ChooseCommandMap(commandline) + let map = s:TabularCommands + let cmd = a:commandline + + if cmd =~# '^<buffer>\s\+' + if !exists('b:TabularCommands') + let b:TabularCommands = {} + endif + let map = b:TabularCommands + let cmd = substitute(cmd, '^<buffer>\s\+', '', '') + endif + + return [ map, cmd ] +endfunction + +" Parse '/pattern/format' into separate pattern and format parts. {{{2 +" If parsing fails, return [ '', '' ] +function! s:ParsePattern(string) + if a:string[0] != '/' + return ['',''] + endif + + let pat = '\\\@<!\%(\\\\\)\{-}\zs/' . tabular#ElementFormatPattern() . '*$' + let format = matchstr(a:string[1:-1], pat) + if !empty(format) + let format = format[1 : -1] + let pattern = a:string[1 : -len(format) - 2] + else + let pattern = a:string[1 : -1] + endif + + return [pattern, format] +endfunction + +" Split apart a list of | separated expressions. {{{2 +function! s:SplitCommands(string) + if a:string =~ '^\s*$' + return [] + endif + + let end = match(a:string, "[\"'|]") + + " Loop until we find a delimiting | or end-of-string + while end != -1 && (a:string[end] != '|' || a:string[end+1] == '|') + if a:string[end] == "'" + let end = match(a:string, "'", end+1) + 1 + if end == 0 + throw "No matching end single quote" + endif + elseif a:string[end] == '"' + " Find a " preceded by an even number of \ (or 0) + let pattern = '\%(\\\@<!\%(\\\\\)*\)\@<="' + let end = matchend(a:string, pattern, end+1) + 1 + if end == 0 + throw "No matching end double quote" + endif + else " Found || + let end += 2 + endif + + let end = match(a:string, "[\"'|]", end) + endwhile + + if end == 0 || a:string[0 : end - (end > 0)] =~ '^\s*$' + throw "Empty element" + endif + + if end == -1 + let rv = [ a:string ] + else + let rv = [ a:string[0 : end-1] ] + s:SplitCommands(a:string[end+1 : -1]) + endif + + return rv +endfunction + +" Public Things {{{1 + +" Command associating a command name with a simple pattern command {{{2 +" AddTabularPattern[!] [<buffer>] name /pattern[/format] +" +" If <buffer> is provided, the command will only be available in the current +" buffer, and will be used instead of any global command with the same name. +" +" If a command with the same name and scope already exists, it is an error, +" unless the ! is provided, in which case the existing command will be +" replaced. +" +" pattern is a regex describing the delimiter to be used. +" +" format describes the format pattern to be used. The default will be used if +" none is provided. +com! -nargs=+ -bang AddTabularPattern + \ call AddTabularPattern(<q-args>, <bang>0) + +function! AddTabularPattern(command, force) + try + let [ commandmap, rest ] = s:ChooseCommandMap(a:command) + + let name = matchstr(rest, '.\{-}\ze\s*/') + let pattern = substitute(rest, '.\{-}\s*\ze/', '', '') + + let [ pattern, format ] = s:ParsePattern(pattern) + + if empty(name) || empty(pattern) + throw "Invalid arguments!" + endif + + if !a:force && has_key(commandmap, name) + throw string(name) . " is already defined, use ! to overwrite." + endif + + let command = "tabular#TabularizeStrings(a:lines, " . string(pattern) + + if !empty(format) + let command .= ", " . string(format) + endif + + let command .= ")" + + let commandmap[name] = { 'pattern' : pattern, 'commands' : [ command ] } + catch + echohl ErrorMsg + echomsg "AddTabularPattern: " . v:exception + echohl None + endtry +endfunction + +" Command associating a command name with a pipeline of functions {{{2 +" AddTabularPipeline[!] [<buffer>] name /pattern/ func [ | func2 [ | func3 ] ] +" +" If <buffer> is provided, the command will only be available in the current +" buffer, and will be used instead of any global command with the same name. +" +" If a command with the same name and scope already exists, it is an error, +" unless the ! is provided, in which case the existing command will be +" replaced. +" +" pattern is a regex that will be used to determine which lines will be +" filtered. If the cursor line doesn't match the pattern, using the command +" will be a no-op, otherwise the cursor and all contiguous lines matching the +" pattern will be filtered. +" +" Each 'func' argument represents a function to be called. This function +" will have access to a:lines, a List containing one String per line being +" filtered. +com! -nargs=+ -bang AddTabularPipeline + \ call AddTabularPipeline(<q-args>, <bang>0) + +function! AddTabularPipeline(command, force) + try + let [ commandmap, rest ] = s:ChooseCommandMap(a:command) + + let name = matchstr(rest, '.\{-}\ze\s*/') + let pattern = substitute(rest, '.\{-}\s*\ze/', '', '') + + let commands = matchstr(pattern, '^/.\{-}\\\@<!\%(\\\\\)\{-}/\zs.*') + let pattern = matchstr(pattern, '/\zs.\{-}\\\@<!\%(\\\\\)\{-}\ze/') + + if empty(name) || empty(pattern) + throw "Invalid arguments!" + endif + + if !a:force && has_key(commandmap, name) + throw string(name) . " is already defined, use ! to overwrite." + endif + + let commandlist = s:SplitCommands(commands) + + if empty(commandlist) + throw "Must provide a list of functions!" + endif + + let commandmap[name] = { 'pattern' : pattern, 'commands' : commandlist } + catch + echohl ErrorMsg + echomsg "AddTabularPipeline: " . v:exception + echohl None + endtry +endfunction + +" Tabularize /pattern[/format] {{{2 +" Tabularize name +" +" Align text, either using the given pattern, or the command associated with +" the given name. +com! -nargs=* -range -complete=customlist,<SID>CompleteTabularizeCommand + \ Tabularize <line1>,<line2>call Tabularize(<q-args>) + +function! Tabularize(command, ...) range + let piperange_opt = {} + if a:0 + let piperange_opt = a:1 + endif + + if empty(a:command) + if !exists("s:last_tabularize_command") + echohl ErrorMsg + echomsg "Tabularize hasn't been called yet; no pattern/command to reuse!" + echohl None + return + endif + else + let s:last_tabularize_command = a:command + endif + + let command = s:last_tabularize_command + + let range = a:firstline . ',' . a:lastline + + try + let [ pattern, format ] = s:ParsePattern(command) + + if !empty(pattern) + let cmd = "tabular#TabularizeStrings(a:lines, " . string(pattern) + + if !empty(format) + let cmd .= "," . string(format) + endif + + let cmd .= ")" + + exe range . 'call tabular#PipeRangeWithOptions(pattern, [ cmd ], ' + \ . 'piperange_opt)' + else + if exists('b:TabularCommands') && has_key(b:TabularCommands, command) + let usercmd = b:TabularCommands[command] + elseif has_key(s:TabularCommands, command) + let usercmd = s:TabularCommands[command] + else + throw "Unrecognized command " . string(command) + endif + + exe range . 'call tabular#PipeRangeWithOptions(usercmd["pattern"], ' + \ . 'usercmd["commands"], piperange_opt)' + endif + catch + echohl ErrorMsg + echomsg "Tabularize: " . v:exception + echohl None + return + endtry +endfunction + +" GTabularize /pattern[/format] {{{2 +" GTabularize name +" +" Align text on only matching lines, either using the given pattern, or the +" command associated with the given name. Mnemonically, this is similar to +" the :global command, which takes some action on all rows matching a pattern +" in a range. This command is different from normal :Tabularize in 3 ways: +" 1) If a line in the range does not match the pattern, it will be left +" unchanged, and not in any way affect the outcome of other lines in the +" range (at least, normally - but Pipelines can and will still look at +" non-matching rows unless they are specifically written to be aware of +" tabular#DoGTabularize() and handle it appropriately). +" 2) No automatic range determination - :Tabularize automatically expands +" a single-line range (or a call with no range) to include all adjacent +" matching lines. That behavior does not make sense for this command. +" 3) If called without a range, it will act on all lines in the buffer (like +" :global) rather than only a single line +com! -nargs=* -range=% -complete=customlist,<SID>CompleteTabularizeCommand + \ GTabularize <line1>,<line2> + \ call Tabularize(<q-args>, { 'mode': 'GTabularize' } ) + +" Stupid vimscript crap, part 2 {{{1 +let &cpo = s:savecpo +unlet s:savecpo + +" vim:set sw=2 sts=2 fdm=marker: diff --git a/sources_non_forked/vim-flake8/README.mdown b/sources_non_forked/vim-flake8/README.mdown index 940eadf7..00d49515 100644 --- a/sources_non_forked/vim-flake8/README.mdown +++ b/sources_non_forked/vim-flake8/README.mdown @@ -108,6 +108,20 @@ This plugin goes well together with the following plugin: and `<F9>`) +Max line lengths +---------------- + +One particular customization a lot of people like to make is relaxing the +maximum line length default. This is a config setting that should be set in +flake8 itself. (vim-flake8 "just" invokes it and deals with showing the output +in Vim's quickfix window.) + +To do so, put the following into your `~/.config/flake8` file: + + [flake8] + max-line-length = 120 + + History ------- 1.6: Deprecated configuring flake8 options through Vim settings. Instead, diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index 345ea349..1f26ec3f 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -468,8 +468,8 @@ endfun function! s:repo_aliases() dict abort if !has_key(self,'_aliases') let self._aliases = {} - for line in split(self.git_chomp('config','--get-regexp','^alias[.]'),"\n") - let self._aliases[matchstr(line,'\.\zs\S\+')] = matchstr(line,' \zs.*') + for line in split(self.git_chomp('config','-z','--get-regexp','^alias[.]'),"\1") + let self._aliases[matchstr(line, '\.\zs.\{-}\ze\n')] = matchstr(line, '\n\zs.*') endfor endif return self._aliases @@ -1776,13 +1776,17 @@ function! s:Diff(vert,keepfocus,...) abort let nr = bufnr('') execute 'leftabove '.vert.'split `=fugitive#buffer().repo().translate(s:buffer().expand('':2''))`' execute 'nnoremap <buffer> <silent> dp :diffput '.nr.'<Bar>diffupdate<CR>' + let nr2 = bufnr('') call s:diffthis() wincmd p execute 'rightbelow '.vert.'split `=fugitive#buffer().repo().translate(s:buffer().expand('':3''))`' execute 'nnoremap <buffer> <silent> dp :diffput '.nr.'<Bar>diffupdate<CR>' + let nr3 = bufnr('') call s:diffthis() wincmd p call s:diffthis() + execute 'nnoremap <buffer> <silent> d2o :diffget '.nr2.'<Bar>diffupdate<CR>' + execute 'nnoremap <buffer> <silent> d3o :diffget '.nr3.'<Bar>diffupdate<CR>' return post elseif len(args) let arg = join(args, ' ') diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index a6923af6..3285648e 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -2,10 +2,20 @@ * We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. +IMPROVEMENTS: + +* Function calls are now highligted as wel when `g:go_highlight_functions` is enabled [gh-1048] +* Add completion support for uninported packages. This allows to complete even if the package is not improted [gh-1084] +* Tools that embeds GOROOT into their binaries do not work when people update their Go version and the GOROOT contains the vesion as part of their path (i.e: `/usr/local/Cellar/go/1.7.2/libexec`, [more info](https://blog.filippo.io/stale-goroot-and-gorebuild/)) . This is now fixed by introducing automatic GOROOT set/unset before each tool invoke. [gh-954] + BUG FIXES: * Change back nil and iota highlighting color to the old type [gh-1049] * Fix passing arguments to `:GoBuild` while using NeoVim [gh-1062] +* Do not open a split if `:GoDef` is used on a modified file [gh-1083] +* Highlight nested structs correctly [gh-1075] +* Highlight builtin functions correctly if `g:go_highlight_functions` is enabled [gh-1070] +* Fix `:GoSameIds` highlighting if a new buffer is opened in the same window [gh-1067] ## 1.9 (September 13, 2016) diff --git a/sources_non_forked/vim-go/LICENSE b/sources_non_forked/vim-go/LICENSE index e9cc0dcd..fd538bde 100644 --- a/sources_non_forked/vim-go/LICENSE +++ b/sources_non_forked/vim-go/LICENSE @@ -56,3 +56,5 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The Go gopher was designed by Renee French. http://reneefrench.blogspot.com/ The design is licensed under the Creative Commons 3.0 Attributions license. Read this article for more details: https://blog.golang.org/gopher diff --git a/sources_non_forked/vim-go/autoload/go/complete.vim b/sources_non_forked/vim-go/autoload/go/complete.vim index 17834536..e65b008a 100644 --- a/sources_non_forked/vim-go/autoload/go/complete.vim +++ b/sources_non_forked/vim-go/autoload/go/complete.vim @@ -32,7 +32,9 @@ function! s:gocodeCommand(cmd, preargs, args) " we might hit cache problems, as gocode doesn't handle well different " GOPATHS: https://github.com/nsf/gocode/issues/239 let old_gopath = $GOPATH + let old_goroot = $GOROOT let $GOPATH = go#path#Detect() + let $GOROOT = go#util#env("goroot") let socket_type = get(g:, 'go_gocode_socket_type', s:sock_type) let cmd = printf('%s -sock %s %s %s %s', @@ -45,6 +47,8 @@ function! s:gocodeCommand(cmd, preargs, args) let result = go#util#System(cmd) let $GOPATH = old_gopath + let $GOROOT = old_goroot + if go#util#ShellError() != 0 return "[\"0\", []]" else @@ -74,6 +78,7 @@ function! s:gocodeEnableOptions() call go#util#System(printf('%s set propose-builtins %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_propose_builtins', 1)))) call go#util#System(printf('%s set autobuild %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_autobuild', 1)))) + call go#util#System(printf('%s set unimported-packages %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_unimported_packages', 1)))) endfunction function! s:toBool(val) diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim index b7e22a1c..41464fe0 100644 --- a/sources_non_forked/vim-go/autoload/go/def.vim +++ b/sources_non_forked/vim-go/autoload/go/def.vim @@ -129,8 +129,6 @@ function! s:jump_to_declaration(out, mode) split elseif a:mode == "vsplit" vsplit - elseif &modified - split endif " open the file and jump to line and column diff --git a/sources_non_forked/vim-go/autoload/go/tool.vim b/sources_non_forked/vim-go/autoload/go/tool.vim index c41bbd27..fe7f2575 100644 --- a/sources_non_forked/vim-go/autoload/go/tool.vim +++ b/sources_non_forked/vim-go/autoload/go/tool.vim @@ -121,7 +121,9 @@ endfunction function! go#tool#ExecuteInDir(cmd) abort let old_gopath = $GOPATH + let old_goroot = $GOROOT let $GOPATH = go#path#Detect() + let $GOROOT = go#util#env("goroot") let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' let dir = getcwd() @@ -132,6 +134,7 @@ function! go#tool#ExecuteInDir(cmd) abort execute cd . fnameescape(dir) endtry + let $GOROOT = old_goroot let $GOPATH = old_gopath return out endfunction diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim index 0251b14a..8792e230 100644 --- a/sources_non_forked/vim-go/autoload/go/util.vim +++ b/sources_non_forked/vim-go/autoload/go/util.vim @@ -43,6 +43,31 @@ function! go#util#IsWin() return 0 endfunction +let s:env_cache = {} + +" env returns the go environment variable for the given key. Where key can be +" GOARCH, GOOS, GOROOT, etc... It caches the result and returns the cached +" version. +function! go#util#env(key) + let l:key = tolower(a:key) + if has_key(s:env_cache, l:key) + return s:env_cache[l:key] + endif + + if executable('go') + let l:var = call('go#util#'.l:key, []) + if go#util#ShellError() != 0 + call go#util#EchoError(printf("'go env %s' failed", toupper(l:key))) + return '' + endif + else + let l:var = eval("$".toupper(a:key)) + endif + + let s:env_cache[l:key] = l:var + return l:var +endfunction + function! go#util#goarch() return substitute(go#util#System('go env GOARCH'), '\n', '', 'g') endfunction diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 19682c42..75189496 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -1396,6 +1396,12 @@ to an autocompletion proposals. By default it is enabled. > let g:go_gocode_propose_builtins = 1 < + *'g:go_gocode_unimported_packages'* + +Specifies whether `gocode` should include suggestions from unimported packages. +By default it is enabled +> + let g:go_gocode_unimported_packages = 1 *'g:go_gocode_socket_type'* Specifies whether `gocode` should use a different socket type. By default diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim index 6c050083..8a9eaf2a 100644 --- a/sources_non_forked/vim-go/plugin/go.vim +++ b/sources_non_forked/vim-go/plugin/go.vim @@ -200,6 +200,10 @@ augroup vim-go autocmd BufWritePre *.s call s:asmfmt_autosave() autocmd BufWritePost *.go call s:metalinter_autosave() autocmd BufNewFile *.go call s:template_autocreate() + " clear SameIds when the buffer is unloaded so that loading another buffer + " in the same window doesn't highlight the most recently matched + " identifier's positions. + autocmd BufWinEnter *.go call go#guru#ClearSameIds() augroup END " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim index e7e61ff3..54afa6ac 100644 --- a/sources_non_forked/vim-go/syntax/go.vim +++ b/sources_non_forked/vim-go/syntax/go.vim @@ -302,16 +302,18 @@ if g:go_highlight_functions != 0 syn match goPointerOperator /\*/ nextgroup=goReceiverType contained skipwhite skipnl syn match goReceiverType /\w\+/ contained syn match goFunction /\w\+/ contained + syn match goFunctionCall /\w\+\ze(/ contains=GoBuiltins,goDeclaration else syn keyword goDeclaration func endif hi def link goFunction Function +hi def link goFunctionCall Type " Methods; if g:go_highlight_methods != 0 - syn match goMethod /\.\w\+\ze(/hs=s+1 + syn match goMethodCall /\.\w\+\ze(/hs=s+1 endif -hi def link goMethod Type +hi def link goMethodCall Type " Fields; if g:go_highlight_fields != 0 @@ -324,7 +326,7 @@ if g:go_highlight_types != 0 syn match goTypeConstructor /\<\w\+{/he=e-1 syn match goTypeDecl /\<type\>/ nextgroup=goTypeName skipwhite skipnl syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl - syn match goDeclType /\<interface\|struct\>/ contained skipwhite skipnl + syn match goDeclType /\<interface\|struct\>/ skipwhite skipnl hi def link goReceiverType Type else syn keyword goDeclType struct interface diff --git a/sources_non_forked/vim-pug/syntax/pug.vim b/sources_non_forked/vim-pug/syntax/pug.vim index ee712dbb..09e6b9b9 100644 --- a/sources_non_forked/vim-pug/syntax/pug.vim +++ b/sources_non_forked/vim-pug/syntax/pug.vim @@ -32,9 +32,10 @@ syn cluster pugTop contains=pugBegin,pugComment,pugHtmlComment,pugJavascript syn match pugBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=pugTag,pugClassChar,pugIdChar,pugPlainChar,pugJavascript,pugScriptConditional,pugScriptStatement,pugPipedText syn match pugTag "+\?\w\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@pugComponent syn cluster pugComponent contains=pugAttributes,pugIdChar,pugBlockExpansionChar,pugClassChar,pugPlainChar,pugJavascript,pugTagBlockChar,pugTagInlineText -syn match pugComment '\(\s\+\|^\)\/\/.*$' -syn region pugCommentBlock start="\z(\s\+\|^\)\/\/.*$" end="^\%(\z1\s\|\s*$\)\@!" keepend -syn region pugHtmlConditionalComment start="<!--\%(.*\)>" end="<!\%(.*\)-->" +syntax keyword pugCommentTodo contained TODO FIXME XXX TBD +syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo +syn region pugCommentBlock start="\z(\s\+\|^\)\/\/.*$" end="^\%(\z1\s\|\s*$\)\@!" contains=pugCommentTodo keepend +syn region pugHtmlConditionalComment start="<!--\%(.*\)>" end="<!\%(.*\)-->" contains=pugCommentTodo syn region pugAttributes matchgroup=pugAttributesDelimiter start="(" end=")" contained contains=@htmlJavascript,pugHtmlArg,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@pugComponent syn match pugClassChar "\." contained nextgroup=pugClass syn match pugBlockExpansionChar ":\s\+" contained nextgroup=pugTag,pugClassChar,pugIdChar @@ -93,6 +94,7 @@ hi def link pugInterpolationDelimiter Delimiter hi def link pugInlineDelimiter Delimiter hi def link pugFilter PreProc hi def link pugDocType PreProc +hi def link pugCommentTodo Todo hi def link pugComment Comment hi def link pugCommentBlock Comment hi def link pugHtmlConditionalComment pugComment diff --git a/sources_non_forked/vim-snippets/UltiSnips/all.snippets b/sources_non_forked/vim-snippets/UltiSnips/all.snippets index 8b7079e2..215487ec 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/all.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/all.snippets @@ -18,7 +18,7 @@ snippet box "A nice box with the current comment symbol" b box = make_box(len(t[1])) snip.rv = box[0] snip += box[1] -`${1:content}`!p +`${1:${VISUAL:content}}`!p box = make_box(len(t[1])) snip.rv = box[2] snip += box[3]` @@ -32,7 +32,7 @@ if not snip.c: box = make_box(len(t[1]), width) snip.rv = box[0] snip += box[1] -`${1:content}`!p +`${1:${VISUAL:content}}`!p box = make_box(len(t[1]), width) snip.rv = box[2] snip += box[3]` diff --git a/sources_non_forked/vim-snippets/UltiSnips/html.snippets b/sources_non_forked/vim-snippets/UltiSnips/html.snippets index 084d9f78..026985cb 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/html.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/html.snippets @@ -258,7 +258,7 @@ snippet style "XHTML <style>" w endsnippet snippet table "XHTML <table>" w -<table border="${1:0}"${2: cellspacing="${3:5}" cellpadding="${4:5}"}> +<table> ${0:${VISUAL}} </table> endsnippet @@ -317,4 +317,8 @@ snippet movie "Embed QT movie (movie)" b `!p x(snip)`> </object> endsnippet + +snippet viewport "Responsive viewport meta" w +<meta name="viewport" content="width=device-width, initial-scale=1"> +endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets index f468d0aa..8821c5ca 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets @@ -158,14 +158,4 @@ snippet cw "console.warn" b console.warn(${1:"${2:value}"}); endsnippet -# AMD (Asynchronous Module Definition) snippets - -snippet def "define an AMD module" -define(${1:optional_name, }[${2:'jquery'}], ${3:callback}); -endsnippet - -snippet req "require an AMD module" -require([${1:'dependencies'}], ${2:callback}); -endsnippet - # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets b/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets index 7367a147..de244736 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets @@ -121,9 +121,9 @@ class ${2:`!v expand('%:t:r')`} extends \Eloquent { public $timestamps = ${5:false}; - protected $hidden = array(${6}); + protected $hidden = [${6}]; - protected $guarded = array(${7:'id'}); + protected $guarded = [${7:'id'}]; } endsnippet @@ -162,7 +162,7 @@ abstract class ${2:`!v expand('%:t:r')`} implements ${3:BaseRepositoryInterface} * * \return Illuminate\Database\Eloquent\Collection */ - public function all($columns = array('*')) { + public function all($columns = ['*']) { return $this->model->all()->toArray(); } @@ -189,7 +189,7 @@ abstract class ${2:`!v expand('%:t:r')`} implements ${3:BaseRepositoryInterface} * * \return mixed */ - public function find($id, $columns = array('*')) { + public function find($id, $columns = ['*']) { return $this->model->find($id, $columns); } } diff --git a/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets b/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets index 2b127ee9..9bca168c 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets @@ -61,7 +61,7 @@ snippet sfa "Symfony 2 Controller action" public function $1Action($2) { $3 - return ${4:array();}$0 + return ${4:[];}$0 } endsnippet diff --git a/sources_non_forked/vim-snippets/pythonx/vimsnippets.py b/sources_non_forked/vim-snippets/pythonx/vimsnippets.py index 6a446a2a..d1cee17b 100644 --- a/sources_non_forked/vim-snippets/pythonx/vimsnippets.py +++ b/sources_non_forked/vim-snippets/pythonx/vimsnippets.py @@ -32,7 +32,7 @@ def _parse_comments(s): flags, text = next(i).split(':', 1) if len(flags) == 0: - rv.append((text, text, text, "")) + rv.append(('OTHER', text, text, text, "")) # parse 3-part comment, but ignore those with O flag elif 's' in flags and 'O' not in flags: ctriple = ["TRIPLE"] diff --git a/sources_non_forked/vim-snippets/snippets/arduino.snippets b/sources_non_forked/vim-snippets/snippets/arduino.snippets index 77ee46fa..6f7f4137 100644 --- a/sources_non_forked/vim-snippets/snippets/arduino.snippets +++ b/sources_non_forked/vim-snippets/snippets/arduino.snippets @@ -1,8 +1,8 @@ snippet setup void setup() { - ${0} - Serial.begin(9600); + Serial.begin(${1:9600}); + ${2} } snippet loop @@ -14,6 +14,9 @@ snippet loop snippet inc #include <${1}.h> +snippet def + #define ${1} + # if snippet if if (${1:/* condition */}) { @@ -50,12 +53,12 @@ snippet case # for snippet for - for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) { + for (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) { ${4} } # for (custom) snippet forr - for (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) { + for (int ${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) { ${5} } # while @@ -93,14 +96,29 @@ snippet dwLow # digitalRead snippet dr digitalRead(${1}); +# analogRead +snippet ar + analogRead(${1}); +# analogWrite +snippet aw + analogWrite(${1}); # serialRead snippet sr - serialRead(); -# serial.println + Serial.read(); +# serialWrite +snippet sw + Serial.write(); +# serial.print snippet sp - serial.println(${1}); + Serial.print(${1}); +# serial.println +snippet sl + Serial.println(${1}); # delay snippet dl delay(${1}); +# millis +snippet ml + millis(); diff --git a/sources_non_forked/vim-snippets/snippets/c.snippets b/sources_non_forked/vim-snippets/snippets/c.snippets index f4745c25..524b5b86 100644 --- a/sources_non_forked/vim-snippets/snippets/c.snippets +++ b/sources_non_forked/vim-snippets/snippets/c.snippets @@ -104,12 +104,12 @@ snippet ret ## Loops # for snippet for - for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) { + for (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) { ${4} } # for (custom) snippet forr - for (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) { + for (int ${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) { ${5} } # while @@ -164,6 +164,12 @@ snippet pr # fprintf (again, this isn't as nice as TextMate's version, but it works) snippet fpr fprintf(${1:stderr}, "${2:%s}\n"${3}); +snippet prd + printf("${1:} = %d\n", $1); +snippet prf + printf("${1:} = %f\n", $1); +snippet prx + printf("${1:} = %${2}\n", $1); # getopt snippet getopt int choice; diff --git a/sources_non_forked/vim-snippets/snippets/elixir.snippets b/sources_non_forked/vim-snippets/snippets/elixir.snippets index 46ac7c86..058f986c 100644 --- a/sources_non_forked/vim-snippets/snippets/elixir.snippets +++ b/sources_non_forked/vim-snippets/snippets/elixir.snippets @@ -88,6 +88,8 @@ snippet defmo defmodule ${1:`substitute(vim_snippets#Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} do ${0} end +snippet dfp + defp ${1:name}, do: ${2} snippet defp defp ${1:name} do ${0} @@ -100,6 +102,8 @@ snippet doc @doc """ ${0} """ +snippet docf + @doc false snippet fn fn ${1:args} -> ${0} end snippet mdoc diff --git a/sources_non_forked/vim-snippets/snippets/html.snippets b/sources_non_forked/vim-snippets/snippets/html.snippets index 5ae8e749..85d0e526 100644 --- a/sources_non_forked/vim-snippets/snippets/html.snippets +++ b/sources_non_forked/vim-snippets/snippets/html.snippets @@ -875,3 +875,5 @@ snippet video <video src="${1} height="${2}" width="${3}" preload="${5:none}" autoplay="${6:autoplay}>${7}</video> snippet wbr <wbr /> +snippet viewport + <meta name="viewport" content="width=device-width, initial-scale=1"> diff --git a/sources_non_forked/vim-snippets/snippets/java.snippets b/sources_non_forked/vim-snippets/snippets/java.snippets index e40bbf52..39cc850a 100644 --- a/sources_non_forked/vim-snippets/snippets/java.snippets +++ b/sources_non_forked/vim-snippets/snippets/java.snippets @@ -214,12 +214,20 @@ snippet wh while (${1}) ${0} ## ## Main method +snippet psvm + public static void main (String[] args) { + ${0} + } snippet main public static void main (String[] args) { ${0} } ## ## Print Methods +snippet sout + System.out.println(${0}); +snippet serr + System.err.println(${0}); snippet print System.out.print("${0:Message}"); snippet printf diff --git a/sources_non_forked/vim-snippets/snippets/javascript/bemjson.snippets b/sources_non_forked/vim-snippets/snippets/javascript-bemjson.snippets similarity index 97% rename from sources_non_forked/vim-snippets/snippets/javascript/bemjson.snippets rename to sources_non_forked/vim-snippets/snippets/javascript-bemjson.snippets index e96c70d9..7899c22d 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/bemjson.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript-bemjson.snippets @@ -42,7 +42,7 @@ snippet e snippet mo mods : { ${1:modName} : '${2:modVal}' }, -mi - BEM mix mod +# mi - BEM mix mod snippet mi mix : [ { ${1:block} : '${2:block}' } ], diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.d3.snippets b/sources_non_forked/vim-snippets/snippets/javascript-d3.snippets similarity index 100% rename from sources_non_forked/vim-snippets/snippets/javascript/javascript.d3.snippets rename to sources_non_forked/vim-snippets/snippets/javascript-d3.snippets diff --git a/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets b/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets index f08bf849..cabfd401 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets @@ -6,6 +6,10 @@ snippet it "it" b it('${1:}', () => { ${0} }); +snippet xit "xit" b + xit('${1:}', () => { + ${0} + }); snippet exp "expect" b expect(${1:})${0}; snippet expe "expect" b diff --git a/sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets b/sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets new file mode 100644 index 00000000..0762eb6b --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets @@ -0,0 +1,81 @@ +# Import only React +snippet ri1 + import React from 'react' + +# Import both React and Component +snippet ri2 + import React, { Component, PropTypes } from 'react' + +# React class +snippet rcla + class ${1:MyComponent} extends Component { + render() { + return ( + ${0:<div></div>} + ) + } + } + +# React constructor +snippet rcon + constructor(props) { + super(props) + + this.state = { + ${1}: ${0}, + } + } + +# Proptypes for React Class +snippet rcpt + static propTypes = { + ${1}: PropTypes.${0}, + } + +# Default props for React Class +snippet rcdp + static defaultProps = { + ${1}: ${0}, + } + +# Presentational component +snippet rcom + (props) => { + return ( + ${0:<div></div>} + ) + } + +# Proptypes for Presentational component +snippet rpt + ${1}.propTypes = { + ${2}: PropTypes.${0}, + } + +# Default props for Presentational component +snippet rdp + ${1}.defaultProps = { + ${2}: ${0}, + } + +# Lifecycle Methods +snippet rcdm + componentDidMount() { + ${0} + } + +# State +snippet rsst + this.setState({ + ${1}: ${0}, + }) + +snippet rtst + this.state.${0} + +# Props +snippet rp + props.${0} + +snippet rtp + this.props.${0} diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript-react.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript-react.snippets new file mode 100644 index 00000000..9deae796 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript-react.snippets @@ -0,0 +1,83 @@ +snippet ir + import React from 'react'; +snippet ird + import ReactDOM from 'react-dom'; +snippet cdm + componentDidMount() { + ${1} + } +snippet cdup + componentDidUpdate(prevProps, prevState) { + ${1} + } +snippet cwm + componentWillMount() { + ${1} + } +snippet cwr + componentWillReceiveProps(nextProps) { + ${1} + } +snippet cwun + componentWillUnmount() { + ${1} + } +snippet cwu + componentWillUpdate(nextProps, nextState) { + ${1} + } +snippet fup + forceUpdate(${1:callback}); +snippet dp + static defaultProps = { + ${1}: ${2}, + } +snippet st + state = { + ${1}: ${2}, + } +snippet pt + static propTypes = { + ${1}: React.PropTypes.${2:type}, + } +snippet rcc + class ${1:ClassName} extends React.Component { + render() { + return ( + ${0:<div />} + ); + } + } +snippet rdr + ReactDOM.render(${1}, ${2}) +snippet ercc + export default class ${1:ClassName} extends React.Component { + render() { + return ( + ${0:<div />} + ); + } + } +snippet ctor + constructor() { + super(); + ${1} + } +snippet ren + render() { + return ( + ${1:<div />} + ); + } +snippet sst + this.setState({ + ${1}: ${2} + }); +snippet scu + shouldComponentUpdate(nextProps, nextState) { + ${1} + } +snippet prp i + this.props.${1} +snippet ste i + this.state.${1} diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets index df059a15..16e46328 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets @@ -12,6 +12,30 @@ snippet clax class ${1} extends ${2} { ${0} } +snippet clac + class ${1} { + constructor(${2}) { + ${0} + } + } +# For of loop +snippet foro + for (let ${1:prop} of ${2:object}) { + ${0:$1} + } +# Generator +snippet fun* + function* ${1:function_name}(${2}) { + ${0} + } +snippet c=> + const ${1:function_name} = (${2}) => { + ${0} + } +snippet caf + const ${1:function_name} = (${2}) => { + ${0} + } snippet => (${1}) => { ${0} diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets index f24e6f77..0ac0bfb4 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets @@ -1,5 +1,4 @@ # Functions - # prototype snippet proto ${1:class_name}.prototype.${2:method_name} = function(${3}) { @@ -44,9 +43,7 @@ snippet sdf ${0} }; }; - # Flow control - # if snippet if if (${1:true}) { @@ -100,9 +97,6 @@ snippet terr # return snippet ret return ${0:result}; - -# Loops - # for loop snippet for for (var ${2:i} = 0, l = ${1:arr}.length; $2 < l; $2++) { @@ -128,9 +122,7 @@ snippet fori for (var ${1:prop} in ${2:object}) { ${0:$2[$1]} } - # Objects - # Object Method snippet :f ${1:method_name}: function (${2:attribute}) { @@ -207,9 +199,7 @@ snippet prop configurable : ${0:boolean} } ); - # Documentation - # docstring snippet /** /** @@ -228,9 +218,7 @@ snippet jsonp # JSON.stringify snippet jsons JSON.stringify(${0:object}); - # DOM selectors - # Get elements snippet get getElementsBy${1:TagName}('${0}') @@ -249,7 +237,6 @@ snippet qs # Query selector all snippet qsa ${1:document}.querySelectorAll('${0:CSS selector}') - # Debugging snippet de debugger; @@ -265,6 +252,9 @@ snippet ce # console.warn snippet cw console.warn(${0}); +# console.info +snippet ci + console.info(${0}); # console.trace snippet ct console.trace(${0:label}); @@ -277,13 +267,10 @@ snippet ca # console.dir snippet cdir console.dir(${0:obj}); - # Misc - # 'use strict'; snippet us 'use strict'; - # setTimeout function snippet timeout setTimeout(function () {${0}}${2}, ${1:10}); diff --git a/sources_non_forked/vim-snippets/snippets/php.snippets b/sources_non_forked/vim-snippets/snippets/php.snippets index 06448590..2d9f5152 100644 --- a/sources_non_forked/vim-snippets/snippets/php.snippets +++ b/sources_non_forked/vim-snippets/snippets/php.snippets @@ -351,8 +351,8 @@ snippet foreachkil "<?php foreach ($var as $key => $value): ?> ... <?php endfor <?php foreach ($${1:variable} as $${2:key} => $${3:value}): ?> ${0:<!-- html... -->} <?php endforeach; ?> -snippet array "$... = array(...)" - $${1:arrayName} = array('${2}' => ${3}); +snippet array "$... = ['' => ]" + $${1:arrayName} = ['${2}' => ${3}]; snippet try "try { ... } catch (Exception $e) { ... }" try { ${0} @@ -466,7 +466,7 @@ snippet CSVWriter ? fopen($file_or_handle, $mode) : $file_or_handle; - $this->fputcsv_args = array($this->f, null, $sep, $quot); + $this->fputcsv_args = [$this->f, null, $sep, $quot]; if (!$this->f) throw new Exception('bad file descriptor'); } @@ -502,7 +502,7 @@ snippet CSVIterator * enclosure * delimiter */ - public function __construct( $file_or_handle, $opts = array(4096, ',') ) + public function __construct( $file_or_handle, $opts = [4096, ','] ) { $d = function($n) use(&$opts){ return isset($opts[$n]) ? $opts[$n] : false; }; @@ -515,13 +515,13 @@ snippet CSVIterator ? fopen( $file_or_handle, 'r' ) : $file_or_handle; if (!$this->f) throw new Exception('bad file descriptor'); - $this->fgetcsv_args = array( + $this->fgetcsv_args = [ $this->f, isset($opts['row_size']) ? $opts['row_size'] : 4096, isset($opts['delimiter']) ? $opts['delimiter'] : ',', isset($opts['enclosure']) ? $opts['enclosure'] : '"', isset($opts['escape']) ? $opts['escape'] : '\\', - ); + ]; $this->start(); } diff --git a/sources_non_forked/vim-snippets/snippets/ps1.snippets b/sources_non_forked/vim-snippets/snippets/ps1.snippets new file mode 100644 index 00000000..acab10cc --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/ps1.snippets @@ -0,0 +1,58 @@ +# Snippets for +# Authored by Trevor Sullivan <trevor@trevorsullivan.net> + +# PowerShell Class +snippet class + class { + [string] ${0:FirstName} + } + +# PowerShell Advanced Function +snippet function + function {0:name} { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [string] $Param1 + ) + + begin { + } + + process { + } + + end { + } + } + +# PowerShell Splatting +snippet splatting + $Params = @{ + ${0:Param1} = 'Value1' + ${1:Param2} = 'Value2' + } + ${3:CommandName} + +# PowerShell Enumeration +snippet enum + enum ${0:name} { + ${1:item1} + ${2:item2} + } + +# PowerShell if..then +snippet if + if (${0:condition}) { + ${1:statement} + } + +# PowerShell While Loop +snippet while + while (${0:condition}) { + ${1:statement} + } + +# PowerShell Filter..Sort +snippet filtersort + ${0:command} | Where-Object -FilterScript { $PSItem.${1:property} -${2:operator} '${3:expression}' } | Sort-Object -Property ${4:sortproperty} diff --git a/sources_non_forked/vim-snippets/snippets/stylus.snippets b/sources_non_forked/vim-snippets/snippets/stylus.snippets index 3f54f781..3ce35c26 100644 --- a/sources_non_forked/vim-snippets/snippets/stylus.snippets +++ b/sources_non_forked/vim-snippets/snippets/stylus.snippets @@ -993,3 +993,7 @@ snippet for for ${1:i} in ${0} snippet keyf @keyframes ${0} +snippet jc:c + justify-content center +snippet jc + justify-content From 3a876f2be09200e22bb211dc8315fca4ef311f57 Mon Sep 17 00:00:00 2001 From: Pascal Jufer <pascal-jufer@bluewin.ch> Date: Tue, 22 Nov 2016 09:36:31 +0100 Subject: [PATCH 191/254] Fix #243 Cleanup corrupt submodules and add them again via update_plugins.py script --- sources_non_forked/gruvbox | 1 - sources_non_forked/gruvbox/CHANGELOG.md | 117 ++ sources_non_forked/gruvbox/README.md | 110 ++ .../autoload/airline/themes/gruvbox.vim | 79 ++ .../gruvbox/autoload/gruvbox.vim | 41 + .../lightline/colorscheme/gruvbox.vim | 53 + sources_non_forked/gruvbox/colors/gruvbox.vim | 1239 +++++++++++++++++ .../gruvbox/gruvbox_256palette.sh | 118 ++ .../gruvbox/gruvbox_256palette_osx.sh | 116 ++ sources_non_forked/vim-colorschemes | 1 - sources_non_forked/vim-gitgutter | 1 - sources_non_forked/vim-gitgutter/.gitignore | 5 + sources_non_forked/vim-gitgutter/README.mkd | 499 +++++++ .../vim-gitgutter/autoload/gitgutter.vim | 253 ++++ .../autoload/gitgutter/async.vim | 211 +++ .../autoload/gitgutter/debug.vim | 119 ++ .../vim-gitgutter/autoload/gitgutter/diff.vim | 342 +++++ .../autoload/gitgutter/highlight.vim | 115 ++ .../vim-gitgutter/autoload/gitgutter/hunk.vim | 137 ++ .../vim-gitgutter/autoload/gitgutter/sign.vim | 179 +++ .../autoload/gitgutter/utility.vim | 212 +++ .../vim-gitgutter/doc/gitgutter.txt | 340 +++++ .../vim-gitgutter/plugin/gitgutter.vim | 241 ++++ .../vim-gitgutter/screenshot.png | Bin 0 -> 16191 bytes .../vim-gitgutter/test/fixture.txt | 11 + .../vim-gitgutter/test/runner.vim | 162 +++ sources_non_forked/vim-gitgutter/test/test | 19 + .../vim-gitgutter/test/test_gitgutter.vim | 400 ++++++ 28 files changed, 5118 insertions(+), 3 deletions(-) delete mode 160000 sources_non_forked/gruvbox create mode 100644 sources_non_forked/gruvbox/CHANGELOG.md create mode 100644 sources_non_forked/gruvbox/README.md create mode 100644 sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim create mode 100644 sources_non_forked/gruvbox/autoload/gruvbox.vim create mode 100644 sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim create mode 100644 sources_non_forked/gruvbox/colors/gruvbox.vim create mode 100644 sources_non_forked/gruvbox/gruvbox_256palette.sh create mode 100644 sources_non_forked/gruvbox/gruvbox_256palette_osx.sh delete mode 160000 sources_non_forked/vim-colorschemes delete mode 160000 sources_non_forked/vim-gitgutter create mode 100644 sources_non_forked/vim-gitgutter/.gitignore create mode 100644 sources_non_forked/vim-gitgutter/README.mkd create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter.vim create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter/debug.vim create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter/highlight.vim create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim create mode 100644 sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim create mode 100644 sources_non_forked/vim-gitgutter/doc/gitgutter.txt create mode 100644 sources_non_forked/vim-gitgutter/plugin/gitgutter.vim create mode 100644 sources_non_forked/vim-gitgutter/screenshot.png create mode 100644 sources_non_forked/vim-gitgutter/test/fixture.txt create mode 100644 sources_non_forked/vim-gitgutter/test/runner.vim create mode 100644 sources_non_forked/vim-gitgutter/test/test create mode 100644 sources_non_forked/vim-gitgutter/test/test_gitgutter.vim diff --git a/sources_non_forked/gruvbox b/sources_non_forked/gruvbox deleted file mode 160000 index 705e68d9..00000000 --- a/sources_non_forked/gruvbox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 705e68d90d6596c621093a28bf480a572a41ad02 diff --git a/sources_non_forked/gruvbox/CHANGELOG.md b/sources_non_forked/gruvbox/CHANGELOG.md new file mode 100644 index 00000000..90fd3a29 --- /dev/null +++ b/sources_non_forked/gruvbox/CHANGELOG.md @@ -0,0 +1,117 @@ +# Change Log + +## [Unreleased](https://github.com/morhetz/gruvbox/tree/HEAD) + +[Full Changelog](https://github.com/morhetz/gruvbox/compare/v1.3.5...HEAD) + +**Fixed bugs:** + +- Lighter background on terminal [\#8](https://github.com/morhetz/gruvbox/issues/8) + +**Closed issues:** + +- Installation issue. [\#54](https://github.com/morhetz/gruvbox/issues/54) + +- Italic font in terminal\(urxvt\) [\#49](https://github.com/morhetz/gruvbox/issues/49) + +- Unable to log in when sourcing the palette shellscript [\#48](https://github.com/morhetz/gruvbox/issues/48) + +- How can i modify multiple comment scheme [\#46](https://github.com/morhetz/gruvbox/issues/46) + +- Remove comment highlight in iterm [\#44](https://github.com/morhetz/gruvbox/issues/44) + +- Comments looking strange withing tmux [\#43](https://github.com/morhetz/gruvbox/issues/43) + +- comments are reverse-video in xterm [\#41](https://github.com/morhetz/gruvbox/issues/41) + +- What font are you using in the screenshots? [\#39](https://github.com/morhetz/gruvbox/issues/39) + +- vim-signature crashes when I use gruvbox [\#38](https://github.com/morhetz/gruvbox/issues/38) + +- Color of statusbar in inactive windows [\#37](https://github.com/morhetz/gruvbox/issues/37) + +- Go method and struct highlighting missing [\#36](https://github.com/morhetz/gruvbox/issues/36) + +- gruvbox\_256palette.sh doesn't work for Konsole [\#35](https://github.com/morhetz/gruvbox/issues/35) + +- Contrast in jekyll markdown files [\#33](https://github.com/morhetz/gruvbox/issues/33) + +- Pentadactyl Gruvbox Theme [\#32](https://github.com/morhetz/gruvbox/issues/32) + +- make vertsplit better [\#31](https://github.com/morhetz/gruvbox/issues/31) + +- Console support. [\#30](https://github.com/morhetz/gruvbox/issues/30) + +- How can I change the background color? [\#29](https://github.com/morhetz/gruvbox/issues/29) + +- Some words are not bold [\#28](https://github.com/morhetz/gruvbox/issues/28) + +- Terminal theme on base gruvbox [\#25](https://github.com/morhetz/gruvbox/issues/25) + +- Markdown has inverted colors when using \* [\#24](https://github.com/morhetz/gruvbox/issues/24) + +- how install it on mac osx [\#23](https://github.com/morhetz/gruvbox/issues/23) + +- Comments color for Terminal Vim [\#22](https://github.com/morhetz/gruvbox/issues/22) + +- Move palette files to gruvbox-generalized [\#20](https://github.com/morhetz/gruvbox/issues/20) + +- Maybe add Gruvbox Airline theme? [\#19](https://github.com/morhetz/gruvbox/issues/19) + +- For Sublime text [\#18](https://github.com/morhetz/gruvbox/issues/18) + +**Merged pull requests:** + +- Fix the 256 palette script failed login issue [\#53](https://github.com/morhetz/gruvbox/pull/53) ([jonasmalacofilho](https://github.com/jonasmalacofilho)) + +- add minimal coloring for gitcommit highlighting [\#52](https://github.com/morhetz/gruvbox/pull/52) ([daniely](https://github.com/daniely)) + +- For terminals, turn off italics by default. [\#47](https://github.com/morhetz/gruvbox/pull/47) ([ryanmjacobs](https://github.com/ryanmjacobs)) + +- Change color of vertical/horizontal seperators between split windows [\#45](https://github.com/morhetz/gruvbox/pull/45) ([deshtop](https://github.com/deshtop)) + +- Improve gruvbox with C code [\#34](https://github.com/morhetz/gruvbox/pull/34) ([gladiac](https://github.com/gladiac)) + +- Fix for linux console [\#27](https://github.com/morhetz/gruvbox/pull/27) ([vyp](https://github.com/vyp)) + +- Colors for plugin vimshell.vim [\#21](https://github.com/morhetz/gruvbox/pull/21) ([joelmo](https://github.com/joelmo)) + +## [v1.3.5](https://github.com/morhetz/gruvbox/tree/v1.3.5) (2014-03-19) + +[Full Changelog](https://github.com/morhetz/gruvbox/compare/v0.0.8...v1.3.5) + +**Implemented enhancements:** + +- Better selection colors [\#15](https://github.com/morhetz/gruvbox/issues/15) + +- When hlsearch is on, the cursor inverts the search color and not visible [\#2](https://github.com/morhetz/gruvbox/issues/2) + +**Fixed bugs:** + +- Problem with changing between dark and light on 256 color terminal [\#7](https://github.com/morhetz/gruvbox/issues/7) + +- IndentGuides coloring doesn't show up [\#1](https://github.com/morhetz/gruvbox/issues/1) + +**Closed issues:** + +- Requesting rxvt-unicode theme [\#17](https://github.com/morhetz/gruvbox/issues/17) + +- gruvbox\_256palette.sh gets reset \(gnome-terminal on Ubuntu\) [\#13](https://github.com/morhetz/gruvbox/issues/13) + +- Powerline colors [\#12](https://github.com/morhetz/gruvbox/issues/12) + +- Info necessary for making a port of this colorscheme [\#10](https://github.com/morhetz/gruvbox/issues/10) + +**Merged pull requests:** + +- Fix GNU screen detection for \*-bce [\#16](https://github.com/morhetz/gruvbox/pull/16) ([blueyed](https://github.com/blueyed)) + +- Added iTerm2 dark theme [\#11](https://github.com/morhetz/gruvbox/pull/11) ([Greduan](https://github.com/Greduan)) + +- Fix typo in Readme [\#5](https://github.com/morhetz/gruvbox/pull/5) ([ViViDboarder](https://github.com/ViViDboarder)) + +## [v0.0.8](https://github.com/morhetz/gruvbox/tree/v0.0.8) (2012-12-08) + + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/sources_non_forked/gruvbox/README.md b/sources_non_forked/gruvbox/README.md new file mode 100644 index 00000000..917abdb9 --- /dev/null +++ b/sources_non_forked/gruvbox/README.md @@ -0,0 +1,110 @@ +<p align="center"><img src="http://imgh.us/gruvbox_logo.svg"></p> + +gruvbox is heavily inspired by [badwolf][], [jellybeans][] and [solarized][]. + +Designed as a bright theme with pastel 'retro groove' colors and light/dark mode switching in the way of [solarized][]. The main focus when developing gruvbox is to keep colors easily distinguishable, contrast enough and still pleasant for the eyes. + + [badwolf]: https://github.com/sjl/badwolf + [jellybeans]: https://github.com/nanotech/jellybeans.vim + [solarized]: http://ethanschoonover.com/solarized + +Attention +--------- + +1. [Read this first](https://github.com/morhetz/gruvbox/wiki/Terminal-specific) +2. Typeface from gallery is [Fantasque Sans Mono](https://github.com/belluzj/fantasque-sans) +3. Typeface from screenshots below is [Fira Mono](http://www.carrois.com/fira-4-1/) + +Screenshots +----------- + +Refer [Gallery][] for more syntax-specific screenshots. + + [Gallery]: https://github.com/morhetz/gruvbox/wiki/Gallery + +### Dark mode + +![Screenshot Dark](http://i.imgur.com/GkIl8Fn.png) + +### Light mode + +![Screenshot Light](http://i.imgur.com/X75niEa.png) + +### Airline theme + +![Screenshot Airline](http://i.imgur.com/wRQceUR.png) + +Palette +------- + +### Dark mode + +![Palette Dark](http://i.imgur.com/wa666xg.png) + +### Light mode + +![Palette Light](http://i.imgur.com/49qKyYW.png) + +Contrast options +---------------- + +Refer [wiki section][] for contrast configuration and other options. + + [wiki section]: https://github.com/morhetz/gruvbox/wiki/Configuration#ggruvbox_contrast_dark + +![Contrast Options](http://i.imgur.com/5MSbe6T.png) + +Documentation +------------- + +Please check [wiki][] for installation details, terminal-specific setup, troubleshooting, configuration options and others. + + [wiki]: https://github.com/morhetz/gruvbox/wiki + +Features +-------- + +* Lots of style-customization options (contrast, color invertion, italics usage etc.) +* Extended filetype highlighting: Html, Xml, Vim (and ES6 with [yajs.vim](https://github.com/othree/yajs.vim)), Clojure, C, Python, JavaScript, CoffeeScript, Ruby, Objective-C, Go, Lua, MoonScript, Java, Markdown, Haskell +* Supported plugins: [EasyMotion][], [vim-sneak][], [Indent Guides][], [indentLine][], [Rainbow Parentheses][], [Airline][], [Lightline][], [GitGutter][], [Signify][], [ShowMarks][], [Signature][], [Syntastic][], [CtrlP][], [Startify][] + + [EasyMotion]: https://github.com/Lokaltog/vim-easymotion + [vim-sneak]: https://github.com/justinmk/vim-sneak + [Indent Guides]: https://github.com/nathanaelkane/vim-indent-guides + [indentLine]: https://github.com/Yggdroot/indentLine + [Rainbow Parentheses]: https://github.com/kien/rainbow_parentheses.vim + [Airline]: https://github.com/bling/vim-airline + [Lightline]: https://github.com/itchyny/lightline.vim + [GitGutter]: https://github.com/airblade/vim-gitgutter + [Signify]: https://github.com/mhinz/vim-signify + [ShowMarks]: http://www.vim.org/scripts/script.php?script_id=152 + [Signature]: https://github.com/kshenoy/vim-signature + [Syntastic]: https://github.com/scrooloose/syntastic + [CtrlP]: https://github.com/kien/ctrlp.vim + [Startify]: https://github.com/mhinz/vim-startify + +Contributions +------------- + +See [gruvbox-contrib][] repo for contributions, ports and extras. + +[gruvbox-contrib]: https://github.com/morhetz/gruvbox-contrib + +ToDo +---- + +* Filetype syntax highlighting (R, TeX, Swift, Erlang, Purescript and I'm still dissatisfied with CSS) +* Plugin support (MiniBufExplorer, Tagbar, Netrw, VimPLug) + +Self-Promotion +-------------- + +If you like gruvbox follow the repository on +[GitHub](https://github.com/morhetz/gruvbox) and vote for it on +[vim.org](http://www.vim.org/scripts/script.php?script_id=4349). + +License +------- +[MIT/X11][] + + [MIT/X11]: https://en.wikipedia.org/wiki/MIT_License diff --git a/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim b/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim new file mode 100644 index 00000000..84793190 --- /dev/null +++ b/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim @@ -0,0 +1,79 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Airline +" Author: morhetz <morhetz@gmail.com> +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 22 Aug 2014 +" ----------------------------------------------------------------------------- + +let g:airline#themes#gruvbox#palette = {} + +function! airline#themes#gruvbox#refresh() + + let M0 = airline#themes#get_highlight('Identifier') + let accents_group = airline#themes#get_highlight('Special') + let modified_group = [M0[0], '', M0[2], '', ''] + let warning_group = airline#themes#get_highlight2(['Normal', 'bg'], ['Question', 'fg']) + let error_group = airline#themes#get_highlight2(['Normal', 'bg'], ['WarningMsg', 'fg']) + + let s:N1 = airline#themes#get_highlight2(['Normal', 'bg'], ['StatusLineNC', 'bg']) + let s:N2 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['StatusLineNC', 'fg']) + let s:N3 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['CursorLine', 'bg']) + let g:airline#themes#gruvbox#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + let g:airline#themes#gruvbox#palette.normal_modified = { 'airline_c': modified_group } + let g:airline#themes#gruvbox#palette.normal.airline_warning = warning_group + let g:airline#themes#gruvbox#palette.normal_modified.airline_warning = warning_group + let g:airline#themes#gruvbox#palette.normal.airline_error = error_group + let g:airline#themes#gruvbox#palette.normal_modified.airline_error = error_group + + let s:I1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Identifier', 'fg']) + let s:I2 = s:N2 + let s:I3 = airline#themes#get_highlight2(['Normal', 'fg'], ['StatusLineNC', 'fg']) + let g:airline#themes#gruvbox#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3) + let g:airline#themes#gruvbox#palette.insert_modified = g:airline#themes#gruvbox#palette.normal_modified + let g:airline#themes#gruvbox#palette.insert.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning + let g:airline#themes#gruvbox#palette.insert_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning + let g:airline#themes#gruvbox#palette.insert.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error + let g:airline#themes#gruvbox#palette.insert_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error + + let s:R1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Structure', 'fg']) + let s:R2 = s:I2 + let s:R3 = s:I3 + let g:airline#themes#gruvbox#palette.replace = airline#themes#generate_color_map(s:R1, s:R2, s:R3) + let g:airline#themes#gruvbox#palette.replace_modified = g:airline#themes#gruvbox#palette.normal_modified + let g:airline#themes#gruvbox#palette.replace.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning + let g:airline#themes#gruvbox#palette.replace_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning + let g:airline#themes#gruvbox#palette.replace.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error + let g:airline#themes#gruvbox#palette.replace_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error + + let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['ModeMsg', 'fg']) + let s:V2 = s:N2 + let s:V3 = airline#themes#get_highlight2(['Normal', 'bg'], ['TabLine', 'fg']) + let g:airline#themes#gruvbox#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3) + let g:airline#themes#gruvbox#palette.visual_modified = { 'airline_c': [ s:V3[0], '', s:V3[2], '', '' ] } + let g:airline#themes#gruvbox#palette.visual.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning + let g:airline#themes#gruvbox#palette.visual_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning + let g:airline#themes#gruvbox#palette.visual.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error + let g:airline#themes#gruvbox#palette.visual_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error + + let s:IA = airline#themes#get_highlight2(['TabLine', 'fg'], ['CursorLine', 'bg']) + let g:airline#themes#gruvbox#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA) + let g:airline#themes#gruvbox#palette.inactive_modified = { 'airline_c': modified_group } + + let g:airline#themes#gruvbox#palette.accents = { 'red': accents_group } + + let s:TF = airline#themes#get_highlight2(['Normal', 'bg'], ['Normal', 'bg']) + let g:airline#themes#gruvbox#palette.tabline = { + \ 'airline_tab': s:N2, + \ 'airline_tabsel': s:N1, + \ 'airline_tabtype': s:V1, + \ 'airline_tabfill': s:TF, + \ 'airline_tabhid': s:IA, + \ 'airline_tabmod': s:I1 + \ } + +endfunction + +call airline#themes#gruvbox#refresh() + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/sources_non_forked/gruvbox/autoload/gruvbox.vim b/sources_non_forked/gruvbox/autoload/gruvbox.vim new file mode 100644 index 00000000..44bec6e1 --- /dev/null +++ b/sources_non_forked/gruvbox/autoload/gruvbox.vim @@ -0,0 +1,41 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Vim +" Author: morhetz <morhetz@gmail.com> +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 09 Apr 2014 +" ----------------------------------------------------------------------------- + +function! gruvbox#invert_signs_toggle() + if g:gruvbox_invert_signs == 0 + let g:gruvbox_invert_signs=1 + else + let g:gruvbox_invert_signs=0 + endif + + colorscheme gruvbox +endfunction + +" Search Highlighting {{{ + +function! gruvbox#hls_show() + set hlsearch + call GruvboxHlsShowCursor() +endfunction + +function! gruvbox#hls_hide() + set nohlsearch + call GruvboxHlsHideCursor() +endfunction + +function! gruvbox#hls_toggle() + if &hlsearch + call gruvbox#hls_hide() + else + call gruvbox#hls_show() + endif +endfunction + +" }}} + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim new file mode 100644 index 00000000..78babce5 --- /dev/null +++ b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim @@ -0,0 +1,53 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Gruvbox colorscheme for Lightline (itchyny/lightline.vim) +" Author: gmoe <me@griffinmoe.com> +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 31 Oct 2015 +" ----------------------------------------------------------------------------- + +function! s:getGruvColor(group) + let guiColor = synIDattr(hlID(a:group), "fg", "gui") + let termColor = synIDattr(hlID(a:group), "fg", "cterm") + return [ guiColor, termColor ] +endfunction + +if exists('g:lightline') + + let s:bg0 = s:getGruvColor('GruvboxBg0') + let s:bg1 = s:getGruvColor('GruvboxBg1') + let s:bg2 = s:getGruvColor('GruvboxBg2') + let s:bg4 = s:getGruvColor('GruvboxBg4') + let s:fg1 = s:getGruvColor('GruvboxFg1') + let s:fg4 = s:getGruvColor('GruvboxFg4') + + let s:yellow = s:getGruvColor('GruvboxYellow') + let s:blue = s:getGruvColor('GruvboxBlue') + let s:aqua = s:getGruvColor('GruvboxAqua') + let s:orange = s:getGruvColor('GruvboxOrange') + + let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}} + let s:p.normal.left = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] + let s:p.normal.right = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] + let s:p.normal.middle = [ [ s:fg4, s:bg1 ] ] + let s:p.inactive.right = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] + let s:p.inactive.left = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] + let s:p.inactive.middle = [ [ s:bg4, s:bg1 ] ] + let s:p.insert.left = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] + let s:p.insert.right = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] + let s:p.insert.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.replace.left = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] + let s:p.replace.right = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] + let s:p.replace.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.visual.left = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ] + let s:p.visual.right = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ] + let s:p.visual.middle = [ [ s:fg4, s:bg1 ] ] + let s:p.tabline.left = [ [ s:fg4, s:bg2 ] ] + let s:p.tabline.tabsel = [ [ s:bg0, s:fg4 ] ] + let s:p.tabline.middle = [ [ s:bg0, s:bg0 ] ] + let s:p.tabline.right = [ [ s:bg0, s:orange ] ] + let s:p.normal.error = [ [ s:bg0, s:orange ] ] + let s:p.normal.warning = [ [ s:bg2, s:yellow ] ] + + let g:lightline#colorscheme#gruvbox#palette = lightline#colorscheme#flatten(s:p) +endif diff --git a/sources_non_forked/gruvbox/colors/gruvbox.vim b/sources_non_forked/gruvbox/colors/gruvbox.vim new file mode 100644 index 00000000..ebc9efff --- /dev/null +++ b/sources_non_forked/gruvbox/colors/gruvbox.vim @@ -0,0 +1,1239 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Vim +" Author: morhetz <morhetz@gmail.com> +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 04 Sep 2015 +" ----------------------------------------------------------------------------- + +" Supporting code ------------------------------------------------------------- +" Initialisation: {{{ + +if version > 580 + hi clear + if exists("syntax_on") + syntax reset + endif +endif + +let g:colors_name='gruvbox' + +if !has('gui_running') && &t_Co != 256 + finish +endif + +" }}} +" Global Settings: {{{ + +if !exists('g:gruvbox_bold') + let g:gruvbox_bold=1 +endif +if !exists('g:gruvbox_italic') + if has('gui_running') || $TERM_ITALICS == 'true' + let g:gruvbox_italic=1 + else + let g:gruvbox_italic=0 + endif +endif +if !exists('g:gruvbox_undercurl') + let g:gruvbox_undercurl=1 +endif +if !exists('g:gruvbox_underline') + let g:gruvbox_underline=1 +endif +if !exists('g:gruvbox_inverse') + let g:gruvbox_inverse=1 +endif + +if !exists('g:gruvbox_guisp_fallback') || index(['fg', 'bg'], g:gruvbox_guisp_fallback) == -1 + let g:gruvbox_guisp_fallback='NONE' +endif + +if !exists('g:gruvbox_improved_strings') + let g:gruvbox_improved_strings=0 +endif + +if !exists('g:gruvbox_improved_warnings') + let g:gruvbox_improved_warnings=0 +endif + +if !exists('g:gruvbox_termcolors') + let g:gruvbox_termcolors=256 +endif + +if !exists('g:gruvbox_invert_indent_guides') + let g:gruvbox_invert_indent_guides=0 +endif + +if exists('g:gruvbox_contrast') + echo 'g:gruvbox_contrast is deprecated; use g:gruvbox_contrast_light and g:gruvbox_contrast_dark instead' +endif + +if !exists('g:gruvbox_contrast_dark') + let g:gruvbox_contrast_dark='medium' +endif + +if !exists('g:gruvbox_contrast_light') + let g:gruvbox_contrast_light='medium' +endif + +let s:is_dark=(&background == 'dark') + +" }}} +" Palette: {{{ + +" setup palette dictionary +let s:gb = {} + +" fill it with absolute colors +let s:gb.dark0_hard = ['#1d2021', 234] " 29-32-33 +let s:gb.dark0 = ['#282828', 235] " 40-40-40 +let s:gb.dark0_soft = ['#32302f', 236] " 50-48-47 +let s:gb.dark1 = ['#3c3836', 237] " 60-56-54 +let s:gb.dark2 = ['#504945', 239] " 80-73-69 +let s:gb.dark3 = ['#665c54', 241] " 102-92-84 +let s:gb.dark4 = ['#7c6f64', 243] " 124-111-100 +let s:gb.dark4_256 = ['#7c6f64', 243] " 124-111-100 + +let s:gb.gray_245 = ['#928374', 245] " 146-131-116 +let s:gb.gray_244 = ['#928374', 244] " 146-131-116 + +let s:gb.light0_hard = ['#f9f5d7', 230] " 249-245-215 +let s:gb.light0 = ['#fbf1c7', 229] " 253-244-193 +let s:gb.light0_soft = ['#f2e5bc', 228] " 242-229-188 +let s:gb.light1 = ['#ebdbb2', 223] " 235-219-178 +let s:gb.light2 = ['#d5c4a1', 250] " 213-196-161 +let s:gb.light3 = ['#bdae93', 248] " 189-174-147 +let s:gb.light4 = ['#a89984', 246] " 168-153-132 +let s:gb.light4_256 = ['#a89984', 246] " 168-153-132 + +let s:gb.bright_red = ['#fb4934', 167] " 251-73-52 +let s:gb.bright_green = ['#b8bb26', 142] " 184-187-38 +let s:gb.bright_yellow = ['#fabd2f', 214] " 250-189-47 +let s:gb.bright_blue = ['#83a598', 109] " 131-165-152 +let s:gb.bright_purple = ['#d3869b', 175] " 211-134-155 +let s:gb.bright_aqua = ['#8ec07c', 108] " 142-192-124 +let s:gb.bright_orange = ['#fe8019', 208] " 254-128-25 + +let s:gb.neutral_red = ['#cc241d', 124] " 204-36-29 +let s:gb.neutral_green = ['#98971a', 106] " 152-151-26 +let s:gb.neutral_yellow = ['#d79921', 172] " 215-153-33 +let s:gb.neutral_blue = ['#458588', 66] " 69-133-136 +let s:gb.neutral_purple = ['#b16286', 132] " 177-98-134 +let s:gb.neutral_aqua = ['#689d6a', 72] " 104-157-106 +let s:gb.neutral_orange = ['#d65d0e', 166] " 214-93-14 + +let s:gb.faded_red = ['#9d0006', 88] " 157-0-6 +let s:gb.faded_green = ['#79740e', 100] " 121-116-14 +let s:gb.faded_yellow = ['#b57614', 136] " 181-118-20 +let s:gb.faded_blue = ['#076678', 24] " 7-102-120 +let s:gb.faded_purple = ['#8f3f71', 96] " 143-63-113 +let s:gb.faded_aqua = ['#427b58', 66] " 66-123-88 +let s:gb.faded_orange = ['#af3a03', 130] " 175-58-3 + +" }}} +" Setup Emphasis: {{{ + +let s:bold = 'bold,' +if g:gruvbox_bold == 0 + let s:bold = '' +endif + +let s:italic = 'italic,' +if g:gruvbox_italic == 0 + let s:italic = '' +endif + +let s:underline = 'underline,' +if g:gruvbox_underline == 0 + let s:underline = '' +endif + +let s:undercurl = 'undercurl,' +if g:gruvbox_undercurl == 0 + let s:undercurl = '' +endif + +let s:inverse = 'inverse,' +if g:gruvbox_inverse == 0 + let s:inverse = '' +endif + +" }}} +" Setup Colors: {{{ + +let s:vim_bg = ['bg', 'bg'] +let s:vim_fg = ['fg', 'fg'] +let s:none = ['NONE', 'NONE'] + +" determine relative colors +if s:is_dark + let s:bg0 = s:gb.dark0 + if g:gruvbox_contrast_dark == 'soft' + let s:bg0 = s:gb.dark0_soft + elseif g:gruvbox_contrast_dark == 'hard' + let s:bg0 = s:gb.dark0_hard + endif + + let s:bg1 = s:gb.dark1 + let s:bg2 = s:gb.dark2 + let s:bg3 = s:gb.dark3 + let s:bg4 = s:gb.dark4 + + let s:gray = s:gb.gray_245 + + let s:fg0 = s:gb.light0 + let s:fg1 = s:gb.light1 + let s:fg2 = s:gb.light2 + let s:fg3 = s:gb.light3 + let s:fg4 = s:gb.light4 + + let s:fg4_256 = s:gb.light4_256 + + let s:red = s:gb.bright_red + let s:green = s:gb.bright_green + let s:yellow = s:gb.bright_yellow + let s:blue = s:gb.bright_blue + let s:purple = s:gb.bright_purple + let s:aqua = s:gb.bright_aqua + let s:orange = s:gb.bright_orange +else + let s:bg0 = s:gb.light0 + if g:gruvbox_contrast_light == 'soft' + let s:bg0 = s:gb.light0_soft + elseif g:gruvbox_contrast_light == 'hard' + let s:bg0 = s:gb.light0_hard + endif + + let s:bg1 = s:gb.light1 + let s:bg2 = s:gb.light2 + let s:bg3 = s:gb.light3 + let s:bg4 = s:gb.light4 + + let s:gray = s:gb.gray_244 + + let s:fg0 = s:gb.dark0 + let s:fg1 = s:gb.dark1 + let s:fg2 = s:gb.dark2 + let s:fg3 = s:gb.dark3 + let s:fg4 = s:gb.dark4 + + let s:fg4_256 = s:gb.dark4_256 + + let s:red = s:gb.faded_red + let s:green = s:gb.faded_green + let s:yellow = s:gb.faded_yellow + let s:blue = s:gb.faded_blue + let s:purple = s:gb.faded_purple + let s:aqua = s:gb.faded_aqua + let s:orange = s:gb.faded_orange +endif + +" reset to 16 colors fallback +if g:gruvbox_termcolors == 16 + let s:bg0[1] = 0 + let s:fg4[1] = 7 + let s:gray[1] = 8 + let s:red[1] = 9 + let s:green[1] = 10 + let s:yellow[1] = 11 + let s:blue[1] = 12 + let s:purple[1] = 13 + let s:aqua[1] = 14 + let s:fg1[1] = 15 +endif + +" save current relative colors back to palette dictionary +let s:gb.bg0 = s:bg0 +let s:gb.bg1 = s:bg1 +let s:gb.bg2 = s:bg2 +let s:gb.bg3 = s:bg3 +let s:gb.bg4 = s:bg4 + +let s:gb.gray = s:gray + +let s:gb.fg0 = s:fg0 +let s:gb.fg1 = s:fg1 +let s:gb.fg2 = s:fg2 +let s:gb.fg3 = s:fg3 +let s:gb.fg4 = s:fg4 + +let s:gb.fg4_256 = s:fg4_256 + +let s:gb.red = s:red +let s:gb.green = s:green +let s:gb.yellow = s:yellow +let s:gb.blue = s:blue +let s:gb.purple = s:purple +let s:gb.aqua = s:aqua +let s:gb.orange = s:orange + +" }}} + +" Overload Setting: {{{ + +let s:hls_cursor = s:orange +if exists('g:gruvbox_hls_cursor') + let s:hls_cursor = get(s:gb, g:gruvbox_hls_cursor) +endif + +let s:number_column = s:none +if exists('g:gruvbox_number_column') + let s:number_column = get(s:gb, g:gruvbox_number_column) +endif + +let s:sign_column = s:bg1 + +if exists('g:gitgutter_override_sign_column_highlight') && + \ g:gitgutter_override_sign_column_highlight == 1 + let s:sign_column = s:number_column +else + let g:gitgutter_override_sign_column_highlight = 0 + + if exists('g:gruvbox_sign_column') + let s:sign_column = get(s:gb, g:gruvbox_sign_column) + endif +endif + +let s:color_column = s:bg1 +if exists('g:gruvbox_color_column') + let s:color_column = get(s:gb, g:gruvbox_color_column) +endif + +let s:vert_split = s:bg2 +if exists('g:gruvbox_vert_split') + let s:vert_split = get(s:gb, g:gruvbox_vert_split) +endif + +let s:invert_signs = '' +if exists('g:gruvbox_invert_signs') + if g:gruvbox_invert_signs == 1 + let s:invert_signs = s:inverse + endif +endif + +let s:invert_selection = s:inverse +if exists('g:gruvbox_invert_selection') + if g:gruvbox_invert_selection == 0 + let s:invert_selection = '' + endif +endif + +let s:invert_tabline = '' +if exists('g:gruvbox_invert_tabline') + if g:gruvbox_invert_tabline == 1 + let s:invert_tabline = s:inverse + endif +endif + +let s:italicize_comments = s:italic +if exists('g:gruvbox_italicize_comments') + if g:gruvbox_italicize_comments == 0 + let s:italicize_comments = '' + endif +endif + +let s:italicize_strings = '' +if exists('g:gruvbox_italicize_strings') + if g:gruvbox_italicize_strings == 1 + let s:italicize_strings = s:italic + endif +endif + +" }}} +" Highlighting Function: {{{ + +function! s:HL(group, fg, ...) + " Arguments: group, guifg, guibg, gui, guisp + + " foreground + let fg = a:fg + + " background + if a:0 >= 1 + let bg = a:1 + else + let bg = s:none + endif + + " emphasis + if a:0 >= 2 && strlen(a:2) + let emstr = a:2 + else + let emstr = 'NONE,' + endif + + " special fallback + if a:0 >= 3 + if g:gruvbox_guisp_fallback != 'NONE' + let fg = a:3 + endif + + " bg fallback mode should invert higlighting + if g:gruvbox_guisp_fallback == 'bg' + let emstr .= 'inverse,' + endif + endif + + let histring = [ 'hi', a:group, + \ 'guifg=' . fg[0], 'ctermfg=' . fg[1], + \ 'guibg=' . bg[0], 'ctermbg=' . bg[1], + \ 'gui=' . emstr[:-2], 'cterm=' . emstr[:-2] + \ ] + + " special + if a:0 >= 3 + call add(histring, 'guisp=' . a:3[0]) + endif + + execute join(histring, ' ') +endfunction + +" }}} +" Gruvbox Hi Groups: {{{ + +" memoize common hi groups +call s:HL('GruvboxFg0', s:fg0) +call s:HL('GruvboxFg1', s:fg1) +call s:HL('GruvboxFg2', s:fg2) +call s:HL('GruvboxFg3', s:fg3) +call s:HL('GruvboxFg4', s:fg4) +call s:HL('GruvboxGray', s:gray) +call s:HL('GruvboxBg0', s:bg0) +call s:HL('GruvboxBg1', s:bg1) +call s:HL('GruvboxBg2', s:bg2) +call s:HL('GruvboxBg3', s:bg3) +call s:HL('GruvboxBg4', s:bg4) + +call s:HL('GruvboxRed', s:red) +call s:HL('GruvboxRedBold', s:red, s:none, s:bold) +call s:HL('GruvboxGreen', s:green) +call s:HL('GruvboxGreenBold', s:green, s:none, s:bold) +call s:HL('GruvboxYellow', s:yellow) +call s:HL('GruvboxYellowBold', s:yellow, s:none, s:bold) +call s:HL('GruvboxBlue', s:blue) +call s:HL('GruvboxBlueBold', s:blue, s:none, s:bold) +call s:HL('GruvboxPurple', s:purple) +call s:HL('GruvboxPurpleBold', s:purple, s:none, s:bold) +call s:HL('GruvboxAqua', s:aqua) +call s:HL('GruvboxAquaBold', s:aqua, s:none, s:bold) +call s:HL('GruvboxOrange', s:orange) +call s:HL('GruvboxOrangeBold', s:orange, s:none, s:bold) + +call s:HL('GruvboxRedSign', s:red, s:sign_column, s:invert_signs) +call s:HL('GruvboxGreenSign', s:green, s:sign_column, s:invert_signs) +call s:HL('GruvboxYellowSign', s:yellow, s:sign_column, s:invert_signs) +call s:HL('GruvboxBlueSign', s:blue, s:sign_column, s:invert_signs) +call s:HL('GruvboxPurpleSign', s:purple, s:sign_column, s:invert_signs) +call s:HL('GruvboxAquaSign', s:aqua, s:sign_column, s:invert_signs) + +" }}} + +" Vanilla colorscheme --------------------------------------------------------- +" General UI: {{{ + +" Normal text +call s:HL('Normal', s:fg1, s:bg0) + +" Correct background (see issue #7): +" --- Problem with changing between dark and light on 256 color terminal +" --- https://github.com/morhetz/gruvbox/issues/7 +if s:is_dark + set background=dark +else + set background=light +endif + +if version >= 700 + " Screen line that the cursor is + call s:HL('CursorLine', s:none, s:bg1) + " Screen column that the cursor is + hi! link CursorColumn CursorLine + + " Tab pages line filler + call s:HL('TabLineFill', s:bg4, s:vim_bg, s:invert_tabline) + " Active tab page label + call s:HL('TabLineSel', s:vim_bg, s:bg4, s:bold . s:invert_tabline) + " Not active tab page label + hi! link TabLine TabLineFill + + " Match paired bracket under the cursor + call s:HL('MatchParen', s:none, s:bg3, s:bold) +endif + +if version >= 703 + " Highlighted screen columns + call s:HL('ColorColumn', s:none, s:color_column) + + " Concealed element: \lambda → λ + call s:HL('Conceal', s:blue, s:none) + + " Line number of CursorLine + call s:HL('CursorLineNr', s:yellow, s:bg1) +endif + +hi! link NonText GruvboxBg2 +hi! link SpecialKey GruvboxBg2 + +call s:HL('Visual', s:none, s:bg3, s:invert_selection) +hi! link VisualNOS Visual + +call s:HL('Search', s:yellow, s:bg0, s:inverse) +call s:HL('IncSearch', s:hls_cursor, s:bg0, s:inverse) + +call s:HL('Underlined', s:blue, s:none, s:underline) + +call s:HL('StatusLine', s:bg4, s:bg0, s:bold . s:inverse) +call s:HL('StatusLineNC', s:bg2, s:fg4, s:bold . s:inverse) + +" The column separating vertically split windows +call s:HL('VertSplit', s:fg4, s:vert_split) + +" Current match in wildmenu completion +call s:HL('WildMenu', s:blue, s:bg2, s:bold) + +" Directory names, special names in listing +hi! link Directory GruvboxGreenBold + +" Titles for output from :set all, :autocmd, etc. +hi! link Title GruvboxGreenBold + +" Error messages on the command line +call s:HL('ErrorMsg', s:bg0, s:red, s:bold) +" More prompt: -- More -- +hi! link MoreMsg GruvboxYellowBold +" Current mode message: -- INSERT -- +hi! link ModeMsg GruvboxYellowBold +" 'Press enter' prompt and yes/no questions +hi! link Question GruvboxOrangeBold +" Warning messages +hi! link WarningMsg GruvboxRedBold + +" }}} +" Gutter: {{{ + +" Line number for :number and :# commands +call s:HL('LineNr', s:bg4, s:number_column) + +" Column where signs are displayed +call s:HL('SignColumn', s:none, s:sign_column) + +" Line used for closed folds +call s:HL('Folded', s:gray, s:bg1, s:italic) +" Column where folds are displayed +call s:HL('FoldColumn', s:gray, s:bg1) + +" }}} +" Cursor: {{{ + +" Character under cursor +call s:HL('Cursor', s:none, s:none, s:inverse) +" Visual mode cursor, selection +hi! link vCursor Cursor +" Input moder cursor +hi! link iCursor Cursor +" Language mapping cursor +hi! link lCursor Cursor + +" }}} +" Syntax Highlighting: {{{ + +if g:gruvbox_improved_strings == 0 + hi! link Special GruvboxOrange +else + call s:HL('Special', s:bg1, s:orange, s:italic) +endif + +call s:HL('Comment', s:gray, s:none, s:italicize_comments) +call s:HL('Todo', s:vim_fg, s:vim_bg, s:bold . s:italic) +call s:HL('Error', s:red, s:vim_bg, s:bold . s:inverse) + +" Generic statement +hi! link Statement GruvboxRed +" if, then, else, endif, swicth, etc. +hi! link Conditional GruvboxRed +" for, do, while, etc. +hi! link Repeat GruvboxRed +" case, default, etc. +hi! link Label GruvboxRed +" try, catch, throw +hi! link Exception GruvboxRed +" sizeof, "+", "*", etc. +hi! link Operator Normal +" Any other keyword +hi! link Keyword GruvboxRed + +" Variable name +hi! link Identifier GruvboxBlue +" Function name +hi! link Function GruvboxGreenBold + +" Generic preprocessor +hi! link PreProc GruvboxAqua +" Preprocessor #include +hi! link Include GruvboxAqua +" Preprocessor #define +hi! link Define GruvboxAqua +" Same as Define +hi! link Macro GruvboxAqua +" Preprocessor #if, #else, #endif, etc. +hi! link PreCondit GruvboxAqua + +" Generic constant +hi! link Constant GruvboxPurple +" Character constant: 'c', '/n' +hi! link Character GruvboxPurple +" String constant: "this is a string" +if g:gruvbox_improved_strings == 0 + call s:HL('String', s:green, s:none, s:italicize_strings) +else + call s:HL('String', s:bg1, s:fg1, s:italicize_strings) +endif +" Boolean constant: TRUE, false +hi! link Boolean GruvboxPurple +" Number constant: 234, 0xff +hi! link Number GruvboxPurple +" Floating point constant: 2.3e10 +hi! link Float GruvboxPurple + +" Generic type +hi! link Type GruvboxYellow +" static, register, volatile, etc +hi! link StorageClass GruvboxOrange +" struct, union, enum, etc. +hi! link Structure GruvboxAqua +" typedef +hi! link Typedef GruvboxYellow + +" }}} +" Completion Menu: {{{ + +if version >= 700 + " Popup menu: normal item + call s:HL('Pmenu', s:fg1, s:bg2) + " Popup menu: selected item + call s:HL('PmenuSel', s:bg2, s:blue, s:bold) + " Popup menu: scrollbar + call s:HL('PmenuSbar', s:none, s:bg2) + " Popup menu: scrollbar thumb + call s:HL('PmenuThumb', s:none, s:bg4) +endif + +" }}} +" Diffs: {{{ + +call s:HL('DiffDelete', s:red, s:bg0, s:inverse) +call s:HL('DiffAdd', s:green, s:bg0, s:inverse) +"call s:HL('DiffChange', s:bg0, s:blue) +"call s:HL('DiffText', s:bg0, s:yellow) + +" Alternative setting +call s:HL('DiffChange', s:aqua, s:bg0, s:inverse) +call s:HL('DiffText', s:yellow, s:bg0, s:inverse) + +" }}} +" Spelling: {{{ + +if has("spell") + " Not capitalised word, or compile warnings + if g:gruvbox_improved_warnings == 0 + call s:HL('SpellCap', s:none, s:none, s:undercurl, s:red) + else + call s:HL('SpellCap', s:green, s:none, s:bold . s:italic) + endif + " Not recognized word + call s:HL('SpellBad', s:none, s:none, s:undercurl, s:blue) + " Wrong spelling for selected region + call s:HL('SpellLocal', s:none, s:none, s:undercurl, s:aqua) + " Rare word + call s:HL('SpellRare', s:none, s:none, s:undercurl, s:purple) +endif + +" }}} + +" Plugin specific ------------------------------------------------------------- +" EasyMotion: {{{ + +hi! link EasyMotionTarget Search +hi! link EasyMotionShade Comment + +" }}} +" Sneak: {{{ + +hi! link SneakPluginTarget Search +hi! link SneakStreakTarget Search +call s:HL('SneakStreakMask', s:yellow, s:yellow) +hi! link SneakStreakStatusLine Search + +" }}} +" Indent Guides: {{{ + +if !exists('g:indent_guides_auto_colors') + let g:indent_guides_auto_colors = 0 +endif + +if g:indent_guides_auto_colors == 0 + if g:gruvbox_invert_indent_guides == 0 + call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2) + call s:HL('IndentGuidesEven', s:vim_bg, s:bg1) + else + call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2, s:inverse) + call s:HL('IndentGuidesEven', s:vim_bg, s:bg3, s:inverse) + endif +endif + +" }}} +" IndentLine: {{{ + +if !exists('g:indentLine_color_term') + let g:indentLine_color_term = s:bg2[1] +endif +if !exists('g:indentLine_color_gui') + let g:indentLine_color_gui = s:bg2[0] +endif + +" }}} +" Rainbow Parentheses: {{{ + +if !exists('g:rbpt_colorpairs') + let g:rbpt_colorpairs = + \ [ + \ ['blue', '#458588'], ['magenta', '#b16286'], + \ ['red', '#cc241d'], ['166', '#d65d0e'] + \ ] +endif + +let g:rainbow_guifgs = [ '#d65d0e', '#cc241d', '#b16286', '#458588' ] +let g:rainbow_ctermfgs = [ '166', 'red', 'magenta', 'blue' ] + +if !exists('g:rainbow_conf') + let g:rainbow_conf = {} +endif +if !has_key(g:rainbow_conf, 'guifgs') + let g:rainbow_conf['guifgs'] = g:rainbow_guifgs +endif +if !has_key(g:rainbow_conf, 'ctermfgs') + let g:rainbow_conf['ctermfgs'] = g:rainbow_ctermfgs +endif + +let g:niji_dark_colours = g:rbpt_colorpairs +let g:niji_light_colours = g:rbpt_colorpairs + +"}}} +" GitGutter: {{{ + +hi! link GitGutterAdd GruvboxGreenSign +hi! link GitGutterChange GruvboxAquaSign +hi! link GitGutterDelete GruvboxRedSign +hi! link GitGutterChangeDelete GruvboxAquaSign + +" }}} +" GitCommit: "{{{ + +hi! link gitcommitSelectedFile GruvboxGreen +hi! link gitcommitDiscardedFile GruvboxRed + +" }}} +" Signify: {{{ + +hi! link SignifySignAdd GruvboxGreenSign +hi! link SignifySignChange GruvboxAquaSign +hi! link SignifySignDelete GruvboxRedSign + +" }}} +" Syntastic: {{{ + +call s:HL('SyntasticError', s:none, s:none, s:undercurl, s:red) +call s:HL('SyntasticWarning', s:none, s:none, s:undercurl, s:yellow) + +hi! link SyntasticErrorSign GruvboxRedSign +hi! link SyntasticWarningSign GruvboxYellowSign + +" }}} +" Signature: {{{ +hi! link SignatureMarkText GruvboxBlueSign +hi! link SignatureMarkerText GruvboxPurpleSign + +" }}} +" ShowMarks: {{{ + +hi! link ShowMarksHLl GruvboxBlueSign +hi! link ShowMarksHLu GruvboxBlueSign +hi! link ShowMarksHLo GruvboxBlueSign +hi! link ShowMarksHLm GruvboxBlueSign + +" }}} +" CtrlP: {{{ + +hi! link CtrlPMatch GruvboxYellow +hi! link CtrlPNoEntries GruvboxRed +hi! link CtrlPPrtBase GruvboxBg2 +hi! link CtrlPPrtCursor GruvboxBlue +hi! link CtrlPLinePre GruvboxBg2 + +call s:HL('CtrlPMode1', s:blue, s:bg2, s:bold) +call s:HL('CtrlPMode2', s:bg0, s:blue, s:bold) +call s:HL('CtrlPStats', s:fg4, s:bg2, s:bold) + +" }}} +" Startify: {{{ + +hi! link StartifyBracket GruvboxFg3 +hi! link StartifyFile GruvboxFg0 +hi! link StartifyNumber GruvboxBlue +hi! link StartifyPath GruvboxGray +hi! link StartifySlash GruvboxGray +hi! link StartifySection GruvboxYellow +hi! link StartifySpecial GruvboxBg2 +hi! link StartifyHeader GruvboxOrange +hi! link StartifyFooter GruvboxBg2 + +" }}} +" Vimshell: {{{ + +let g:vimshell_escape_colors = [ + \ s:bg4[0], s:red[0], s:green[0], s:yellow[0], + \ s:blue[0], s:purple[0], s:aqua[0], s:fg4[0], + \ s:bg0[0], s:red[0], s:green[0], s:orange[0], + \ s:blue[0], s:purple[0], s:aqua[0], s:fg0[0] + \ ] + +" }}} +" BufTabLine: {{{ + +call s:HL('BufTabLineCurrent', s:bg0, s:fg4) +call s:HL('BufTabLineActive', s:fg4, s:bg2) +call s:HL('BufTabLineHidden', s:bg4, s:bg1) +call s:HL('BufTabLineFill', s:bg0, s:bg0) + +" }}} + +" Filetype specific ----------------------------------------------------------- +" Diff: {{{ + +hi! link diffAdded GruvboxGreen +hi! link diffRemoved GruvboxRed +hi! link diffChanged GruvboxAqua + +hi! link diffFile GruvboxOrange +hi! link diffNewFile GruvboxYellow + +hi! link diffLine GruvboxBlue + +" }}} +" Html: {{{ + +hi! link htmlTag GruvboxBlue +hi! link htmlEndTag GruvboxBlue + +hi! link htmlTagName GruvboxAquaBold +hi! link htmlArg GruvboxAqua + +hi! link htmlScriptTag GruvboxPurple +hi! link htmlTagN GruvboxFg1 +hi! link htmlSpecialTagName GruvboxAquaBold + +call s:HL('htmlLink', s:fg4, s:none, s:underline) + +hi! link htmlSpecialChar GruvboxOrange + +call s:HL('htmlBold', s:vim_fg, s:vim_bg, s:bold) +call s:HL('htmlBoldUnderline', s:vim_fg, s:vim_bg, s:bold . s:underline) +call s:HL('htmlBoldItalic', s:vim_fg, s:vim_bg, s:bold . s:italic) +call s:HL('htmlBoldUnderlineItalic', s:vim_fg, s:vim_bg, s:bold . s:underline . s:italic) + +call s:HL('htmlUnderline', s:vim_fg, s:vim_bg, s:underline) +call s:HL('htmlUnderlineItalic', s:vim_fg, s:vim_bg, s:underline . s:italic) +call s:HL('htmlItalic', s:vim_fg, s:vim_bg, s:italic) + +" }}} +" Xml: {{{ + +hi! link xmlTag GruvboxBlue +hi! link xmlEndTag GruvboxBlue +hi! link xmlTagName GruvboxBlue +hi! link xmlEqual GruvboxBlue +hi! link docbkKeyword GruvboxAquaBold + +hi! link xmlDocTypeDecl GruvboxGray +hi! link xmlDocTypeKeyword GruvboxPurple +hi! link xmlCdataStart GruvboxGray +hi! link xmlCdataCdata GruvboxPurple +hi! link dtdFunction GruvboxGray +hi! link dtdTagName GruvboxPurple + +hi! link xmlAttrib GruvboxAqua +hi! link xmlProcessingDelim GruvboxGray +hi! link dtdParamEntityPunct GruvboxGray +hi! link dtdParamEntityDPunct GruvboxGray +hi! link xmlAttribPunct GruvboxGray + +hi! link xmlEntity GruvboxOrange +hi! link xmlEntityPunct GruvboxOrange +" }}} +" Vim: {{{ + +call s:HL('vimCommentTitle', s:fg4_256, s:none, s:bold . s:italicize_comments) + +hi! link vimNotation GruvboxOrange +hi! link vimBracket GruvboxOrange +hi! link vimMapModKey GruvboxOrange +hi! link vimFuncSID GruvboxFg3 +hi! link vimSetSep GruvboxFg3 +hi! link vimSep GruvboxFg3 +hi! link vimContinue GruvboxFg3 + +" }}} +" Clojure: {{{ + +hi! link clojureKeyword GruvboxBlue +hi! link clojureCond GruvboxOrange +hi! link clojureSpecial GruvboxOrange +hi! link clojureDefine GruvboxOrange + +hi! link clojureFunc GruvboxYellow +hi! link clojureRepeat GruvboxYellow +hi! link clojureCharacter GruvboxAqua +hi! link clojureStringEscape GruvboxAqua +hi! link clojureException GruvboxRed + +hi! link clojureRegexp GruvboxAqua +hi! link clojureRegexpEscape GruvboxAqua +call s:HL('clojureRegexpCharClass', s:fg3, s:none, s:bold) +hi! link clojureRegexpMod clojureRegexpCharClass +hi! link clojureRegexpQuantifier clojureRegexpCharClass + +hi! link clojureParen GruvboxFg3 +hi! link clojureAnonArg GruvboxYellow +hi! link clojureVariable GruvboxBlue +hi! link clojureMacro GruvboxOrange + +hi! link clojureMeta GruvboxYellow +hi! link clojureDeref GruvboxYellow +hi! link clojureQuote GruvboxYellow +hi! link clojureUnquote GruvboxYellow + +" }}} +" C: {{{ + +hi! link cOperator GruvboxPurple +hi! link cStructure GruvboxOrange + +" }}} +" Python: {{{ + +hi! link pythonBuiltin GruvboxOrange +hi! link pythonBuiltinObj GruvboxOrange +hi! link pythonBuiltinFunc GruvboxOrange +hi! link pythonFunction GruvboxAqua +hi! link pythonDecorator GruvboxRed +hi! link pythonInclude GruvboxBlue +hi! link pythonImport GruvboxBlue +hi! link pythonRun GruvboxBlue +hi! link pythonCoding GruvboxBlue +hi! link pythonOperator GruvboxRed +hi! link pythonExceptions GruvboxPurple +hi! link pythonBoolean GruvboxPurple +hi! link pythonDot GruvboxFg3 + +" }}} +" CSS: {{{ + +hi! link cssBraces GruvboxBlue +hi! link cssFunctionName GruvboxYellow +hi! link cssIdentifier GruvboxOrange +hi! link cssClassName GruvboxGreen +hi! link cssColor GruvboxBlue +hi! link cssSelectorOp GruvboxBlue +hi! link cssSelectorOp2 GruvboxBlue +hi! link cssImportant GruvboxGreen +hi! link cssVendor GruvboxFg1 + +hi! link cssTextProp GruvboxAqua +hi! link cssAnimationProp GruvboxAqua +hi! link cssUIProp GruvboxYellow +hi! link cssTransformProp GruvboxAqua +hi! link cssTransitionProp GruvboxAqua +hi! link cssPrintProp GruvboxAqua +hi! link cssPositioningProp GruvboxYellow +hi! link cssBoxProp GruvboxAqua +hi! link cssFontDescriptorProp GruvboxAqua +hi! link cssFlexibleBoxProp GruvboxAqua +hi! link cssBorderOutlineProp GruvboxAqua +hi! link cssBackgroundProp GruvboxAqua +hi! link cssMarginProp GruvboxAqua +hi! link cssListProp GruvboxAqua +hi! link cssTableProp GruvboxAqua +hi! link cssFontProp GruvboxAqua +hi! link cssPaddingProp GruvboxAqua +hi! link cssDimensionProp GruvboxAqua +hi! link cssRenderProp GruvboxAqua +hi! link cssColorProp GruvboxAqua +hi! link cssGeneratedContentProp GruvboxAqua + +" }}} +" JavaScript: {{{ + +hi! link javaScriptBraces GruvboxFg1 +hi! link javaScriptFunction GruvboxAqua +hi! link javaScriptIdentifier GruvboxRed +hi! link javaScriptMember GruvboxBlue +hi! link javaScriptNumber GruvboxPurple +hi! link javaScriptNull GruvboxPurple +hi! link javaScriptParens GruvboxFg3 + +" }}} +" YAJS: {{{ + +hi! link javascriptImport GruvboxAqua +hi! link javascriptExport GruvboxAqua +hi! link javascriptClassKeyword GruvboxAqua +hi! link javascriptClassExtends GruvboxAqua +hi! link javascriptDefault GruvboxAqua + +hi! link javascriptClassName GruvboxYellow +hi! link javascriptClassSuperName GruvboxYellow +hi! link javascriptGlobal GruvboxYellow + +hi! link javascriptEndColons GruvboxFg1 +hi! link javascriptFuncArg GruvboxFg1 +hi! link javascriptGlobalMethod GruvboxFg1 +hi! link javascriptNodeGlobal GruvboxFg1 + +" hi! link javascriptVariable GruvboxOrange +hi! link javascriptVariable GruvboxRed +" hi! link javascriptIdentifier GruvboxOrange +" hi! link javascriptClassSuper GruvboxOrange +hi! link javascriptIdentifier GruvboxOrange +hi! link javascriptClassSuper GruvboxOrange + +" hi! link javascriptFuncKeyword GruvboxOrange +" hi! link javascriptAsyncFunc GruvboxOrange +hi! link javascriptFuncKeyword GruvboxAqua +hi! link javascriptAsyncFunc GruvboxAqua +hi! link javascriptClassStatic GruvboxOrange + +hi! link javascriptOperator GruvboxRed +hi! link javascriptForOperator GruvboxRed +hi! link javascriptYield GruvboxRed +hi! link javascriptExceptions GruvboxRed +hi! link javascriptMessage GruvboxRed + +hi! link javascriptTemplateSB GruvboxAqua +hi! link javascriptTemplateSubstitution GruvboxFg1 + +" hi! link javascriptLabel GruvboxBlue +" hi! link javascriptObjectLabel GruvboxBlue +" hi! link javascriptPropertyName GruvboxBlue +hi! link javascriptLabel GruvboxFg1 +hi! link javascriptObjectLabel GruvboxFg1 +hi! link javascriptPropertyName GruvboxFg1 + +hi! link javascriptLogicSymbols GruvboxFg1 +hi! link javascriptArrowFunc GruvboxFg1 + +hi! link javascriptDocParamName GruvboxFg4 +hi! link javascriptDocTags GruvboxFg4 +hi! link javascriptDocNotation GruvboxFg4 +hi! link javascriptDocParamType GruvboxFg4 +hi! link javascriptDocNamedParamType GruvboxFg4 + +" }}} +" TypeScript: {{{ + +hi! link typeScriptReserved GruvboxAqua +hi! link typeScriptLabel GruvboxAqua +hi! link typeScriptIdentifier GruvboxOrange +hi! link typeScriptBraces GruvboxFg1 +hi! link typeScriptEndColons GruvboxFg1 +hi! link typeScriptDOMObjects GruvboxFg1 +hi! link typeScriptAjaxMethods GruvboxFg1 +hi! link typeScriptLogicSymbols GruvboxFg1 +hi! link typeScriptDocSeeTag Comment +hi! link typeScriptDocParam Comment +hi! link typeScriptDocTags vimCommentTitle + +" }}} +" CoffeeScript: {{{ + +hi! link coffeeExtendedOp GruvboxFg3 +hi! link coffeeSpecialOp GruvboxFg3 +hi! link coffeeCurly GruvboxOrange +hi! link coffeeParen GruvboxFg3 +hi! link coffeeBracket GruvboxOrange + +" }}} +" Ruby: {{{ + +hi! link rubyStringDelimiter GruvboxGreen +hi! link rubyInterpolationDelimiter GruvboxAqua + +" }}} +" ObjectiveC: {{{ + +hi! link objcTypeModifier GruvboxRed +hi! link objcDirective GruvboxBlue + +" }}} +" Go: {{{ + +hi! link goDirective GruvboxAqua +hi! link goConstants GruvboxPurple +hi! link goDeclaration GruvboxRed +hi! link goDeclType GruvboxBlue +hi! link goBuiltins GruvboxOrange + +" }}} +" Lua: {{{ + +hi! link luaIn GruvboxRed +hi! link luaFunction GruvboxAqua +hi! link luaTable GruvboxOrange + +" }}} +" MoonScript: {{{ + +hi! link moonSpecialOp GruvboxFg3 +hi! link moonExtendedOp GruvboxFg3 +hi! link moonFunction GruvboxFg3 +hi! link moonObject GruvboxYellow + +" }}} +" Java: {{{ + +hi! link javaAnnotation GruvboxBlue +hi! link javaDocTags GruvboxAqua +hi! link javaCommentTitle vimCommentTitle +hi! link javaParen GruvboxFg3 +hi! link javaParen1 GruvboxFg3 +hi! link javaParen2 GruvboxFg3 +hi! link javaParen3 GruvboxFg3 +hi! link javaParen4 GruvboxFg3 +hi! link javaParen5 GruvboxFg3 +hi! link javaOperator GruvboxOrange + +hi! link javaVarArg GruvboxGreen + +" }}} +" Elixir: {{{ + +hi! link elixirDocString Comment + +hi! link elixirStringDelimiter GruvboxGreen +hi! link elixirInterpolationDelimiter GruvboxAqua + +hi! link elixirModuleDeclaration GruvboxYellow + +" }}} +" Scala: {{{ + +" NB: scala vim syntax file is kinda horrible +hi! link scalaNameDefinition GruvboxFg1 +hi! link scalaCaseFollowing GruvboxFg1 +hi! link scalaCapitalWord GruvboxFg1 +hi! link scalaTypeExtension GruvboxFg1 + +hi! link scalaKeyword GruvboxRed +hi! link scalaKeywordModifier GruvboxRed + +hi! link scalaSpecial GruvboxAqua +hi! link scalaOperator GruvboxFg1 + +hi! link scalaTypeDeclaration GruvboxYellow +hi! link scalaTypeTypePostDeclaration GruvboxYellow + +hi! link scalaInstanceDeclaration GruvboxFg1 +hi! link scalaInterpolation GruvboxAqua + +" }}} +" Markdown: {{{ + +call s:HL('markdownItalic', s:fg3, s:none, s:italic) + +hi! link markdownH1 GruvboxGreenBold +hi! link markdownH2 GruvboxGreenBold +hi! link markdownH3 GruvboxYellowBold +hi! link markdownH4 GruvboxYellowBold +hi! link markdownH5 GruvboxYellow +hi! link markdownH6 GruvboxYellow + +hi! link markdownCode GruvboxAqua +hi! link markdownCodeBlock GruvboxAqua +hi! link markdownCodeDelimiter GruvboxAqua + +hi! link markdownBlockquote GruvboxGray +hi! link markdownListMarker GruvboxGray +hi! link markdownOrderedListMarker GruvboxGray +hi! link markdownRule GruvboxGray +hi! link markdownHeadingRule GruvboxGray + +hi! link markdownUrlDelimiter GruvboxFg3 +hi! link markdownLinkDelimiter GruvboxFg3 +hi! link markdownLinkTextDelimiter GruvboxFg3 + +hi! link markdownHeadingDelimiter GruvboxOrange +hi! link markdownUrl GruvboxPurple +hi! link markdownUrlTitleDelimiter GruvboxGreen + +call s:HL('markdownLinkText', s:gray, s:none, s:underline) +hi! link markdownIdDeclaration markdownLinkText + +" }}} +" Haskell: {{{ + +" hi! link haskellType GruvboxYellow +" hi! link haskellOperators GruvboxOrange +" hi! link haskellConditional GruvboxAqua +" hi! link haskellLet GruvboxOrange +" +hi! link haskellType GruvboxFg1 +hi! link haskellIdentifier GruvboxFg1 +hi! link haskellSeparator GruvboxFg1 +hi! link haskellDelimiter GruvboxFg4 +hi! link haskellOperators GruvboxBlue +" +hi! link haskellBacktick GruvboxOrange +hi! link haskellStatement GruvboxOrange +hi! link haskellConditional GruvboxOrange + +hi! link haskellLet GruvboxAqua +hi! link haskellDefault GruvboxAqua +hi! link haskellWhere GruvboxAqua +hi! link haskellBottom GruvboxAqua +hi! link haskellBlockKeywords GruvboxAqua +hi! link haskellImportKeywords GruvboxAqua +hi! link haskellDeclKeyword GruvboxAqua +hi! link haskellDeriving GruvboxAqua +hi! link haskellAssocType GruvboxAqua + +hi! link haskellNumber GruvboxPurple +hi! link haskellPragma GruvboxPurple + +hi! link haskellString GruvboxGreen +hi! link haskellChar GruvboxGreen + +" }}} +" Json: {{{ + +hi! link jsonKeyword GruvboxGreen +hi! link jsonQuote GruvboxGreen +hi! link jsonBraces GruvboxFg1 +hi! link jsonString GruvboxFg1 + +" }}} + + +" Functions ------------------------------------------------------------------- +" Search Highlighting Cursor {{{ + +function! GruvboxHlsShowCursor() + call s:HL('Cursor', s:bg0, s:hls_cursor) +endfunction + +function! GruvboxHlsHideCursor() + call s:HL('Cursor', s:none, s:none, s:inverse) +endfunction + +" }}} + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/sources_non_forked/gruvbox/gruvbox_256palette.sh b/sources_non_forked/gruvbox/gruvbox_256palette.sh new file mode 100644 index 00000000..c7fd190e --- /dev/null +++ b/sources_non_forked/gruvbox/gruvbox_256palette.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +if [ "${TERM%%-*}" = "screen" ]; then + if [ -n "$TMUX" ]; then + printf "\033Ptmux;\033\033]4;236;rgb:32/30/2f\007\033\\" + printf "\033Ptmux;\033\033]4;234;rgb:1d/20/21\007\033\\" + + printf "\033Ptmux;\033\033]4;235;rgb:28/28/28\007\033\\" + printf "\033Ptmux;\033\033]4;237;rgb:3c/38/36\007\033\\" + printf "\033Ptmux;\033\033]4;239;rgb:50/49/45\007\033\\" + printf "\033Ptmux;\033\033]4;241;rgb:66/5c/54\007\033\\" + printf "\033Ptmux;\033\033]4;243;rgb:7c/6f/64\007\033\\" + + printf "\033Ptmux;\033\033]4;244;rgb:92/83/74\007\033\\" + printf "\033Ptmux;\033\033]4;245;rgb:92/83/74\007\033\\" + + printf "\033Ptmux;\033\033]4;228;rgb:f2/e5/bc\007\033\\" + printf "\033Ptmux;\033\033]4;230;rgb:f9/f5/d7\007\033\\" + + printf "\033Ptmux;\033\033]4;229;rgb:fb/f1/c7\007\033\\" + printf "\033Ptmux;\033\033]4;223;rgb:eb/db/b2\007\033\\" + printf "\033Ptmux;\033\033]4;250;rgb:d5/c4/a1\007\033\\" + printf "\033Ptmux;\033\033]4;248;rgb:bd/ae/93\007\033\\" + printf "\033Ptmux;\033\033]4;246;rgb:a8/99/84\007\033\\" + + printf "\033Ptmux;\033\033]4;167;rgb:fb/49/34\007\033\\" + printf "\033Ptmux;\033\033]4;142;rgb:b8/bb/26\007\033\\" + printf "\033Ptmux;\033\033]4;214;rgb:fa/bd/2f\007\033\\" + printf "\033Ptmux;\033\033]4;109;rgb:83/a5/98\007\033\\" + printf "\033Ptmux;\033\033]4;175;rgb:d3/86/9b\007\033\\" + printf "\033Ptmux;\033\033]4;108;rgb:8e/c0/7c\007\033\\" + printf "\033Ptmux;\033\033]4;208;rgb:fe/80/19\007\033\\" + + printf "\033Ptmux;\033\033]4;88;rgb:9d/00/06\007\033\\" + printf "\033Ptmux;\033\033]4;100;rgb:79/74/0e\007\033\\" + printf "\033Ptmux;\033\033]4;136;rgb:b5/76/14\007\033\\" + printf "\033Ptmux;\033\033]4;24;rgb:07/66/78\007\033\\" + printf "\033Ptmux;\033\033]4;96;rgb:8f/3f/71\007\033\\" + printf "\033Ptmux;\033\033]4;66;rgb:42/7b/58\007\033\\" + printf "\033Ptmux;\033\033]4;130;rgb:af/3a/03\007\033\\" + else + printf "\033P\033]4;236;rgb:32/30/2f\007\033\\" + printf "\033P\033]4;234;rgb:1d/20/21\007\033\\" + + printf "\033P\033]4;235;rgb:28/28/28\007\033\\" + printf "\033P\033]4;237;rgb:3c/38/36\007\033\\" + printf "\033P\033]4;239;rgb:50/49/45\007\033\\" + printf "\033P\033]4;241;rgb:66/5c/54\007\033\\" + printf "\033P\033]4;243;rgb:7c/6f/64\007\033\\" + + printf "\033P\033]4;244;rgb:92/83/74\007\033\\" + printf "\033P\033]4;245;rgb:92/83/74\007\033\\" + + printf "\033P\033]4;228;rgb:f2/e5/bc\007\033\\" + printf "\033P\033]4;230;rgb:f9/f5/d7\007\033\\" + + printf "\033P\033]4;229;rgb:fb/f1/c7\007\033\\" + printf "\033P\033]4;223;rgb:eb/db/b2\007\033\\" + printf "\033P\033]4;250;rgb:d5/c4/a1\007\033\\" + printf "\033P\033]4;248;rgb:bd/ae/93\007\033\\" + printf "\033P\033]4;246;rgb:a8/99/84\007\033\\" + + printf "\033P\033]4;167;rgb:fb/49/34\007\033\\" + printf "\033P\033]4;142;rgb:b8/bb/26\007\033\\" + printf "\033P\033]4;214;rgb:fa/bd/2f\007\033\\" + printf "\033P\033]4;109;rgb:83/a5/98\007\033\\" + printf "\033P\033]4;175;rgb:d3/86/9b\007\033\\" + printf "\033P\033]4;108;rgb:8e/c0/7c\007\033\\" + printf "\033P\033]4;208;rgb:fe/80/19\007\033\\" + + printf "\033P\033]4;88;rgb:9d/00/06\007\033\\" + printf "\033P\033]4;100;rgb:79/74/0e\007\033\\" + printf "\033P\033]4;136;rgb:b5/76/14\007\033\\" + printf "\033P\033]4;24;rgb:07/66/78\007\033\\" + printf "\033P\033]4;96;rgb:8f/3f/71\007\033\\" + printf "\033P\033]4;66;rgb:42/7b/58\007\033\\" + printf "\033P\033]4;130;rgb:af/3a/03\007\033\\" + fi + +elif [ "$TERM" != "linux" ] && [ "$TERM" != "vt100" ] && [ "$TERM" != "vt220" ]; then + + printf "\033]4;236;rgb:32/30/2f\033\\" + printf "\033]4;234;rgb:1d/20/21\033\\" + + printf "\033]4;235;rgb:28/28/28\033\\" + printf "\033]4;237;rgb:3c/38/36\033\\" + printf "\033]4;239;rgb:50/49/45\033\\" + printf "\033]4;241;rgb:66/5c/54\033\\" + printf "\033]4;243;rgb:7c/6f/64\033\\" + + printf "\033]4;244;rgb:92/83/74\033\\" + printf "\033]4;245;rgb:92/83/74\033\\" + + printf "\033]4;228;rgb:f2/e5/bc\033\\" + printf "\033]4;230;rgb:f9/f5/d7\033\\" + + printf "\033]4;229;rgb:fb/f1/c7\033\\" + printf "\033]4;223;rgb:eb/db/b2\033\\" + printf "\033]4;250;rgb:d5/c4/a1\033\\" + printf "\033]4;248;rgb:bd/ae/93\033\\" + printf "\033]4;246;rgb:a8/99/84\033\\" + + printf "\033]4;167;rgb:fb/49/34\033\\" + printf "\033]4;142;rgb:b8/bb/26\033\\" + printf "\033]4;214;rgb:fa/bd/2f\033\\" + printf "\033]4;109;rgb:83/a5/98\033\\" + printf "\033]4;175;rgb:d3/86/9b\033\\" + printf "\033]4;108;rgb:8e/c0/7c\033\\" + printf "\033]4;208;rgb:fe/80/19\033\\" + + printf "\033]4;88;rgb:9d/00/06\033\\" + printf "\033]4;100;rgb:79/74/0e\033\\" + printf "\033]4;136;rgb:b5/76/14\033\\" + printf "\033]4;24;rgb:07/66/78\033\\" + printf "\033]4;96;rgb:8f/3f/71\033\\" + printf "\033]4;66;rgb:42/7b/58\033\\" + printf "\033]4;130;rgb:af/3a/03\033\\" +fi diff --git a/sources_non_forked/gruvbox/gruvbox_256palette_osx.sh b/sources_non_forked/gruvbox/gruvbox_256palette_osx.sh new file mode 100644 index 00000000..ad5111a1 --- /dev/null +++ b/sources_non_forked/gruvbox/gruvbox_256palette_osx.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +if [ "${TERM%%-*}" = "screen" ]; then + if [ -n "$TMUX" ]; then + printf "\033Ptmux;\033\033]4;236;rgb:26/24/23\007\033\\" + printf "\033Ptmux;\033\033]4;234;rgb:16/18/19\007\033\\" + + printf "\033Ptmux;\033\033]4;235;rgb:1e/1e/1e\007\033\\" + printf "\033Ptmux;\033\033]4;237;rgb:2e/2a/29\007\033\\" + printf "\033Ptmux;\033\033]4;239;rgb:3f/39/35\007\033\\" + printf "\033Ptmux;\033\033]4;241;rgb:53/4a/42\007\033\\" + printf "\033Ptmux;\033\033]4;243;rgb:68/5c/51\007\033\\" + + printf "\033Ptmux;\033\033]4;244;rgb:7f/70/61\007\033\\" + printf "\033Ptmux;\033\033]4;245;rgb:7f/70/61\007\033\\" + + printf "\033Ptmux;\033\033]4;228;rgb:ef/df/ae\007\033\\" + printf "\033Ptmux;\033\033]4;230;rgb:f8/f4/cd\007\033\\" + + printf "\033Ptmux;\033\033]4;229;rgb:fa/ee/bb\007\033\\" + printf "\033Ptmux;\033\033]4;223;rgb:e6/d4/a3\007\033\\" + printf "\033Ptmux;\033\033]4;250;rgb:cb/b8/90\007\033\\" + printf "\033Ptmux;\033\033]4;248;rgb:af/9f/81\007\033\\" + printf "\033Ptmux;\033\033]4;246;rgb:97/87/71\007\033\\" + + printf "\033Ptmux;\033\033]4;167;rgb:f7/30/28\007\033\\" + printf "\033Ptmux;\033\033]4;142;rgb:aa/b0/1e\007\033\\" + printf "\033Ptmux;\033\033]4;214;rgb:f7/b1/25\007\033\\" + printf "\033Ptmux;\033\033]4;109;rgb:71/95/86\007\033\\" + printf "\033Ptmux;\033\033]4;175;rgb:c7/70/89\007\033\\" + printf "\033Ptmux;\033\033]4;108;rgb:7d/b6/69\007\033\\" + printf "\033Ptmux;\033\033]4;208;rgb:fb/6a/16\007\033\\" + + printf "\033Ptmux;\033\033]4;88;rgb:89/00/09\007\033\\" + printf "\033Ptmux;\033\033]4;100;rgb:66/62/0d\007\033\\" + printf "\033Ptmux;\033\033]4;136;rgb:a5/63/11\007\033\\" + printf "\033Ptmux;\033\033]4;24;rgb:0e/53/65\007\033\\" + printf "\033Ptmux;\033\033]4;96;rgb:7b/2b/5e\007\033\\" + printf "\033Ptmux;\033\033]4;66;rgb:35/6a/46\007\033\\" + printf "\033Ptmux;\033\033]4;130;rgb:9d/28/07\007\033\\" + else + printf "\033P\033]4;236;rgb:26/24/23\007\033\\" + printf "\033P\033]4;234;rgb:16/18/19\007\033\\" + + printf "\033P\033]4;235;rgb:1e/1e/1e\007\033\\" + printf "\033P\033]4;237;rgb:2e/2a/29\007\033\\" + printf "\033P\033]4;239;rgb:3f/39/35\007\033\\" + printf "\033P\033]4;241;rgb:53/4a/42\007\033\\" + printf "\033P\033]4;243;rgb:68/5c/51\007\033\\" + + printf "\033P\033]4;244;rgb:7f/70/61\007\033\\" + printf "\033P\033]4;245;rgb:7f/70/61\007\033\\" + + printf "\033P\033]4;228;rgb:ef/df/ae\007\033\\" + printf "\033P\033]4;230;rgb:f8/f4/cd\007\033\\" + + printf "\033P\033]4;229;rgb:fa/ee/bb\007\033\\" + printf "\033P\033]4;223;rgb:e6/d4/a3\007\033\\" + printf "\033P\033]4;250;rgb:cb/b8/90\007\033\\" + printf "\033P\033]4;248;rgb:af/9f/81\007\033\\" + printf "\033P\033]4;246;rgb:97/87/71\007\033\\" + + printf "\033P\033]4;167;rgb:f7/30/28\007\033\\" + printf "\033P\033]4;142;rgb:aa/b0/1e\007\033\\" + printf "\033P\033]4;214;rgb:f7/b1/25\007\033\\" + printf "\033P\033]4;109;rgb:71/95/86\007\033\\" + printf "\033P\033]4;175;rgb:c7/70/89\007\033\\" + printf "\033P\033]4;108;rgb:7d/b6/69\007\033\\" + printf "\033P\033]4;208;rgb:fb/6a/16\007\033\\" + + printf "\033P\033]4;88;rgb:89/00/09\007\033\\" + printf "\033P\033]4;100;rgb:66/62/0d\007\033\\" + printf "\033P\033]4;136;rgb:a5/63/11\007\033\\" + printf "\033P\033]4;24;rgb:0e/53/65\007\033\\" + printf "\033P\033]4;96;rgb:7b/2b/5e\007\033\\" + printf "\033P\033]4;66;rgb:35/6a/46\007\033\\" + printf "\033P\033]4;130;rgb:9d/28/07\007\033\\" + fi +else + printf "\033]4;236;rgb:26/24/23\033\\" + printf "\033]4;234;rgb:16/18/19\033\\" + + printf "\033]4;235;rgb:1e/1e/1e\033\\" + printf "\033]4;237;rgb:2e/2a/29\033\\" + printf "\033]4;239;rgb:3f/39/35\033\\" + printf "\033]4;241;rgb:53/4a/42\033\\" + printf "\033]4;243;rgb:68/5c/51\033\\" + + printf "\033]4;244;rgb:7f/70/61\033\\" + printf "\033]4;245;rgb:7f/70/61\033\\" + + printf "\033]4;228;rgb:ef/df/ae\033\\" + printf "\033]4;230;rgb:f8/f4/cd\033\\" + + printf "\033]4;229;rgb:fa/ee/bb\033\\" + printf "\033]4;223;rgb:e6/d4/a3\033\\" + printf "\033]4;250;rgb:cb/b8/90\033\\" + printf "\033]4;248;rgb:af/9f/81\033\\" + printf "\033]4;246;rgb:97/87/71\033\\" + + printf "\033]4;167;rgb:f7/30/28\033\\" + printf "\033]4;142;rgb:aa/b0/1e\033\\" + printf "\033]4;214;rgb:f7/b1/25\033\\" + printf "\033]4;109;rgb:71/95/86\033\\" + printf "\033]4;175;rgb:c7/70/89\033\\" + printf "\033]4;108;rgb:7d/b6/69\033\\" + printf "\033]4;208;rgb:fb/6a/16\033\\" + + printf "\033]4;88;rgb:89/00/09\033\\" + printf "\033]4;100;rgb:66/62/0d\033\\" + printf "\033]4;136;rgb:a5/63/11\033\\" + printf "\033]4;24;rgb:0e/53/65\033\\" + printf "\033]4;96;rgb:7b/2b/5e\033\\" + printf "\033]4;66;rgb:35/6a/46\033\\" + printf "\033]4;130;rgb:9d/28/07\033\\" +fi diff --git a/sources_non_forked/vim-colorschemes b/sources_non_forked/vim-colorschemes deleted file mode 160000 index 28a989b2..00000000 --- a/sources_non_forked/vim-colorschemes +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 28a989b28457e38df620e4c7ab23e224aff70efe diff --git a/sources_non_forked/vim-gitgutter b/sources_non_forked/vim-gitgutter deleted file mode 160000 index 339f8ba0..00000000 --- a/sources_non_forked/vim-gitgutter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 339f8ba079ed7d465ca442c9032b36bc56c21f61 diff --git a/sources_non_forked/vim-gitgutter/.gitignore b/sources_non_forked/vim-gitgutter/.gitignore new file mode 100644 index 00000000..82fb2537 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/.gitignore @@ -0,0 +1,5 @@ +/doc/tags +/misc +/test/*.actual +*.log + diff --git a/sources_non_forked/vim-gitgutter/README.mkd b/sources_non_forked/vim-gitgutter/README.mkd new file mode 100644 index 00000000..19ed3876 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/README.mkd @@ -0,0 +1,499 @@ +## vim-gitgutter + +A Vim plugin which shows a git diff in the 'gutter' (sign column). It shows whether each line has been added, modified, and where lines have been removed. You can also stage and undo individual hunks. + +Features: + +* Shows signs for added, modified, and removed lines. +* Runs the diffs asynchronously in terminal Vim/MacVim (7.4.1826+), gVim (7.4.1850+), MacVim GUI (7.4.1832+), and NeoVim. +* Ensures signs are always as up to date as possible (but without running more than necessary). +* Quick jumping between blocks of changed lines ("hunks"). +* Stage/undo/preview individual hunks. +* Provides a hunk text object. +* Diffs against index (default) or any commit. +* Handles line endings correctly, even with repos that do CRLF conversion. +* Optional line highlighting. +* Fully customisable (signs, sign column, line highlights, mappings, extra git-diff arguments, etc). +* Can be toggled on/off. +* Preserves signs from other plugins. +* Easy to integrate diff stats into status line; built-in integration with [vim-airline](https://github.com/bling/vim-airline/). +* Works with fish shell (in addition to the usual shells). + +Constraints: + +* Supports git only. + +If you work with other version control systems, I recommend [vim-signify](https://github.com/mhinz/vim-signify). + + +### Screenshot + +![screenshot](https://raw.github.com/airblade/vim-gitgutter/master/screenshot.png) + +In the screenshot above you can see: + +* Line 15 has been modified. +* Lines 21-24 are new. +* A line or lines were removed between lines 25 and 26. + + +### Installation + +Before installation, please check your Vim supports signs by running `:echo has('signs')`. `1` means you're all set; `0` means you need to install a Vim with signs support. If you're compiling Vim yourself you need the 'big' or 'huge' feature set. [MacVim][] supports signs. + +You install vim-gitgutter like any other vim plugin. + +##### Pathogen + +``` +cd ~/.vim/bundle +git clone git://github.com/airblade/vim-gitgutter.git +``` + +##### Voom + +Edit your plugin manifest (`voom edit`) and add: + +``` +airblade/vim-gitgutter +``` + +##### VimPlug + +Place this in your .vimrc: + +```viml +Plug 'airblade/vim-gitgutter' +``` + +Then run the following in Vim: + +``` +:source % +:PlugInstall +``` + +##### NeoBundle + +Place this in your .vimrc: + +```viml +NeoBundle 'airblade/vim-gitgutter' +``` + +Then run the following in Vim: + +``` +:source % +:NeoBundleInstall +``` + +##### No plugin manager + +Copy vim-gitgutter's subdirectories into your vim configuration directory: + +``` +cd /tmp && git clone git://github.com/airblade/vim-gitgutter.git +cp -r vim-gitgutter/* ~/.vim/ +``` + +See `:help add-global-plugin`. + + +If you are on Windows you may find the command prompt pops up briefly every time vim-gitgutter runs. You can avoid this by installing both [vim-misc](https://github.com/xolox/vim-misc) and [vim-shell](https://github.com/xolox/vim-shell). If you have those two plugins but don't want vim-gitgutter to use them, you can opt out with `let g:gitgutter_avoid_cmd_prompt_on_windows = 0` in your `~/.vimrc`. + + +### Getting started + +When you make a change to a file tracked by git, the diff markers should appear automatically. The delay is governed by vim's `updatetime` option; the default value is 4 seconds but I suggest reducing it to around 250ms (add `set updatetime=250` to your vimrc). + +You can jump between hunks with `[c` and `]c`. You can preview, stage, and undo hunks with `<leader>hp`, `<leader>hs`, and `<leader>hu` respectively. + +You cannot currently unstage a staged hunk. + + +#### Activation + +You can explicitly turn vim-gitgutter off and on (defaults to on): + +* turn off with `:GitGutterDisable` +* turn on with `:GitGutterEnable` +* toggle with `:GitGutterToggle`. + +You can turn the signs on and off (defaults to on): + +* turn on with `:GitGutterSignsEnable` +* turn off with `:GitGutterSignsDisable` +* toggle with `:GitGutterSignsToggle`. + +And you can turn line highlighting on and off (defaults to off): + +* turn on with `:GitGutterLineHighlightsEnable` +* turn off with `:GitGutterLineHighlightsDisable` +* toggle with `:GitGutterLineHighlightsToggle`. + +Note that if you have line highlighting on and signs off, you will have an empty sign column – more accurately, a sign column with invisible signs. This is because line highlighting requires signs and Vim always shows the sign column even if the signs are invisible. + +If you switch off both line highlighting and signs, you won't see the sign column. That is unless you have set `let g:gitgutter_sign_column_always = 1` so it's always there. + +To keep your Vim snappy, vim-gitgutter will suppress itself when a file has more than 500 changes. As soon as the number of changes falls below the limit vim-gitgutter will show the signs again. You can configure the threshold with: + +```viml +let g:gitgutter_max_signs = 500 " default value +``` + +#### Hunks + +You can jump between hunks: + +* jump to next hunk (change): `]c` +* jump to previous hunk (change): `[c`. + +Both of those take a preceding count. + +To set your own mappings for these, for example `]h` and `[h`: + +```viml +nmap ]h <Plug>GitGutterNextHunk +nmap [h <Plug>GitGutterPrevHunk +``` + +You can stage or undo an individual hunk when your cursor is in it: + +* stage the hunk with `<Leader>hs` or +* undo it with `<Leader>hu`. + +See the FAQ if you want to unstage staged changes. + +The `.` command will work with both these if you install [repeat.vim](https://github.com/tpope/vim-repeat). + +To set your own mappings for these, for example if you prefer the mnemonics hunk-add and hunk-revert: + +```viml +nmap <Leader>ha <Plug>GitGutterStageHunk +nmap <Leader>hr <Plug>GitGutterUndoHunk +``` + +And you can preview a hunk's changes with `<Leader>hp`. You can of course change this mapping, e.g: + +```viml +nmap <Leader>hv <Plug>GitGutterPreviewHunk +``` + +A hunk text object is provided which works in visual and operator-pending modes. + +- `ic` operates on all lines in the current hunk. +- `ac` operates on all lines in the current hunk and any trailing empty lines. + +To re-map these, for example to `ih` and `ah`: + +```viml +omap ih <Plug>GitGutterTextObjectInnerPending +omap ah <Plug>GitGutterTextObjectOuterPending +xmap ih <Plug>GitGutterTextObjectInnerVisual +xmap ah <Plug>GitGutterTextObjectOuterVisual +``` + +If you don't want vim-gitgutter to set up any mappings at all, use this: + +```viml +let g:gitgutter_map_keys = 0 +``` + +Finally, you can force vim-gitgutter to update its signs across all visible buffers with `:GitGutterAll`. + +See the customisation section below for how to change the defaults. + + +### When are the signs updated? + +By default the signs are updated as follows: + +| Event | Reason for update | Configuration | +|---------------------------|--------------------------------------|------------------------| +| Stop typing | So the signs are real time | `g:gitgutter_realtime` | +| Switch buffer | To notice change to git index | `g:gitgutter_eager` | +| Switch tab | To notice change to git index | `g:gitgutter_eager` | +| Focus the GUI | To notice change to git index | `g:gitgutter_eager` (not gVim on Windows) | +| Read a file into a buffer | To display initial signs | [always] | +| Save a buffer | So non-realtime signs are up to date | [always] | +| Change a file outside Vim | To notice `git stash` | [always] | + +The length of time Vim waits after you stop typing before it triggers the plugin is governed by the setting `updatetime`. This defaults to `4000` milliseconds which is rather too long. I recommend around `250` milliseconds but it depends on your system and your preferences. Note that in terminal Vim pre-7.4.427 an `updatetime` of less than approximately `1000` milliseconds can lead to random highlighting glitches; the lower the `updatetime`, the more glitches. + +If you experience a lag, you can trade speed for accuracy: + +```viml +let g:gitgutter_realtime = 0 +let g:gitgutter_eager = 0 +``` + +Note the realtime updating requires Vim 7.3.105 or higher. + + +### Customisation + +You can customise: + +* The sign column's colours +* Whether or not the sign column is shown when there aren't any signs (defaults to no) +* The signs' colours and symbols +* Line highlights +* The base of the diff +* Extra arguments for `git diff` +* Key mappings +* Whether or not vim-gitgutter is on initially (defaults to on) +* Whether or not signs are shown (defaults to yes) +* Whether or not line highlighting is on initially (defaults to off) +* Whether or not vim-gitgutter runs in "realtime" (defaults to yes) +* Whether or not vim-gitgutter runs eagerly (defaults to yes) +* Whether or not vim-gitgutter runs asynchronously (defaults to yes) + +Please note that vim-gitgutter won't override any colours or highlights you've set in your colorscheme. + + +#### Sign column + +By default vim-gitgutter will make the sign column look like the line number column. + +To customise your sign column's background color, first tell vim-gitgutter to leave it alone: + +```viml +let g:gitgutter_override_sign_column_highlight = 0 +``` + +And then either update your colorscheme's `SignColumn` highlight group or set it in your vimrc: + +```viml +highlight SignColumn ctermbg=whatever " terminal Vim +highlight SignColumn guibg=whatever " gVim/MacVim +``` + +By default the sign column will appear when there are signs to show and disappear when there aren't. If you would always like the sign column to be there, add `let g:gitgutter_sign_column_always = 1` to your `~/.vimrc`. + + +#### Signs' colours and symbols + +To customise the colours, set up the following highlight groups in your colorscheme or `~/.vimrc`: + +```viml +GitGutterAdd " an added line +GitGutterChange " a changed line +GitGutterDelete " at least one removed line +GitGutterChangeDelete " a changed line followed by at least one removed line +``` + +You can either set these with `highlight GitGutterAdd {key}={arg}...` or link them to existing highlight groups with, say, `highlight link GitGutterAdd DiffAdd`. + +To customise the symbols, add the following to your `~/.vimrc`: + +```viml +let g:gitgutter_sign_added = 'xx' +let g:gitgutter_sign_modified = 'yy' +let g:gitgutter_sign_removed = 'zz' +let g:gitgutter_sign_removed_first_line = '^^' +let g:gitgutter_sign_modified_removed = 'ww' +``` + + +#### Line highlights + +Similarly to the signs' colours, set up the following highlight groups in your colorscheme or `~/.vimrc`: + +```viml +GitGutterAddLine " default: links to DiffAdd +GitGutterChangeLine " default: links to DiffChange +GitGutterDeleteLine " default: links to DiffDelete +GitGutterChangeDeleteLine " default: links to GitGutterChangeLineDefault, i.e. DiffChange +``` + + +#### The base of the diff + +By default buffers are diffed against the index. However you can diff against any commit by setting: + +```viml +let g:gitgutter_diff_base = '<commit SHA>' +``` + + +#### Extra arguments for `git diff` + +If you want to pass extra arguments to `git diff`, for example to ignore whitespace, do so like this: + +```viml +let g:gitgutter_diff_args = '-w' +``` + +#### Key mappings + +To disable all key mappings: + +```viml +let g:gitgutter_map_keys = 0 +``` + +See above for configuring maps for hunk-jumping and staging/undoing. + + +#### Use a custom `grep` command + +If you use an alternative to grep, or your grep does not support the `color` flag, you can tell vim-gitgutter to use it here. It only needs to support extended POSIX regex. + +```viml +" Default: +let g:gitgutter_grep_command = 'grep --color=never -e' +``` + +#### To turn off vim-gitgutter by default + +Add `let g:gitgutter_enabled = 0` to your `~/.vimrc`. + + +#### To turn off signs by default + +Add `let g:gitgutter_signs = 0` to your `~/.vimrc`. + + +#### To turn on line highlighting by default + +Add `let g:gitgutter_highlight_lines = 1` to your `~/.vimrc`. + + +#### To turn off asynchronous updates + +By default diffs are run asynchronously. To run diffs synchronously instead: + +```viml +let g:gitgutter_async = 0 +``` + + +### Extensions + +#### Operate on every line in a hunk + +You can map an operator to do whatever you want to every line in a hunk. + +Let's say, for example, you want to remove trailing whitespace. + +```viml +function! CleanUp(...) + if a:0 " opfunc + let [first, last] = [line("'["), line("']")] + else + let [first, last] = [line("'<"), line("'>")] + endif + for lnum in range(first, last) + let line = getline(lnum) + + " clean up the text, e.g.: + let line = substitute(line, '\s\+$', '', '') + + call setline(lnum, line) + endfor +endfunction + +nmap <silent> <Leader>x :set opfunc=CleanUp<CR>g@ +``` + +Then place your cursor in a hunk and type `\xic` (assuming a leader of `\`). + +Alternatively you could place your cursor in a hunk, type `vic` to select it, then `:call CleanUp()`. + + +#### Operate on every changed line in a file + +You can write a command to do whatever you want to every changed line in a file. + +```viml +function! GlobalChangedLines(ex_cmd) + for hunk in GitGutterGetHunks() + for lnum in range(hunk[2], hunk[2]+hunk[3]-1) + let cursor = getcurpos() + silent! execute lnum.a:ex_cmd + call setpos('.', cursor) + endfor + endfor +endfunction + +command -nargs=1 Glines call GlobalChangedLines(<q-args>) +``` + +Let's say, for example, you want to remove trailing whitespace from all changed lines: + +```viml +:Glines s/\s\+$// +``` + + +### FAQ + +> Why can't I unstage staged changes? + +Unstaging staged hunks is feasible but not quite as easy as it sounds. There are three relevant versions of a file at any one time: + +1. The version at HEAD in the repo. +2. The version staged in the index. +3. The version in the working tree, in your vim buffer. + +`git-diff` without arguments shows you how 3 and 2 differ; this is what vim-gitgutter shows too. + +`git-diff --staged` shows you how 2 and 1 differ. + +Let's say you are looking at a file in vim which has some unstaged changes. Now you stage a hunk, either via vim-gitgutter or another means. The hunk is no longer marked in vim-gitgutter because it is the same in 3 and 2. + +Now you want to unstage that hunk. To see it, you need the difference between 2 and 1. For vim-gitgutter to show those differences, it would need to show you 2 instead of 3 in your vim buffer. But 2 is virtual so vim-gitgutter would need to handle it without touching 3. + +I intend to implement this but I can't commit to any deadline. + +> Why are the colours in the sign column weird? + +Your colorscheme is configuring the `SignColumn` highlight group weirdly. Please see the section above on customising the sign column. + +> There's a noticeable lag when vim-gitter runs; how can I avoid it? + +By default vim-gitgutter runs often so the signs are as accurate as possible. The delay is governed by `updatetime`; see [above](#when-are-the-signs-updated) for more information. + +If you don't want realtime updates and would like to trade a little accuracy for speed, add this to your `~/.vimrc`: + +```viml +let g:gitgutter_realtime = 0 +let g:gitgutter_eager = 0 +``` + +> What happens if I also use another plugin which uses signs (e.g. Syntastic)? + +Vim only allows one sign per line. Before adding a sign to a line, vim-gitgutter checks whether a sign has already been added by somebody else. If so it doesn't do anything. In other words vim-gitgutter won't overwrite another plugin's signs. It also won't remove another plugin's signs. + +> Why aren't any signs showing at all? + +Here are some things you can check: + +* `:echo system("git --version")` succeeds. +* Your git config is compatible with the version of git returned by the command above. +* Your Vim supports signs (`:echo has('signs')` should give `1`). +* Your file is being tracked by git and has unstaged changes. +* If your grep does not support the `color` flag, add `let g:gitgutter_grep_command = 'grep -e'` to your `~/.vimrc`. + + +### Shameless Plug + +If this plugin has helped you, or you'd like to learn more about Vim, why not check out this screencast I wrote for PeepCode: + +* [Smash Into Vim][siv] + +This was one of PeepCode's all-time top three bestsellers and is now available at Pluralsight. + +You can read reviews on my [website][airblade]. + + +### Intellectual Property + +Copyright Andrew Stewart, AirBlade Software Ltd. Released under the MIT licence. + + + [pathogen]: https://github.com/tpope/vim-pathogen + [siv]: http://pluralsight.com/training/Courses/TableOfContents/smash-into-vim + [airblade]: http://airbladesoftware.com/peepcode-vim + [macvim]: http://code.google.com/p/macvim/ diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim new file mode 100644 index 00000000..e5431597 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim @@ -0,0 +1,253 @@ +let s:nomodeline = (v:version > 703 || (v:version == 703 && has('patch442'))) ? '<nomodeline>' : '' + +" Primary functions {{{ + +function! gitgutter#all() abort + for buffer_id in gitgutter#utility#dedup(tabpagebuflist()) + let file = expand('#' . buffer_id . ':p') + if !empty(file) + call gitgutter#process_buffer(buffer_id, 0) + endif + endfor +endfunction + +" bufnr: (integer) the buffer to process. +" realtime: (boolean) when truthy, do a realtime diff; otherwise do a disk-based diff. +function! gitgutter#process_buffer(bufnr, realtime) abort + call gitgutter#utility#use_known_shell() + + call gitgutter#utility#set_buffer(a:bufnr) + if gitgutter#utility#is_active() + if g:gitgutter_sign_column_always + call gitgutter#sign#add_dummy_sign() + endif + try + if !a:realtime || gitgutter#utility#has_fresh_changes() + let diff = gitgutter#diff#run_diff(a:realtime || gitgutter#utility#has_unsaved_changes(), 0) + if diff != 'async' + call gitgutter#handle_diff(diff) + endif + endif + catch /diff failed/ + call gitgutter#debug#log('diff failed') + call gitgutter#hunk#reset() + endtry + execute "silent doautocmd" s:nomodeline "User GitGutter" + else + call gitgutter#hunk#reset() + endif + + call gitgutter#utility#restore_shell() +endfunction + + +function! gitgutter#handle_diff(diff) abort + call gitgutter#debug#log(a:diff) + + call setbufvar(gitgutter#utility#bufnr(), 'gitgutter_tracked', 1) + + call gitgutter#hunk#set_hunks(gitgutter#diff#parse_diff(a:diff)) + let modified_lines = gitgutter#diff#process_hunks(gitgutter#hunk#hunks()) + + if len(modified_lines) > g:gitgutter_max_signs + call gitgutter#utility#warn_once('exceeded maximum number of signs (configured by g:gitgutter_max_signs).', 'max_signs') + call gitgutter#sign#clear_signs() + return + endif + + if g:gitgutter_signs || g:gitgutter_highlight_lines + call gitgutter#sign#update_signs(modified_lines) + endif + + call gitgutter#utility#save_last_seen_change() +endfunction + +function! gitgutter#disable() abort + " get list of all buffers (across all tabs) + let buflist = [] + for i in range(tabpagenr('$')) + call extend(buflist, tabpagebuflist(i + 1)) + endfor + + for buffer_id in gitgutter#utility#dedup(buflist) + let file = expand('#' . buffer_id . ':p') + if !empty(file) + call gitgutter#utility#set_buffer(buffer_id) + call gitgutter#sign#clear_signs() + call gitgutter#sign#remove_dummy_sign(1) + call gitgutter#hunk#reset() + endif + endfor + + let g:gitgutter_enabled = 0 +endfunction + +function! gitgutter#enable() abort + let g:gitgutter_enabled = 1 + call gitgutter#all() +endfunction + +function! gitgutter#toggle() abort + if g:gitgutter_enabled + call gitgutter#disable() + else + call gitgutter#enable() + endif +endfunction + +" }}} + +" Line highlights {{{ + +function! gitgutter#line_highlights_disable() abort + let g:gitgutter_highlight_lines = 0 + call gitgutter#highlight#define_sign_line_highlights() + + if !g:gitgutter_signs + call gitgutter#sign#clear_signs() + call gitgutter#sign#remove_dummy_sign(0) + endif + + redraw! +endfunction + +function! gitgutter#line_highlights_enable() abort + let old_highlight_lines = g:gitgutter_highlight_lines + + let g:gitgutter_highlight_lines = 1 + call gitgutter#highlight#define_sign_line_highlights() + + if !old_highlight_lines && !g:gitgutter_signs + call gitgutter#all() + endif + + redraw! +endfunction + +function! gitgutter#line_highlights_toggle() abort + if g:gitgutter_highlight_lines + call gitgutter#line_highlights_disable() + else + call gitgutter#line_highlights_enable() + endif +endfunction + +" }}} + +" Signs {{{ + +function! gitgutter#signs_enable() abort + let old_signs = g:gitgutter_signs + + let g:gitgutter_signs = 1 + call gitgutter#highlight#define_sign_text_highlights() + + if !old_signs && !g:gitgutter_highlight_lines + call gitgutter#all() + endif +endfunction + +function! gitgutter#signs_disable() abort + let g:gitgutter_signs = 0 + call gitgutter#highlight#define_sign_text_highlights() + + if !g:gitgutter_highlight_lines + call gitgutter#sign#clear_signs() + call gitgutter#sign#remove_dummy_sign(0) + endif +endfunction + +function! gitgutter#signs_toggle() abort + if g:gitgutter_signs + call gitgutter#signs_disable() + else + call gitgutter#signs_enable() + endif +endfunction + +" }}} + +" Hunks {{{ + +function! gitgutter#stage_hunk() abort + call gitgutter#utility#use_known_shell() + if gitgutter#utility#is_active() + " Ensure the working copy of the file is up to date. + " It doesn't make sense to stage a hunk otherwise. + noautocmd silent write + let diff = gitgutter#diff#run_diff(0, 1) + call gitgutter#handle_diff(diff) + + if empty(gitgutter#hunk#current_hunk()) + call gitgutter#utility#warn('cursor is not in a hunk') + else + let diff_for_hunk = gitgutter#diff#generate_diff_for_hunk(diff, 'stage') + call gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' apply --cached --unidiff-zero - '), diff_for_hunk) + + " refresh gitgutter's view of buffer + silent execute "GitGutter" + endif + + silent! call repeat#set("\<Plug>GitGutterStageHunk", -1)<CR> + endif + call gitgutter#utility#restore_shell() +endfunction + +function! gitgutter#undo_hunk() abort + call gitgutter#utility#use_known_shell() + if gitgutter#utility#is_active() + " Ensure the working copy of the file is up to date. + " It doesn't make sense to stage a hunk otherwise. + noautocmd silent write + let diff = gitgutter#diff#run_diff(0, 1) + call gitgutter#handle_diff(diff) + + if empty(gitgutter#hunk#current_hunk()) + call gitgutter#utility#warn('cursor is not in a hunk') + else + let diff_for_hunk = gitgutter#diff#generate_diff_for_hunk(diff, 'undo') + call gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' apply --reverse --unidiff-zero - '), diff_for_hunk) + + " reload file preserving screen line position + let wl = winline() + silent edit + let offset = wl - winline() + execute "normal! ".offset."\<C-Y>" + endif + + silent! call repeat#set("\<Plug>GitGutterUndoHunk", -1)<CR> + endif + call gitgutter#utility#restore_shell() +endfunction + +function! gitgutter#preview_hunk() abort + call gitgutter#utility#use_known_shell() + if gitgutter#utility#is_active() + " Ensure the working copy of the file is up to date. + " It doesn't make sense to stage a hunk otherwise. + noautocmd silent write + let diff = gitgutter#diff#run_diff(0, 1) + call gitgutter#handle_diff(diff) + + if empty(gitgutter#hunk#current_hunk()) + call gitgutter#utility#warn('cursor is not in a hunk') + else + let diff_for_hunk = gitgutter#diff#generate_diff_for_hunk(diff, 'preview') + + silent! wincmd P + if !&previewwindow + noautocmd execute 'bo' &previewheight 'new' + set previewwindow + endif + + setlocal noro modifiable filetype=diff buftype=nofile bufhidden=delete noswapfile + execute "%delete_" + call append(0, split(diff_for_hunk, "\n")) + + noautocmd wincmd p + endif + endif + call gitgutter#utility#restore_shell() +endfunction + +" }}} diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim new file mode 100644 index 00000000..0ce70b82 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim @@ -0,0 +1,211 @@ +let s:jobs = {} + +" Nvim has always supported async commands. +" +" Vim introduced async in 7.4.1826. +" +" gVim didn't support aync until 7.4.1850 (though I haven't been able to +" verify this myself). +" +" MacVim-GUI didn't support async until 7.4.1832 (actually commit +" 88f4fe0 but 7.4.1832 was the first subsequent patch release). +let s:available = has('nvim') || ( + \ has('job') && ( + \ (has('patch-7-4-1826') && !has('gui_running')) || + \ (has('patch-7-4-1850') && has('gui_running')) || + \ (has('patch-7-4-1832') && has('gui_macvim')) + \ ) + \ ) + +function! gitgutter#async#available() + return s:available +endfunction + +function! gitgutter#async#execute(cmd) abort + let bufnr = gitgutter#utility#bufnr() + + if has('nvim') + if has('unix') + let command = ["sh", "-c", a:cmd] + elseif has('win32') + let command = ["cmd.exe", "/c", a:cmd] + else + throw 'unknown os' + endif + " Make the job use a shell while avoiding (un)quoting problems. + let job_id = jobstart(command, { + \ 'buffer': bufnr, + \ 'on_stdout': function('gitgutter#async#handle_diff_job_nvim'), + \ 'on_stderr': function('gitgutter#async#handle_diff_job_nvim'), + \ 'on_exit': function('gitgutter#async#handle_diff_job_nvim') + \ }) + call gitgutter#debug#log('[nvim job: '.job_id.', buffer: '.bufnr.'] '.a:cmd) + if job_id < 1 + throw 'diff failed' + endif + + " Note that when `cmd` doesn't produce any output, i.e. the diff is empty, + " the `stdout` event is not fired on the job handler. Therefore we keep + " track of the jobs ourselves so we can spot empty diffs. + call s:job_started(job_id) + + else + " Make the job use a shell. + " + " Pass a handler for stdout but not for stderr so that errors are + " ignored (and thus signs are not updated; this assumes that an error + " only occurs when a file is not tracked by git). + + if has('unix') + let command = ["sh", "-c", a:cmd] + elseif has('win32') + " Help docs recommend {command} be a string on Windows. But I think + " they also say that will run the command directly, which I believe would + " mean the redirection and pipe stuff wouldn't work. + " let command = "cmd.exe /c ".a:cmd + let command = ["cmd.exe", "/c", a:cmd] + else + throw 'unknown os' + endif + + let job = job_start(command, { + \ 'out_cb': 'gitgutter#async#handle_diff_job_vim', + \ 'close_cb': 'gitgutter#async#handle_diff_job_vim_close' + \ }) + call gitgutter#debug#log('[vim job: '.string(job_info(job)).', buffer: '.bufnr.'] '.a:cmd) + + call s:job_started(s:channel_id(job_getchannel(job)), bufnr) + endif +endfunction + + +function! gitgutter#async#handle_diff_job_nvim(job_id, data, event) abort + call gitgutter#debug#log('job_id: '.a:job_id.', event: '.a:event.', buffer: '.self.buffer) + + let job_bufnr = self.buffer + if bufexists(job_bufnr) + let current_buffer = gitgutter#utility#bufnr() + call gitgutter#utility#set_buffer(job_bufnr) + + if a:event == 'stdout' + " a:data is a list + call s:job_finished(a:job_id) + if gitgutter#utility#is_active() + call gitgutter#handle_diff(gitgutter#utility#stringify(a:data)) + endif + + elseif a:event == 'exit' + " If the exit event is triggered without a preceding stdout event, + " the diff was empty. + if s:is_job_started(a:job_id) + if gitgutter#utility#is_active() + call gitgutter#handle_diff("") + endif + call s:job_finished(a:job_id) + endif + + else " a:event is stderr + call gitgutter#hunk#reset() + call s:job_finished(a:job_id) + + endif + + call gitgutter#utility#set_buffer(current_buffer) + else + call s:job_finished(a:job_id) + endif +endfunction + + +" Channel is in NL mode. +function! gitgutter#async#handle_diff_job_vim(channel, line) abort + call gitgutter#debug#log('channel: '.a:channel.', line: '.a:line) + + call s:accumulate_job_output(s:channel_id(a:channel), a:line) +endfunction + +function! gitgutter#async#handle_diff_job_vim_close(channel) abort + call gitgutter#debug#log('channel: '.a:channel) + + let channel_id = s:channel_id(a:channel) + let job_bufnr = s:job_buffer(channel_id) + + if bufexists(job_bufnr) + let current_buffer = gitgutter#utility#bufnr() + call gitgutter#utility#set_buffer(job_bufnr) + + if gitgutter#utility#is_active() + call gitgutter#handle_diff(s:job_output(channel_id)) + endif + + call gitgutter#utility#set_buffer(current_buffer) + endif + call s:job_finished(channel_id) +endfunction + + +function! s:channel_id(channel) abort + return ch_info(a:channel)['id'] +endfunction + + +" +" Keep track of jobs. +" +" nvim: receives all the job's output at once so we don't need to accumulate +" it ourselves. We can pass the buffer number into the job so we don't need +" to track that either. +" +" s:jobs {} -> key: job's id, value: anything truthy +" +" vim: receives the job's output line by line so we need to accumulate it. +" We also need to keep track of the buffer the job is running for. +" Vim job's don't have an id. Instead we could use the external process's id +" or the channel's id (there seems to be 1 channel per job). Arbitrarily +" choose the channel's id. +" +" s:jobs {} -> key: channel's id, value: {} key: output, value: [] job's output +" key: buffer: value: buffer number + + +" nvim: +" id: job's id +" +" vim: +" id: channel's id +" arg: buffer number +function! s:job_started(id, ...) abort + if a:0 " vim + let s:jobs[a:id] = {'output': [], 'buffer': a:1} + else " nvim + let s:jobs[a:id] = 1 + endif +endfunction + +function! s:is_job_started(id) abort + return has_key(s:jobs, a:id) +endfunction + +function! s:accumulate_job_output(id, line) abort + call add(s:jobs[a:id].output, a:line) +endfunction + +" Returns a string +function! s:job_output(id) abort + if has_key(s:jobs, a:id) + return gitgutter#utility#stringify(s:jobs[a:id].output) + else + return "" + endif +endfunction + +function! s:job_buffer(id) abort + return s:jobs[a:id].buffer +endfunction + +function! s:job_finished(id) abort + if has_key(s:jobs, a:id) + unlet s:jobs[a:id] + endif +endfunction + diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/debug.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/debug.vim new file mode 100644 index 00000000..594f044b --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/debug.vim @@ -0,0 +1,119 @@ +let s:plugin_dir = expand('<sfile>:p:h:h:h').'/' +let s:log_file = s:plugin_dir.'gitgutter.log' +let s:channel_log = s:plugin_dir.'channel.log' +let s:new_log_session = 1 + + +function! gitgutter#debug#debug() + " Open a scratch buffer + vsplit __GitGutter_Debug__ + normal! ggdG + setlocal buftype=nofile + setlocal bufhidden=delete + setlocal noswapfile + + call gitgutter#debug#vim_version() + call gitgutter#debug#separator() + + call gitgutter#debug#git_version() + call gitgutter#debug#separator() + + call gitgutter#debug#grep_version() + call gitgutter#debug#separator() + + call gitgutter#debug#option('updatetime') + call gitgutter#debug#option('shell') + call gitgutter#debug#option('shellcmdflag') + call gitgutter#debug#option('shellpipe') + call gitgutter#debug#option('shellquote') + call gitgutter#debug#option('shellredir') + call gitgutter#debug#option('shellslash') + call gitgutter#debug#option('shelltemp') + call gitgutter#debug#option('shelltype') + call gitgutter#debug#option('shellxescape') + call gitgutter#debug#option('shellxquote') +endfunction + + +function! gitgutter#debug#separator() + call gitgutter#debug#output('') +endfunction + +function! gitgutter#debug#vim_version() + redir => version_info + silent execute 'version' + redir END + call gitgutter#debug#output(split(version_info, '\n')[0:2]) +endfunction + +function! gitgutter#debug#git_version() + let v = system(g:gitgutter_git_executable.' --version') + call gitgutter#debug#output( substitute(v, '\n$', '', '') ) +endfunction + +function! gitgutter#debug#grep_version() + let v = system('grep --version') + call gitgutter#debug#output( substitute(v, '\n$', '', '') ) + + let v = system('grep --help') + call gitgutter#debug#output( substitute(v, '\%x00', '', 'g') ) +endfunction + +function! gitgutter#debug#option(name) + if exists('+' . a:name) + let v = eval('&' . a:name) + call gitgutter#debug#output(a:name . '=' . v) + " redir => output + " silent execute "verbose set " . a:name . "?" + " redir END + " call gitgutter#debug#output(a:name . '=' . output) + else + call gitgutter#debug#output(a:name . ' [n/a]') + end +endfunction + +function! gitgutter#debug#output(text) + call append(line('$'), a:text) +endfunction + +" assumes optional args are calling function's optional args +function! gitgutter#debug#log(message, ...) abort + if g:gitgutter_log + if s:new_log_session && gitgutter#async#available() + if exists('*ch_logfile') + call ch_logfile(s:channel_log, 'w') + endif + endif + + execute 'redir >> '.s:log_file + if s:new_log_session + let s:start = reltime() + silent echo "\n==== start log session ====" + endif + + let elapsed = reltimestr(reltime(s:start)).' ' + silent echo '' + " callers excluding this function + silent echo elapsed.expand('<sfile>')[:-22].':' + silent echo elapsed.s:format_for_log(a:message) + if a:0 && !empty(a:1) + for msg in a:000 + silent echo elapsed.s:format_for_log(msg) + endfor + endif + redir END + + let s:new_log_session = 0 + endif +endfunction + +function! s:format_for_log(data) abort + if type(a:data) == 1 + return join(split(a:data,'\n'),"\n") + elseif type(a:data) == 3 + return '['.join(a:data,"\n").']' + else + return a:data + endif +endfunction + diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim new file mode 100644 index 00000000..170193bf --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim @@ -0,0 +1,342 @@ +if exists('g:gitgutter_grep_command') + let s:grep_available = 1 + let s:grep_command = g:gitgutter_grep_command +else + let s:grep_available = executable('grep') + if s:grep_available + let s:grep_command = 'grep --color=never -e' + endif +endif +let s:hunk_re = '^@@ -\(\d\+\),\?\(\d*\) +\(\d\+\),\?\(\d*\) @@' + +let s:c_flag = gitgutter#utility#git_supports_command_line_config_override() + +let s:temp_index = tempname() +let s:temp_buffer = tempname() + +" Returns a diff of the buffer. +" +" The way to get the diff depends on whether the buffer is saved or unsaved. +" +" * Saved: the buffer contents is the same as the file on disk in the working +" tree so we simply do: +" +" git diff myfile +" +" * Unsaved: the buffer contents is not the same as the file on disk so we +" need to pass two instances of the file to git-diff: +" +" git diff myfileA myfileB +" +" The first instance is the file in the index which we obtain with: +" +" git show :myfile > myfileA +" +" The second instance is the buffer contents. Ideally we would pass this to +" git-diff on stdin via the second argument to vim's system() function. +" Unfortunately git-diff does not do CRLF conversion for input received on +" stdin, and git-show never performs CRLF conversion, so repos with CRLF +" conversion report that every line is modified due to mismatching EOLs. +" +" Instead, we write the buffer contents to a temporary file - myfileB in this +" example. Note the file extension must be preserved for the CRLF +" conversion to work. +" +" Before diffing a buffer for the first time, we check whether git knows about +" the file: +" +" git ls-files --error-unmatch myfile +" +" After running the diff we pass it through grep where available to reduce +" subsequent processing by the plugin. If grep is not available the plugin +" does the filtering instead. +function! gitgutter#diff#run_diff(realtime, preserve_full_diff) abort + " Wrap compound commands in parentheses to make Windows happy. + " bash doesn't mind the parentheses. + let cmd = '(' + + let bufnr = gitgutter#utility#bufnr() + let tracked = getbufvar(bufnr, 'gitgutter_tracked') " i.e. tracked by git + if !tracked + " Don't bother trying to realtime-diff an untracked file. + " NOTE: perhaps we should pull this guard up to the caller? + if a:realtime + throw 'diff failed' + else + let cmd .= g:gitgutter_git_executable.' ls-files --error-unmatch '.gitgutter#utility#shellescape(gitgutter#utility#filename()).' && (' + endif + endif + + if a:realtime + let blob_name = g:gitgutter_diff_base.':'.gitgutter#utility#shellescape(gitgutter#utility#file_relative_to_repo_root()) + let blob_file = s:temp_index + let buff_file = s:temp_buffer + let extension = gitgutter#utility#extension() + if !empty(extension) + let blob_file .= '.'.extension + let buff_file .= '.'.extension + endif + let cmd .= g:gitgutter_git_executable.' show '.blob_name.' > '.blob_file.' && ' + + " Writing the whole buffer resets the '[ and '] marks and also the + " 'modified' flag (if &cpoptions includes '+'). These are unwanted + " side-effects so we save and restore the values ourselves. + let modified = getbufvar(bufnr, "&mod") + let op_mark_start = getpos("'[") + let op_mark_end = getpos("']") + + execute 'keepalt noautocmd silent write!' buff_file + + call setbufvar(bufnr, "&mod", modified) + call setpos("'[", op_mark_start) + call setpos("']", op_mark_end) + endif + + let cmd .= g:gitgutter_git_executable + if s:c_flag + let cmd .= ' -c "diff.autorefreshindex=0"' + endif + let cmd .= ' diff --no-ext-diff --no-color -U0 '.g:gitgutter_diff_args.' ' + + if a:realtime + let cmd .= ' -- '.blob_file.' '.buff_file + else + let cmd .= g:gitgutter_diff_base.' -- '.gitgutter#utility#shellescape(gitgutter#utility#filename()) + endif + + if !a:preserve_full_diff && s:grep_available + let cmd .= ' | '.s:grep_command.' '.gitgutter#utility#shellescape('^@@ ') + endif + + if (!a:preserve_full_diff && s:grep_available) || a:realtime + " grep exits with 1 when no matches are found; diff exits with 1 when + " differences are found. However we want to treat non-matches and + " differences as non-erroneous behaviour; so we OR the command with one + " which always exits with success (0). + let cmd .= ' || exit 0' + endif + + let cmd .= ')' + + if !tracked + let cmd .= ')' + endif + + let cmd = gitgutter#utility#command_in_directory_of_file(cmd) + + if g:gitgutter_async && gitgutter#async#available() && !a:preserve_full_diff + call gitgutter#async#execute(cmd) + return 'async' + + else + let diff = gitgutter#utility#system(cmd) + + if gitgutter#utility#shell_error() + " A shell error indicates the file is not tracked by git (unless something bizarre is going on). + throw 'diff failed' + endif + + return diff + endif +endfunction + +function! gitgutter#diff#parse_diff(diff) abort + let hunks = [] + for line in split(a:diff, '\n') + let hunk_info = gitgutter#diff#parse_hunk(line) + if len(hunk_info) == 4 + call add(hunks, hunk_info) + endif + endfor + return hunks +endfunction + +function! gitgutter#diff#parse_hunk(line) abort + let matches = matchlist(a:line, s:hunk_re) + if len(matches) > 0 + let from_line = str2nr(matches[1]) + let from_count = (matches[2] == '') ? 1 : str2nr(matches[2]) + let to_line = str2nr(matches[3]) + let to_count = (matches[4] == '') ? 1 : str2nr(matches[4]) + return [from_line, from_count, to_line, to_count] + else + return [] + end +endfunction + +function! gitgutter#diff#process_hunks(hunks) abort + call gitgutter#hunk#reset() + let modified_lines = [] + for hunk in a:hunks + call extend(modified_lines, gitgutter#diff#process_hunk(hunk)) + endfor + return modified_lines +endfunction + +" Returns [ [<line_number (number)>, <name (string)>], ...] +function! gitgutter#diff#process_hunk(hunk) abort + let modifications = [] + let from_line = a:hunk[0] + let from_count = a:hunk[1] + let to_line = a:hunk[2] + let to_count = a:hunk[3] + + if gitgutter#diff#is_added(from_count, to_count) + call gitgutter#diff#process_added(modifications, from_count, to_count, to_line) + call gitgutter#hunk#increment_lines_added(to_count) + + elseif gitgutter#diff#is_removed(from_count, to_count) + call gitgutter#diff#process_removed(modifications, from_count, to_count, to_line) + call gitgutter#hunk#increment_lines_removed(from_count) + + elseif gitgutter#diff#is_modified(from_count, to_count) + call gitgutter#diff#process_modified(modifications, from_count, to_count, to_line) + call gitgutter#hunk#increment_lines_modified(to_count) + + elseif gitgutter#diff#is_modified_and_added(from_count, to_count) + call gitgutter#diff#process_modified_and_added(modifications, from_count, to_count, to_line) + call gitgutter#hunk#increment_lines_added(to_count - from_count) + call gitgutter#hunk#increment_lines_modified(from_count) + + elseif gitgutter#diff#is_modified_and_removed(from_count, to_count) + call gitgutter#diff#process_modified_and_removed(modifications, from_count, to_count, to_line) + call gitgutter#hunk#increment_lines_modified(to_count) + call gitgutter#hunk#increment_lines_removed(from_count - to_count) + + endif + return modifications +endfunction + +function! gitgutter#diff#is_added(from_count, to_count) abort + return a:from_count == 0 && a:to_count > 0 +endfunction + +function! gitgutter#diff#is_removed(from_count, to_count) abort + return a:from_count > 0 && a:to_count == 0 +endfunction + +function! gitgutter#diff#is_modified(from_count, to_count) abort + return a:from_count > 0 && a:to_count > 0 && a:from_count == a:to_count +endfunction + +function! gitgutter#diff#is_modified_and_added(from_count, to_count) abort + return a:from_count > 0 && a:to_count > 0 && a:from_count < a:to_count +endfunction + +function! gitgutter#diff#is_modified_and_removed(from_count, to_count) abort + return a:from_count > 0 && a:to_count > 0 && a:from_count > a:to_count +endfunction + +function! gitgutter#diff#process_added(modifications, from_count, to_count, to_line) abort + let offset = 0 + while offset < a:to_count + let line_number = a:to_line + offset + call add(a:modifications, [line_number, 'added']) + let offset += 1 + endwhile +endfunction + +function! gitgutter#diff#process_removed(modifications, from_count, to_count, to_line) abort + if a:to_line == 0 + call add(a:modifications, [1, 'removed_first_line']) + else + call add(a:modifications, [a:to_line, 'removed']) + endif +endfunction + +function! gitgutter#diff#process_modified(modifications, from_count, to_count, to_line) abort + let offset = 0 + while offset < a:to_count + let line_number = a:to_line + offset + call add(a:modifications, [line_number, 'modified']) + let offset += 1 + endwhile +endfunction + +function! gitgutter#diff#process_modified_and_added(modifications, from_count, to_count, to_line) abort + let offset = 0 + while offset < a:from_count + let line_number = a:to_line + offset + call add(a:modifications, [line_number, 'modified']) + let offset += 1 + endwhile + while offset < a:to_count + let line_number = a:to_line + offset + call add(a:modifications, [line_number, 'added']) + let offset += 1 + endwhile +endfunction + +function! gitgutter#diff#process_modified_and_removed(modifications, from_count, to_count, to_line) abort + let offset = 0 + while offset < a:to_count + let line_number = a:to_line + offset + call add(a:modifications, [line_number, 'modified']) + let offset += 1 + endwhile + let a:modifications[-1] = [a:to_line + offset - 1, 'modified_removed'] +endfunction + +" Generates a zero-context diff for the current hunk. +" +" diff - the full diff for the buffer +" type - stage | undo | preview +function! gitgutter#diff#generate_diff_for_hunk(diff, type) abort + let diff_for_hunk = gitgutter#diff#discard_hunks(a:diff, a:type == 'stage' || a:type == 'undo') + + if a:type == 'stage' || a:type == 'undo' + let diff_for_hunk = gitgutter#diff#adjust_hunk_summary(diff_for_hunk, a:type == 'stage') + endif + + return diff_for_hunk +endfunction + +" Returns the diff with all hunks discarded except the current. +" +" diff - the diff to process +" keep_header - truthy to keep the diff header and hunk summary, falsy to discard it +function! gitgutter#diff#discard_hunks(diff, keep_header) abort + let modified_diff = [] + let keep_line = a:keep_header + for line in split(a:diff, '\n') + let hunk_info = gitgutter#diff#parse_hunk(line) + if len(hunk_info) == 4 " start of new hunk + let keep_line = gitgutter#hunk#cursor_in_hunk(hunk_info) + endif + if keep_line + call add(modified_diff, line) + endif + endfor + + if a:keep_header + return gitgutter#utility#stringify(modified_diff) + else + " Discard hunk summary too. + return gitgutter#utility#stringify(modified_diff[1:]) + endif +endfunction + +" Adjust hunk summary (from's / to's line number) to ignore changes above/before this one. +" +" diff_for_hunk - a diff containing only the hunk of interest +" staging - truthy if the hunk is to be staged, falsy if it is to be undone +" +" TODO: push this down to #discard_hunks? +function! gitgutter#diff#adjust_hunk_summary(diff_for_hunk, staging) abort + let line_adjustment = gitgutter#hunk#line_adjustment_for_current_hunk() + let adj_diff = [] + for line in split(a:diff_for_hunk, '\n') + if match(line, s:hunk_re) != -1 + if a:staging + " increment 'to' line number + let line = substitute(line, '+\@<=\(\d\+\)', '\=submatch(1)+line_adjustment', '') + else + " decrement 'from' line number + let line = substitute(line, '-\@<=\(\d\+\)', '\=submatch(1)-line_adjustment', '') + endif + endif + call add(adj_diff, line) + endfor + return gitgutter#utility#stringify(adj_diff) +endfunction + diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/highlight.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/highlight.vim new file mode 100644 index 00000000..e3b774bc --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/highlight.vim @@ -0,0 +1,115 @@ +function! gitgutter#highlight#define_sign_column_highlight() abort + if g:gitgutter_override_sign_column_highlight + highlight! link SignColumn LineNr + else + highlight default link SignColumn LineNr + endif +endfunction + +function! gitgutter#highlight#define_highlights() abort + let [guibg, ctermbg] = gitgutter#highlight#get_background_colors('SignColumn') + + " Highlights used by the signs. + + execute "highlight GitGutterAddDefault guifg=#009900 guibg=" . guibg . " ctermfg=2 ctermbg=" . ctermbg + execute "highlight GitGutterChangeDefault guifg=#bbbb00 guibg=" . guibg . " ctermfg=3 ctermbg=" . ctermbg + execute "highlight GitGutterDeleteDefault guifg=#ff2222 guibg=" . guibg . " ctermfg=1 ctermbg=" . ctermbg + highlight default link GitGutterChangeDeleteDefault GitGutterChangeDefault + + execute "highlight GitGutterAddInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg + execute "highlight GitGutterChangeInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg + execute "highlight GitGutterDeleteInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg + highlight default link GitGutterChangeDeleteInvisible GitGutterChangeInvisble + + highlight default link GitGutterAdd GitGutterAddDefault + highlight default link GitGutterChange GitGutterChangeDefault + highlight default link GitGutterDelete GitGutterDeleteDefault + highlight default link GitGutterChangeDelete GitGutterChangeDeleteDefault + + " Highlights used for the whole line. + + highlight default link GitGutterAddLine DiffAdd + highlight default link GitGutterChangeLine DiffChange + highlight default link GitGutterDeleteLine DiffDelete + highlight default link GitGutterChangeDeleteLine GitGutterChangeLine +endfunction + +function! gitgutter#highlight#define_signs() abort + sign define GitGutterLineAdded + sign define GitGutterLineModified + sign define GitGutterLineRemoved + sign define GitGutterLineRemovedFirstLine + sign define GitGutterLineModifiedRemoved + sign define GitGutterDummy + + call gitgutter#highlight#define_sign_text() + call gitgutter#highlight#define_sign_text_highlights() + call gitgutter#highlight#define_sign_line_highlights() +endfunction + +function! gitgutter#highlight#define_sign_text() abort + execute "sign define GitGutterLineAdded text=" . g:gitgutter_sign_added + execute "sign define GitGutterLineModified text=" . g:gitgutter_sign_modified + execute "sign define GitGutterLineRemoved text=" . g:gitgutter_sign_removed + execute "sign define GitGutterLineRemovedFirstLine text=" . g:gitgutter_sign_removed_first_line + execute "sign define GitGutterLineModifiedRemoved text=" . g:gitgutter_sign_modified_removed +endfunction + +function! gitgutter#highlight#define_sign_text_highlights() abort + " Once a sign's text attribute has been defined, it cannot be undefined or + " set to an empty value. So to make signs' text disappear (when toggling + " off or disabling) we make them invisible by setting their foreground colours + " to the background's. + if g:gitgutter_signs + sign define GitGutterLineAdded texthl=GitGutterAdd + sign define GitGutterLineModified texthl=GitGutterChange + sign define GitGutterLineRemoved texthl=GitGutterDelete + sign define GitGutterLineRemovedFirstLine texthl=GitGutterDelete + sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDelete + else + sign define GitGutterLineAdded texthl=GitGutterAddInvisible + sign define GitGutterLineModified texthl=GitGutterChangeInvisible + sign define GitGutterLineRemoved texthl=GitGutterDeleteInvisible + sign define GitGutterLineRemovedFirstLine texthl=GitGutterDeleteInvisible + sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDeleteInvisible + endif +endfunction + +function! gitgutter#highlight#define_sign_line_highlights() abort + if g:gitgutter_highlight_lines + sign define GitGutterLineAdded linehl=GitGutterAddLine + sign define GitGutterLineModified linehl=GitGutterChangeLine + sign define GitGutterLineRemoved linehl=GitGutterDeleteLine + sign define GitGutterLineRemovedFirstLine linehl=GitGutterDeleteLine + sign define GitGutterLineModifiedRemoved linehl=GitGutterChangeDeleteLine + else + sign define GitGutterLineAdded linehl= + sign define GitGutterLineModified linehl= + sign define GitGutterLineRemoved linehl= + sign define GitGutterLineRemovedFirstLine linehl= + sign define GitGutterLineModifiedRemoved linehl= + endif +endfunction + +function! gitgutter#highlight#get_background_colors(group) abort + redir => highlight + silent execute 'silent highlight ' . a:group + redir END + + let link_matches = matchlist(highlight, 'links to \(\S\+\)') + if len(link_matches) > 0 " follow the link + return gitgutter#highlight#get_background_colors(link_matches[1]) + endif + + let ctermbg = gitgutter#highlight#match_highlight(highlight, 'ctermbg=\([0-9A-Za-z]\+\)') + let guibg = gitgutter#highlight#match_highlight(highlight, 'guibg=\([#0-9A-Za-z]\+\)') + return [guibg, ctermbg] +endfunction + +function! gitgutter#highlight#match_highlight(highlight, pattern) abort + let matches = matchlist(a:highlight, a:pattern) + if len(matches) == 0 + return 'NONE' + endif + return matches[1] +endfunction diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim new file mode 100644 index 00000000..0fd02468 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim @@ -0,0 +1,137 @@ +let s:hunks = [] + +function! gitgutter#hunk#set_hunks(hunks) abort + let s:hunks = a:hunks +endfunction + +function! gitgutter#hunk#hunks() abort + return s:hunks +endfunction + +function! gitgutter#hunk#summary(bufnr) abort + return get(getbufvar(a:bufnr,''), 'gitgutter_summary', [0,0,0]) +endfunction + +function! gitgutter#hunk#reset() abort + call setbufvar(gitgutter#utility#bufnr(), 'gitgutter_summary', [0,0,0]) +endfunction + +function! gitgutter#hunk#increment_lines_added(count) abort + let bufnr = gitgutter#utility#bufnr() + let summary = gitgutter#hunk#summary(bufnr) + let summary[0] += a:count + call setbufvar(bufnr, 'gitgutter_summary', summary) +endfunction + +function! gitgutter#hunk#increment_lines_modified(count) abort + let bufnr = gitgutter#utility#bufnr() + let summary = gitgutter#hunk#summary(bufnr) + let summary[1] += a:count + call setbufvar(bufnr, 'gitgutter_summary', summary) +endfunction + +function! gitgutter#hunk#increment_lines_removed(count) abort + let bufnr = gitgutter#utility#bufnr() + let summary = gitgutter#hunk#summary(bufnr) + let summary[2] += a:count + call setbufvar(bufnr, 'gitgutter_summary', summary) +endfunction + +function! gitgutter#hunk#next_hunk(count) abort + if gitgutter#utility#is_active() + let current_line = line('.') + let hunk_count = 0 + for hunk in s:hunks + if hunk[2] > current_line + let hunk_count += 1 + if hunk_count == a:count + execute 'normal!' hunk[2] . 'G' + return + endif + endif + endfor + call gitgutter#utility#warn('No more hunks') + endif +endfunction + +function! gitgutter#hunk#prev_hunk(count) abort + if gitgutter#utility#is_active() + let current_line = line('.') + let hunk_count = 0 + for hunk in reverse(copy(s:hunks)) + if hunk[2] < current_line + let hunk_count += 1 + if hunk_count == a:count + let target = hunk[2] == 0 ? 1 : hunk[2] + execute 'normal!' target . 'G' + return + endif + endif + endfor + call gitgutter#utility#warn('No previous hunks') + endif +endfunction + +" Returns the hunk the cursor is currently in or an empty list if the cursor +" isn't in a hunk. +function! gitgutter#hunk#current_hunk() abort + let current_hunk = [] + + for hunk in s:hunks + if gitgutter#hunk#cursor_in_hunk(hunk) + let current_hunk = hunk + break + endif + endfor + + return current_hunk +endfunction + +function! gitgutter#hunk#cursor_in_hunk(hunk) abort + let current_line = line('.') + + if current_line == 1 && a:hunk[2] == 0 + return 1 + endif + + if current_line >= a:hunk[2] && current_line < a:hunk[2] + (a:hunk[3] == 0 ? 1 : a:hunk[3]) + return 1 + endif + + return 0 +endfunction + +" Returns the number of lines the current hunk is offset from where it would +" be if any changes above it in the file didn't exist. +function! gitgutter#hunk#line_adjustment_for_current_hunk() abort + let adj = 0 + for hunk in s:hunks + if gitgutter#hunk#cursor_in_hunk(hunk) + break + else + let adj += hunk[1] - hunk[3] + endif + endfor + return adj +endfunction + +function! gitgutter#hunk#text_object(inner) abort + let hunk = gitgutter#hunk#current_hunk() + + if empty(hunk) + return + endif + + let [first_line, last_line] = [hunk[2], hunk[2] + hunk[3] - 1] + + if ! a:inner + let lnum = last_line + let eof = line('$') + while lnum < eof && empty(getline(lnum + 1)) + let lnum +=1 + endwhile + let last_line = lnum + endif + + execute 'normal! 'first_line.'GV'.last_line.'G' +endfunction diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim new file mode 100644 index 00000000..7e1218d4 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim @@ -0,0 +1,179 @@ +" Vim doesn't namespace sign ids so every plugin shares the same +" namespace. Sign ids are simply integers so to avoid clashes with other +" signs we guess at a clear run. +" +" Note also we currently never reset s:next_sign_id. +let s:first_sign_id = 3000 +let s:next_sign_id = s:first_sign_id +let s:dummy_sign_id = s:first_sign_id - 1 +" Remove-all-signs optimisation requires Vim 7.3.596+. +let s:supports_star = v:version > 703 || (v:version == 703 && has("patch596")) + + +" Removes gitgutter's signs (excluding dummy sign) from the buffer being processed. +function! gitgutter#sign#clear_signs() abort + let bufnr = gitgutter#utility#bufnr() + call gitgutter#sign#find_current_signs() + + let sign_ids = map(values(getbufvar(bufnr, 'gitgutter_gitgutter_signs')), 'v:val.id') + call gitgutter#sign#remove_signs(sign_ids, 1) + call setbufvar(bufnr, 'gitgutter_gitgutter_signs', {}) +endfunction + + +" Updates gitgutter's signs in the buffer being processed. +" +" modified_lines: list of [<line_number (number)>, <name (string)>] +" where name = 'added|removed|modified|modified_removed' +function! gitgutter#sign#update_signs(modified_lines) abort + call gitgutter#sign#find_current_signs() + + let new_gitgutter_signs_line_numbers = map(copy(a:modified_lines), 'v:val[0]') + let obsolete_signs = gitgutter#sign#obsolete_gitgutter_signs_to_remove(new_gitgutter_signs_line_numbers) + + let flicker_possible = s:remove_all_old_signs && !empty(a:modified_lines) + if flicker_possible + call gitgutter#sign#add_dummy_sign() + endif + + call gitgutter#sign#remove_signs(obsolete_signs, s:remove_all_old_signs) + call gitgutter#sign#upsert_new_gitgutter_signs(a:modified_lines) + + if flicker_possible + call gitgutter#sign#remove_dummy_sign(0) + endif +endfunction + + +function! gitgutter#sign#add_dummy_sign() abort + let bufnr = gitgutter#utility#bufnr() + if !getbufvar(bufnr, 'gitgutter_dummy_sign') + execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy buffer=" . bufnr + call setbufvar(bufnr, 'gitgutter_dummy_sign', 1) + endif +endfunction + +function! gitgutter#sign#remove_dummy_sign(force) abort + let bufnr = gitgutter#utility#bufnr() + if getbufvar(bufnr, 'gitgutter_dummy_sign') && (a:force || !g:gitgutter_sign_column_always) + execute "sign unplace" s:dummy_sign_id "buffer=" . bufnr + call setbufvar(bufnr, 'gitgutter_dummy_sign', 0) + endif +endfunction + + +" +" Internal functions +" + + +function! gitgutter#sign#find_current_signs() abort + let bufnr = gitgutter#utility#bufnr() + let gitgutter_signs = {} " <line_number (string)>: {'id': <id (number)>, 'name': <name (string)>} + let other_signs = [] " [<line_number (number),...] + let dummy_sign_placed = 0 + + redir => signs + silent execute "sign place buffer=" . bufnr + redir END + + for sign_line in filter(split(signs, '\n')[2:], 'v:val =~# "="') + " Typical sign line: line=88 id=1234 name=GitGutterLineAdded + " We assume splitting is faster than a regexp. + let components = split(sign_line) + let name = split(components[2], '=')[1] + if name =~# 'GitGutterDummy' + let dummy_sign_placed = 1 + else + let line_number = str2nr(split(components[0], '=')[1]) + if name =~# 'GitGutter' + let id = str2nr(split(components[1], '=')[1]) + " Remove orphaned signs (signs placed on lines which have been deleted). + " (When a line is deleted its sign lingers. Subsequent lines' signs' + " line numbers are decremented appropriately.) + if has_key(gitgutter_signs, line_number) + execute "sign unplace" gitgutter_signs[line_number].id + endif + let gitgutter_signs[line_number] = {'id': id, 'name': name} + else + call add(other_signs, line_number) + endif + end + endfor + + call setbufvar(bufnr, 'gitgutter_dummy_sign', dummy_sign_placed) + call setbufvar(bufnr, 'gitgutter_gitgutter_signs', gitgutter_signs) + call setbufvar(bufnr, 'gitgutter_other_signs', other_signs) +endfunction + + +" Returns a list of [<id (number)>, ...] +" Sets `s:remove_all_old_signs` as a side-effect. +function! gitgutter#sign#obsolete_gitgutter_signs_to_remove(new_gitgutter_signs_line_numbers) abort + let bufnr = gitgutter#utility#bufnr() + let signs_to_remove = [] " list of [<id (number)>, ...] + let remove_all_signs = 1 + let old_gitgutter_signs = getbufvar(bufnr, 'gitgutter_gitgutter_signs') + for line_number in keys(old_gitgutter_signs) + if index(a:new_gitgutter_signs_line_numbers, str2nr(line_number)) == -1 + call add(signs_to_remove, old_gitgutter_signs[line_number].id) + else + let remove_all_signs = 0 + endif + endfor + let s:remove_all_old_signs = remove_all_signs + return signs_to_remove +endfunction + + +function! gitgutter#sign#remove_signs(sign_ids, all_signs) abort + let bufnr = gitgutter#utility#bufnr() + if a:all_signs && s:supports_star && empty(getbufvar(bufnr, 'gitgutter_other_signs')) + let dummy_sign_present = getbufvar(bufnr, 'gitgutter_dummy_sign') + execute "sign unplace * buffer=" . bufnr + if dummy_sign_present + execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy buffer=" . bufnr + endif + else + for id in a:sign_ids + execute "sign unplace" id + endfor + endif +endfunction + + +function! gitgutter#sign#upsert_new_gitgutter_signs(modified_lines) abort + let bufnr = gitgutter#utility#bufnr() + let other_signs = getbufvar(bufnr, 'gitgutter_other_signs') + let old_gitgutter_signs = getbufvar(bufnr, 'gitgutter_gitgutter_signs') + + for line in a:modified_lines + let line_number = line[0] " <number> + if index(other_signs, line_number) == -1 " don't clobber others' signs + let name = gitgutter#utility#highlight_name_for_change(line[1]) + if !has_key(old_gitgutter_signs, line_number) " insert + let id = gitgutter#sign#next_sign_id() + execute "sign place" id "line=" . line_number "name=" . name "buffer=" . bufnr + else " update if sign has changed + let old_sign = old_gitgutter_signs[line_number] + if old_sign.name !=# name + execute "sign place" old_sign.id "name=" . name "buffer=" . bufnr + end + endif + endif + endfor + " At this point b:gitgutter_gitgutter_signs is out of date. +endfunction + + +function! gitgutter#sign#next_sign_id() abort + let next_id = s:next_sign_id + let s:next_sign_id += 1 + return next_id +endfunction + + +" Only for testing. +function! gitgutter#sign#reset() + let s:next_sign_id = s:first_sign_id +endfunction diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim new file mode 100644 index 00000000..77ad2dc2 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim @@ -0,0 +1,212 @@ +let s:file = '' +let s:using_xolox_shell = -1 +let s:exit_code = 0 + +function! gitgutter#utility#warn(message) abort + echohl WarningMsg + echo 'vim-gitgutter: ' . a:message + echohl None + let v:warningmsg = a:message +endfunction + +function! gitgutter#utility#warn_once(message, key) abort + if empty(getbufvar(s:bufnr, a:key)) + call setbufvar(s:bufnr, a:key, '1') + echohl WarningMsg + redraw | echo 'vim-gitgutter: ' . a:message + echohl None + let v:warningmsg = a:message + endif +endfunction + +" Returns truthy when the buffer's file should be processed; and falsey when it shouldn't. +" This function does not and should not make any system calls. +function! gitgutter#utility#is_active() abort + return g:gitgutter_enabled && + \ !pumvisible() && + \ gitgutter#utility#is_file_buffer() && + \ gitgutter#utility#exists_file() && + \ gitgutter#utility#not_git_dir() +endfunction + +function! gitgutter#utility#not_git_dir() abort + return gitgutter#utility#full_path_to_directory_of_file() !~ '[/\\]\.git\($\|[/\\]\)' +endfunction + +function! gitgutter#utility#is_file_buffer() abort + return empty(getbufvar(s:bufnr, '&buftype')) +endfunction + +" A replacement for the built-in `shellescape(arg)`. +" +" Recent versions of Vim handle shell escaping pretty well. However older +" versions aren't as good. This attempts to do the right thing. +" +" See: +" https://github.com/tpope/vim-fugitive/blob/8f0b8edfbd246c0026b7a2388e1d883d579ac7f6/plugin/fugitive.vim#L29-L37 +function! gitgutter#utility#shellescape(arg) abort + if a:arg =~ '^[A-Za-z0-9_/.-]\+$' + return a:arg + elseif &shell =~# 'cmd' || gitgutter#utility#using_xolox_shell() + return '"' . substitute(substitute(a:arg, '"', '""', 'g'), '%', '"%"', 'g') . '"' + else + return shellescape(a:arg) + endif +endfunction + +function! gitgutter#utility#set_buffer(bufnr) abort + let s:bufnr = a:bufnr + let s:file = resolve(bufname(a:bufnr)) +endfunction + +function! gitgutter#utility#bufnr() + return s:bufnr +endfunction + +function! gitgutter#utility#file() + return s:file +endfunction + +function! gitgutter#utility#filename() abort + return fnamemodify(s:file, ':t') +endfunction + +function! gitgutter#utility#extension() abort + return fnamemodify(s:file, ':e') +endfunction + +function! gitgutter#utility#full_path_to_directory_of_file() abort + return fnamemodify(s:file, ':p:h') +endfunction + +function! gitgutter#utility#directory_of_file() abort + return fnamemodify(s:file, ':h') +endfunction + +function! gitgutter#utility#exists_file() abort + return filereadable(s:file) +endfunction + +function! gitgutter#utility#has_unsaved_changes() abort + return getbufvar(s:bufnr, "&mod") +endfunction + +function! gitgutter#utility#has_fresh_changes() abort + return getbufvar(s:bufnr, 'changedtick') != getbufvar(s:bufnr, 'gitgutter_last_tick') +endfunction + +function! gitgutter#utility#save_last_seen_change() abort + call setbufvar(s:bufnr, 'gitgutter_last_tick', getbufvar(s:bufnr, 'changedtick')) +endfunction + +function! gitgutter#utility#shell_error() abort + return gitgutter#utility#using_xolox_shell() ? s:exit_code : v:shell_error +endfunction + +function! gitgutter#utility#using_xolox_shell() abort + if s:using_xolox_shell == -1 + if !g:gitgutter_avoid_cmd_prompt_on_windows + let s:using_xolox_shell = 0 + " Although xolox/vim-shell works on both windows and unix we only want to use + " it on windows. + elseif has('win32') || has('win64') || has('win32unix') + let s:using_xolox_shell = exists('g:xolox#misc#version') && exists('g:xolox#shell#version') + else + let s:using_xolox_shell = 0 + endif + endif + return s:using_xolox_shell +endfunction + +function! gitgutter#utility#system(cmd, ...) abort + call gitgutter#debug#log(a:cmd, a:000) + + if gitgutter#utility#using_xolox_shell() + let options = {'command': a:cmd, 'check': 0} + if a:0 > 0 + let options['stdin'] = a:1 + endif + let ret = xolox#misc#os#exec(options) + let output = join(ret.stdout, "\n") + let s:exit_code = ret.exit_code + else + silent let output = (a:0 == 0) ? system(a:cmd) : system(a:cmd, a:1) + endif + return output +endfunction + +function! gitgutter#utility#file_relative_to_repo_root() abort + let file_path_relative_to_repo_root = getbufvar(s:bufnr, 'gitgutter_repo_relative_path') + if empty(file_path_relative_to_repo_root) + let dir_path_relative_to_repo_root = gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' rev-parse --show-prefix')) + let dir_path_relative_to_repo_root = gitgutter#utility#strip_trailing_new_line(dir_path_relative_to_repo_root) + let file_path_relative_to_repo_root = dir_path_relative_to_repo_root . gitgutter#utility#filename() + call setbufvar(s:bufnr, 'gitgutter_repo_relative_path', file_path_relative_to_repo_root) + endif + return file_path_relative_to_repo_root +endfunction + +function! gitgutter#utility#command_in_directory_of_file(cmd) abort + return 'cd '.gitgutter#utility#shellescape(gitgutter#utility#directory_of_file()).' && '.a:cmd +endfunction + +function! gitgutter#utility#highlight_name_for_change(text) abort + if a:text ==# 'added' + return 'GitGutterLineAdded' + elseif a:text ==# 'removed' + return 'GitGutterLineRemoved' + elseif a:text ==# 'removed_first_line' + return 'GitGutterLineRemovedFirstLine' + elseif a:text ==# 'modified' + return 'GitGutterLineModified' + elseif a:text ==# 'modified_removed' + return 'GitGutterLineModifiedRemoved' + endif +endfunction + +" Dedups list in-place. +" Assumes list has no empty entries. +function! gitgutter#utility#dedup(list) + return filter(sort(a:list), 'index(a:list, v:val, v:key + 1) == -1') +endfunction + +function! gitgutter#utility#strip_trailing_new_line(line) abort + return substitute(a:line, '\n$', '', '') +endfunction + +function! gitgutter#utility#git_version() abort + return matchstr(system(g:gitgutter_git_executable.' --version'), '[0-9.]\+') +endfunction + +" True for git v1.7.2+. +function! gitgutter#utility#git_supports_command_line_config_override() abort + let [major, minor, patch; _] = split(gitgutter#utility#git_version(), '\.') + return major > 1 || (major == 1 && minor > 7) || (minor == 7 && patch > 1) +endfunction + +function! gitgutter#utility#stringify(list) abort + return join(a:list, "\n")."\n" +endfunction + +function! gitgutter#utility#use_known_shell() abort + if has('unix') + if &shell !=# 'sh' + let s:shell = &shell + let s:shellcmdflag = &shellcmdflag + let s:shellredir = &shellredir + let &shell = 'sh' + set shellcmdflag=-c + set shellredir=>%s\ 2>&1 + endif + endif +endfunction + +function! gitgutter#utility#restore_shell() abort + if has('unix') + if exists('s:shell') + let &shell = s:shell + let &shellcmdflag = s:shellcmdflag + let &shellredir = s:shellredir + endif + endif +endfunction diff --git a/sources_non_forked/vim-gitgutter/doc/gitgutter.txt b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt new file mode 100644 index 00000000..d4bb7747 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt @@ -0,0 +1,340 @@ +*gitgutter.txt* A Vim plugin which shows a git diff in the gutter. + + + Vim Git Gutter + + +Author: Andy Stewart <http://airbladesoftware.com/> +Plugin Homepage: <https://github.com/airblade/vim-gitgutter> + +=============================================================================== +CONTENTS *GitGutterContents* + + 1. Introduction ................. |GitGutterIntroduction| + 2. Installation ................. |GitGutterInstallation| + 3. Usage ........................ |GitGutterUsage| + 4. Commands ..................... |GitGutterCommands| + 5. Autocommand .................. |GitGutterAutocmd| + 6. CUSTOMISATION................. |GitGutterCustomisation| + 7. FAQ .......................... |GitGutterFAQ| + +=============================================================================== +1. INTRODUCTION *GitGutterIntroduction* + *GitGutter* + +Vim Git Gutter is a Vim plugin which shows a git diff in the 'gutter' (sign +column). It shows whether each line has been added, modified, and where lines +have been removed. + +This is a port of the Git Gutter plugin for Sublime Text 2. + +=============================================================================== +2. INSTALLATION *GitGutterInstallation* + +* Pathogen: +> + cd ~/.vim/bundle + git clone git://github.com/airblade/vim-gitgutter.git +< +* Voom: + +Edit your plugin manifest (`voom edit`) and add: +> + airblade/vim-gitgutter +< +* VimPlug: + +Place this in your .vimrc: +> + Plug 'airblade/vim-gitgutter' +< +Then run the following in Vim: +> + :source % + :PlugInstall +< +* NeoBundle: + +Place this in your .vimrc: +> + NeoBundle 'airblade/vim-gitgutter' +< +Then run the following in Vim: +> + :source % + :NeoBundleInstall +< +* No plugin manager: + +Copy vim-gitgutter's subdirectories into your vim configuration directory: +> + cd tmp && git clone git://github.com/airblade/vim-gitgutter.git + cp vim-gitgutter/* ~/.vim/ +< +See |add-global-plugin|. + +=============================================================================== +3. USAGE *GitGutterUsage* + +You don't have to do anything: it just works. + +=============================================================================== +4. COMMANDS *GitGutterCommands* + +Commands for turning Git Gutter on and off: + + :GitGutterDisable *:GitGutterDisable* + Explicitly turn Git Gutter off. + + :GitGutterEnable *:GitGutterEnable* + Explicitly turn Git Gutter on. + + :GitGutterToggle *:GitGutterToggle* + Explicitly turn Git Gutter on if it was off and vice versa. + + :GitGutter *:GitGutter* + Update signs for the current buffer. + + :GitGutterAll *:GitGutterAll* + Update signs across all buffers. + +Commands for turning signs on and off (defaults to on): + + :GitGutterSignsEnable *:GitGutterSignsEnable* + Explicitly turn line signs on. + + :GitGutterSignsDisable *:GitGutterSignsDisable* + Explicitly turn line signs off. + + :GitGutterSignsToggle *:GitGutterSignsToggle* + Explicitly turn line signs on if it was off and vice versa. + +Commands for turning line highlighting on and off (defaults to off): + + :GitGutterLineHighlightsEnable *:GitGutterLineHighlightsEnable* + Explicitly turn line highlighting on. + + :GitGutterLineHighlightsDisable *:GitGutterLineHighlightsDisable* + Explicitly turn line highlighting off. + + :GitGutterLineHighlightsToggle *:GitGutterLineHighlightsToggle* + Explicitly turn line highlighting on if it was off and vice versa. + +Commands for jumping between marked hunks: + + :GitGutterNextHunk *:GitGutterNextHunk* + Jump to the next marked hunk. Takes a count. + + :GitGutterPrevHunk *:GitGutterPrevHunk* + Jump to the previous marked hunk. Takes a count. + +Commands for staging or undoing individual hunks: + + :GitGutterStageHunk *:GitGutterStageHunk* + Stage the hunk the cursor is in. + + :GitGutterUndoHunk *:GitGutterUndoHunk* + Undo the hunk the cursor is in. + + :GitGutterPreviewHunk *:GitGutterPreviewHunk* + Preview the hunk the cursor is in. + +=============================================================================== +5. AUTOCOMMAND *GitGutterAutocmd* + +After updating a buffer's signs vim-gitgutter fires a |User| |autocmd| with the +event GitGutter. You can listen for this event, for example: +> + autocmd User GitGutter call updateMyStatusLine() +< + +=============================================================================== +6. CUSTOMISATION *GitGutterCustomisation* + +You can customise: + +- The sign column's colours +- The signs' colours and symbols +- Line highlights +- The base of the diff +- Extra arguments for git-diff +- Key mappings +- The grep executable used +- Whether or not vim-gitgutter is on initially (defaults to on) +- Whether or not signs are shown (defaults to yes) +- Whether or not line highlighting is on initially (defaults to off) +- Whether or not vim-gitgutter runs in realtime (defaults to yes) +- Whether or not vim-gitgutter runs eagerly (defaults to yes) +- Whether or not vim-gitgutter runs asynchronously (defaults to yes) + +Please note that vim-gitgutter won't override any colours or highlights you've +set in your colorscheme. + +SIGN COLUMN + +By default vim-gitgutter will make the sign column look like the line number +column (i.e. the |hl-LineNr| highlight group). + +To customise your sign column's background color, first tell vim-gitgutter to +leave it alone: +> + let g:gitgutter_override_sign_column_highlight = 0 +< + +And then either update your colorscheme's |hlSignColumn| highlight group or set +it in your |vimrc|: + + Desired appearance Command ~ + Same as line number column highlight clear SignColumn + User-defined (terminal Vim) highlight SignColumn ctermbg={whatever} + User-defined (graphical Vim) highlight SignColumn guibg={whatever} + +SIGNS' COLOURS AND SYMBOLS + +To customise the colours, set up the following highlight groups in your +colorscheme or |vimrc|: + +> + GitGutterAdd " an added line + GitGutterChange " a changed line + GitGutterDelete " at least one removed line + GitGutterChangeDelete " a changed line followed by at least one removed line +< + +You can either set these with `highlight GitGutterAdd {key}={arg}...` or link +them to existing highlight groups with, say: +> + highlight link GitGutterAdd DiffAdd +< + +To customise the symbols, add the following to your |vimrc|: +> + let g:gitgutter_sign_added = 'xx' + let g:gitgutter_sign_modified = 'yy' + let g:gitgutter_sign_removed = 'zz' + let g:gitgutter_sign_modified_removed = 'ww' +< + +LINE HIGHLIGHTS + +Similarly to the signs' colours, set up the following highlight groups in your +colorscheme or |vimrc|: +> + GitGutterAddLine " default: links to DiffAdd + GitGutterChangeLine " default: links to DiffChange + GitGutterDeleteLine " default: links to DiffDelete + GitGutterChangeDeleteLine " default: links to GitGutterChangeLineDefault +< + +THE BASE OF THE DIFF + +By default buffers are diffed against the index. To diff against a commit +instead: +> + let g:gitgutter_diff_base = '<commit SHA>' +< + +EXTRA ARGUMENTS FOR GIT-DIFF + +To pass extra arguments to git-diff, add this to your |vimrc|: +> + let g:gitgutter_diff_args = '-w' +< + +KEY MAPPINGS + +To disable all key maps: +> + let g:gitgutter_map_keys = 0 +< + +To change the hunk-jumping maps (defaults shown): +> + nmap [c <Plug>GitGutterPrevHunk + nmap ]c <Plug>GitGutterNextHunk +< + +To change the hunk-staging/undoing/previewing maps (defaults shown): +> + nmap <Leader>hs <Plug>GitGutterStageHunk + nmap <Leader>hu <Plug>GitGutterUndoHunk + nmap <Leader>hp <Plug>GitGutterPreviewHunk +< + +To change the hunk text object maps (defaults shown): +> + omap ic <Plug>GitGutterTextObjectInnerPending + omap ac <Plug>GitGutterTextObjectOuterPending + xmap ic <Plug>GitGutterTextObjectInnerVisual + xmap ac <Plug>GitGutterTextObjectOuterVisual +< + +TO USE A CUSTOM GREP COMMAND + +To use a custom invocation for grep, use this: +> + let g:gitgutter_grep_command = 'grep --color=never -e' +< + +TO TURN OFF VIM-GITGUTTER BY DEFAULT + +Add to your |vimrc| +> + let g:gitgutter_enabled = 0 +< + +TO TURN OFF SIGNS BY DEFAULT + +Add to your |vimrc| +> + let g:gitgutter_signs = 0 +< + +Note that the sign column will still be present if you have line highlighting +switched on. + +TO TURN ON LINE HIGHLIGHTING BY DEFAULT + +Add to your |vimrc| +> + let g:gitgutter_highlight_lines = 1 +< + +TO STOP VIM-GITGUTTER RUNNING IN REALTIME + +Add to your |vimrc| +> + let g:gitgutter_realtime = 0 +< + +TO STOP VIM-GITGUTTER RUNNING EAGERLY + +Add to your |vimrc| +> + let g:gitgutter_eager = 0 +< + +TO TURN OFF ASYNCHRONOUS UPDATES + +By default diffs are run asynchronously. To run diffs synchronously +instead: + +Add to your |vimrc| +> +let g:gitgutter_async = 0 +< + +=============================================================================== +7. FAQ *GitGutterFAQ* + +a. Why are the colours in the sign column weird? + + Your colorscheme is configuring the |hl-SignColumn| highlight group weirdly. + Please see |GitGutterCustomisation| on customising the sign column. + +b. What happens if I also use another plugin which uses signs (e.g. Syntastic)? + + Vim only allows one sign per line. Before adding a sign to a line, + vim-gitgutter checks whether a sign has already been added by somebody else. + If so it doesn't do anything. In other words vim-gitgutter won't overwrite + another plugin's signs. It also won't remove another plugin's signs. diff --git a/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim new file mode 100644 index 00000000..eeaffb15 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim @@ -0,0 +1,241 @@ +scriptencoding utf-8 + +if exists('g:loaded_gitgutter') || !has('signs') || &cp + finish +endif +let g:loaded_gitgutter = 1 + +" Initialisation {{{ + +" Realtime sign updates require Vim 7.3.105+. +if v:version < 703 || (v:version == 703 && !has("patch105")) + let g:gitgutter_realtime = 0 +endif + +" Eager updates require gettabvar()/settabvar(). +if !exists("*gettabvar") + let g:gitgutter_eager = 0 +endif + +function! s:set(var, default) abort + if !exists(a:var) + if type(a:default) + execute 'let' a:var '=' string(a:default) + else + execute 'let' a:var '=' a:default + endif + endif +endfunction + +call s:set('g:gitgutter_enabled', 1) +call s:set('g:gitgutter_max_signs', 500) +call s:set('g:gitgutter_signs', 1) +call s:set('g:gitgutter_highlight_lines', 0) +call s:set('g:gitgutter_sign_column_always', 0) +call s:set('g:gitgutter_override_sign_column_highlight', 1) +call s:set('g:gitgutter_realtime', 1) +call s:set('g:gitgutter_eager', 1) +call s:set('g:gitgutter_sign_added', '+') +call s:set('g:gitgutter_sign_modified', '~') +call s:set('g:gitgutter_sign_removed', '_') +try + call s:set('g:gitgutter_sign_removed_first_line', '‾') +catch /E239/ + let g:gitgutter_sign_removed_first_line = '_^' +endtry + +call s:set('g:gitgutter_sign_modified_removed', '~_') +call s:set('g:gitgutter_diff_args', '') +call s:set('g:gitgutter_diff_base', '') +call s:set('g:gitgutter_map_keys', 1) +call s:set('g:gitgutter_avoid_cmd_prompt_on_windows', 1) +call s:set('g:gitgutter_async', 1) +call s:set('g:gitgutter_log', 0) +call s:set('g:gitgutter_git_executable', 'git') + +if !executable(g:gitgutter_git_executable) + call gitgutter#utility#warn('cannot find git. Please set g:gitgutter_git_executable.') +endif + +call gitgutter#highlight#define_sign_column_highlight() +call gitgutter#highlight#define_highlights() +call gitgutter#highlight#define_signs() + +" }}} + +" Primary functions {{{ + +command -bar GitGutterAll call gitgutter#all() +command -bar GitGutter call gitgutter#process_buffer(bufnr(''), 0) + +command -bar GitGutterDisable call gitgutter#disable() +command -bar GitGutterEnable call gitgutter#enable() +command -bar GitGutterToggle call gitgutter#toggle() + +" }}} + +" Line highlights {{{ + +command -bar GitGutterLineHighlightsDisable call gitgutter#line_highlights_disable() +command -bar GitGutterLineHighlightsEnable call gitgutter#line_highlights_enable() +command -bar GitGutterLineHighlightsToggle call gitgutter#line_highlights_toggle() + +" }}} + +" Signs {{{ + +command -bar GitGutterSignsEnable call gitgutter#signs_enable() +command -bar GitGutterSignsDisable call gitgutter#signs_disable() +command -bar GitGutterSignsToggle call gitgutter#signs_toggle() + +" }}} + +" Hunks {{{ + +command -bar -count=1 GitGutterNextHunk call gitgutter#hunk#next_hunk(<count>) +command -bar -count=1 GitGutterPrevHunk call gitgutter#hunk#prev_hunk(<count>) + +command -bar GitGutterStageHunk call gitgutter#stage_hunk() +command -bar GitGutterUndoHunk call gitgutter#undo_hunk() +command -bar GitGutterRevertHunk echomsg 'GitGutterRevertHunk is deprecated. Use GitGutterUndoHunk'<Bar>call gitgutter#undo_hunk() +command -bar GitGutterPreviewHunk call gitgutter#preview_hunk() + +" Hunk text object +onoremap <silent> <Plug>GitGutterTextObjectInnerPending :<C-U>call gitgutter#hunk#text_object(1)<CR> +onoremap <silent> <Plug>GitGutterTextObjectOuterPending :<C-U>call gitgutter#hunk#text_object(0)<CR> +xnoremap <silent> <Plug>GitGutterTextObjectInnerVisual :<C-U>call gitgutter#hunk#text_object(1)<CR> +xnoremap <silent> <Plug>GitGutterTextObjectOuterVisual :<C-U>call gitgutter#hunk#text_object(0)<CR> + + +" Returns the git-diff hunks for the file or an empty list if there +" aren't any hunks. +" +" The return value is a list of lists. There is one inner list per hunk. +" +" [ +" [from_line, from_count, to_line, to_count], +" [from_line, from_count, to_line, to_count], +" ... +" ] +" +" where: +" +" `from` - refers to the staged file +" `to` - refers to the working tree's file +" `line` - refers to the line number where the change starts +" `count` - refers to the number of lines the change covers +function! GitGutterGetHunks() + return gitgutter#utility#is_active() ? gitgutter#hunk#hunks() : [] +endfunction + +" Returns an array that contains a summary of the hunk status for the current +" window. The format is [ added, modified, removed ], where each value +" represents the number of lines added/modified/removed respectively. +function! GitGutterGetHunkSummary() + return gitgutter#hunk#summary(winbufnr(0)) +endfunction + +" }}} + +command -bar GitGutterDebug call gitgutter#debug#debug() + +" Maps {{{ + +nnoremap <silent> <expr> <Plug>GitGutterNextHunk &diff ? ']c' : ":\<C-U>execute v:count1 . 'GitGutterNextHunk'\<CR>" +nnoremap <silent> <expr> <Plug>GitGutterPrevHunk &diff ? '[c' : ":\<C-U>execute v:count1 . 'GitGutterPrevHunk'\<CR>" + +if g:gitgutter_map_keys + if !hasmapto('<Plug>GitGutterPrevHunk') && maparg('[c', 'n') ==# '' + nmap [c <Plug>GitGutterPrevHunk + endif + if !hasmapto('<Plug>GitGutterNextHunk') && maparg(']c', 'n') ==# '' + nmap ]c <Plug>GitGutterNextHunk + endif +endif + + +nnoremap <silent> <Plug>GitGutterStageHunk :GitGutterStageHunk<CR> +nnoremap <silent> <Plug>GitGutterUndoHunk :GitGutterUndoHunk<CR> +nnoremap <silent> <Plug>GitGutterPreviewHunk :GitGutterPreviewHunk<CR> + +if g:gitgutter_map_keys + if !hasmapto('<Plug>GitGutterStageHunk') && maparg('<Leader>hs', 'n') ==# '' + nmap <Leader>hs <Plug>GitGutterStageHunk + endif + if !hasmapto('<Plug>GitGutterUndoHunk') && maparg('<Leader>hu', 'n') ==# '' + nmap <Leader>hu <Plug>GitGutterUndoHunk + nmap <Leader>hr <Plug>GitGutterUndoHunk:echomsg '<Leader>hr is deprecated. Use <Leader>hu'<CR> + endif + if !hasmapto('<Plug>GitGutterPreviewHunk') && maparg('<Leader>hp', 'n') ==# '' + nmap <Leader>hp <Plug>GitGutterPreviewHunk + endif + + if !hasmapto('<Plug>GitGutterTextObjectInnerPending') && maparg('ic', 'o') ==# '' + omap ic <Plug>GitGutterTextObjectInnerPending + endif + if !hasmapto('<Plug>GitGutterTextObjectOuterPending') && maparg('ac', 'o') ==# '' + omap ac <Plug>GitGutterTextObjectOuterPending + endif + if !hasmapto('<Plug>GitGutterTextObjectInnerVisual') && maparg('ic', 'x') ==# '' + xmap ic <Plug>GitGutterTextObjectInnerVisual + endif + if !hasmapto('<Plug>GitGutterTextObjectOuterVisual') && maparg('ac', 'x') ==# '' + xmap ac <Plug>GitGutterTextObjectOuterVisual + endif +endif + +" }}} + +" Autocommands {{{ + +augroup gitgutter + autocmd! + + if g:gitgutter_realtime + autocmd CursorHold,CursorHoldI * call gitgutter#process_buffer(bufnr(''), 1) + endif + + if g:gitgutter_eager + autocmd BufWritePost,FileChangedShellPost * call gitgutter#process_buffer(bufnr(''), 0) + + " When you enter a new tab, BufEnter is only fired if the buffer you enter + " is not the one you came from. + " + " For example: + " + " `:tab split` fires TabEnter but not BufEnter. + " `:tab new` fires TabEnter and BufEnter. + " + " As and when both TabEnter and BufEnter are fired, we do not want to + " process the entered buffer twice. We avoid this by setting and clearing + " a flag. + + autocmd BufEnter * + \ if gettabvar(tabpagenr(), 'gitgutter_didtabenter') | + \ call settabvar(tabpagenr(), 'gitgutter_didtabenter', 0) | + \ else | + \ call gitgutter#process_buffer(bufnr(''), 0) | + \ endif + + autocmd TabEnter * + \ call settabvar(tabpagenr(), 'gitgutter_didtabenter', 1) | + \ call gitgutter#all() + + if !has('gui_win32') + autocmd FocusGained * call gitgutter#all() + endif + + else + autocmd BufRead,BufWritePost,FileChangedShellPost * call gitgutter#process_buffer(bufnr(''), 0) + endif + + autocmd ColorScheme * call gitgutter#highlight#define_sign_column_highlight() | call gitgutter#highlight#define_highlights() + + " Disable during :vimgrep + autocmd QuickFixCmdPre *vimgrep* let g:gitgutter_enabled = 0 + autocmd QuickFixCmdPost *vimgrep* let g:gitgutter_enabled = 1 +augroup END + +" }}} + +" vim:set et sw=2 fdm=marker: diff --git a/sources_non_forked/vim-gitgutter/screenshot.png b/sources_non_forked/vim-gitgutter/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6b50f839ec91fd623e1191f8ada8c823740be041 GIT binary patch literal 16191 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 P9zj7?MW#y1H01vSr(8@| literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-gitgutter/test/fixture.txt b/sources_non_forked/vim-gitgutter/test/fixture.txt new file mode 100644 index 00000000..f5c6affe --- /dev/null +++ b/sources_non_forked/vim-gitgutter/test/fixture.txt @@ -0,0 +1,11 @@ +a +b +c +d +e +f +g +h +i +j + diff --git a/sources_non_forked/vim-gitgutter/test/runner.vim b/sources_non_forked/vim-gitgutter/test/runner.vim new file mode 100644 index 00000000..630693c4 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/test/runner.vim @@ -0,0 +1,162 @@ +" +" Adapted from https://github.com/vim/vim/blob/master/src/testdir/runtest.vim +" +" When debugging tests it can help to write debug output: +" call Log('oh noes') +" + +function RunTest(test) + if exists("*SetUp") + call SetUp() + endif + + try + execute 'call '.a:test + catch + call Exception() + let s:errored = 1 + endtry + + if exists("*TearDown") + call TearDown() + endif +endfunction + +function Log(msg) + if type(a:msg) == type('') + call add(s:messages, a:msg) + elseif type(a:msg) == type([]) + call extend(s:messages, a:msg) + else + call add(v:errors, 'Exception: unsupported type: '.type(a:msg)) + endif +endfunction + +function Exception() + call add(v:errors, v:throwpoint.'..'.'Exception: '.v:exception) +endfunction + +" Shuffles list in place. +function Shuffle(list) + " Fisher-Yates-Durstenfeld-Knuth + let n = len(a:list) + if n < 2 + return a:list + endif + for i in range(0, n-2) + let j = Random(0, n-i-1) + let e = a:list[i] + let a:list[i] = a:list[i+j] + let a:list[i+j] = e + endfor + return a:list +endfunction + +" Returns a pseudorandom integer i such that 0 <= i <= max +function Random(min, max) + if has('unix') + let i = system('echo $RANDOM') " 0 <= i <= 32767 + else + let i = system('echo %RANDOM%') " 0 <= i <= 32767 + endif + return i * (a:max - a:min + 1) / 32768 + a:min +endfunction + +function FriendlyName(test_name) + return substitute(a:test_name[5:-3], '_', ' ', 'g') +endfunction + +function Align(left, right) + if type(a:right) == type([]) + let result = [] + for s in a:right + if empty(result) + call add(result, printf('%-'.s:indent.'S', a:left).s) + else + call add(result, printf('%-'.s:indent.'S', '').s) + endif + endfor + return result + endif + + return printf('%-'.s:indent.'S', a:left).a:right +endfunction + +let g:testname = expand('%') +let s:errored = 0 +let s:done = 0 +let s:fail = 0 +let s:errors = 0 +let s:messages = [] +let s:indent = '' + +call Log(g:testname.':') + +" Source the test script. +try + source % +catch + let s:errors += 1 + call Exception() +endtry + +" Locate the test functions. +set nomore +redir @q +silent function /^Test_ +redir END +let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g')) + +" If there is another argument, filter test-functions' names against it. +if argc() > 1 + let s:tests = filter(s:tests, 'v:val =~ argv(1)') +endif + +let s:indent = max(map(copy(s:tests), {_, val -> len(FriendlyName(val))})) + +" Run the tests in random order. +for test in Shuffle(s:tests) + call RunTest(test) + let s:done += 1 + + let friendly_name = FriendlyName(test) + if len(v:errors) == 0 + call Log(Align(friendly_name, ' - ok')) + else + if s:errored + let s:errors += 1 + let s:errored = 0 + else + let s:fail += 1 + endif + call Log(Align(friendly_name, ' - not ok')) + + let i = 0 + for error in v:errors + if i != 0 + call Log(Align('',' ! ----')) + endif + for trace in reverse(split(error, '\.\.')) + call Log(Align('', ' ! '.trace)) + endfor + let i += 1 + endfor + + let v:errors = [] + endif +endfor + +let summary = [ + \ s:done.( s:done == 1 ? ' test' : ' tests'), + \ s:errors.(s:errors == 1 ? ' error' : ' errors'), + \ s:fail.( s:fail == 1 ? ' failure' : ' failures'), + \ ] +call Log('') +call Log(join(summary, ', ')) + +split messages.log +call append(line('$'), s:messages) +write + +qall! + diff --git a/sources_non_forked/vim-gitgutter/test/test b/sources_non_forked/vim-gitgutter/test/test new file mode 100644 index 00000000..6247a058 --- /dev/null +++ b/sources_non_forked/vim-gitgutter/test/test @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +VIM="/Applications/MacVim.app/Contents/MacOS/Vim -v" + +$VIM -u NONE -U NONE -N \ + --cmd 'set rtp+=../' \ + --cmd 'let g:gitgutter_async=0' \ + --cmd 'source ../plugin/gitgutter.vim' \ + -S runner.vim \ + test_*.vim \ + $* + +cat messages.log + +grep -q "0 errors, 0 failures" messages.log +status=$? +rm messages.log +exit $status + diff --git a/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim b/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim new file mode 100644 index 00000000..1a65ed8a --- /dev/null +++ b/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim @@ -0,0 +1,400 @@ +let s:current_dir = expand('%:p:h') +let s:test_repo = s:current_dir.'/test-repo' +let s:bufnr = bufnr('') + +" +" Helpers +" + +function s:signs(filename) + redir => signs + silent execute 'sign place' + redir END + + let signs = split(signs, '\n') + + " filter out signs for this test file + " assumes a:filename's signs are last set listed + let i = index(signs, 'Signs for '.a:filename.':') + let signs = (i > -1 ? signs[i+1:] : []) + + call map(signs, {_, v -> substitute(v, ' ', '', '')}) + + return signs +endfunction + +function s:git_diff() + return split(system('git diff -U0 fixture.txt'), '\n') +endfunction + +function s:git_diff_staged() + return split(system('git diff -U0 --staged fixture.txt'), '\n') +endfunction + + +" +" SetUp / TearDown +" + +function SetUp() + call system("git init ".s:test_repo. + \ " && cd ".s:test_repo. + \ " && cp ../fixture.txt .". + \ " && git add . && git commit -m 'initial'") + execute ':cd' s:test_repo + edit! fixture.txt + call gitgutter#sign#reset() +endfunction + +function TearDown() + " delete all buffers except this one + " TODO: move to runner.vim, accounting for multiple test files + if s:bufnr > 1 + silent! execute '1,'.s:bufnr-1.'bdelete!' + endif + silent! execute s:bufnr+1.',$bdelete!' + + execute ':cd' s:current_dir + call system("rm -rf ".s:test_repo) +endfunction + +" +" The tests +" + +function Test_add_lines() + normal ggo* + write + + let expected = ["line=2 id=3000 name=GitGutterLineAdded"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_add_lines_fish() + let _shell = &shell + set shell=/usr/local/bin/fish + + normal ggo* + write + + let expected = ["line=2 id=3000 name=GitGutterLineAdded"] + call assert_equal(expected, s:signs('fixture.txt')) + + let &shell = _shell +endfunction + + +function Test_modify_lines() + normal ggi* + write + + let expected = ["line=1 id=3000 name=GitGutterLineModified"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_remove_lines() + execute '5d' + write + + let expected = ["line=4 id=3000 name=GitGutterLineRemoved"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_remove_first_lines() + execute '1d' + write + + let expected = ["line=1 id=3000 name=GitGutterLineRemovedFirstLine"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_edit_file_with_same_name_as_a_branch() + normal 5Gi* + call system('git checkout -b fixture.txt') + write + + let expected = ["line=5 id=3000 name=GitGutterLineModified"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_file_added_to_git() + let tmpfile = 'fileAddedToGit.tmp' + call system('touch '.tmpfile.' && git add '.tmpfile) + execute 'edit '.tmpfile + normal ihello + write + + let expected = ["line=1 id=3000 name=GitGutterLineAdded"] + call assert_equal(expected, s:signs('fileAddedToGit.tmp')) +endfunction + + +function Test_filename_with_equals() + call system('touch =fixture=.txt && git add =fixture=.txt') + edit =fixture=.txt + normal ggo* + write + + let expected = [ + \ 'line=1 id=3000 name=GitGutterLineAdded', + \ 'line=2 id=3001 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('=fixture=.txt')) +endfunction + + +function Test_filename_with_square_brackets() + call system('touch fix[tu]re.txt && git add fix[tu]re.txt') + edit fix[tu]re.txt + normal ggo* + write + + let expected = [ + \ 'line=1 id=3000 name=GitGutterLineAdded', + \ 'line=2 id=3001 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('fix[tu]re.txt')) +endfunction + + +" FIXME: this test fails when it is the first (or only) test to be run +function Test_follow_symlink() + let tmp = 'symlink' + call system('ln -nfs fixture.txt '.tmp) + execute 'edit '.tmp + 6d + write + + let expected = ['line=5 id=3000 name=GitGutterLineRemoved'] + call assert_equal(expected, s:signs('symlink')) +endfunction + + +function Test_keep_alt() + enew + execute "normal! \<C-^>" + + call assert_equal('fixture.txt', bufname('')) + call assert_equal('', bufname('#')) + + normal ggx + doautocmd CursorHold + + call assert_equal('', bufname('#')) +endfunction + + +function Test_keep_modified() + normal 5Go* + call assert_equal(1, getbufvar('', '&modified')) + + doautocmd CursorHold + + call assert_equal(1, getbufvar('', '&modified')) +endfunction + + +function Test_keep_op_marks() + normal 5Go* + call assert_equal([0,6,1,0], getpos("'[")) + call assert_equal([0,6,2,0], getpos("']")) + + doautocmd CursorHold + + call assert_equal([0,6,1,0], getpos("'[")) + call assert_equal([0,6,2,0], getpos("']")) +endfunction + + +function Test_no_modifications() + call assert_equal([], s:signs('fixture.txt')) +endfunction + + +function Test_orphaned_signs() + execute "normal 5GoX\<CR>Y" + write + 6d + write + + let expected = ['line=6 id=3001 name=GitGutterLineAdded'] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_sign_column_always() + let g:gitgutter_sign_column_always=1 + write + + let expected = ['line=9999 id=2999 name=GitGutterDummy'] + call assert_equal(expected, s:signs('fixture.txt')) + + let g:gitgutter_sign_column_always=0 +endfunction + + +function Test_untracked_file_outside_repo() + let tmp = tempname() + call system('touch '.tmp) + execute 'edit '.tmp + + call assert_equal([], s:signs(tmp)) +endfunction + + +function Test_untracked_file_within_repo() + let tmp = 'untrackedFileWithinRepo.tmp' + call system('touch '.tmp) + execute 'edit '.tmp + normal ggo* + doautocmd CursorHold + + call assert_equal([], s:signs(tmp)) + + call system('rm '.tmp) +endfunction + + +function Test_untracked_file_square_brackets_within_repo() + let tmp = '[un]trackedFileWithinRepo.tmp' + call system('touch '.tmp) + execute 'edit '.tmp + normal ggo* + doautocmd CursorHold + + call assert_equal([], s:signs(tmp)) + + call system('rm '.tmp) +endfunction + + +function Test_hunk_outside_noop() + normal 5G + GitGutterStageHunk + + call assert_equal([], s:signs('fixture.txt')) + call assert_equal([], s:git_diff()) + call assert_equal([], s:git_diff_staged()) + + GitGutterUndoHunk + + call assert_equal([], s:signs('fixture.txt')) + call assert_equal([], s:git_diff()) + call assert_equal([], s:git_diff_staged()) +endfunction + + +function Test_hunk_stage() + let _shell = &shell + set shell=foo + + normal 5Gi* + GitGutterStageHunk + + call assert_equal('foo', &shell) + let &shell = _shell + + call assert_equal([], s:signs('fixture.txt')) + + call assert_equal([], s:git_diff()) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index f5c6aff..ae8e546 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -5 +5 @@ d', + \ '-e', + \ '+*e' + \ ] + call assert_equal(expected, s:git_diff_staged()) +endfunction + + +function Test_hunk_stage_nearby_hunk() + execute "normal! 2Gox\<CR>y\<CR>z" + normal 2jdd + normal k + GitGutterStageHunk + + let expected = [ + \ 'line=3 id=3000 name=GitGutterLineAdded', + \ 'line=4 id=3001 name=GitGutterLineAdded', + \ 'line=5 id=3002 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('fixture.txt')) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index 53b13df..8fdfda7 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -2,0 +3,3 @@ b', + \ '+x', + \ '+y', + \ '+z', + \ ] + call assert_equal(expected, s:git_diff()) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index f5c6aff..53b13df 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -4 +3,0 @@ c', + \ '-d', + \ ] + call assert_equal(expected, s:git_diff_staged()) +endfunction + + +function Test_hunk_undo() + let _shell = &shell + set shell=foo + + normal 5Gi* + GitGutterUndoHunk + write " write file so we can verify git diff (--staged) + + call assert_equal('foo', &shell) + let &shell = _shell + + call assert_equal([], s:signs('fixture.txt')) + call assert_equal([], s:git_diff()) + call assert_equal([], s:git_diff_staged()) +endfunction + + +function Test_undo_nearby_hunk() + execute "normal! 2Gox\<CR>y\<CR>z" + normal 2jdd + normal k + GitGutterUndoHunk + write " write file so we can verify git diff (--staged) + + let expected = [ + \ 'line=3 id=3000 name=GitGutterLineAdded', + \ 'line=4 id=3001 name=GitGutterLineAdded', + \ 'line=5 id=3002 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('fixture.txt')) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index f5c6aff..3fbde56 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -2,0 +3,3 @@ b', + \ '+x', + \ '+y', + \ '+z', + \ ] + call assert_equal(expected, s:git_diff()) + + call assert_equal([], s:git_diff_staged()) +endfunction From 9cd8652c4656515be5e7306373ac465ab2f78a34 Mon Sep 17 00:00:00 2001 From: Curtis G <geqw@me.com> Date: Fri, 16 Dec 2016 20:20:55 -0500 Subject: [PATCH 192/254] Add training space to <leader>nb map of NERDTreeFromBookmark --- vimrcs/plugins_config.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index 44d761cb..53d0539e 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -78,7 +78,7 @@ let NERDTreeShowHidden=0 let NERDTreeIgnore = ['\.pyc$', '__pycache__'] let g:NERDTreeWinSize=35 map <leader>nn :NERDTreeToggle<cr> -map <leader>nb :NERDTreeFromBookmark +map <leader>nb :NERDTreeFromBookmark<Space> map <leader>nf :NERDTreeFind<cr> From 04abc6907c45e877dbb675dc7dade208b6c91281 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Tue, 27 Dec 2016 11:45:17 -0300 Subject: [PATCH 193/254] Improved the escaping when using the silver searcher (Ag) --- vimrcs/basic.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index ce1c38ed..6c1d423c 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -383,11 +383,11 @@ function! VisualSelection(direction, extra_filter) range let l:saved_reg = @" execute "normal! vgvy" - let l:pattern = escape(@", '\\/.*$^~[]') + let l:pattern = escape(@", "\\/.*'$^~[]") let l:pattern = substitute(l:pattern, "\n$", "", "") if a:direction == 'gv' - call CmdLine("Ag \"" . l:pattern . "\" " ) + call CmdLine("Ag '" . l:pattern . "' " ) elseif a:direction == 'replace' call CmdLine("%s" . '/'. l:pattern . '/') endif From a6de243fcac4c23d65417f441491beefda9d188f Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Tue, 27 Dec 2016 11:46:49 -0300 Subject: [PATCH 194/254] Updated plugins --- .../ctrlp.vim/autoload/ctrlp.vim | 7 +- sources_non_forked/ctrlp.vim/doc/ctrlp.txt | 22 + .../lightline.vim/autoload/lightline.vim | 26 +- .../lightline/colorscheme/molokai.vim | 36 + .../lightline.vim/doc/lightline.txt | 12 +- .../lightline.vim/test/highlight.vim | 120 ++-- .../lightline.vim/test/link.vim | 110 +-- sources_non_forked/syntastic/CONTRIBUTING.md | 8 +- sources_non_forked/syntastic/README.markdown | 22 +- .../syntastic/autoload/syntastic/util.vim | 20 +- .../syntastic/doc/syntastic-checkers.txt | 15 +- .../syntastic/doc/syntastic.txt | 4 +- .../syntastic/plugin/syntastic.vim | 19 +- .../syntax_checkers/stylus/stylint.vim | 22 +- .../vim-fugitive/plugin/fugitive.vim | 2 +- .../vim-go/.github/ISSUE_TEMPLATE.md | 22 +- sources_non_forked/vim-go/CHANGELOG.md | 132 +++- sources_non_forked/vim-go/README.md | 13 +- .../vim-go/autoload/ctrlp/decls.vim | 12 +- .../vim-go/autoload/go/alternate.vim | 2 +- .../vim-go/autoload/go/asmfmt.vim | 16 +- sources_non_forked/vim-go/autoload/go/cmd.vim | 210 ++++-- .../vim-go/autoload/go/complete.vim | 24 +- .../vim-go/autoload/go/coverage.vim | 129 +++- sources_non_forked/vim-go/autoload/go/def.vim | 153 +++-- sources_non_forked/vim-go/autoload/go/doc.vim | 205 +++--- sources_non_forked/vim-go/autoload/go/fmt.vim | 6 +- .../vim-go/autoload/go/guru.vim | 648 ++++++++++++------ .../vim-go/autoload/go/impl.vim | 10 +- .../vim-go/autoload/go/import.vim | 4 +- sources_non_forked/vim-go/autoload/go/job.vim | 109 +++ .../vim-go/autoload/go/jobcontrol.vim | 85 +-- .../vim-go/autoload/go/lint.vim | 141 +++- .../vim-go/autoload/go/list.vim | 25 +- .../vim-go/autoload/go/package.vim | 10 +- .../vim-go/autoload/go/path.vim | 14 +- .../vim-go/autoload/go/play.vim | 8 +- .../vim-go/autoload/go/rename.vim | 109 ++- .../vim-go/autoload/go/statusline.vim | 112 +++ .../vim-go/autoload/go/template.vim | 16 +- .../vim-go/autoload/go/term.vim | 17 +- .../vim-go/autoload/go/textobj.vim | 4 +- .../vim-go/autoload/go/tool.vim | 29 +- sources_non_forked/vim-go/autoload/go/ui.vim | 8 +- .../vim-go/autoload/go/util.vim | 109 ++- sources_non_forked/vim-go/doc/vim-go.txt | 99 ++- sources_non_forked/vim-go/ftplugin/go.vim | 70 +- .../vim-go/ftplugin/go/commands.vim | 6 +- .../vim-go/ftplugin/go/mappings.vim | 7 +- .../vim-go/indent/gohtmltmpl.vim | 4 +- sources_non_forked/vim-go/plugin/go.vim | 10 +- sources_non_forked/vim-go/syntax/go.vim | 7 +- .../vim-snipmate/autoload/snipMate.vim | 66 +- sources_non_forked/vim-snippets/AUTHORS | 383 +++++++++++ .../vim-snippets/UltiSnips/cuda.snippets | 5 + .../vim-snippets/UltiSnips/python.snippets | 5 + .../vim-snippets/UltiSnips/tex.snippets | 4 +- .../vim-snippets/snippets/_.snippets | 8 + .../vim-snippets/snippets/cuda.snippets | 1 + .../vim-snippets/snippets/fortran.snippets | 21 +- .../vim-snippets/snippets/handlebars.snippets | 14 + .../javascript/javascript.es6.snippets | 13 +- .../javascript/javascript.node.snippets | 2 +- .../vim-snippets/snippets/mustache.snippets | 9 +- .../vim-snippets/snippets/purescript.snippets | 52 ++ .../vim-snippets/snippets/rails.snippets | 2 +- .../vim-snippets/snippets/tex.snippets | 318 ++++----- 67 files changed, 2836 insertions(+), 1097 deletions(-) create mode 100644 sources_non_forked/lightline.vim/autoload/lightline/colorscheme/molokai.vim create mode 100644 sources_non_forked/vim-go/autoload/go/job.vim create mode 100644 sources_non_forked/vim-go/autoload/go/statusline.vim create mode 100644 sources_non_forked/vim-snippets/AUTHORS create mode 100644 sources_non_forked/vim-snippets/UltiSnips/cuda.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/cuda.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/handlebars.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/purescript.snippets diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index b6cd9a62..fc8b8830 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -1,8 +1,9 @@ " ============================================================================= " File: autoload/ctrlp.vim " Description: Fuzzy file, buffer, mru, tag, etc finder. -" Author: Kien Nguyen <github.com/kien> -" Version: 1.79 +" Author: CtrlP Dev Team +" Original: Kien Nguyen <github.com/kien> +" Version: 1.80 " ============================================================================= " ** Static variables {{{1 @@ -1583,7 +1584,7 @@ fu! s:formatline(str) let str .= printf(' %s', '<bp>'.parts[3].'</bp>') en el - let str .= printf(' %-5s %-30s %s', + let str .= printf(' %-5s %-30s', \ parts[0], \ parts[2]) if (!empty(s:bufpath_mod)) diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt index 012e7beb..1107497b 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt @@ -1497,6 +1497,28 @@ Special thanks:~ =============================================================================== CHANGELOG *ctrlp-changelog* +Before 2016/11/28~ + + + New command: |YankLine()| to yank current line. + + New option: |g:ctrlp_types| to select builtin modes. + + New feature: asynchronized spawn of |g:ctrlp_user_command|. This enable + with set |g:user_command_async| to 1. + + Support buffertag for delphi, rust and golang. + + New option: |g:ctrlp_brief_prompt|, + |g:match_current_file|, + |g:ctrlp_compare_lim|. + + New feature: Auto-ignore extension. + + Support buffertag for ant, tex, dosbatch, matlab and vhdl. + + New option |g:ctrlp_line_prefix| for integrating third party plugins. + + New option |g:open_single_match| to open single file in matches. + + Add <plug>(ctrlp) for launch CtrlP. + + Accept bang for CtrlPBookmarkDirAdd to avoid confirm. + + Handle variable like "g:ctrlp_TYPE_MODE". + ex: let g:ctrlp_path_sort + + New option: |g:ctrlp_custom_ancestors| + +Before 2014/08/08~ + + New buffer explorer mode with highlighting (|+conceal| recommended) + New options: |g:ctrlp_bufname_mod|, |g:ctrlp_bufpath_mod| diff --git a/sources_non_forked/lightline.vim/autoload/lightline.vim b/sources_non_forked/lightline.vim/autoload/lightline.vim index 2bb89b8c..6bcc09b4 100644 --- a/sources_non_forked/lightline.vim/autoload/lightline.vim +++ b/sources_non_forked/lightline.vim/autoload/lightline.vim @@ -2,7 +2,7 @@ " Filename: autoload/lightline.vim " Author: itchyny " License: MIT License -" Last Change: 2016/10/05 08:00:00. +" Last Change: 2016/12/03 12:08:08. " ============================================================================= let s:save_cpo = &cpo @@ -156,7 +156,7 @@ function! lightline#init() abort endfor call extend(s:lightline.tabline_separator, s:lightline.separator, 'keep') call extend(s:lightline.tabline_subseparator, s:lightline.subseparator, 'keep') - let s:lightline.tabline_configured = 0 + let s:lightline.tabline_configured = has_key(get(get(g:, 'lightline', {}), 'component_expand', {}), 'tabs') for components in deepcopy(s:lightline.tabline.left + s:lightline.tabline.right) if len(filter(components, 'v:val !=# "tabs" && v:val !=# "close"')) > 0 let s:lightline.tabline_configured = 1 @@ -229,16 +229,16 @@ function! lightline#link(...) abort for [p, l] in [['Left', len(s:lightline.active.left)], ['Right', len(s:lightline.active.right)]] for [i, t] in map(range(0, l), '[v:val, 0]') + types if i != l - exec printf('hi link LightLine%s_active_%s LightLine%s_%s_%s', p, i, p, mode, i) + exec printf('hi link Lightline%s_active_%s Lightline%s_%s_%s', p, i, p, mode, i) endif for [j, s] in map(range(0, l), '[v:val, 0]') + types if i + 1 == j || t || s && i != l - exec printf('hi link LightLine%s_active_%s_%s LightLine%s_%s_%s_%s', p, i, j, p, mode, i, j) + exec printf('hi link Lightline%s_active_%s_%s Lightline%s_%s_%s_%s', p, i, j, p, mode, i, j) endif endfor endfor endfor - exec printf('hi link LightLineMiddle_active LightLineMiddle_%s', mode) + exec printf('hi link LightlineMiddle_active LightlineMiddle_%s', mode) return '' endfunction @@ -279,17 +279,17 @@ function! lightline#highlight(...) abort for [i, t] in map(range(0, l), '[v:val, 0]') + types if i < l || i < 1 let r = t ? (has_key(get(c, d, []), i) ? c[d][i][0] : has_key(get(c, 'tabline', {}), i) ? c.tabline[i][0] : get(c.normal, i, zs)[0]) : get(zs, i, ms) - exec printf('hi LightLine%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', p, mode, i, r[0], r[1], r[2], r[3], s:term(r)) + exec printf('hi Lightline%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', p, mode, i, r[0], r[1], r[2], r[3], s:term(r)) endif for [j, s] in map(range(0, l), '[v:val, 0]') + types if i + 1 == j || t || s && i != l let q = s ? (has_key(get(c, d, []), j) ? c[d][j][0] : has_key(get(c, 'tabline', {}), j) ? c.tabline[j][0] : get(c.normal, j, zs)[0]) : (j != l ? get(zs, j, ms) :ms) - exec printf('hi LightLine%s_%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s', p, mode, i, j, r[1], q[1], r[3], q[3]) + exec printf('hi Lightline%s_%s_%s_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s', p, mode, i, j, r[1], q[1], r[3], q[3]) endif endfor endfor endfor - exec printf('hi LightLineMiddle_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', mode, ms[0], ms[1], ms[2], ms[3], s:term(ms)) + exec printf('hi LightlineMiddle_%s guifg=%s guibg=%s ctermfg=%s ctermbg=%s %s', mode, ms[0], ms[1], ms[2], ms[3], s:term(ms)) endfor endfunction @@ -400,7 +400,7 @@ function! s:line(tabline, inactive) abort let r_ = has_key(s:lightline, mode) ? s:lightline[mode].right : s:lightline.active.right let [rt, rc, rl] = s:expand(copy(r_)) for i in range(len(lt)) - let _ .= '%#LightLineLeft_' . mode . '_' . ll[i] . '#' + let _ .= '%#LightlineLeft_' . mode . '_' . ll[i] . '#' for j in range(len(lt[i])) let x = lc[i][j] ? lt[i][j] : has_key(f, lt[i][j]) ? (exists('*' . f[lt[i][j]]) ? '%{' . f[lt[i][j]] . '()}' : '%{exists("*' . f[lt[i][j]] . '")?' . f[lt[i][j]] . '():""}') : get(c, lt[i][j], '') let _ .= has_key(t, lt[i][j]) && t[lt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)' @@ -408,14 +408,14 @@ function! s:line(tabline, inactive) abort let _ .= s:subseparator(lt[i][(j):], s.left, lc[i][(j):]) endif endfor - let _ .= '%#LightLineLeft_' . mode . '_' . ll[i] . '_' . ll[i + 1] . '#' + let _ .= '%#LightlineLeft_' . mode . '_' . ll[i] . '_' . ll[i + 1] . '#' let _ .= i < l + len(lt) - len(l_) && ll[i] < l || ll[i] != ll[i + 1] ? p.left : len(lt[i]) ? s.left : '' endfor - let _ .= '%#LightLineMiddle_' . mode . '#%=' + let _ .= '%#LightlineMiddle_' . mode . '#%=' for i in reverse(range(len(rt))) - let _ .= '%#LightLineRight_' . mode . '_' . rl[i] . '_' . rl[i + 1] . '#' + let _ .= '%#LightlineRight_' . mode . '_' . rl[i] . '_' . rl[i + 1] . '#' let _ .= i < r + len(rt) - len(r_) && rl[i] < r || rl[i] != rl[i + 1] ? p.right : len(rt[i]) ? s.right : '' - let _ .= '%#LightLineRight_' . mode . '_' . rl[i] . '#' + let _ .= '%#LightlineRight_' . mode . '_' . rl[i] . '#' for j in range(len(rt[i])) let x = rc[i][j] ? rt[i][j] : has_key(f, rt[i][j]) ? (exists('*' . f[rt[i][j]]) ? '%{' . f[rt[i][j]] . '()}' : '%{exists("*' . f[rt[i][j]] . '")?' . f[rt[i][j]] . '():""}') : get(c, rt[i][j], '') let _ .= has_key(t, rt[i][j]) && t[rt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)' diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/molokai.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/molokai.vim new file mode 100644 index 00000000..9d066a1b --- /dev/null +++ b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/molokai.vim @@ -0,0 +1,36 @@ +" ============================================================================= +" Filename: autoload/lightline/colorscheme/molokai.vim +" Author: challsted +" License: MIT License +" Last Change: 2016/11/17 00:27:58. +" ============================================================================= +" +let s:black = [ '#232526', 233 ] +let s:gray = [ '#808080', 244 ] +let s:white = [ '#f8f8f2', 234 ] +let s:cyan = [ '#66d9ef', 81 ] +let s:green = [ '#a6e22e', 118 ] +let s:orange = [ '#ef5939', 166 ] +let s:pink = [ '#f92672', 161 ] +let s:red = [ '#ff0000', 160 ] +let s:yellow = [ '#e6db74', 229 ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} + +let s:p.normal.left = [ [ s:black, s:cyan ], [ s:orange, s:black ] ] +let s:p.normal.middle = [ [ s:orange, s:black ] ] +let s:p.normal.right = [ [ s:pink, s:black ], [ s:black, s:pink ] ] +let s:p.normal.error = [ [ s:pink, s:black ] ] +let s:p.normal.warning = [ [ s:yellow, s:black ] ] +let s:p.insert.left = [ [ s:black, s:green ], [ s:green, s:black ] ] +let s:p.visual.left = [ [ s:black, s:yellow ], [ s:yellow, s:black ] ] +let s:p.replace.left = [ [ s:black, s:red ], [ s:red, s:black ] ] +let s:p.inactive.left = [ [ s:pink, s:black ], [ s:white, s:black ] ] +let s:p.inactive.middle = [ [ s:gray, s:black ] ] +let s:p.inactive.right = [ [ s:white, s:pink ], [ s:pink, s:black ] ] +let s:p.tabline.left = [ [ s:pink, s:black ] ] +let s:p.tabline.middle = [ [ s:pink, s:black] ] +let s:p.tabline.right = copy(s:p.normal.right) +let s:p.tabline.tabsel = [ [ s:black, s:pink ] ] + +let g:lightline#colorscheme#molokai#palette = lightline#colorscheme#flatten(s:p) diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index b86be500..8b0a580d 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -223,7 +223,7 @@ OPTIONS *lightline-option* The colorscheme for lightline.vim. Currently, wombat, solarized, powerline, jellybeans, Tomorrow, Tomorrow_Night, Tomorrow_Night_Blue, Tomorrow_Night_Eighties, - PaperColor, seoul256, landscape, one, Dracula, and 16color are available. + PaperColor, seoul256, landscape, one, Dracula, Molokai and 16color are available. The default value is: > let g:lightline.colorscheme = 'default' @@ -636,6 +636,16 @@ compiled version of your colorscheme. < Then copy and paste the result to the colorscheme file. +If you want to contribute a new colorscheme that is not currently available +please follow the following rules: + *) All hex codes should be lowercase only + *) Use 2 space soft tabs + *) If your colorscheme has both light and dark variants, use a single file + *) Normal Mode should default to Cyan + *) Insert Mode should default to Green + *) Visual Mode should default to Yellow + *) Replace Mode should default to Red + ============================================================================== EXAMPLES *lightline-examples* You can configure the appearance of statusline. diff --git a/sources_non_forked/lightline.vim/test/highlight.vim b/sources_non_forked/lightline.vim/test/highlight.vim index fe5182a3..0e9e6566 100644 --- a/sources_non_forked/lightline.vim/test/highlight.vim +++ b/sources_non_forked/lightline.vim/test/highlight.vim @@ -23,14 +23,14 @@ function! s:suite.highlight() call lightline#init() call lightline#colorscheme() let palette = lightline#palette() - call s:assert.match(s:hi('LightLineLeft_normal_0'), s:pattern(palette.normal.left[0])) - call s:assert.match(s:hi('LightLineLeft_normal_1'), s:pattern(palette.normal.left[1])) - call s:assert.match(s:hi('LightLineLeft_normal_2'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineRight_normal_0'), s:pattern(palette.normal.right[0])) - call s:assert.match(s:hi('LightLineRight_normal_1'), s:pattern(palette.normal.right[1])) - call s:assert.match(s:hi('LightLineRight_normal_2'), s:pattern(palette.normal.right[2])) - call s:assert.match(s:hi('LightLineRight_normal_3'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineLeft_normal_0'), s:pattern(palette.normal.left[0])) + call s:assert.match(s:hi('LightlineLeft_normal_1'), s:pattern(palette.normal.left[1])) + call s:assert.match(s:hi('LightlineLeft_normal_2'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineRight_normal_0'), s:pattern(palette.normal.right[0])) + call s:assert.match(s:hi('LightlineRight_normal_1'), s:pattern(palette.normal.right[1])) + call s:assert.match(s:hi('LightlineRight_normal_2'), s:pattern(palette.normal.right[2])) + call s:assert.match(s:hi('LightlineRight_normal_3'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0])) endfunction function! s:suite.insert() @@ -39,14 +39,14 @@ function! s:suite.insert() call lightline#colorscheme() call lightline#highlight('insert') let palette = lightline#palette() - call s:assert.match(s:hi('LightLineLeft_insert_0'), s:pattern(palette.insert.left[0])) - call s:assert.match(s:hi('LightLineLeft_insert_1'), s:pattern(palette.insert.left[1])) - call s:assert.match(s:hi('LightLineLeft_insert_2'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineRight_insert_0'), s:pattern(palette.insert.right[0])) - call s:assert.match(s:hi('LightLineRight_insert_1'), s:pattern(palette.insert.right[1])) - call s:assert.match(s:hi('LightLineRight_insert_2'), s:pattern(palette.insert.right[2])) - call s:assert.match(s:hi('LightLineRight_insert_3'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineMiddle_insert'), s:pattern(palette.insert.middle[0])) + call s:assert.match(s:hi('LightlineLeft_insert_0'), s:pattern(palette.insert.left[0])) + call s:assert.match(s:hi('LightlineLeft_insert_1'), s:pattern(palette.insert.left[1])) + call s:assert.match(s:hi('LightlineLeft_insert_2'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineRight_insert_0'), s:pattern(palette.insert.right[0])) + call s:assert.match(s:hi('LightlineRight_insert_1'), s:pattern(palette.insert.right[1])) + call s:assert.match(s:hi('LightlineRight_insert_2'), s:pattern(palette.insert.right[2])) + call s:assert.match(s:hi('LightlineRight_insert_3'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineMiddle_insert'), s:pattern(palette.insert.middle[0])) endfunction @@ -56,14 +56,14 @@ function! s:suite.visual() call lightline#colorscheme() call lightline#highlight('visual') let palette = lightline#palette() - call s:assert.match(s:hi('LightLineLeft_visual_0'), s:pattern(palette.visual.left[0])) - call s:assert.match(s:hi('LightLineLeft_visual_1'), s:pattern(palette.visual.left[1])) - call s:assert.match(s:hi('LightLineLeft_visual_2'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineRight_visual_0'), s:pattern(palette.normal.right[0])) - call s:assert.match(s:hi('LightLineRight_visual_1'), s:pattern(palette.normal.right[1])) - call s:assert.match(s:hi('LightLineRight_visual_2'), s:pattern(palette.normal.right[2])) - call s:assert.match(s:hi('LightLineRight_visual_3'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineLeft_visual_0'), s:pattern(palette.visual.left[0])) + call s:assert.match(s:hi('LightlineLeft_visual_1'), s:pattern(palette.visual.left[1])) + call s:assert.match(s:hi('LightlineLeft_visual_2'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineRight_visual_0'), s:pattern(palette.normal.right[0])) + call s:assert.match(s:hi('LightlineRight_visual_1'), s:pattern(palette.normal.right[1])) + call s:assert.match(s:hi('LightlineRight_visual_2'), s:pattern(palette.normal.right[2])) + call s:assert.match(s:hi('LightlineRight_visual_3'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0])) endfunction function! s:suite.replace() @@ -72,14 +72,14 @@ function! s:suite.replace() call lightline#colorscheme() call lightline#highlight('replace') let palette = lightline#palette() - call s:assert.match(s:hi('LightLineLeft_replace_0'), s:pattern(palette.replace.left[0])) - call s:assert.match(s:hi('LightLineLeft_replace_1'), s:pattern(palette.replace.left[1])) - call s:assert.match(s:hi('LightLineLeft_replace_2'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineRight_replace_0'), s:pattern(palette.replace.right[0])) - call s:assert.match(s:hi('LightLineRight_replace_1'), s:pattern(palette.replace.right[1])) - call s:assert.match(s:hi('LightLineRight_replace_2'), s:pattern(palette.replace.right[2])) - call s:assert.match(s:hi('LightLineRight_replace_3'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineMiddle_replace'), s:pattern(palette.replace.middle[0])) + call s:assert.match(s:hi('LightlineLeft_replace_0'), s:pattern(palette.replace.left[0])) + call s:assert.match(s:hi('LightlineLeft_replace_1'), s:pattern(palette.replace.left[1])) + call s:assert.match(s:hi('LightlineLeft_replace_2'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineRight_replace_0'), s:pattern(palette.replace.right[0])) + call s:assert.match(s:hi('LightlineRight_replace_1'), s:pattern(palette.replace.right[1])) + call s:assert.match(s:hi('LightlineRight_replace_2'), s:pattern(palette.replace.right[2])) + call s:assert.match(s:hi('LightlineRight_replace_3'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineMiddle_replace'), s:pattern(palette.replace.middle[0])) endfunction function! s:suite.left_right() @@ -92,18 +92,18 @@ function! s:suite.left_right() call lightline#init() call lightline#colorscheme() let palette = lightline#palette() - call s:assert.match(s:hi('LightLineLeft_normal_0'), s:pattern(palette.normal.left[0])) - call s:assert.match(s:hi('LightLineLeft_normal_1'), s:pattern(palette.normal.left[1])) - call s:assert.match(s:hi('LightLineLeft_normal_2'), s:pattern(palette.normal.middle[0])) - call s:assert.match(s:hi('LightLineLeft_normal_3'), s:pattern(palette.normal.middle[0])) - call s:assert.match(s:hi('LightLineLeft_normal_4'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineRight_normal_0'), s:pattern(palette.normal.right[0])) - call s:assert.match(s:hi('LightLineRight_normal_1'), s:pattern(palette.normal.right[1])) - call s:assert.match(s:hi('LightLineRight_normal_2'), s:pattern(palette.normal.right[2])) - call s:assert.match(s:hi('LightLineRight_normal_3'), s:pattern(palette.normal.middle[0])) - call s:assert.match(s:hi('LightLineRight_normal_4'), s:pattern(palette.normal.middle[0])) - call s:assert.match(s:hi('LightLineRight_normal_5'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineLeft_normal_0'), s:pattern(palette.normal.left[0])) + call s:assert.match(s:hi('LightlineLeft_normal_1'), s:pattern(palette.normal.left[1])) + call s:assert.match(s:hi('LightlineLeft_normal_2'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineLeft_normal_3'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineLeft_normal_4'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineRight_normal_0'), s:pattern(palette.normal.right[0])) + call s:assert.match(s:hi('LightlineRight_normal_1'), s:pattern(palette.normal.right[1])) + call s:assert.match(s:hi('LightlineRight_normal_2'), s:pattern(palette.normal.right[2])) + call s:assert.match(s:hi('LightlineRight_normal_3'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineRight_normal_4'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineRight_normal_5'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0])) endfunction function! s:suite.no_components() @@ -120,11 +120,11 @@ function! s:suite.no_components() call lightline#init() call lightline#colorscheme() let palette = lightline#palette() - call s:assert.match(s:hi('LightLineLeft_normal_0'), s:pattern(palette.normal.left[0])) - call s:assert.match(s:hi('LightLineLeft_normal_1'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineRight_normal_0'), s:pattern(palette.normal.right[0])) - call s:assert.match(s:hi('LightLineRight_normal_1'), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi('LightLineMiddle_normal'), s:pattern(palette.normal.middle[0])) + call s:assert.match(s:hi('LightlineLeft_normal_0'), s:pattern(palette.normal.left[0])) + call s:assert.match(s:hi('LightlineLeft_normal_1'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineRight_normal_0'), s:pattern(palette.normal.right[0])) + call s:assert.match(s:hi('LightlineRight_normal_1'), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi('LightlineMiddle_normal'), s:pattern(palette.normal.middle[0])) endfunction function! s:suite.subseparator() @@ -140,9 +140,9 @@ function! s:suite.subseparator() for i in range(4) for j in range(5) if i + 1 == j - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_%s', i, j)), s:pattern(get(palette.normal.left, i, palette.normal.middle[0]), get(palette.normal.left, j, palette.normal.middle[0]))) + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_%s', i, j)), s:pattern(get(palette.normal.left, i, palette.normal.middle[0]), get(palette.normal.left, j, palette.normal.middle[0]))) else - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_%s', i, j)), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_%s', i, j)), 'E411: highlight group not found\|cleared') endif endfor endfor @@ -154,18 +154,18 @@ function! s:suite.component_type() call lightline#colorscheme() let palette = lightline#palette() for type in ['error', 'warning'] - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s', type)), s:pattern(palette.normal[type][0])) - call s:assert.match(s:hi(printf('LightLineLeft_normal_0_%s', type)), s:pattern(palette.normal.left[0], palette.normal[type][0])) - call s:assert.match(s:hi(printf('LightLineLeft_normal_1_%s', type)), s:pattern(palette.normal.left[1], palette.normal[type][0])) - call s:assert.match(s:hi(printf('LightLineLeft_normal_2_%s', type)), 'E411: highlight group not found\|cleared') - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_0', type)), s:pattern(palette.normal[type][0], palette.normal.left[0])) - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_1', type)), s:pattern(palette.normal[type][0], palette.normal.left[1])) - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_2', type)), s:pattern(palette.normal[type][0], palette.normal.middle[0])) - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_3', type)), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s', type)), s:pattern(palette.normal[type][0])) + call s:assert.match(s:hi(printf('LightlineLeft_normal_0_%s', type)), s:pattern(palette.normal.left[0], palette.normal[type][0])) + call s:assert.match(s:hi(printf('LightlineLeft_normal_1_%s', type)), s:pattern(palette.normal.left[1], palette.normal[type][0])) + call s:assert.match(s:hi(printf('LightlineLeft_normal_2_%s', type)), 'E411: highlight group not found\|cleared') + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_0', type)), s:pattern(palette.normal[type][0], palette.normal.left[0])) + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_1', type)), s:pattern(palette.normal[type][0], palette.normal.left[1])) + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_2', type)), s:pattern(palette.normal[type][0], palette.normal.middle[0])) + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_3', type)), 'E411: highlight group not found\|cleared') endfor for type1 in ['error', 'warning'] for type2 in ['error', 'warning'] - call s:assert.match(s:hi(printf('LightLineLeft_normal_%s_%s', type1, type2)), s:pattern(palette.normal[type1][0], palette.normal[type2][0])) + call s:assert.match(s:hi(printf('LightlineLeft_normal_%s_%s', type1, type2)), s:pattern(palette.normal[type1][0], palette.normal[type2][0])) endfor endfor endfunction diff --git a/sources_non_forked/lightline.vim/test/link.vim b/sources_non_forked/lightline.vim/test/link.vim index ca867536..c0811c42 100644 --- a/sources_non_forked/lightline.vim/test/link.vim +++ b/sources_non_forked/lightline.vim/test/link.vim @@ -17,50 +17,50 @@ endfunction function! s:suite.link() call lightline#link() - call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_normal_0') - call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_normal_1') - call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_normal_0') - call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_normal_1') - call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_normal_2') - call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_normal') + call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_normal_0') + call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_normal_1') + call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_normal_0') + call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_normal_1') + call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_normal_2') + call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_normal') endfunction function! s:suite.insert() call lightline#link('i') - call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_insert_0') - call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_insert_1') - call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_insert_0') - call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_insert_1') - call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_insert_2') - call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_insert') + call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_insert_0') + call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_insert_1') + call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_insert_0') + call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_insert_1') + call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_insert_2') + call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_insert') endfunction function! s:suite.visual() call lightline#link('v') - call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_visual_0') - call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_visual_1') - call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_visual_0') - call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_visual_1') - call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_visual_2') - call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_visual') + call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_visual_0') + call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_visual_1') + call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_visual_0') + call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_visual_1') + call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_visual_2') + call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_visual') endfunction function! s:suite.replace() call lightline#link('R') - call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_replace_0') - call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_replace_1') - call s:assert.match(s:hi('LightLineLeft_active_2'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_replace_0') - call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_replace_1') - call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_replace_2') - call s:assert.match(s:hi('LightLineRight_active_3'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_replace') + call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_replace_0') + call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_replace_1') + call s:assert.match(s:hi('LightlineLeft_active_2'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_replace_0') + call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_replace_1') + call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_replace_2') + call s:assert.match(s:hi('LightlineRight_active_3'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_replace') endfunction function! s:suite.left_right() @@ -73,18 +73,18 @@ function! s:suite.left_right() call lightline#init() call lightline#colorscheme() call lightline#link() - call s:assert.match(s:hi('LightLineLeft_active_0'), 'LightLineLeft_normal_0') - call s:assert.match(s:hi('LightLineLeft_active_1'), 'LightLineLeft_normal_1') - call s:assert.match(s:hi('LightLineLeft_active_2'), 'LightLineLeft_normal_2') - call s:assert.match(s:hi('LightLineLeft_active_3'), 'LightLineLeft_normal_3') - call s:assert.match(s:hi('LightLineLeft_active_4'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineRight_active_0'), 'LightLineRight_normal_0') - call s:assert.match(s:hi('LightLineRight_active_1'), 'LightLineRight_normal_1') - call s:assert.match(s:hi('LightLineRight_active_2'), 'LightLineRight_normal_2') - call s:assert.match(s:hi('LightLineRight_active_3'), 'LightLineRight_normal_3') - call s:assert.match(s:hi('LightLineRight_active_4'), 'LightLineRight_normal_4') - call s:assert.match(s:hi('LightLineRight_active_5'), 'E411: highlight group not found') - call s:assert.match(s:hi('LightLineMiddle_active'), 'LightLineMiddle_normal') + call s:assert.match(s:hi('LightlineLeft_active_0'), 'LightlineLeft_normal_0') + call s:assert.match(s:hi('LightlineLeft_active_1'), 'LightlineLeft_normal_1') + call s:assert.match(s:hi('LightlineLeft_active_2'), 'LightlineLeft_normal_2') + call s:assert.match(s:hi('LightlineLeft_active_3'), 'LightlineLeft_normal_3') + call s:assert.match(s:hi('LightlineLeft_active_4'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineRight_active_0'), 'LightlineRight_normal_0') + call s:assert.match(s:hi('LightlineRight_active_1'), 'LightlineRight_normal_1') + call s:assert.match(s:hi('LightlineRight_active_2'), 'LightlineRight_normal_2') + call s:assert.match(s:hi('LightlineRight_active_3'), 'LightlineRight_normal_3') + call s:assert.match(s:hi('LightlineRight_active_4'), 'LightlineRight_normal_4') + call s:assert.match(s:hi('LightlineRight_active_5'), 'E411: highlight group not found') + call s:assert.match(s:hi('LightlineMiddle_active'), 'LightlineMiddle_normal') endfunction function! s:suite.subseparator() @@ -100,9 +100,9 @@ function! s:suite.subseparator() for i in range(4) for j in range(5) if i + 1 == j - call s:assert.match(s:hi(printf('LightLineLeft_active_%s_%s', i, j)), printf('LightLineLeft_normal_%s_%s', i, j)) + call s:assert.match(s:hi(printf('LightlineLeft_active_%s_%s', i, j)), printf('LightlineLeft_normal_%s_%s', i, j)) else - call s:assert.match(s:hi(printf('LightLineLeft_active_%s_%s', i, j)), 'E411: highlight group not found') + call s:assert.match(s:hi(printf('LightlineLeft_active_%s_%s', i, j)), 'E411: highlight group not found') endif endfor endfor @@ -114,18 +114,18 @@ function! s:suite.component_type() call lightline#colorscheme() call lightline#link() for type in ['error', 'warning'] - call s:assert.match(s:hi(printf('LightLineLeft_active_%s', type)), printf('LightLineLeft_normal_%s', type)) - call s:assert.match(s:hi(printf('LightLineLeft_active_0_%s', type)), printf('LightLineLeft_normal_0_%s', type)) - call s:assert.match(s:hi(printf('LightLineLeft_active_1_%s', type)), printf('LightLineLeft_normal_1_%s', type)) - call s:assert.match(s:hi(printf('LightLineLeft_active_2_%s', type)), 'E411: highlight group not found') - call s:assert.match(s:hi(printf('LightLineLeft_active_%s_0', type)), printf('LightLineLeft_normal_%s_0', type)) - call s:assert.match(s:hi(printf('LightLineLeft_active_%s_1', type)), printf('LightLineLeft_normal_%s_1', type)) - call s:assert.match(s:hi(printf('LightLineLeft_active_%s_2', type)), printf('LightLineLeft_normal_%s_2', type)) - call s:assert.match(s:hi(printf('LightLineLeft_active_%s_3', type)), 'E411: highlight group not found') + call s:assert.match(s:hi(printf('LightlineLeft_active_%s', type)), printf('LightlineLeft_normal_%s', type)) + call s:assert.match(s:hi(printf('LightlineLeft_active_0_%s', type)), printf('LightlineLeft_normal_0_%s', type)) + call s:assert.match(s:hi(printf('LightlineLeft_active_1_%s', type)), printf('LightlineLeft_normal_1_%s', type)) + call s:assert.match(s:hi(printf('LightlineLeft_active_2_%s', type)), 'E411: highlight group not found') + call s:assert.match(s:hi(printf('LightlineLeft_active_%s_0', type)), printf('LightlineLeft_normal_%s_0', type)) + call s:assert.match(s:hi(printf('LightlineLeft_active_%s_1', type)), printf('LightlineLeft_normal_%s_1', type)) + call s:assert.match(s:hi(printf('LightlineLeft_active_%s_2', type)), printf('LightlineLeft_normal_%s_2', type)) + call s:assert.match(s:hi(printf('LightlineLeft_active_%s_3', type)), 'E411: highlight group not found') endfor for type1 in ['error', 'warning'] for type2 in ['error', 'warning'] - call s:assert.match(s:hi(printf('LightLineLeft_active_%s_%s', type1, type2)), printf('LightLineLeft_normal_%s_%s', type1, type2)) + call s:assert.match(s:hi(printf('LightlineLeft_active_%s_%s', type1, type2)), printf('LightlineLeft_normal_%s_%s', type1, type2)) endfor endfor endfunction diff --git a/sources_non_forked/syntastic/CONTRIBUTING.md b/sources_non_forked/syntastic/CONTRIBUTING.md index 1949415e..44eb13f8 100644 --- a/sources_non_forked/syntastic/CONTRIBUTING.md +++ b/sources_non_forked/syntastic/CONTRIBUTING.md @@ -97,9 +97,9 @@ let errorformat = \ '%-G%.%#' ``` -[bug_tracker]: https://github.com/scrooloose/syntastic/issues -[manual]: https://github.com/scrooloose/syntastic/blob/master/doc/syntastic.txt -[github]: https://github.com/scrooloose/syntastic +[bug_tracker]: https://github.com/vim-syntastic/syntastic/issues +[manual]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic.txt +[github]: https://github.com/vim-syntastic/syntastic [branches]: https://github.com/dchelimsky/rspec/wiki/Topic-Branches#using-topic-branches-when-contributing-patches [variables]: http://www.refactoring.com/catalog/extractVariable.html -[guide]: https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide +[guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index e5c8396a..7ed8cc87 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -49,11 +49,12 @@ ## 1\. Introduction -Syntastic is a syntax checking plugin for [Vim][vim] that runs files through -external syntax checkers and displays any resulting errors to the user. This -can be done on demand, or automatically as files are saved. If syntax errors -are detected, the user is notified and is happy because they didn't have to -compile their code or execute their script to find them. +Syntastic is a syntax checking plugin for [Vim][vim] created by +[Martin Grenfell][scrooloose]. It runs files through external syntax checkers +and displays any resulting errors to the user. This can be done on demand, or +automatically as files are saved. If syntax errors are detected, the user is +notified and is happy because they didn't have to compile their code or execute +their script to find them. At the time of this writing, syntastic has checking plugins for ACPI Source Language, ActionScript, Ada, Ansible configurations, API Blueprint, @@ -153,7 +154,7 @@ You now have pathogen installed and can put syntastic into `~/.vim/bundle` like this: ```sh cd ~/.vim/bundle && \ -git clone --depth=1 https://github.com/scrooloose/syntastic.git +git clone --depth=1 https://github.com/vim-syntastic/syntastic.git ``` Quit vim and start it back up to reload it, then type: ```vim @@ -501,15 +502,16 @@ plugins that provide more functionality than syntastic. You might want to take a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [vim-go][vimgo], or [YouCompleteMe][ycm]. -[screenshot]: https://github.com/scrooloose/syntastic/raw/master/_assets/screenshot_1.png +[scrooloose]: https://github.com/scrooloose +[screenshot]: https://github.com/vim-syntastic/syntastic/raw/master/_assets/screenshot_1.png -[bug_tracker]: https://github.com/scrooloose/syntastic/issues -[checkers]: https://github.com/scrooloose/syntastic/blob/master/doc/syntastic-checkers.txt +[bug_tracker]: https://github.com/vim-syntastic/syntastic/issues +[checkers]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic-checkers.txt [crystal]: https://github.com/rhysd/vim-crystal [eastwood]: https://github.com/venantius/vim-eastwood [ghcmod]: https://github.com/eagletmt/ghcmod-vim [google_group]: https://groups.google.com/group/vim-syntastic -[guide]: https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide +[guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide [jedi]: https://github.com/davidhalter/jedi-vim [merlin]: https://github.com/the-lambda-church/merlin [myint]: https://github.com/myint/syntastic-extras diff --git a/sources_non_forked/syntastic/autoload/syntastic/util.vim b/sources_non_forked/syntastic/autoload/syntastic/util.vim index 90216946..deeb0f1f 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/util.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/util.vim @@ -37,8 +37,24 @@ function! syntastic#util#system(command) abort " {{{2 let $LC_MESSAGES = 'C' let $LC_ALL = '' + let crashed = 0 let cmd_start = reltime() - let out = system(a:command) + try + let out = system(a:command) + catch + let crashed = 1 + call syntastic#log#error('exception running system(' . string(a:command) . '): ' . v:exception) + if syntastic#util#isRunningWindows() + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP)) + else + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM)) + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR)) + endif + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, '$PATH = ' . string($PATH)) + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd())) + call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS) + let out = '' + endtry let cmd_time = split(reltimestr(reltime(cmd_start)))[0] let $LC_ALL = old_lc_all @@ -46,7 +62,7 @@ function! syntastic#util#system(command) abort " {{{2 let &shell = old_shell - if exists('g:_SYNTASTIC_DEBUG_TRACE') + if !crashed && exists('g:_SYNTASTIC_DEBUG_TRACE') call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'system: command run in ' . cmd_time . 's') endif diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index 1dff751e..d8fb584d 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -2009,7 +2009,7 @@ Security~ This checker executes the code in the files it checks: - https://github.com/scrooloose/syntastic/issues/1141 + https://github.com/vim-syntastic/syntastic/issues/1141 This is probably fine if you wrote the files yourself, but it can be a problem if you're trying to check third party files. If you are 100% willing to let @@ -2277,6 +2277,13 @@ Type: string Default: unset Additional arguments to pass to "cgc". +Note~ + +You probably also need a plugin to set |filetype| for OpenGL files, such as +"vim-glsl": + + https://github.com/tikhomirov/vim-glsl + ============================================================================== SYNTAX CHECKERS FOR GO *syntastic-checkers-go* @@ -2385,7 +2392,7 @@ Maintainer: Kamil Kisiel <kamil@kamilkisiel.net> See the tool's documentation for details: - https://godoc.org/golang.org/x/tools/cmd/vet + https://godoc.org/cmd/vet Note~ @@ -5123,7 +5130,7 @@ Security~ This checker executes the code in the files it checks: - https://github.com/scrooloose/syntastic/issues/1773 + https://github.com/vim-syntastic/syntastic/issues/1773 This is probably fine if you wrote the files yourself, but it can be a problem if you're trying to check third party files. If you are 100% willing to let @@ -6010,7 +6017,7 @@ Maintainer: LCD 47 <lcd047@gmail.com> "Stylint" is a linter for Stylus (http://learnboost.github.io/stylus). See the project's page at GitHub for details: - https://github.com/rossPatton/stylint + https://github.com/SimenB/stylint Checker options~ diff --git a/sources_non_forked/syntastic/doc/syntastic.txt b/sources_non_forked/syntastic/doc/syntastic.txt index ed47fb0b..db3e99e4 100644 --- a/sources_non_forked/syntastic/doc/syntastic.txt +++ b/sources_non_forked/syntastic/doc/syntastic.txt @@ -85,7 +85,7 @@ Take a look at the list of supported filetypes and checkers: |syntastic-checkers Note: This doc only deals with using syntastic. To learn how to write syntax checker integrations, see the guide on the GitHub wiki: - https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide + https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide ------------------------------------------------------------------------------ 1.1. Quick start *syntastic-quickstart* @@ -1196,7 +1196,7 @@ The core maintainers of syntastic are: Find the latest version of syntastic at: - http://github.com/scrooloose/syntastic + http://github.com/vim-syntastic/syntastic ============================================================================== 9. License *syntastic-license* diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 73563a67..2c8bdbad 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-3' +let g:_SYNTASTIC_VERSION = '3.8.0-10' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 @@ -126,7 +126,7 @@ endif " Debug {{{1 -let s:_DEBUG_DUMP_OPTIONS = [ +let g:_SYNTASTIC_SHELL_OPTIONS = [ \ 'shell', \ 'shellcmdflag', \ 'shellpipe', @@ -142,10 +142,10 @@ for s:feature in [ \ ] if exists('+' . s:feature) - call add(s:_DEBUG_DUMP_OPTIONS, s:feature) + call add(g:_SYNTASTIC_SHELL_OPTIONS, s:feature) endif endfor -lockvar! s:_DEBUG_DUMP_OPTIONS +lockvar! g:_SYNTASTIC_SHELL_OPTIONS " debug constants let g:_SYNTASTIC_DEBUG_TRACE = 1 @@ -231,7 +231,7 @@ function! SyntasticInfo(...) abort " {{{2 call s:modemap.modeInfo(a:000) call s:registry.echoInfoFor(a:000) call s:_explain_skip(a:000) - call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, s:_DEBUG_DUMP_OPTIONS) + call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS) call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES) endfunction " }}}2 @@ -382,7 +382,7 @@ endfunction " }}}2 "refresh and redraw all the error info for this buf when saving or reading function! s:UpdateErrors(buf, auto_invoked, checker_names) abort " {{{2 call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'version') - call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, s:_DEBUG_DUMP_OPTIONS) + call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS) call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'UpdateErrors' . (a:auto_invoked ? ' (auto)' : '') . \ ': ' . (len(a:checker_names) ? join(a:checker_names) : 'default checkers')) @@ -455,7 +455,12 @@ function! s:CacheErrors(buf, checker_names) abort " {{{2 if !s:_skip_file(a:buf) " debug logging {{{3 call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'aggregate_errors') - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM)) + if syntastic#util#isRunningWindows() + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP)) + else + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM)) + call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR)) + endif call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$PATH = ' . string($PATH)) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd())) " }}}3 diff --git a/sources_non_forked/syntastic/syntax_checkers/stylus/stylint.vim b/sources_non_forked/syntastic/syntax_checkers/stylus/stylint.vim index f489910e..b32b745e 100644 --- a/sources_non_forked/syntastic/syntax_checkers/stylus/stylint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/stylus/stylint.vim @@ -19,13 +19,25 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_stylus_stylint_GetLocList() dict + if !exists('s:stylint_new') + let s:stylint_new = syntastic#util#versionIsAtLeast(self.getVersion(), [1, 5, 7]) + endif + let makeprg = self.makeprgBuild({}) - let errorformat = - \ '%WWarning: %m,' . - \ '%EError: %m,' . - \ '%CFile: %f,' . - \ '%CLine: %l:%.%#' + if s:stylint_new + let errorformat = + \ '%P%f,' . + \ '%-Q,' . + \ '%\m%l:%c%\s%\+%t%\%%(rror%\|arning%\)%\s%\+%m%\s%\+%\S%\+%\s%#,' . + \ '%\m%l%\s%\+%t%\%%(rror%\|arning%\)%\s%\+%m%\s%\+%\S%\+%\s%#' + else + let errorformat = + \ '%WWarning: %m,' . + \ '%EError: %m,' . + \ '%CFile: %f,' . + \ '%CLine: %l:%.%#' + endif return SyntasticMake({ \ 'makeprg': makeprg, diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index 1f26ec3f..576dda19 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -2321,7 +2321,7 @@ function! s:Browse(bang,line1,count,...) abort if empty(url) && raw ==# '.' call s:throw("Instaweb failed to start") elseif empty(url) - call s:throw('"'.remote."' is not a supported remote") + call s:throw("'".remote."' is not a supported remote") endif let url = s:gsub(url, '[ <>]', '\="%".printf("%02X",char2nr(submatch(0)))') diff --git a/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md b/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md index 0adaff3c..467b1287 100644 --- a/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md +++ b/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md @@ -1,16 +1,14 @@ -### Actual behavior +### Behavior -Write here what's happening ... - -### Expected behavior - -Write here what you're expecting ... +Write here what's happening and what you're expecting instead of... ### Steps to reproduce: -Please create a reproducible case of your problem. Re produce it -with a minimal `vimrc` with all plugins disabled and only `vim-go` -enabled: +Please create a reproducible case of your problem. If this step is +not provided, the issue will be **closed** + +Re produce it with a minimal `vimrc` with all plugins disabled and +only `vim-go` enabled: 1. 2. @@ -22,7 +20,7 @@ Add here your current configuration and additional information that might be useful, such as: * `vimrc` you used to reproduce -* vim version: -* vim-go version -* go version +* vim version: +* vim-go version: +* go version: diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 3285648e..0a6be1cf 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -1,12 +1,123 @@ -## Unplanned +## 1.11 - Unplanned -* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. +FEATURES: + +* Add new `g:go_updatetime` setting to change the default updatetime (which was hardcoded previously) [gh-1055] +* Add new `g:go_template_use_pkg` setting to enable to use cwd as package name instead of basic template file [gh-1124] IMPROVEMENTS: -* Function calls are now highligted as wel when `g:go_highlight_functions` is enabled [gh-1048] -* Add completion support for uninported packages. This allows to complete even if the package is not improted [gh-1084] -* Tools that embeds GOROOT into their binaries do not work when people update their Go version and the GOROOT contains the vesion as part of their path (i.e: `/usr/local/Cellar/go/1.7.2/libexec`, [more info](https://blog.filippo.io/stale-goroot-and-gorebuild/)) . This is now fixed by introducing automatic GOROOT set/unset before each tool invoke. [gh-954] +* Add `statusline` support for `:GoMetaLinter` [gh-1120] +* Quickfix and Location lists contain now a descriptive title (requires at least Vim `7.4.2200`)[gh-1004] + +BUG FIXES: + +* Always use full path to detect packages to be shown in statusline [gh-1121] +* Use `echom` to persist errors in case of multiple echos [gh-1122] +* Fix a race condition where a quickfix window was not closed if a job has succeeded [gh-1123] +* Do not expand coverage arguments for non job execution of `:GoCoverage` [gh-1127] +* `:GoCoverage` doesn't mess up custom syntax anymore [gh-1128] +* Disable autoformat for `asm` files as they might be non Go ASM format [gh-1141] +* Fix indentation broken when using a action with a minus sign like `{{-` [gh-1143] +* Fix breaking Neovim change of passing less arguments to callbacks [gh-1145] +* Fix `guru` commands if custom build tags were set [gh-1136] +* Fix referencing a non defined variable for async commands when bang (!) was used +* Fix `:GoDef` failing for a modified buffer if `hidden` was not set [gh-1132] +* Fix `:GoDefStack` to allow popping from jump list when buffer is modified [gh-1133] + + +## 1.10 (November 24, 2016) + +FEATURES: + +* **Vim 8.0 support!** This is the initial version to add Vim 8.0 based support to + all basic commands (check out below for more information). With time we'll + going to extend it to other commands. All the features are only enabled if + you have at least Vim 8.0.0087. Backwards compatible with Vim 7.4.x. + If you see any problems, please open an issue. + +* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. +* `:GoBuild`, `:GoTest`, `:GoTestCompile`, `:GoInstall` commands are now fully + async. Async means it doesn't block your UI anymore. If the command finished + it echoes the status. For a better experience use the statusline information + (more info below) + +* `:GoCoverage` and `:GoCoverageBrowser` commands are fully async. +* `:GoDef` is fully async if `guru` is used as command. +* `:GoRename` is fully async . + +* `:GoMetaLinter` is fully asnyc. Also works with the current autosave linting + feature. As a reminder, to enable auto linting on save either call + `:GoMetaLinterAutoSaveToggle` (temporary) or add `let + g:go_metalinter_autosave = 1` (persistent) to your virmc). + +* All `guru` commands run asynchronously if Vim 8.0 is being used. Current + Commands: + * GoImplements + * GoWhicherrs + * GoCallees + * GoDescribe + * GoCallers + * GoCallstack + * GoFreevars + * GoChannelPeers + * GoReferrers + +* `:GoSameIds` also runs asynchronously. This makes it useful especially for + auto sameids mode. In this mode it constantly evaluates the identifier under the + cursor whenever it's in hold position and then calls :GoSameIds. As a + reminder, to enable auto info either call `:GoSameIdsAutoToggle`(temporary) + or add `let g:go_auto_sameids = 1` (persistent) to your vimrc. + +* `:GoInfo` is now non blocking and works in async mode if `guru` is used in + `g:go_info_mode`. This makes it useful especially for autoinfo mode. In this + mode it constantly evaluates the identifier under the cursor whenever it's in + hold position and then calls :GoInfo. As a reminder, to enable auto info + either call `:GoAutoTypeInfoToggle`(temporary) or add `let + g:go_auto_type_info = 1` (persistent) to your vimrc. To use `guru` instead of + `gocode` add following to your vimrc: `let g:go_info_mode = 'guru'` + + The `guru` is more accurate and reliabed due the usage of `guru` describe. It + doesn't rely on `pkg/` folder like `gocode` does. However it's slower than + `gocode` as there is no caching mechanism in `guru` yet. + +* **New**: Statusline function: `go#statusline#Show()` which can be plugged into + the statusline bar. Works only with vim 8.0. It shows all asynchronously + called functions status real time. Checkout it in action: + https://twitter.com/fatih/status/800473735467847680. To enable it add the + following to your `vimrc`. If you use lightline, airline, .. check out their + respective documentation on how to add a custom function: + +```viml +" go command status (requires vim-go) +set statusline+=%#goStatuslineColor# +set statusline+=%{go#statusline#Show()} +set statusline+=%* +``` + +IMPROVEMENTS: + +* **:GoDocBrowser** is now capable to to understand the identifier under the cursor (just like :GoDoc) +* Function calls are now highlighted as well when `g:go_highlight_functions` is enabled [gh-1048] +* Add completion support for un-imported packages. This allows to complete even + if the package is not imported. By default it's disabled, enable by adding + `let g:go_gocode_unimported_packages = 1` [gh-1084] +* Tools that embeds GOROOT into their binaries do not work when people update + their Go version and the GOROOT contains the vesion as part of their path + (i.e: `/usr/local/Cellar/go/1.7.2/libexec`, [more + info](https://blog.filippo.io/stale-goroot-and-gorebuild/)) . This is now + fixed by introducing automatic GOROOT set/unset before each tool invoke. + [gh-954] +* Added new setting `g:go_echo_go_info` to enable/disable printing identifier + information when completion is done [gh-1101] +* Added new `go_echo_command_info` setting is added, which is enabled by + default. It's just a switch for disabling messages of commands, such as + `:GoBuild`, `:GoTest`, etc.. Useful to *disable* if `go#statusline#Show()` is + being used in Statusline, to prevent to see duplicates notifications. +* goSameId highlighting is now linked to `Search`, which is much more clear as + it changes according to the users colorscheme +* Add plug mapping `(go-lint)` for :GoLint [gh-1089] + BUG FIXES: @@ -16,6 +127,17 @@ BUG FIXES: * Highlight nested structs correctly [gh-1075] * Highlight builtin functions correctly if `g:go_highlight_functions` is enabled [gh-1070] * Fix `:GoSameIds` highlighting if a new buffer is opened in the same window [gh-1067] +* Internal: add `abort` to all vim function to return in case of errors [gh-1100] +* Fix `:GoCoverage` to be executed if working dir is not inside the test dir [gh-1033] + +BACKWARDS INCOMPATIBILITIES: + +* remove vim-dispatch and vimproc.vim support. vim 8.0 has now the necessary + API to invoke async jobs and timers. Going forward we should use those. Also + this will remove the burden to maintain compatibility with those plugins. + +* `go#jobcontrol#Statusline()` is removed in favor of the new, global and + extensible `go#statusline#Show()` ## 1.9 (September 13, 2016) diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md index 1d886e90..504149b2 100644 --- a/sources_non_forked/vim-go/README.md +++ b/sources_non_forked/vim-go/README.md @@ -46,10 +46,8 @@ disabled/enabled easily. * Custom vim text objects such as `a function` or `inner function` list. * Jump to function or type declarations with `:GoDecls` or `:GoDeclsDir` -* A async launcher for the go command is implemented for Neovim, fully async - building and testing (beta). -* Integrated with the Neovim terminal, launch `:GoRun` and other go commands - in their own new terminal. (beta) +* Vim 8.0 support. Async execution for most commands, various underlying improvements. +* NeoVim support (beta). Async execution for some commands. * Alternate between implementation and test code with `:GoAlternate` Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial) @@ -237,9 +235,10 @@ let g:go_get_update = 0 ### Using with Neovim (beta) Note: Neovim currently is not a first class citizen for vim-go. You are free -to open bugs but I'm not going to look at them. Even though I'm using Neovim -myself, Neovim itself is still alpha. So vim-go might not work well as good as -in Vim. I'm happy to accept pull requests or very detailed bug reports. +to open bug, however I'm not using Neovim so it's hard for me to test it. +vim-go might not work well as good as in Vim. I'm happy to accept pull requests +or very detailed bug reports. If you're interested to improve the state of +Neovim in vim-go you're always welcome! Run `:GoRun` in a new tab, horizontal split or vertical split terminal diff --git a/sources_non_forked/vim-go/autoload/ctrlp/decls.vim b/sources_non_forked/vim-go/autoload/ctrlp/decls.vim index 7af2cda7..e1465adb 100644 --- a/sources_non_forked/vim-go/autoload/ctrlp/decls.vim +++ b/sources_non_forked/vim-go/autoload/ctrlp/decls.vim @@ -14,12 +14,12 @@ else let g:ctrlp_ext_vars = [s:go_decls_var] endif -function! ctrlp#decls#init() +function! ctrlp#decls#init() abort cal s:enable_syntax() return s:decls endfunction -function! ctrlp#decls#exit() +function! ctrlp#decls#exit() abort unlet! s:decls s:current_dir s:target endfunction @@ -28,7 +28,7 @@ endfunction " a:mode the mode that has been chosen by pressing <cr> <c-v> <c-t> or <c-x> " the values are 'e', 'v', 't' and 'h', respectively " a:str the selected string -function! ctrlp#decls#accept(mode, str) +function! ctrlp#decls#accept(mode, str) abort let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' let dir = getcwd() try @@ -56,7 +56,7 @@ function! ctrlp#decls#accept(mode, str) endtry endfunction -function! ctrlp#decls#enter() +function! ctrlp#decls#enter() abort let s:current_dir = fnameescape(expand('%:p:h')) let s:decls = [] @@ -130,7 +130,7 @@ function! ctrlp#decls#enter() endfor endfunc -function! s:enable_syntax() +function! s:enable_syntax() abort if !(has('syntax') && exists('g:syntax_on')) return endif @@ -148,7 +148,7 @@ endfunction let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) -function! ctrlp#decls#cmd(mode, ...) +function! ctrlp#decls#cmd(mode, ...) abort let s:mode = a:mode if a:0 && !empty(a:1) let s:target = a:1 diff --git a/sources_non_forked/vim-go/autoload/go/alternate.vim b/sources_non_forked/vim-go/autoload/go/alternate.vim index dc5643dc..f2cb210f 100644 --- a/sources_non_forked/vim-go/autoload/go/alternate.vim +++ b/sources_non_forked/vim-go/autoload/go/alternate.vim @@ -4,7 +4,7 @@ if !exists("g:go_alternate_mode") endif " Test alternates between the implementation of code and the test code. -function! go#alternate#Switch(bang, cmd) +function! go#alternate#Switch(bang, cmd) abort let file = expand('%') if empty(file) call go#util#EchoError("no buffer name") diff --git a/sources_non_forked/vim-go/autoload/go/asmfmt.vim b/sources_non_forked/vim-go/autoload/go/asmfmt.vim index b47651da..07779b57 100644 --- a/sources_non_forked/vim-go/autoload/go/asmfmt.vim +++ b/sources_non_forked/vim-go/autoload/go/asmfmt.vim @@ -11,7 +11,7 @@ " " Options: " -" g:go_asmfmt_autosave [default=1] +" g:go_asmfmt_autosave [default=0] " " Flag to automatically call :Fmt when file is saved. @@ -19,7 +19,7 @@ let s:got_fmt_error = 0 " This is a trimmed-down version of the logic in fmt.vim. -function! go#asmfmt#Format() +function! go#asmfmt#Format() abort " Save state. let l:curw = winsaveview() @@ -55,15 +55,15 @@ function! go#asmfmt#Format() call winrestview(l:curw) endfunction -function! go#asmfmt#ToggleAsmFmtAutoSave() - if get(g:, "go_asmfmt_autosave", 1) - let g:go_asmfmt_autosave = 0 - call go#util#EchoProgress("auto asmfmt disabled") +function! go#asmfmt#ToggleAsmFmtAutoSave() abort + if get(g:, "go_asmfmt_autosave", 0) + let g:go_asmfmt_autosave = 1 + call go#util#EchoProgress("auto asmfmt enabled") return end - let g:go_asmfmt_autosave = 1 - call go#util#EchoProgress("auto asmfmt enabled") + let g:go_asmfmt_autosave = 0 + call go#util#EchoProgress("auto asmfmt disabled") endfunction " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index 126ac807..e7a5daf7 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -1,19 +1,14 @@ -if !exists("g:go_dispatch_enabled") - let g:go_dispatch_enabled = 0 -endif - -function! go#cmd#autowrite() +function! go#cmd#autowrite() abort if &autowrite == 1 - silent wall + silent! wall endif endfunction - " Build builds the source code without producting any output binary. We live in " an editor so the best is to build it to catch errors and fix them. By " default it tries to call simply 'go build', but it first tries to get all " dependent files for the current folder and passes it to go build. -function! go#cmd#Build(bang, ...) +function! go#cmd#Build(bang, ...) abort " expand all wildcards(i.e: '%' to the current file name) let goargs = map(copy(a:000), "expand(v:val)") @@ -26,8 +21,18 @@ function! go#cmd#Build(bang, ...) " placeholder with the current folder (indicated with '.') let args = ["build"] + goargs + [".", "errors"] - " if we have nvim, call it asynchronously and return early ;) - if has('nvim') + if go#util#has_job() + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("building dispatched ...") + endif + + call s:cmd_job({ + \ 'cmd': ['go'] + args, + \ 'bang': a:bang, + \}) + return + elseif has('nvim') + " if we have nvim, call it asynchronously and return early ;) call go#util#EchoProgress("building dispatched ...") call go#jobcontrol#Spawn(a:bang, "build", args) return @@ -45,10 +50,7 @@ function! go#cmd#Build(bang, ...) let dir = getcwd() try execute cd . fnameescape(expand("%:p:h")) - if g:go_dispatch_enabled && exists(':Make') == 2 - call go#util#EchoProgress("building dispatched ...") - silent! exe 'Make' - elseif l:listtype == "locationlist" + if l:listtype == "locationlist" silent! exe 'lmake!' else silent! exe 'make!' @@ -60,11 +62,8 @@ function! go#cmd#Build(bang, ...) let errors = go#list#Get(l:listtype) call go#list#Window(l:listtype, len(errors)) - - if !empty(errors) - if !a:bang - call go#list#JumpToFirst(l:listtype) - endif + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) else call go#util#EchoSuccess("[build] SUCCESS") endif @@ -75,7 +74,7 @@ endfunction " Run runs the current file (and their dependencies if any) in a new terminal. -function! go#cmd#RunTerm(bang, mode, files) +function! go#cmd#RunTerm(bang, mode, files) abort if empty(a:files) let cmd = "go run ". go#util#Shelljoin(go#tool#Files()) else @@ -88,12 +87,18 @@ endfunction " This is intented to test small programs and play with them. It's not " suitable for long running apps, because vim is blocking by default and " calling long running apps will block the whole UI. -function! go#cmd#Run(bang, ...) +function! go#cmd#Run(bang, ...) abort if has('nvim') call go#cmd#RunTerm(a:bang, '', a:000) return endif + if go#util#has_job() + " NOTE(arslan): 'term': 'open' case is not implement for +jobs. This means + " executions waiting for stdin will not work. That's why we don't do + " anything. Once this is implemented we're going to make :GoRun async + endif + let old_gopath = $GOPATH let $GOPATH = go#path#Detect() @@ -119,9 +124,7 @@ function! go#cmd#Run(bang, ...) let l:listtype = go#list#Type("quickfix") - if g:go_dispatch_enabled && exists(':Make') == 2 - silent! exe 'Make' - elseif l:listtype == "locationlist" + if l:listtype == "locationlist" exe 'lmake!' else exe 'make!' @@ -130,7 +133,7 @@ function! go#cmd#Run(bang, ...) let items = go#list#Get(l:listtype) let errors = go#tool#FilterValids(items) - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, &makeprg) call go#list#Window(l:listtype, len(errors)) if !empty(errors) && !a:bang call go#list#JumpToFirst(l:listtype) @@ -141,9 +144,28 @@ function! go#cmd#Run(bang, ...) endfunction " Install installs the package by simple calling 'go install'. If any argument -" is given(which are passed directly to 'go install') it tries to install those -" packages. Errors are populated in the location window. -function! go#cmd#Install(bang, ...) +" is given(which are passed directly to 'go install') it tries to install +" those packages. Errors are populated in the location window. +function! go#cmd#Install(bang, ...) abort + " use vim's job functionality to call it asynchronously + if go#util#has_job() + " expand all wildcards(i.e: '%' to the current file name) + let goargs = map(copy(a:000), "expand(v:val)") + + " escape all shell arguments before we pass it to make + let goargs = go#util#Shelllist(goargs, 1) + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("installing dispatched ...") + endif + + call s:cmd_job({ + \ 'cmd': ['go', 'install'] + goargs, + \ 'bang': a:bang, + \}) + return + endif + let old_gopath = $GOPATH let $GOPATH = go#path#Detect() let default_makeprg = &makeprg @@ -159,10 +181,7 @@ function! go#cmd#Install(bang, ...) let dir = getcwd() try execute cd . fnameescape(expand("%:p:h")) - if g:go_dispatch_enabled && exists(':Make') == 2 - call go#util#EchoProgress("building dispatched ...") - silent! exe 'Make' - elseif l:listtype == "locationlist" + if l:listtype == "locationlist" silent! exe 'lmake!' else silent! exe 'make!' @@ -174,12 +193,10 @@ function! go#cmd#Install(bang, ...) let errors = go#list#Get(l:listtype) call go#list#Window(l:listtype, len(errors)) - if !empty(errors) - if !a:bang - call go#list#JumpToFirst(l:listtype) - endif + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) else - redraws! | echon "vim-go: " | echohl Function | echon "installed to ". $GOPATH | echohl None + call go#util#EchoSuccess("installed to ". $GOPATH) endif let $GOPATH = old_gopath @@ -189,7 +206,7 @@ endfunction " Test runs `go test` in the current directory. If compile is true, it'll " compile the tests instead of running them (useful to catch errors in the " test files). Any other argument is appendend to the final `go test` command -function! go#cmd#Test(bang, compile, ...) +function! go#cmd#Test(bang, compile, ...) abort let args = ["test"] " don't run the test, only compile it. Useful to capture and fix errors. @@ -199,9 +216,15 @@ function! go#cmd#Test(bang, compile, ...) endif if a:0 - " expand all wildcards(i.e: '%' to the current file name) - let goargs = map(copy(a:000), "expand(v:val)") - if !has('nvim') + let goargs = a:000 + + " do not expand for coverage mode as we're passing the arg ourself + if a:1 != '-coverprofile' + " expand all wildcards(i.e: '%' to the current file name) + let goargs = map(copy(a:000), "expand(v:val)") + endif + + if !(has('nvim') || go#util#has_job()) let goargs = go#util#Shelllist(goargs, 1) endif @@ -212,13 +235,29 @@ function! go#cmd#Test(bang, compile, ...) call add(args, printf("-timeout=%s", timeout)) endif - if a:compile - echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None - else - echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None + if get(g:, 'go_echo_command_info', 1) + if a:compile + echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None + else + echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None + endif endif - if has('nvim') + if go#util#has_job() + " use vim's job functionality to call it asynchronously + let job_args = { + \ 'cmd': ['go'] + args, + \ 'bang': a:bang, + \ } + + if a:compile + let job_args['custom_cb'] = function('s:test_compile', [compile_file]) + endif + + call s:cmd_job(job_args) + return + elseif has('nvim') + " use nvims's job functionality if get(g:, 'go_term_enabled', 0) let id = go#term#new(a:bang, ["go"] + args) else @@ -252,7 +291,7 @@ function! go#cmd#Test(bang, compile, ...) let errors = go#tool#ParseErrors(split(out, '\n')) let errors = go#tool#FilterValids(errors) - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, command) call go#list#Window(l:listtype, len(errors)) if !empty(errors) && !a:bang call go#list#JumpToFirst(l:listtype) @@ -276,7 +315,7 @@ endfunction " Testfunc runs a single test that surrounds the current cursor position. " Arguments are passed to the `go test` command. -function! go#cmd#TestFunc(bang, ...) +function! go#cmd#TestFunc(bang, ...) abort " search flags legend (used only) " 'b' search backward instead of forward " 'c' accept a match at the cursor position @@ -304,7 +343,7 @@ function! go#cmd#TestFunc(bang, ...) endfunction " Generate runs 'go generate' in similar fashion to go#cmd#Build() -function! go#cmd#Generate(bang, ...) +function! go#cmd#Generate(bang, ...) abort let default_makeprg = &makeprg let old_gopath = $GOPATH @@ -322,9 +361,7 @@ function! go#cmd#Generate(bang, ...) let l:listtype = go#list#Type("quickfix") echon "vim-go: " | echohl Identifier | echon "generating ..."| echohl None - if g:go_dispatch_enabled && exists(':Make') == 2 - silent! exe 'Make' - elseif l:listtype == "locationlist" + if l:listtype == "locationlist" silent! exe 'lmake!' else silent! exe 'make!' @@ -346,12 +383,79 @@ function! go#cmd#Generate(bang, ...) endfunction +" --------------------- +" | Vim job callbacks | +" --------------------- + +function s:cmd_job(args) abort + let status_dir = expand('%:p:h') + let started_at = reltime() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': a:args.cmd[1], + \ 'state': "started", + \}) + + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + function! s:error_info_cb(job, exit_status, data) closure abort + let status = { + \ 'desc': 'last status', + \ 'type': a:args.cmd[1], + \ 'state': "success", + \ } + + if a:exit_status + let status.state = "failed" + endif + + let elapsed_time = reltimestr(reltime(started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(status_dir, status) + endfunction + + let a:args.error_info_cb = function('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) + + let start_options = { + \ 'callback': callbacks.callback, + \ 'close_cb': callbacks.close_cb, + \ } + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " pre start + let dir = getcwd() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir + + call job_start(a:args.cmd, start_options) + + " post start + execute cd . fnameescape(dir) + let $GOPATH = old_gopath +endfunction + + +" test_compile is called when a GoTestCompile call is finished +function! s:test_compile(test_file, job, exit_status, data) abort + call delete(a:test_file) +endfunction + " ----------------------- " | Neovim job handlers | " ----------------------- let s:test_compile_handlers = {} -function! s:test_compile_handler(job, exit_status, data) +function! s:test_compile_handler(job, exit_status, data) abort if !has_key(s:test_compile_handlers, a:job.id) return endif diff --git a/sources_non_forked/vim-go/autoload/go/complete.vim b/sources_non_forked/vim-go/autoload/go/complete.vim index e65b008a..2663afbd 100644 --- a/sources_non_forked/vim-go/autoload/go/complete.vim +++ b/sources_non_forked/vim-go/autoload/go/complete.vim @@ -1,6 +1,6 @@ let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix' -function! s:gocodeCurrentBuffer() +function! s:gocodeCurrentBuffer() abort let buf = getline(1, '$') if &encoding != 'utf-8' let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")') @@ -16,7 +16,7 @@ function! s:gocodeCurrentBuffer() return file endfunction -function! s:gocodeCommand(cmd, preargs, args) +function! s:gocodeCommand(cmd, preargs, args) abort for i in range(0, len(a:args) - 1) let a:args[i] = go#util#Shellescape(a:args[i]) endfor @@ -59,12 +59,12 @@ function! s:gocodeCommand(cmd, preargs, args) endif endfunction -function! s:gocodeCurrentBufferOpt(filename) +function! s:gocodeCurrentBufferOpt(filename) abort return '-in=' . a:filename endfunction let s:optionsEnabled = 0 -function! s:gocodeEnableOptions() +function! s:gocodeEnableOptions() abort if s:optionsEnabled return endif @@ -78,14 +78,14 @@ function! s:gocodeEnableOptions() call go#util#System(printf('%s set propose-builtins %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_propose_builtins', 1)))) call go#util#System(printf('%s set autobuild %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_autobuild', 1)))) - call go#util#System(printf('%s set unimported-packages %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_unimported_packages', 1)))) + call go#util#System(printf('%s set unimported-packages %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_unimported_packages', 0)))) endfunction -function! s:toBool(val) +function! s:toBool(val) abort if a:val | return 'true ' | else | return 'false' | endif endfunction -function! s:gocodeAutocomplete() +function! s:gocodeAutocomplete() abort call s:gocodeEnableOptions() let filename = s:gocodeCurrentBuffer() @@ -96,7 +96,7 @@ function! s:gocodeAutocomplete() return result endfunction -function! go#complete#GetInfo() +function! go#complete#GetInfo() abort let offset = go#util#OffsetCursor()+1 let filename = s:gocodeCurrentBuffer() let result = s:gocodeCommand('autocomplete', @@ -137,7 +137,7 @@ function! go#complete#GetInfo() return "" endfunction -function! go#complete#Info(auto) +function! go#complete#Info(auto) abort " auto is true if we were called by g:go_auto_type_info's autocmd let result = go#complete#GetInfo() if !empty(result) @@ -147,12 +147,12 @@ function! go#complete#Info(auto) endif endfunction -function! s:trim_bracket(val) +function! s:trim_bracket(val) abort let a:val.word = substitute(a:val.word, '[(){}\[\]]\+$', '', '') return a:val endfunction -function! go#complete#Complete(findstart, base) +function! go#complete#Complete(findstart, base) abort "findstart = 1 when we need to get the text length if a:findstart == 1 execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete() @@ -167,7 +167,7 @@ function! go#complete#Complete(findstart, base) endif endf -function! go#complete#ToggleAutoTypeInfo() +function! go#complete#ToggleAutoTypeInfo() abort if get(g:, "go_auto_type_info", 0) let g:go_auto_type_info = 0 call go#util#EchoProgress("auto type info disabled") diff --git a/sources_non_forked/vim-go/autoload/go/coverage.vim b/sources_non_forked/vim-go/autoload/go/coverage.vim index f3d36c43..9b027861 100644 --- a/sources_non_forked/vim-go/autoload/go/coverage.vim +++ b/sources_non_forked/vim-go/autoload/go/coverage.vim @@ -3,7 +3,7 @@ let s:toggle = 0 " Buffer creates a new cover profile with 'go test -coverprofile' and changes " the current buffers highlighting to show covered and uncovered sections of " the code. If run again it clears the annotation. -function! go#coverage#BufferToggle(bang, ...) +function! go#coverage#BufferToggle(bang, ...) abort if s:toggle call go#coverage#Clear() return @@ -20,7 +20,7 @@ endfunction " teh current buffers highlighting to show covered and uncovered sections of " the code. Calling it again reruns the tests and shows the last updated " coverage. -function! go#coverage#Buffer(bang, ...) +function! go#coverage#Buffer(bang, ...) abort " we use matchaddpos() which was introduce with 7.4.330, be sure we have " it: http://ftp.vim.org/vim/patches/7.4/7.4.330 if !exists("*matchaddpos") @@ -43,8 +43,17 @@ function! go#coverage#Buffer(bang, ...) let s:toggle = 1 let l:tmpname = tempname() - let args = [a:bang, 0, "-coverprofile", l:tmpname] + if go#util#has_job() + call s:coverage_job({ + \ 'cmd': ['go', 'test', '-coverprofile', l:tmpname], + \ 'custom_cb': function('s:coverage_callback', [l:tmpname]), + \ 'bang': a:bang, + \ }) + return + endif + + let args = [a:bang, 0, "-coverprofile", l:tmpname] if a:0 call extend(args, a:000) endif @@ -75,11 +84,8 @@ function! go#coverage#Buffer(bang, ...) endfunction " Clear clears and resets the buffer annotation matches -function! go#coverage#Clear() - " only reset the syntax if the user has syntax enabled - if !empty(&syntax) - if exists("g:syntax_on") | syntax enable | endif - endif +function! go#coverage#Clear() abort + call clearmatches() if exists("s:toggle") | let s:toggle = 0 | endif @@ -87,25 +93,34 @@ function! go#coverage#Clear() if exists("#BufWinLeave#<buffer>") autocmd! BufWinLeave <buffer> endif - - call clearmatches() endfunction " Browser creates a new cover profile with 'go test -coverprofile' and opens " a new HTML coverage page from that profile in a new browser -function! go#coverage#Browser(bang, ...) +function! go#coverage#Browser(bang, ...) abort let l:tmpname = tempname() - let args = [a:bang, 0, "-coverprofile", l:tmpname] + if go#util#has_job() + call s:coverage_job({ + \ 'cmd': ['go', 'test', '-coverprofile', l:tmpname], + \ 'custom_cb': function('s:coverage_browser_callback', [l:tmpname]), + \ 'bang': a:bang, + \ }) + return + endif + let args = [a:bang, 0, "-coverprofile", l:tmpname] if a:0 call extend(args, a:000) endif + let id = call('go#cmd#Test', args) if has('nvim') call go#jobcontrol#AddHandler(function('s:coverage_browser_handler')) let s:coverage_browser_handler_jobs[id] = l:tmpname return endif + + if go#util#ShellError() == 0 let openHTML = 'go tool cover -html='.l:tmpname call go#tool#ExecuteInDir(openHTML) @@ -116,7 +131,7 @@ endfunction " Parses a single line from the cover file generated via go test -coverprofile " and returns a single coverage profile block. -function! go#coverage#parsegocoverline(line) +function! go#coverage#parsegocoverline(line) abort " file:startline.col,endline.col numstmt count let mx = '\([^:]\+\):\(\d\+\)\.\(\d\+\),\(\d\+\)\.\(\d\+\)\s\(\d\+\)\s\(\d\+\)' let tokens = matchlist(a:line, mx) @@ -133,7 +148,7 @@ endfunction " Generates matches to be added to matchaddpos for the given coverage profile " block -function! go#coverage#genmatch(cov) +function! go#coverage#genmatch(cov) abort let color = 'goCoverageCovered' if a:cov.cnt == 0 let color = 'goCoverageUncover' @@ -183,7 +198,7 @@ function! go#coverage#genmatch(cov) endfunction " Reads the given coverprofile file and annotates the current buffer -function! go#coverage#overlay(file) +function! go#coverage#overlay(file) abort if !filereadable(a:file) return endif @@ -204,7 +219,7 @@ function! go#coverage#overlay(file) let cnt += 1 endwhile - let fname = expand('%:t') + let fname = expand('%') " when called for a _test.go file, run the coverage for the actuall file " file @@ -221,6 +236,9 @@ function! go#coverage#overlay(file) exe ":edit ". fnamemodify(fname, ":p") endif + " cov.file includes only the filename itself, without full path + let fname = fnamemodify(fname, ":t") + for line in lines[1:] let cov = go#coverage#parsegocoverline(line) @@ -233,8 +251,6 @@ function! go#coverage#overlay(file) call extend(matches, go#coverage#genmatch(cov)) endfor - syntax manual - " clear the matches if we leave the buffer autocmd BufWinLeave <buffer> call go#coverage#Clear() @@ -244,6 +260,78 @@ function! go#coverage#overlay(file) endfunction +" --------------------- +" | Vim job callbacks | +" --------------------- +" +function s:coverage_job(args) + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let status_dir = expand('%:p:h') + function! s:error_info_cb(job, exit_status, data) closure + let status = { + \ 'desc': 'last status', + \ 'type': "coverage", + \ 'state': "finished", + \ } + + if a:exit_status + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + endfunction + + let a:args.error_info_cb = function('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) + + let start_options = { + \ 'callback': callbacks.callback, + \ 'close_cb': callbacks.close_cb, + \ } + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " pre start + let dir = getcwd() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "coverage", + \ 'state': "started", + \}) + + call job_start(a:args.cmd, start_options) + + " post start + execute cd . fnameescape(dir) + let $GOPATH = old_gopath +endfunction + +" coverage_callback is called when the coverage execution is finished +function! s:coverage_callback(coverfile, job, exit_status, data) + if a:exit_status == 0 + call go#coverage#overlay(a:coverfile) + endif + + call delete(a:coverfile) +endfunction + +function! s:coverage_browser_callback(coverfile, job, exit_status, data) + if a:exit_status == 0 + let openHTML = 'go tool cover -html='.a:coverfile + call go#tool#ExecuteInDir(openHTML) + endif + + call delete(a:coverfile) +endfunction + " ----------------------- " | Neovim job handlers | " ----------------------- @@ -251,7 +339,7 @@ endfunction let s:coverage_handler_jobs = {} let s:coverage_browser_handler_jobs = {} -function! s:coverage_handler(job, exit_status, data) +function! s:coverage_handler(job, exit_status, data) abort if !has_key(s:coverage_handler_jobs, a:job.id) return endif @@ -264,7 +352,7 @@ function! s:coverage_handler(job, exit_status, data) unlet s:coverage_handler_jobs[a:job.id] endfunction -function! s:coverage_browser_handler(job, exit_status, data) +function! s:coverage_browser_handler(job, exit_status, data) abort if !has_key(s:coverage_browser_handler_jobs, a:job.id) return endif @@ -279,4 +367,5 @@ function! s:coverage_browser_handler(job, exit_status, data) unlet s:coverage_browser_handler_jobs[a:job.id] endfunction + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim index 41464fe0..d3b51c26 100644 --- a/sources_non_forked/vim-go/autoload/go/def.vim +++ b/sources_non_forked/vim-go/autoload/go/def.vim @@ -1,7 +1,7 @@ let s:go_stack = [] let s:go_stack_level = 0 -function! go#def#Jump(mode) +function! go#def#Jump(mode) abort let old_gopath = $GOPATH let $GOPATH = go#path#Detect() @@ -27,42 +27,53 @@ function! go#def#Jump(mode) endif let command = printf("%s -f=%s -o=%s -t", bin_path, fname, go#util#OffsetCursor()) let out = go#util#System(command) - - " append the type information to the same line so our - " jump_to_declaration() function can parse it. This makes it - " compatible with guru definition as well too - let out = join(split(out, '\n'), ':') if exists("l:tmpname") call delete(l:tmpname) endif - elseif bin_name == 'guru' - let flags = "" - let in = "" - - if &modified - let sep = go#util#LineEnding() - let content = join(getline(1, '$'), sep) - let in = fname . "\n" . strlen(content) . "\n" . content - let flags .= " -modified" - endif - let bin_path = go#path#CheckBinPath("guru") if empty(bin_path) let $GOPATH = old_gopath return endif - if exists('g:go_guru_tags') - let tags = get(g:, 'go_guru_tags') - let flags .= printf(" -tags %s", tags) - endif - - let fname = shellescape(fname.':#'.go#util#OffsetCursor()) - let command = printf("%s %s definition %s", bin_path, flags, fname) + let cmd = [bin_path] + let stdin_content = "" if &modified - let out = go#util#System(command, in) + let sep = go#util#LineEnding() + let content = join(getline(1, '$'), sep) + let stdin_content = fname . "\n" . strlen(content) . "\n" . content + call add(cmd, "-modified") + endif + + if exists('g:go_guru_tags') + let tags = get(g:, 'go_guru_tags') + call extend(cmd, ["-tags", tags]) + endif + + let fname = fname.':#'.go#util#OffsetCursor() + call extend(cmd, ["definition", fname]) + + if go#util#has_job() + let l:spawn_args = { + \ 'cmd': cmd, + \ 'custom_cb': function('s:jump_to_declaration_cb', [a:mode, bin_name]), + \ } + + if &modified + let l:spawn_args.input = stdin_content + endif + + call go#util#EchoProgress("searching declaration ...") + + call s:def_job(spawn_args) + return + endif + + let command = join(cmd, " ") + if &modified + let out = go#util#System(command, stdin_content) else let out = go#util#System(command) endif @@ -76,13 +87,28 @@ function! go#def#Jump(mode) return endif - call s:jump_to_declaration(out, a:mode) + call s:jump_to_declaration(out, a:mode, bin_name) let $GOPATH = old_gopath endfunction -function! s:jump_to_declaration(out, mode) +function! s:jump_to_declaration_cb(mode, bin_name, job, exit_status, data) abort + if a:exit_status != 0 + return + endif + + call s:jump_to_declaration(a:data[0], a:mode, a:bin_name) +endfunction + +function! s:jump_to_declaration(out, mode, bin_name) abort + let final_out = a:out + if a:bin_name == "godef" + " append the type information to the same line so our we can parse it. + " This makes it compatible with guru output. + let final_out = join(split(a:out, '\n'), ':') + endif + " strip line ending - let out = split(a:out, go#util#LineEnding())[0] + let out = split(final_out, go#util#LineEnding())[0] if go#util#IsWin() let parts = split(out, '\(^[a-zA-Z]\)\@<!:') else @@ -120,19 +146,27 @@ function! s:jump_to_declaration(out, mode) if get(g:, 'go_def_reuse_buffer', 0) && bufloaded(filename) != 0 && bufwinnr(filename) != -1 " jumpt to existing buffer if it exists execute bufwinnr(filename) . 'wincmd w' - elseif a:mode == "tab" - let &switchbuf = "usetab" - if bufloaded(filename) == 0 - tab split + else + if &modified + let cmd = 'hide edit' + else + let cmd = 'edit' endif - elseif a:mode == "split" - split - elseif a:mode == "vsplit" - vsplit - endif - " open the file and jump to line and column - exec 'edit' filename + if a:mode == "tab" + let &switchbuf = "usetab" + if bufloaded(filename) == 0 + tab split + endif + elseif a:mode == "split" + split + elseif a:mode == "vsplit" + vsplit + endif + + " open the file and jump to line and column + exec cmd filename + endif endif call cursor(line, col) @@ -142,7 +176,7 @@ function! s:jump_to_declaration(out, mode) let &switchbuf = old_switchbuf endfunction -function! go#def#SelectStackEntry() +function! go#def#SelectStackEntry() abort let target_window = go#ui#GetReturnWindow() if empty(target_window) let target_window = winnr() @@ -157,7 +191,7 @@ function! go#def#SelectStackEntry() call go#ui#CloseWindow() endfunction -function! go#def#StackUI() +function! go#def#StackUI() abort if len(s:go_stack) == 0 call go#util#EchoError("godef stack empty") return @@ -192,12 +226,12 @@ function! go#def#StackUI() noremap <buffer> <silent> q :<C-U>call go#ui#CloseWindow()<CR> endfunction -function! go#def#StackClear(...) +function! go#def#StackClear(...) abort let s:go_stack = [] let s:go_stack_level = 0 endfunction -function! go#def#StackPop(...) +function! go#def#StackPop(...) abort if len(s:go_stack) == 0 call go#util#EchoError("godef stack empty") return @@ -218,7 +252,7 @@ function! go#def#StackPop(...) call go#def#Stack(newLevel + 1) endfunction -function! go#def#Stack(...) +function! go#def#Stack(...) abort if len(s:go_stack) == 0 call go#util#EchoError("godef stack empty") return @@ -246,7 +280,13 @@ function! go#def#Stack(...) let target = s:go_stack[s:go_stack_level] " jump - exec 'edit' target["file"] + if expand('%:p') != target["file"] + if &modified + exec 'hide edit' target["file"] + else + exec 'edit' target["file"] + endif + endif call cursor(target["line"], target["col"]) normal! zz else @@ -254,4 +294,27 @@ function! go#def#Stack(...) endif endfunction +function s:def_job(args) abort + function! s:error_info_cb(job, exit_status, data) closure + " do not print anything during async definition search&jump + endfunction + + let a:args.error_info_cb = function('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) + + let start_options = { + \ 'callback': callbacks.callback, + \ 'close_cb': callbacks.close_cb, + \ } + + if &modified + let l:tmpname = tempname() + call writefile(split(a:args.input, "\n"), l:tmpname, "b") + let l:start_options.in_io = "file" + let l:start_options.in_name = l:tmpname + endif + + call job_start(a:args.cmd, start_options) +endfunction + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/doc.vim b/sources_non_forked/vim-go/autoload/go/doc.vim index a65351f3..3756167d 100644 --- a/sources_non_forked/vim-go/autoload/go/doc.vim +++ b/sources_non_forked/vim-go/autoload/go/doc.vim @@ -12,57 +12,39 @@ if !exists("g:go_doc_options") let g:go_doc_options = "" endif -" returns the package and exported name. exported name might be empty. -" ie: fmt and Println -" ie: github.com/fatih/set and New -function! s:godocWord(args) - if !executable('godoc') - let msg = "godoc command not found." - let msg .= " install with: go get golang.org/x/tools/cmd/godoc" - call go#util#EchoWarning(msg) - return [] +function! go#doc#OpenBrowser(...) abort + " check if we have gogetdoc as it gives us more and accurate information. + " Only supported if we have json_decode as it's not worth to parse the plain + " non-json output of gogetdoc + let bin_path = go#path#CheckBinPath('gogetdoc') + if !empty(bin_path) && exists('*json_decode') + let json_out = s:gogetdoc(1) + if go#util#ShellError() != 0 + call go#util#EchoError(json_out) + return + endif + + let out = json_decode(json_out) + if type(out) != type({}) + call go#util#EchoError("gogetdoc output is malformed") + endif + + let import = out["import"] + let name = out["name"] + + " if import is empty, it means we selected a package name + if import ==# "" + let godoc_url = "https://godoc.org/" . name + else + let godoc_url = "https://godoc.org/" . import . "#" . name + endif + + echo godoc_url + + call go#tool#OpenBrowser(godoc_url) + return endif - if !len(a:args) - let oldiskeyword = &iskeyword - setlocal iskeyword+=. - let word = expand('<cword>') - let &iskeyword = oldiskeyword - let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g') - let words = split(word, '\.\ze[^./]\+$') - else - let words = a:args - endif - - if !len(words) - return [] - endif - - let pkg = words[0] - if len(words) == 1 - let exported_name = "" - else - let exported_name = words[1] - endif - - let packages = go#tool#Imports() - - if has_key(packages, pkg) - let pkg = packages[pkg] - endif - - return [pkg, exported_name] -endfunction - -function! s:godocNotFound(content) - if len(a:content) == 0 - return 1 - endif - - return a:content =~# '^.*: no such file or directory\n$' -endfunction - -function! go#doc#OpenBrowser(...) let pkgs = s:godocWord(a:000) if empty(pkgs) return @@ -76,7 +58,7 @@ function! go#doc#OpenBrowser(...) call go#tool#OpenBrowser(godoc_url) endfunction -function! go#doc#Open(newmode, mode, ...) +function! go#doc#Open(newmode, mode, ...) abort if len(a:000) " check if we have 'godoc' and use it automatically let bin_path = go#path#CheckBinPath('godoc') @@ -87,34 +69,7 @@ function! go#doc#Open(newmode, mode, ...) let command = printf("%s %s", bin_path, join(a:000, ' ')) let out = go#util#System(command) else - " check if we have 'gogetdoc' and use it automatically - let bin_path = go#path#CheckBinPath('gogetdoc') - if empty(bin_path) - return - endif - - let offset = go#util#OffsetCursor() - let fname = expand("%:p:gs!\\!/!") - let pos = shellescape(fname.':#'.offset) - let command = printf("%s -pos %s", bin_path, pos) - - if &modified - " gogetdoc supports the same archive format as guru for dealing with - " modified buffers. - " use the -modified flag - " write each archive entry on stdin as: - " filename followed by newline - " file size followed by newline - " file contents - let in = "" - let sep = go#util#LineEnding() - let content = join(getline(1, '$'), sep) - let in = fname . "\n" . strlen(content) . "\n" . content - let command .= " -modified" - let out = go#util#System(command, in) - else - let out = go#util#System(command) - endif + let out = s:gogetdoc(0) endif if go#util#ShellError() != 0 @@ -125,7 +80,7 @@ function! go#doc#Open(newmode, mode, ...) call s:GodocView(a:newmode, a:mode, out) endfunction -function! s:GodocView(newposition, position, content) +function! s:GodocView(newposition, position, content) abort " reuse existing buffer window if it exists otherwise create a new one if !bufexists(s:buf_nr) execute a:newposition @@ -169,4 +124,96 @@ function! s:GodocView(newposition, position, content) noremap <buffer> <silent> <Esc> :<C-U>close<CR> endfunction +function! s:gogetdoc(json) abort + " check if we have 'gogetdoc' and use it automatically + let bin_path = go#path#CheckBinPath('gogetdoc') + if empty(bin_path) + return -1 + endif + + let cmd = [bin_path] + + let offset = go#util#OffsetCursor() + let fname = expand("%:p:gs!\\!/!") + let pos = shellescape(fname.':#'.offset) + + let cmd += ["-pos", pos] + if a:json + let cmd += ["-json"] + endif + + let command = join(cmd, " ") + + if &modified + " gogetdoc supports the same archive format as guru for dealing with + " modified buffers. + " use the -modified flag + " write each archive entry on stdin as: + " filename followed by newline + " file size followed by newline + " file contents + let in = "" + let sep = go#util#LineEnding() + let content = join(getline(1, '$'), sep) + let in = fname . "\n" . strlen(content) . "\n" . content + let command .= " -modified" + let out = go#util#System(command, in) + else + let out = go#util#System(command) + endif + + return out +endfunction + +" returns the package and exported name. exported name might be empty. +" ie: fmt and Println +" ie: github.com/fatih/set and New +function! s:godocWord(args) abort + if !executable('godoc') + let msg = "godoc command not found." + let msg .= " install with: go get golang.org/x/tools/cmd/godoc" + call go#util#EchoWarning(msg) + return [] + endif + + if !len(a:args) + let oldiskeyword = &iskeyword + setlocal iskeyword+=. + let word = expand('<cword>') + let &iskeyword = oldiskeyword + let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g') + let words = split(word, '\.\ze[^./]\+$') + else + let words = a:args + endif + + if !len(words) + return [] + endif + + let pkg = words[0] + if len(words) == 1 + let exported_name = "" + else + let exported_name = words[1] + endif + + let packages = go#tool#Imports() + + if has_key(packages, pkg) + let pkg = packages[pkg] + endif + + return [pkg, exported_name] +endfunction + +function! s:godocNotFound(content) abort + if len(a:content) == 0 + return 1 + endif + + return a:content =~# '^.*: no such file or directory\n$' +endfunction + + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim index b55ba83d..391fca93 100644 --- a/sources_non_forked/vim-go/autoload/go/fmt.vim +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim @@ -51,7 +51,7 @@ endif " it doesn't undo changes and break undo history. If you are here reading " this and have VimL experience, please look at the function for " improvements, patches are welcome :) -function! go#fmt#Format(withGoimport) +function! go#fmt#Format(withGoimport) abort if g:go_fmt_experimental == 1 " Using winsaveview to save/restore cursor state has the problem of " closing folds on save: @@ -185,7 +185,7 @@ function! go#fmt#Format(withGoimport) % | " Couldn't detect gofmt error format, output errors endif if !empty(errors) - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, 'Format') echohl Error | echomsg "Gofmt returned error" | echohl None endif @@ -215,7 +215,7 @@ function! go#fmt#Format(withGoimport) endif endfunction -function! go#fmt#ToggleFmtAutoSave() +function! go#fmt#ToggleFmtAutoSave() abort if get(g:, "go_fmt_autosave", 1) let g:go_fmt_autosave = 0 call go#util#EchoProgress("auto fmt disabled") diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim index c1f7f193..78cacc0b 100644 --- a/sources_non_forked/vim-go/autoload/go/guru.vim +++ b/sources_non_forked/vim-go/autoload/go/guru.vim @@ -1,47 +1,63 @@ " guru.vim -- Vim integration for the Go guru. -func! s:RunGuru(mode, format, selected, needs_scope) range abort +" guru_cmd returns a dict that contains the command to execute guru. option +" is dict with following options: +" mode : guru mode, such as 'implements' +" format : output format, either 'plain' or 'json' +" needs_scope : if 1, adds the current package to the scope +" selected : if 1, means it's a range of selection, otherwise it picks up the +" offset under the cursor +" example output: +" {'cmd' : ['guru', '-json', 'implements', 'demo/demo.go:#66']} +function! s:guru_cmd(args) range abort + let mode = a:args.mode + let format = a:args.format + let needs_scope = a:args.needs_scope + let selected = a:args.selected + + let result = {} + let dirname = expand('%:p:h') + let pkg = go#package#ImportPath(dirname) + + " this is important, check it! + if pkg == -1 && needs_scope + return {'err': "current directory is not inside of a valid GOPATH"} + endif + "return with a warning if the binary doesn't exist let bin_path = go#path#CheckBinPath("guru") if empty(bin_path) return {'err': "bin path not found"} endif - let dirname = expand('%:p:h') - let pkg = go#package#ImportPath(dirname) - - " this is important, check it! - if pkg == -1 && a:needs_scope - return {'err': "current directory is not inside of a valid GOPATH"} - endif - - " start constructing the 'command' variable - let command = bin_path + " start constructing the command + let cmd = [bin_path] let filename = fnamemodify(expand("%"), ':p:gs?\\?/?') - let in = "" + let stdin_content = "" if &modified let sep = go#util#LineEnding() let content = join(getline(1, '$'), sep ) - let in = filename . "\n" . strlen(content) . "\n" . content - let command .= " -modified" + let result.stdin_content = filename . "\n" . strlen(content) . "\n" . content + call add(cmd, "-modified") endif " enable outputting in json format - if a:format == "json" - let command .= " -json" + if format == "json" + call add(cmd, "-json") endif " check for any tags if exists('g:go_guru_tags') let tags = get(g:, 'go_guru_tags') - let command .= printf(" -tags %s", tags) + call extend(cmd, ["-tags", tags]) + let result.tags = tags endif " some modes require scope to be defined (such as callers). For these we " choose a sensible setting, which is using the current file's package let scopes = [] - if a:needs_scope + if needs_scope let scopes = [pkg] endif @@ -66,274 +82,421 @@ func! s:RunGuru(mode, format, selected, needs_scope) range abort let scopes = go#util#StripTrailingSlash(scopes) " create shell-safe entries of the list - let scopes = go#util#Shelllist(scopes) + if !go#util#has_job() | let scopes = go#util#Shelllist(scopes) | endif " guru expect a comma-separated list of patterns, construct it let l:scope = join(scopes, ",") - let command .= printf(" -scope %s", l:scope) + let result.scope = l:scope + call extend(cmd, ["-scope", l:scope]) endif let pos = printf("#%s", go#util#OffsetCursor()) - if a:selected != -1 + if selected != -1 " means we have a range, get it let pos1 = go#util#Offset(line("'<"), col("'<")) let pos2 = go#util#Offset(line("'>"), col("'>")) let pos = printf("#%s,#%s", pos1, pos2) endif - " this is our final command let filename .= ':'.pos - let command .= printf(' %s %s', a:mode, shellescape(filename)) + call extend(cmd, [mode, filename]) + + let result.cmd = cmd + return result +endfunction + +" sync_guru runs guru in sync mode with the given arguments +function! s:sync_guru(args) abort + let result = s:guru_cmd(a:args) + if has_key(result, 'err') + call go#util#EchoError(result.err) + return -1 + endif + + if !has_key(a:args, 'disable_progress') + if a:args.needs_scope + call go#util#EchoProgress("analysing with scope ". result.scope . " ...") + elseif a:args.mode !=# 'what' + " the query might take time, let us give some feedback + call go#util#EchoProgress("analysing ...") + endif + endif let old_gopath = $GOPATH let $GOPATH = go#path#Detect() - if a:needs_scope - call go#util#EchoProgress("analysing with scope ". l:scope . " ...") - elseif a:mode !=# 'what' - " the query might take time, let us give some feedback - call go#util#EchoProgress("analysing ...") - endif - " run, forrest run!!! + let command = join(result.cmd, " ") if &modified - let out = go#util#System(command, in) + let out = go#util#System(command, result.stdin_content) else let out = go#util#System(command) endif let $GOPATH = old_gopath - if go#util#ShellError() != 0 - " the output contains the error message - return {'err' : out} + + if has_key(a:args, 'custom_parse') + call a:args.custom_parse(go#util#ShellError(), out) + else + call s:parse_guru_output(go#util#ShellError(), out, a:args.mode) endif - return {'out': out} + return out endfunc -" This uses Vim's errorformat to parse the output from Guru's 'plain output -" and put it into location list. I believe using errorformat is much more -" easier to use. If we need more power we can always switch back to parse it -" via regex. -func! s:loclistSecond(output) - " backup users errorformat, will be restored once we are finished - let old_errorformat = &errorformat - - " match two possible styles of errorformats: - " - " 'file:line.col-line2.col2: message' - " 'file:line:col: message' - " - " We discard line2 and col2 for the first errorformat, because it's not - " useful and location only has the ability to show one line and column - " number - let errformat = "%f:%l.%c-%[%^:]%#:\ %m,%f:%l:%c:\ %m" - call go#list#ParseFormat("locationlist", errformat, split(a:output, "\n")) - - let errors = go#list#Get("locationlist") - call go#list#Window("locationlist", len(errors)) -endfun - - -function! go#guru#Scope(...) - if a:0 - if a:0 == 1 && a:1 == '""' - unlet g:go_guru_scope - call go#util#EchoSuccess("guru scope is cleared") - else - let g:go_guru_scope = a:000 - call go#util#EchoSuccess("guru scope changed to: ". join(a:000, ",")) - endif - +" async_guru runs guru in async mode with the given arguments +function! s:async_guru(args) abort + let result = s:guru_cmd(a:args) + if has_key(result, 'err') + call go#util#EchoError(result.err) return endif - if !exists('g:go_guru_scope') - call go#util#EchoError("guru scope is not set") - else - call go#util#EchoSuccess("current guru scope: ". join(g:go_guru_scope, ",")) + let status_dir = expand('%:p:h') + let statusline_type = printf("%s", a:args.mode) + + if !has_key(a:args, 'disable_progress') + if a:args.needs_scope + call go#util#EchoProgress("analysing with scope ". result.scope . " ...") + endif endif + + function! s:close_cb(chan) closure + let messages = [] + while ch_status(a:chan, {'part': 'out'}) == 'buffered' + let msg = ch_read(a:chan, {'part': 'out'}) + call add(messages, msg) + endwhile + + while ch_status(a:chan, {'part': 'err'}) == 'buffered' + let msg = ch_read(a:chan, {'part': 'err'}) + call add(messages, msg) + endwhile + + let l:job = ch_getjob(a:chan) + let l:info = job_info(l:job) + + let out = join(messages, "\n") + + let status = { + \ 'desc': 'last status', + \ 'type': statusline_type, + \ 'state': "finished", + \ } + + if l:info.exitval + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + + if has_key(a:args, 'custom_parse') + call a:args.custom_parse(l:info.exitval, out) + else + call s:parse_guru_output(l:info.exitval, out, a:args.mode) + endif + endfunction + + let start_options = { + \ 'close_cb': function("s:close_cb"), + \ } + + if &modified + let l:tmpname = tempname() + call writefile(split(result.stdin_content, "\n"), l:tmpname, "b") + let l:start_options.in_io = "file" + let l:start_options.in_name = l:tmpname + endif + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': statusline_type, + \ 'state': "analysing", + \}) + + return job_start(result.cmd, start_options) +endfunc + +" run_guru runs the given guru argument +function! s:run_guru(args) abort + if go#util#has_job() + return s:async_guru(a:args) + endif + + return s:sync_guru(a:args) endfunction -function! go#guru#Tags(...) - if a:0 - if a:0 == 1 && a:1 == '""' - unlet g:go_guru_tags - call go#util#EchoSuccess("guru tags is cleared") - else - let g:go_guru_tags = a:1 - call go#util#EchoSuccess("guru tags changed to: ". a:1) - endif +" Show 'implements' relation for selected package +function! go#guru#Implements(selected) abort + let args = { + \ 'mode': 'implements', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } - return - endif - - if !exists('g:go_guru_tags') - call go#util#EchoSuccess("guru tags is not set") - else - call go#util#EchoSuccess("current guru tags: ". a:1) - endif + call s:run_guru(args) endfunction " Report the possible constants, global variables, and concrete types that may " appear in a value of type error -function! go#guru#Whicherrs(selected) - let out = s:RunGuru('whicherrs', 'plain', a:selected, 1) - if has_key(out, 'err') - call go#util#EchoError(out.err) - return - endif +function! go#guru#Whicherrs(selected) abort + let args = { + \ 'mode': 'whicherrs', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } - if empty(out.out) - call go#util#EchoSuccess("no error variables found. Try to change the scope with :GoGuruScope") - return - endif - call s:loclistSecond(out.out) -endfunction - -" Show 'implements' relation for selected package -function! go#guru#Implements(selected) - let out = s:RunGuru('implements', 'plain', a:selected, 1) - if has_key(out, 'err') - call go#util#EchoError(out.err) - return - endif - - call s:loclistSecond(out.out) + " TODO(arslan): handle empty case for both sync/async + " if empty(out.out) + " call go#util#EchoSuccess("no error variables found. Try to change the scope with :GoGuruScope") + " return + " endif + call s:run_guru(args) endfunction " Describe selected syntax: definition, methods, etc -function! go#guru#Describe(selected) - let out = s:RunGuru('describe', 'plain', a:selected, 0) - if has_key(out, 'err') - call go#util#EchoError(out.err) +function! go#guru#Describe(selected) abort + let args = { + \ 'mode': 'describe', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +function! go#guru#DescribeInfo() abort + " json_encode() and friends are introduced with this patch (7.4.1304) + " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ + " nvim: https://github.com/neovim/neovim/pull/4131 + if !exists("*json_decode") + call go#util#EchoError("requires 'json_decode'. Update your Vim/Neovim version.") return endif - call s:loclistSecond(out.out) + function! s:info(exit_val, output) + if a:exit_val != 0 + return + endif + + if a:output[0] !=# '{' + return + endif + + if empty(a:output) || type(a:output) != type("") + return + endif + + let result = json_decode(a:output) + if type(result) != type({}) + call go#util#EchoError(printf("malformed output from guru: %s", a:output)) + return + endif + + if !has_key(result, 'detail') + " if there is no detail check if there is a description and print it + if has_key(result, "desc") + call go#util#EchoInfo(result["desc"]) + return + endif + + call go#util#EchoError("detail key is missing. Please open a bug report on vim-go repo.") + return + endif + + let detail = result['detail'] + let info = "" + + " guru gives different information based on the detail mode. Let try to + " extract the most useful information + + if detail == "value" + if !has_key(result, 'value') + call go#util#EchoError("value key is missing. Please open a bug report on vim-go repo.") + return + endif + + let val = result["value"] + if !has_key(val, 'type') + call go#util#EchoError("type key is missing (value.type). Please open a bug report on vim-go repo.") + return + endif + + let info = val["type"] + elseif detail == "type" + if !has_key(result, 'type') + call go#util#EchoError("type key is missing. Please open a bug report on vim-go repo.") + return + endif + + let type = result["type"] + if !has_key(type, 'type') + call go#util#EchoError("type key is missing (type.type). Please open a bug report on vim-go repo.") + return + endif + + let info = type["type"] + elseif detail == "package" + if !has_key(result, 'package') + call go#util#EchoError("package key is missing. Please open a bug report on vim-go repo.") + return + endif + + let package = result["package"] + if !has_key(package, 'path') + call go#util#EchoError("path key is missing (package.path). Please open a bug report on vim-go repo.") + return + endif + + let info = printf("package %s", package["path"]) + elseif detail == "unknown" + let info = result["desc"] + else + call go#util#EchoError(printf("unknown detail mode found '%s'. Please open a bug report on vim-go repo", detail)) + return + endif + + call go#util#EchoInfo(info) + endfunction + + let args = { + \ 'mode': 'describe', + \ 'format': 'json', + \ 'selected': -1, + \ 'needs_scope': 1, + \ 'custom_parse': function('s:info'), + \ 'disable_progress': 1, + \ } + + call s:run_guru(args) endfunction " Show possible targets of selected function call -function! go#guru#Callees(selected) - let out = s:RunGuru('callees', 'plain', a:selected, 1) - if has_key(out, 'err') - call go#util#EchoError(out.err) - return - endif +function! go#guru#Callees(selected) abort + let args = { + \ 'mode': 'callees', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } - call s:loclistSecond(out.out) + call s:run_guru(args) endfunction " Show possible callers of selected function -function! go#guru#Callers(selected) - let out = s:RunGuru('callers', 'plain', a:selected, 1) - if has_key(out, 'err') - call go#util#EchoError(out.err) - return - endif +function! go#guru#Callers(selected) abort + let args = { + \ 'mode': 'callers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } - call s:loclistSecond(out.out) + call s:run_guru(args) endfunction " Show path from callgraph root to selected function -function! go#guru#Callstack(selected) - let out = s:RunGuru('callstack', 'plain', a:selected, 1) - if has_key(out, 'err') - call go#util#EchoError(out.err) - return - endif +function! go#guru#Callstack(selected) abort + let args = { + \ 'mode': 'callstack', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } - call s:loclistSecond(out.out) + call s:run_guru(args) endfunction " Show free variables of selection -function! go#guru#Freevars(selected) +function! go#guru#Freevars(selected) abort " Freevars requires a selection if a:selected == -1 call go#util#EchoError("GoFreevars requires a selection (range) of code") return endif - let out = s:RunGuru('freevars', 'plain', a:selected, 0) - if has_key(out, 'err') - call go#util#EchoError(out.err) - return - endif + let args = { + \ 'mode': 'freevars', + \ 'format': 'plain', + \ 'selected': 1, + \ 'needs_scope': 0, + \ } - call s:loclistSecond(out.out) + call s:run_guru(args) endfunction " Show send/receive corresponding to selected channel op -function! go#guru#ChannelPeers(selected) - let out = s:RunGuru('peers', 'plain', a:selected, 1) - if has_key(out, 'err') - call go#util#EchoError(out.err) - return - endif +function! go#guru#ChannelPeers(selected) abort + let args = { + \ 'mode': 'peers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } - call s:loclistSecond(out.out) + call s:run_guru(args) endfunction " Show all refs to entity denoted by selected identifier -function! go#guru#Referrers(selected) - let out = s:RunGuru('referrers', 'plain', a:selected, 0) - if has_key(out, 'err') - call go#util#EchoError(out.err) +function! go#guru#Referrers(selected) abort + let args = { + \ 'mode': 'referrers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 0, + \ } + + call s:run_guru(args) +endfunction + +function! go#guru#SameIdsTimer() abort + call timer_start(200, function('go#guru#SameIds'), {'repeat': -1}) +endfunction + +function! go#guru#SameIds() abort + " we use matchaddpos() which was introduce with 7.4.330, be sure we have + " it: http://ftp.vim.org/vim/patches/7.4/7.4.330 + if !exists("*matchaddpos") + call go#util#EchoError("GoSameIds requires 'matchaddpos'. Update your Vim/Neovim version.") return endif - call s:loclistSecond(out.out) -endfunction - -function! go#guru#What(selected) " json_encode() and friends are introduced with this patch (7.4.1304) " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ " nvim: https://github.com/neovim/neovim/pull/4131 if !exists("*json_decode") - return {'err': "GoWhat is not supported due old version of Vim/Neovim"} - endif - - let out = s:RunGuru('what', 'json', a:selected, 0) - if has_key(out, 'err') - return {'err': out.err} - endif - - let result = json_decode(out.out) - - if type(result) != type({}) - return {'err': "malformed output from guru"} - endif - - return result -endfunction - -function! go#guru#AutoToogleSameIds() - if get(g:, "go_auto_sameids", 0) - call go#util#EchoProgress("sameids auto highlighting disabled") - call go#guru#ClearSameIds() - let g:go_auto_sameids = 0 + call go#util#EchoError("GoSameIds requires 'json_decode'. Update your Vim/Neovim version.") return endif - call go#util#EchoSuccess("sameids auto highlighting enabled") - let g:go_auto_sameids = 1 + let args = { + \ 'mode': 'what', + \ 'format': 'json', + \ 'selected': -1, + \ 'needs_scope': 0, + \ 'custom_parse': function('s:same_ids_highlight'), + \ } + + call s:run_guru(args) endfunction -function! go#guru#SameIds(selected) - " we use matchaddpos() which was introduce with 7.4.330, be sure we have - " it: http://ftp.vim.org/vim/patches/7.4/7.4.330 - if !exists("*matchaddpos") - call go#util#EchoError("GoSameIds is supported with Vim version 7.4-330 or later") - return - endif - - let result = go#guru#What(a:selected) - +function! s:same_ids_highlight(exit_val, output) abort call go#guru#ClearSameIds() " run after calling guru to reduce flicker. - if has_key(result, 'err') && !get(g:, 'go_auto_sameids', 0) - " only echo if it's called via `:GoSameIds, but not if it's in automode - call go#util#EchoError(result.err) + + if a:output[0] !=# '{' + if !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError(a:output) + endif + return + endif + + let result = json_decode(a:output) + if type(result) != type({}) && !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError("malformed output from guru") return endif @@ -367,11 +530,11 @@ function! go#guru#SameIds(selected) if get(g:, "go_auto_sameids", 0) " re-apply SameIds at the current cursor position at the time the buffer " is redisplayed: e.g. :edit, :GoRename, etc. - autocmd BufWinEnter <buffer> nested call go#guru#SameIds(-1) + autocmd BufWinEnter <buffer> nested call go#guru#SameIds() endif endfunction -function! go#guru#ClearSameIds() +function! go#guru#ClearSameIds() abort let m = getmatches() for item in m if item['group'] == 'goSameId' @@ -385,11 +548,94 @@ function! go#guru#ClearSameIds() endif endfunction -function! go#guru#ToggleSameIds(selected) +function! go#guru#ToggleSameIds() abort if len(getmatches()) != 0 call go#guru#ClearSameIds() else - call go#guru#SameIds(a:selected) + call go#guru#SameIds() + endif +endfunction + +function! go#guru#AutoToogleSameIds() abort + if get(g:, "go_auto_sameids", 0) + call go#util#EchoProgress("sameids auto highlighting disabled") + call go#guru#ClearSameIds() + let g:go_auto_sameids = 0 + return + endif + + call go#util#EchoSuccess("sameids auto highlighting enabled") + let g:go_auto_sameids = 1 +endfunction + + +"""""""""""""""""""""""""""""""""""""""" +"" HELPER FUNCTIONS +"""""""""""""""""""""""""""""""""""""""" + +" This uses Vim's errorformat to parse the output from Guru's 'plain output +" and put it into location list. I believe using errorformat is much more +" easier to use. If we need more power we can always switch back to parse it +" via regex. Match two possible styles of errorformats: +" +" 'file:line.col-line2.col2: message' +" 'file:line:col: message' +" +" We discard line2 and col2 for the first errorformat, because it's not +" useful and location only has the ability to show one line and column +" number +function! s:parse_guru_output(exit_val, output, title) abort + if a:exit_val + call go#util#EchoError(a:output) + return + endif + + let old_errorformat = &errorformat + let errformat = "%f:%l.%c-%[%^:]%#:\ %m,%f:%l:%c:\ %m" + call go#list#ParseFormat("locationlist", errformat, a:output, a:title) + let &errorformat = old_errorformat + + let errors = go#list#Get("locationlist") + call go#list#Window("locationlist", len(errors)) +endfun + +function! go#guru#Scope(...) abort + if a:0 + if a:0 == 1 && a:1 == '""' + unlet g:go_guru_scope + call go#util#EchoSuccess("guru scope is cleared") + else + let g:go_guru_scope = a:000 + call go#util#EchoSuccess("guru scope changed to: ". join(a:000, ",")) + endif + + return + endif + + if !exists('g:go_guru_scope') + call go#util#EchoError("guru scope is not set") + else + call go#util#EchoSuccess("current guru scope: ". join(g:go_guru_scope, ",")) + endif +endfunction + +function! go#guru#Tags(...) abort + if a:0 + if a:0 == 1 && a:1 == '""' + unlet g:go_guru_tags + call go#util#EchoSuccess("guru tags is cleared") + else + let g:go_guru_tags = a:1 + call go#util#EchoSuccess("guru tags changed to: ". a:1) + endif + + return + endif + + if !exists('g:go_guru_tags') + call go#util#EchoSuccess("guru tags is not set") + else + call go#util#EchoSuccess("current guru tags: ". a:1) endif endfunction diff --git a/sources_non_forked/vim-go/autoload/go/impl.vim b/sources_non_forked/vim-go/autoload/go/impl.vim index fce4a29b..139dba75 100644 --- a/sources_non_forked/vim-go/autoload/go/impl.vim +++ b/sources_non_forked/vim-go/autoload/go/impl.vim @@ -1,4 +1,4 @@ -function! go#impl#Impl(...) +function! go#impl#Impl(...) abort let binpath = go#path#CheckBinPath('impl') if empty(binpath) return @@ -69,7 +69,7 @@ else endfunction endif -function! s:root_dirs() +function! s:root_dirs() abort let dirs = [] let root = go#util#goroot() if root !=# '' && isdirectory(root) @@ -88,7 +88,7 @@ function! s:root_dirs() return dirs endfunction -function! s:go_packages(dirs) +function! s:go_packages(dirs) abort let pkgs = [] for d in a:dirs let pkg_root = expand(d . '/pkg/' . go#util#osarch()) @@ -97,7 +97,7 @@ function! s:go_packages(dirs) return map(pkgs, "fnamemodify(v:val, ':t:r')") endfunction -function! s:interface_list(pkg) +function! s:interface_list(pkg) abort let contents = split(go#util#System('go doc ' . a:pkg), "\n") if go#util#ShellError() return [] @@ -108,7 +108,7 @@ function! s:interface_list(pkg) endfunction " Complete package and interface for {interface} -function! go#impl#Complete(arglead, cmdline, cursorpos) +function! go#impl#Complete(arglead, cmdline, cursorpos) abort let words = split(a:cmdline, '\s\+', 1) if words[-1] ==# '' return s:uniq(sort(s:go_packages(s:root_dirs()))) diff --git a/sources_non_forked/vim-go/autoload/go/import.vim b/sources_non_forked/vim-go/autoload/go/import.vim index 69658916..8d9e8d4c 100644 --- a/sources_non_forked/vim-go/autoload/go/import.vim +++ b/sources_non_forked/vim-go/autoload/go/import.vim @@ -4,7 +4,7 @@ " " Check out the docs for more information at /doc/vim-go.txt " -function! go#import#SwitchImport(enabled, localname, path, bang) +function! go#import#SwitchImport(enabled, localname, path, bang) abort let view = winsaveview() let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '') @@ -205,7 +205,7 @@ function! go#import#SwitchImport(enabled, localname, path, bang) endfunction -function! s:Error(s) +function! s:Error(s) abort echohl Error | echo a:s | echohl None endfunction diff --git a/sources_non_forked/vim-go/autoload/go/job.vim b/sources_non_forked/vim-go/autoload/go/job.vim new file mode 100644 index 00000000..e60b2b45 --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/job.vim @@ -0,0 +1,109 @@ +" Spawn returns callbacks to be used with job_start. It's abstracted to be +" used with various go command, such as build, test, install, etc.. This avoid +" us to write the same callback over and over for some commands. It's fully +" customizable so each command can change it to it's own logic. +function go#job#Spawn(args) + let cbs = { + \ 'winnr': winnr(), + \ 'dir': getcwd(), + \ 'jobdir': fnameescape(expand("%:p:h")), + \ 'messages': [], + \ 'args': a:args.cmd, + \ 'bang': 0, + \ } + + if has_key(a:args, 'bang') + let cbs.bang = a:args.bang + endif + + " add final callback to be called if async job is finished + " The signature should be in form: func(job, exit_status, messages) + if has_key(a:args, 'custom_cb') + let cbs.custom_cb = a:args.custom_cb + endif + + if has_key(a:args, 'error_info_cb') + let cbs.error_info_cb = a:args.error_info_cb + endif + + function cbs.callback(chan, msg) dict + call add(self.messages, a:msg) + endfunction + + function cbs.close_cb(chan) dict + let l:job = ch_getjob(a:chan) + let l:status = job_status(l:job) + + " the job might be in fail status, we assume by default it's failed. + " However if it's dead, we can use the real exitval + let exitval = 1 + if l:status == "dead" + let l:info = job_info(l:job) + let exitval = l:info.exitval + endif + + if has_key(self, 'custom_cb') + call self.custom_cb(l:job, exitval, self.messages) + endif + + if has_key(self, 'error_info_cb') + call self.error_info_cb(l:job, exitval, self.messages) + endif + + if get(g:, 'go_echo_command_info', 1) + if exitval == 0 + call go#util#EchoSuccess("SUCCESS") + else + call go#util#EchoError("FAILED") + endif + endif + + let l:listtype = go#list#Type("quickfix") + if exitval == 0 + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + return + endif + + call self.show_errors(l:listtype) + endfunction + + function cbs.show_errors(listtype) dict + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + try + execute cd self.jobdir + let errors = go#tool#ParseErrors(self.messages) + let errors = go#tool#FilterValids(errors) + finally + execute cd . fnameescape(self.dir) + endtry + + if !len(errors) + " failed to parse errors, output the original content + call go#util#EchoError(join(self.messages, " ")) + call go#util#EchoError(self.dir) + return + endif + + if self.winnr == winnr() + call go#list#Populate(a:listtype, errors, join(self.args)) + call go#list#Window(a:listtype, len(errors)) + if !empty(errors) && !self.bang + call go#list#JumpToFirst(a:listtype) + endif + endif + endfunction + + " override callback handler if user provided it + if has_key(a:args, 'callback') + let cbs.callback = a:args.callback + endif + + " override close callback handler if user provided it + if has_key(a:args, 'close_cb') + let cbs.close_cb = a:args.close_cb + endif + + return cbs +endfunction +" vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/jobcontrol.vim b/sources_non_forked/vim-go/autoload/go/jobcontrol.vim index e03c75d6..189ed5f4 100644 --- a/sources_non_forked/vim-go/autoload/go/jobcontrol.vim +++ b/sources_non_forked/vim-go/autoload/go/jobcontrol.vim @@ -9,7 +9,7 @@ let s:handlers = {} " Spawn is a wrapper around s:spawn. It can be executed by other files and " scripts if needed. Desc defines the description for printing the status " during the job execution (useful for statusline integration). -function! go#jobcontrol#Spawn(bang, desc, args) +function! go#jobcontrol#Spawn(bang, desc, args) abort " autowrite is not enabled for jobs call go#cmd#autowrite() @@ -17,31 +17,8 @@ function! go#jobcontrol#Spawn(bang, desc, args) return job.id endfunction -" Statusline returns the current status of the job -function! go#jobcontrol#Statusline() abort - if empty(s:jobs) - return '' - endif - - let import_path = go#package#ImportPath(expand('%:p:h')) - - for job in values(s:jobs) - if job.importpath != import_path - continue - endif - - if job.state == "SUCCESS" - return '' - endif - - return printf("%s ... [%s]", job.desc, job.state) - endfor - - return '' -endfunction - " AddHandler adds a on_exit callback handler and returns the id. -function! go#jobcontrol#AddHandler(handler) +function! go#jobcontrol#AddHandler(handler) abort let i = len(s:handlers) while has_key(s:handlers, string(i)) let i += 1 @@ -52,7 +29,7 @@ function! go#jobcontrol#AddHandler(handler) endfunction " RemoveHandler removes a callback handler by id. -function! go#jobcontrol#RemoveHandler(id) +function! go#jobcontrol#RemoveHandler(id) abort unlet s:handlers[a:id] endfunction @@ -60,10 +37,10 @@ endfunction " a job is started a reference will be stored inside s:jobs. spawn changes the " GOPATH when g:go_autodetect_gopath is enabled. The job is started inside the " current files folder. -function! s:spawn(bang, desc, args) - let job = { - \ 'desc': a:desc, - \ 'bang': a:bang, +function! s:spawn(bang, desc, args) abort + let job = { + \ 'desc': a:desc, + \ 'bang': a:bang, \ 'winnr': winnr(), \ 'importpath': go#package#ImportPath(expand('%:p:h')), \ 'state': "RUNNING", @@ -113,7 +90,7 @@ endfunction " references and also displaying errors in the quickfix window collected by " on_stderr handler. If there are no errors and a quickfix window is open, " it'll be closed. -function! s:on_exit(job_id, exit_status) +function! s:on_exit(job_id, exit_status, event) dict abort let std_combined = self.stderr + self.stdout let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' @@ -122,9 +99,10 @@ function! s:on_exit(job_id, exit_status) call s:callback_handlers_on_exit(s:jobs[a:job_id], a:exit_status, std_combined) + let l:listtype = go#list#Type("quickfix") if a:exit_status == 0 - call go#list#Clean(0) - call go#list#Window(0) + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) let self.state = "SUCCESS" call go#util#EchoSuccess("SUCCESS") @@ -149,8 +127,7 @@ function! s:on_exit(job_id, exit_status) " if we are still in the same windows show the list if self.winnr == winnr() - let l:listtype = "locationlist" - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, self.desc) call go#list#Window(l:listtype, len(errors)) if !empty(errors) && !self.bang call go#list#JumpToFirst(l:listtype) @@ -159,7 +136,7 @@ function! s:on_exit(job_id, exit_status) endfunction " callback_handlers_on_exit runs all handlers for job on exit event. -function! s:callback_handlers_on_exit(job, exit_status, data) +function! s:callback_handlers_on_exit(job, exit_status, data) abort if empty(s:handlers) return endif @@ -170,45 +147,15 @@ function! s:callback_handlers_on_exit(job, exit_status, data) endfunction " on_stdout is the stdout handler for jobstart(). It collects the output of -" stderr and stores them to the jobs internal stdout list. -function! s:on_stdout(job_id, data) +" stderr and stores them to the jobs internal stdout list. +function! s:on_stdout(job_id, data) dict abort call extend(self.stdout, a:data) endfunction " on_stderr is the stderr handler for jobstart(). It collects the output of " stderr and stores them to the jobs internal stderr list. -function! s:on_stderr(job_id, data) +function! s:on_stderr(job_id, data) dict abort call extend(self.stderr, a:data) endfunction -" abort_all aborts all current jobs created with s:spawn() -function! s:abort_all() - if empty(s:jobs) - return - endif - - for id in keys(s:jobs) - if id > 0 - silent! call jobstop(id) - endif - endfor - - let s:jobs = {} -endfunction - -" abort aborts the job with the given name, where name is the first argument -" passed to s:spawn() -function! s:abort(path) - if empty(s:jobs) - return - endif - - for job in values(s:jobs) - if job.importpath == path && job.id > 0 - silent! call jobstop(job.id) - unlet s:jobs['job.id'] - endif - endfor -endfunction - " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/lint.vim b/sources_non_forked/vim-go/autoload/go/lint.vim index 9b2a543a..d81072a1 100644 --- a/sources_non_forked/vim-go/autoload/go/lint.vim +++ b/sources_non_forked/vim-go/autoload/go/lint.vim @@ -29,37 +29,42 @@ function! go#lint#Gometa(autosave, ...) abort let goargs = go#util#Shelljoin(a:000) endif - let meta_command = "gometalinter --disable-all" + let bin_path = go#path#CheckBinPath("gometalinter") + if empty(bin_path) + return + endif + + let cmd = [bin_path] + let cmd += ["--disable-all"] + if a:autosave || empty(g:go_metalinter_command) - let bin_path = go#path#CheckBinPath("gometalinter") - if empty(bin_path) - return - endif - - if a:autosave - " include only messages for the active buffer - let meta_command .= " --include='^" . expand('%:p') . ".*$'" - endif - " linters let linters = a:autosave ? g:go_metalinter_autosave_enabled : g:go_metalinter_enabled for linter in linters - let meta_command .= " --enable=".linter + let cmd += ["--enable=".linter] endfor - " deadline - let meta_command .= " --deadline=" . g:go_metalinter_deadline - " path - let meta_command .= " " . goargs + let cmd += [expand('%:p:h')] else " the user wants something else, let us use it. - let meta_command = g:go_metalinter_command + let cmd += [split(g:go_metalinter_command, " ")] endif - " comment out the following two lines for debugging - " echo meta_command - " return + if go#util#has_job() && has('lambda') + call s:lint_job({'cmd': cmd}) + return + endif + + " we add deadline only for sync mode + let cmd += ["--deadline=" . g:go_metalinter_deadline] + if a:autosave + " include only messages for the active buffer + let cmd += ["--include='^" . expand('%:p') . ".*$'"] + endif + + + let meta_command = join(cmd, " ") let out = go#tool#ExecuteInDir(meta_command) @@ -77,7 +82,7 @@ function! go#lint#Gometa(autosave, ...) abort let errformat = "%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m" " Parse and populate our location list - call go#list#ParseFormat(l:listtype, errformat, split(out, "\n")) + call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'GoMetaLinter') let errors = go#list#Get(l:listtype) call go#list#Window(l:listtype, len(errors)) @@ -117,7 +122,7 @@ endfunction " Vet calls 'go vet' on the current directory. Any warnings are populated in " the location list -function! go#lint#Vet(bang, ...) +function! go#lint#Vet(bang, ...) abort call go#cmd#autowrite() echon "vim-go: " | echohl Identifier | echon "calling vet..." | echohl None if a:0 == 0 @@ -129,7 +134,7 @@ function! go#lint#Vet(bang, ...) let l:listtype = "quickfix" if go#util#ShellError() != 0 let errors = go#tool#ParseErrors(split(out, '\n')) - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, 'Vet') call go#list#Window(l:listtype, len(errors)) if !empty(errors) && !a:bang call go#list#JumpToFirst(l:listtype) @@ -171,7 +176,7 @@ function! go#lint#Errcheck(...) abort let errformat = "%f:%l:%c:\ %m, %f:%l:%c\ %#%m" " Parse and populate our location list - call go#list#ParseFormat(l:listtype, errformat, split(out, "\n")) + call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'Errcheck') let errors = go#list#Get(l:listtype) @@ -182,7 +187,7 @@ function! go#lint#Errcheck(...) abort endif if !empty(errors) - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, 'Errcheck') call go#list#Window(l:listtype, len(errors)) if !empty(errors) call go#list#JumpToFirst(l:listtype) @@ -196,7 +201,7 @@ function! go#lint#Errcheck(...) abort endfunction -function! go#lint#ToggleMetaLinterAutoSave() +function! go#lint#ToggleMetaLinterAutoSave() abort if get(g:, "go_metalinter_autosave", 0) let g:go_metalinter_autosave = 0 call go#util#EchoProgress("auto metalinter disabled") @@ -207,4 +212,88 @@ function! go#lint#ToggleMetaLinterAutoSave() call go#util#EchoProgress("auto metalinter enabled") endfunction +function s:lint_job(args) + let status_dir = expand('%:p:h') + let started_at = reltime() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "gometalinter", + \ 'state': "analysing", + \}) + + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let l:listtype = go#list#Type("quickfix") + let l:errformat = '%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m' + + function! s:callback(chan, msg) closure + let old_errorformat = &errorformat + let &errorformat = l:errformat + caddexpr a:msg + let &errorformat = old_errorformat + + " TODO(arslan): cursor still jumps to first error even If I don't want + " it. Seems like there is a regression somewhere, but not sure where. + copen + endfunction + + function! s:close_cb(chan) closure + let l:job = ch_getjob(a:chan) + let l:status = job_status(l:job) + + let exitval = 1 + if l:status == "dead" + let l:info = job_info(l:job) + let exitval = l:info.exitval + endif + + let status = { + \ 'desc': 'last status', + \ 'type': "gometaliner", + \ 'state': "finished", + \ } + + if exitval + let status.state = "failed" + endif + + let elapsed_time = reltimestr(reltime(started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(status_dir, status) + + let errors = go#list#Get(l:listtype) + if empty(errors) + call go#list#Window(l:listtype, len(errors)) + elseif has("patch-7.4.2200") + if l:listtype == 'quickfix' + call setqflist([], 'a', {'title': 'GoMetaLinter'}) + else + call setloclist(0, [], 'a', {'title': 'GoMetaLinter'}) + endif + endif + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoSuccess("linting finished") + endif + endfunction + + let start_options = { + \ 'callback': function("s:callback"), + \ 'close_cb': function("s:close_cb"), + \ } + + call job_start(a:args.cmd, start_options) + + call go#list#Clean(l:listtype) + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("linting started ...") + endif +endfunction + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/list.vim b/sources_non_forked/vim-go/autoload/go/list.vim index 6859a9f3..56d6115d 100644 --- a/sources_non_forked/vim-go/autoload/go/list.vim +++ b/sources_non_forked/vim-go/autoload/go/list.vim @@ -5,7 +5,7 @@ endif " Window opens the list with the given height up to 10 lines maximum. " Otherwise g:go_loclist_height is used. If no or zero height is given it " closes the window -function! go#list#Window(listtype, ...) +function! go#list#Window(listtype, ...) abort let l:listtype = go#list#Type(a:listtype) " we don't use lwindow to close the location list as we need also the " ability to resize the window. So, we are going to use lopen and lclose @@ -40,7 +40,7 @@ endfunction " Get returns the current list of items from the location list -function! go#list#Get(listtype) +function! go#list#Get(listtype) abort let l:listtype = go#list#Type(a:listtype) if l:listtype == "locationlist" return getloclist(0) @@ -50,22 +50,27 @@ function! go#list#Get(listtype) endfunction " Populate populate the location list with the given items -function! go#list#Populate(listtype, items) +function! go#list#Populate(listtype, items, title) abort let l:listtype = go#list#Type(a:listtype) if l:listtype == "locationlist" call setloclist(0, a:items, 'r') + + " The last argument ({what}) is introduced with 7.4.2200: + " https://github.com/vim/vim/commit/d823fa910cca43fec3c31c030ee908a14c272640 + if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif else call setqflist(a:items, 'r') + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif endif endfunction -function! go#list#PopulateWin(winnr, items) +function! go#list#PopulateWin(winnr, items) abort call setloclist(a:winnr, a:items, 'r') endfunction " Parse parses the given items based on the specified errorformat nad " populates the location list. -function! go#list#ParseFormat(listtype, errformat, items) +function! go#list#ParseFormat(listtype, errformat, items, title) abort let l:listtype = go#list#Type(a:listtype) " backup users errorformat, will be restored once we are finished let old_errorformat = &errorformat @@ -74,8 +79,10 @@ function! go#list#ParseFormat(listtype, errformat, items) let &errorformat = a:errformat if l:listtype == "locationlist" lgetexpr a:items + if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif else cgetexpr a:items + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif endif "restore back @@ -84,7 +91,7 @@ endfunction " Parse parses the given items based on the global errorformat and " populates the location list. -function! go#list#Parse(listtype, items) +function! go#list#Parse(listtype, items) abort let l:listtype = go#list#Type(a:listtype) if l:listtype == "locationlist" lgetexpr a:items @@ -94,7 +101,7 @@ function! go#list#Parse(listtype, items) endfunction " JumpToFirst jumps to the first item in the location list -function! go#list#JumpToFirst(listtype) +function! go#list#JumpToFirst(listtype) abort let l:listtype = go#list#Type(a:listtype) if l:listtype == "locationlist" ll 1 @@ -104,7 +111,7 @@ function! go#list#JumpToFirst(listtype) endfunction " Clean cleans the location list -function! go#list#Clean(listtype) +function! go#list#Clean(listtype) abort let l:listtype = go#list#Type(a:listtype) if l:listtype == "locationlist" lex [] @@ -113,7 +120,7 @@ function! go#list#Clean(listtype) endif endfunction -function! go#list#Type(listtype) +function! go#list#Type(listtype) abort if g:go_list_type == "locationlist" return "locationlist" elseif g:go_list_type == "quickfix" diff --git a/sources_non_forked/vim-go/autoload/go/package.vim b/sources_non_forked/vim-go/autoload/go/package.vim index e6f194ae..b12c7b71 100644 --- a/sources_non_forked/vim-go/autoload/go/package.vim +++ b/sources_non_forked/vim-go/autoload/go/package.vim @@ -28,7 +28,7 @@ if len(s:goarch) == 0 endif endif -function! go#package#Paths() +function! go#package#Paths() abort let dirs = [] if !exists("s:goroot") @@ -54,7 +54,7 @@ function! go#package#Paths() return dirs endfunction -function! go#package#ImportPath(arg) +function! go#package#ImportPath(arg) abort let path = fnamemodify(resolve(a:arg), ':p') let dirs = go#package#Paths() @@ -77,7 +77,7 @@ function! go#package#ImportPath(arg) endif endfunction -function! go#package#FromPath(arg) +function! go#package#FromPath(arg) abort let path = fnamemodify(resolve(a:arg), ':p') let dirs = go#package#Paths() @@ -99,7 +99,7 @@ function! go#package#FromPath(arg) endif endfunction -function! go#package#CompleteMembers(package, member) +function! go#package#CompleteMembers(package, member) abort silent! let content = go#util#System('godoc ' . a:package) if go#util#ShellError() || !len(content) return [] @@ -118,7 +118,7 @@ function! go#package#CompleteMembers(package, member) endtry endfunction -function! go#package#Complete(ArgLead, CmdLine, CursorPos) +function! go#package#Complete(ArgLead, CmdLine, CursorPos) abort let words = split(a:CmdLine, '\s\+', 1) " do not complete package members for these commands diff --git a/sources_non_forked/vim-go/autoload/go/path.vim b/sources_non_forked/vim-go/autoload/go/path.vim index 75c46616..a9b74e97 100644 --- a/sources_non_forked/vim-go/autoload/go/path.vim +++ b/sources_non_forked/vim-go/autoload/go/path.vim @@ -8,7 +8,7 @@ let s:initial_go_path = "" " echoes the current GOPATH, if an argument is passed it replaces the current " GOPATH with it. If two double quotes are passed (the empty string in go), " it'll clear the GOPATH and will restore to the initial GOPATH. -function! go#path#GoPath(...) +function! go#path#GoPath(...) abort " we have an argument, replace GOPATH if len(a:000) " clears the current manually set GOPATH and restores it to the @@ -35,7 +35,7 @@ endfunction " Default returns the default GOPATH. If there is a single GOPATH it returns " it. For multiple GOPATHS separated with a the OS specific separator, only " the first one is returned -function! go#path#Default() +function! go#path#Default() abort let go_paths = split($GOPATH, go#util#PathListSep()) if len(go_paths) == 1 @@ -47,7 +47,7 @@ endfunction " HasPath checks whether the given path exists in GOPATH environment variable " or not -function! go#path#HasPath(path) +function! go#path#HasPath(path) abort let go_paths = split($GOPATH, go#util#PathListSep()) let last_char = strlen(a:path) - 1 @@ -69,7 +69,7 @@ endfunction " Godeps, GB, it will modify the GOPATH so those directories take precedence " over the current GOPATH. It also detects diretories whose are outside " GOPATH. -function! go#path#Detect() +function! go#path#Detect() abort let gopath = $GOPATH " don't lookup for godeps if autodetect is disabled. @@ -115,7 +115,7 @@ endfunction " BinPath returns the binary path of installed go tools. -function! go#path#BinPath() +function! go#path#BinPath() abort let bin_path = "" " check if our global custom path is set, if not check if $GOBIN is set so @@ -135,7 +135,7 @@ endfunction " CheckBinPath checks whether the given binary exists or not and returns the " path of the binary. It returns an empty string doesn't exists. -function! go#path#CheckBinPath(binpath) +function! go#path#CheckBinPath(binpath) abort " remove whitespaces if user applied something like 'goimports ' let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '') " save off original path @@ -161,7 +161,7 @@ function! go#path#CheckBinPath(binpath) " just get the basename let basename = fnamemodify(binpath, ":t") if !executable(basename) - echo "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it." + echom "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it." " restore back! let $PATH = old_path return "" diff --git a/sources_non_forked/vim-go/autoload/go/play.vim b/sources_non_forked/vim-go/autoload/go/play.vim index 44cf3eca..ac5bba42 100644 --- a/sources_non_forked/vim-go/autoload/go/play.vim +++ b/sources_non_forked/vim-go/autoload/go/play.vim @@ -3,7 +3,7 @@ if !exists("g:go_play_open_browser") endif -function! go#play#Share(count, line1, line2) +function! go#play#Share(count, line1, line2) abort if !executable('curl') echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None return @@ -42,7 +42,7 @@ function! go#play#Share(count, line1, line2) endfunction -function! s:get_visual_content() +function! s:get_visual_content() abort let save_regcont = @" let save_regtype = getregtype('"') silent! normal! gvy @@ -55,7 +55,7 @@ endfunction " http://stackoverflow.com/questions/1533565/how-to-get-visually-selected-text-in-vimscript " another function that returns the content of visual selection, it's not used " but might be useful in the future -function! s:get_visual_selection() +function! s:get_visual_selection() abort let [lnum1, col1] = getpos("'<")[1:2] let [lnum2, col2] = getpos("'>")[1:2] @@ -72,7 +72,7 @@ endfunction " following two functions are from: https://github.com/mattn/gist-vim " thanks @mattn -function! s:get_browser_command() +function! s:get_browser_command() abort let go_play_browser_command = get(g:, 'go_play_browser_command', '') if go_play_browser_command == '' if has('win32') || has('win64') diff --git a/sources_non_forked/vim-go/autoload/go/rename.vim b/sources_non_forked/vim-go/autoload/go/rename.vim index d65256c5..df8047e1 100644 --- a/sources_non_forked/vim-go/autoload/go/rename.vim +++ b/sources_non_forked/vim-go/autoload/go/rename.vim @@ -6,22 +6,22 @@ if !exists("g:go_gorename_prefill") let g:go_gorename_prefill = 1 endif -function! go#rename#Rename(bang, ...) - let to = "" +function! go#rename#Rename(bang, ...) abort + let to_identifier = "" if a:0 == 0 let from = expand("<cword>") let ask = printf("vim-go: rename '%s' to: ", from) if g:go_gorename_prefill - let to = input(ask, from) + let to_identifier = input(ask, from) else - let to = input(ask) + let to_identifier = input(ask) endif redraw! - if empty(to) + if empty(to_identifier) return endif else - let to = a:1 + let to_identifier = a:1 endif "return with a warning if the bin doesn't exist @@ -32,10 +32,79 @@ function! go#rename#Rename(bang, ...) let fname = expand('%:p') let pos = go#util#OffsetCursor() - let cmd = printf('%s -offset %s -to %s', shellescape(bin_path), shellescape(printf('%s:#%d', fname, pos)), shellescape(to)) + let offset = printf('%s:#%d', fname, pos) - let out = go#tool#ExecuteInDir(cmd) + " no need to escape for job call + let bin_path = go#util#has_job() ? bin_path : shellescape(bin_path) + let offset = go#util#has_job() ? offset : shellescape(offset) + let to_identifier = go#util#has_job() ? to_identifier : shellescape(to_identifier) + let cmd = [bin_path, "-offset", offset, "-to", to_identifier] + + if go#util#has_job() + call go#util#EchoProgress(printf("renaming to '%s' ...", to_identifier)) + call s:rename_job({ + \ 'cmd': cmd, + \ 'bang': a:bang, + \}) + return + endif + + let command = join(cmd, " ") + let out = go#tool#ExecuteInDir(command) + + let splitted = split(out, '\n') + call s:parse_errors(go#util#ShellError(), a:bang, splitted) +endfunction + +function s:rename_job(args) + let messages = [] + function! s:callback(chan, msg) closure + call add(messages, a:msg) + endfunction + + let status_dir = expand('%:p:h') + + function! s:close_cb(chan) closure + let l:job = ch_getjob(a:chan) + let l:info = job_info(l:job) + + let status = { + \ 'desc': 'last status', + \ 'type': "gorename", + \ 'state': "finished", + \ } + + if l:info.exitval + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + + call s:parse_errors(l:info.exitval, a:args.bang, messages) + endfunction + + let start_options = { + \ 'callback': function("s:callback"), + \ 'close_cb': function("s:close_cb"), + \ } + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "gorename", + \ 'state': "started", + \}) + + call job_start(a:args.cmd, start_options) + + let $GOPATH = old_gopath +endfunction + +function s:parse_errors(exit_val, bang, out) " reload all files to reflect the new changes. We explicitly call " checktime to trigger a reload of all files. See " http://www.mail-archive.com/vim@vim.org/msg05900.html for more info @@ -45,28 +114,28 @@ function! go#rename#Rename(bang, ...) silent! checktime let &autoread = current_autoread - " strip out newline on the end that gorename puts. If we don't remove, it - " will trigger the 'Hit ENTER to continue' prompt - let clean = split(out, '\n') - let l:listtype = "quickfix" - if go#util#ShellError() != 0 - let errors = go#tool#ParseErrors(split(out, '\n')) - call go#list#Populate(l:listtype, errors) + if a:exit_val != 0 + call go#util#EchoError("FAILED") + let errors = go#tool#ParseErrors(a:out) + call go#list#Populate(l:listtype, errors, 'Rename') call go#list#Window(l:listtype, len(errors)) if !empty(errors) && !a:bang call go#list#JumpToFirst(l:listtype) elseif empty(errors) " failed to parse errors, output the original content - call go#util#EchoError(out) + call go#util#EchoError(join(a:out, "")) endif + return - else - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - redraw | echon "vim-go: " | echohl Function | echon clean[0] | echohl None endif + " strip out newline on the end that gorename puts. If we don't remove, it + " will trigger the 'Hit ENTER to continue' prompt + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + call go#util#EchoSuccess(a:out[0]) + " refresh the buffer so we can see the new content " TODO(arslan): also find all other buffers and refresh them too. For this " we need a way to get the list of changes from gorename upon an success diff --git a/sources_non_forked/vim-go/autoload/go/statusline.vim b/sources_non_forked/vim-go/autoload/go/statusline.vim new file mode 100644 index 00000000..c832797c --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/statusline.vim @@ -0,0 +1,112 @@ +" Statusline +"""""""""""""""""""""""""""""""" + +" s:statuses is a global reference to all statuses. It stores the statuses per +" import paths (map[string]status), where each status is unique per its +" type. Current status dict is in form: +" { +" 'desc' : 'Job description', +" 'state' : 'Job state, such as success, failure, etc..', +" 'type' : 'Job type, such as build, test, etc..' +" 'created_at' : 'Time it was created as seconds since 1st Jan 1970' +" } +let s:statuses = {} + +" timer_id for cleaner +let s:timer_id = 0 + +" last_status stores the last generated text per status +let s:last_status = "" + +" Show returns the current status of the job for 20 seconds (configurable). It +" displays it in form of 'desc: [type|state]' if there is any state available, +" if not it returns an empty string. This function should be plugged directly +" into the statusline. +function! go#statusline#Show() abort + " lazy initialiation of the cleaner + if !s:timer_id + " clean every 60 seconds all statuses + let interval = get(g:, 'go_statusline_duration', 60000) + let s:timer_id = timer_start(interval, function('go#statusline#Clear'), {'repeat': -1}) + endif + + " nothing to show + if empty(s:statuses) + return '' + endif + + let status_dir = expand('%:p:h') + + if !has_key(s:statuses, status_dir) + return '' + endif + + let status = s:statuses[status_dir] + if !has_key(status, 'desc') || !has_key(status, 'state') || !has_key(status, 'type') + return '' + endif + + let status_text = printf("[%s|%s]", status.type, status.state) + if empty(status_text) + return '' + endif + + " only update highlight if status has changed. + if status_text != s:last_status + if status.state =~ "success" || status.state =~ "finished" + hi goStatusLineColor cterm=bold ctermbg=76 ctermfg=22 + elseif status.state =~ "started" || status.state =~ "analysing" + hi goStatusLineColor cterm=bold ctermbg=208 ctermfg=88 + elseif status.state =~ "failed" + hi goStatusLineColor cterm=bold ctermbg=196 ctermfg=52 + endif + endif + + let s:last_status = status_text + return status_text +endfunction + +" Update updates (adds) the statusline for the given status_dir with the +" given status dict. It overrides any previously set status. +function! go#statusline#Update(status_dir, status) abort + let a:status.created_at = reltime() + let s:statuses[a:status_dir] = a:status + + " force to update the statusline, otherwise the user needs to move the + " cursor + exe 'let &ro = &ro' + + " before we stop the timer, check if we have any previous jobs to be cleaned + " up. Otherwise every job will reset the timer when this function is called + " and thus old jobs will never be cleaned + call go#statusline#Clear(0) + + " also reset the timer, so the user has time to see it in the statusline. + " Setting the timer_id to 0 will trigger a new cleaner routine. + call timer_stop(s:timer_id) + let s:timer_id = 0 +endfunction + +" Clear clears all currently stored statusline data. The timer_id argument is +" just a placeholder so we can pass it to a timer_start() function if needed. +function! go#statusline#Clear(timer_id) abort + for [status_dir, status] in items(s:statuses) + let elapsed_time = reltimestr(reltime(status.created_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + + if str2nr(elapsed_time) > 10 + call remove(s:statuses, status_dir) + endif + endfor + + if len(s:statuses) == 0 + let s:statuses = {} + endif + + " force to update the statusline, otherwise the user needs to move the + " cursor + exe 'let &ro = &ro' +endfunction + +" vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/template.vim b/sources_non_forked/vim-go/autoload/go/template.vim index 4b9e2713..0a92988f 100644 --- a/sources_non_forked/vim-go/autoload/go/template.vim +++ b/sources_non_forked/vim-go/autoload/go/template.vim @@ -1,6 +1,7 @@ let s:current_file = expand("<sfile>") -function! go#template#create() +function! go#template#create() abort + let l:go_template_use_pkg = get(g:, 'go_template_use_pkg', 0) let l:root_dir = fnamemodify(s:current_file, ':h:h:h') let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' @@ -10,12 +11,19 @@ function! go#template#create() let l:package_name = go#tool#PackageName() " if we can't figure out any package name(no Go files or non Go package - " files) from the directory create the template - if l:package_name == -1 + " files) from the directory create the template or use the cwd + " as the name + if l:package_name == -1 && l:go_template_use_pkg != 1 let l:template_file = get(g:, 'go_template_file', "hello_world.go") let l:template_path = go#util#Join(l:root_dir, "templates", l:template_file) exe '0r ' . fnameescape(l:template_path) $delete _ + elseif l:package_name == -1 && l:go_template_use_pkg == 1 + " cwd is now the dir of the package + let l:path = fnamemodify(getcwd(), ':t') + let l:content = printf("package %s", l:path) + call append(0, l:content) + $delete _ else let l:content = printf("package %s", l:package_name) call append(0, l:content) @@ -28,7 +36,7 @@ function! go#template#create() execute cd . fnameescape(dir) endfunction -function! go#template#ToggleAutoCreate() +function! go#template#ToggleAutoCreate() abort if get(g:, "go_template_autocreate", 1) let g:go_template_autocreate = 0 call go#util#EchoProgress("auto template create disabled") diff --git a/sources_non_forked/vim-go/autoload/go/term.vim b/sources_non_forked/vim-go/autoload/go/term.vim index 08947fa9..9404ca9e 100644 --- a/sources_non_forked/vim-go/autoload/go/term.vim +++ b/sources_non_forked/vim-go/autoload/go/term.vim @@ -7,12 +7,12 @@ let s:jobs = {} " new creates a new terminal with the given command. Mode is set based on the " global variable g:go_term_mode, which is by default set to :vsplit -function! go#term#new(bang, cmd) +function! go#term#new(bang, cmd) abort return go#term#newmode(a:bang, a:cmd, g:go_term_mode) endfunction " new creates a new terminal with the given command and window mode. -function! go#term#newmode(bang, cmd, mode) +function! go#term#newmode(bang, cmd, mode) abort let mode = a:mode if empty(mode) let mode = g:go_term_mode @@ -36,7 +36,7 @@ function! go#term#newmode(bang, cmd, mode) setlocal noswapfile setlocal nobuflisted - let job = { + let job = { \ 'stderr' : [], \ 'stdout' : [], \ 'bang' : a:bang, @@ -53,6 +53,7 @@ function! go#term#newmode(bang, cmd, mode) let $GOPATH = old_gopath let job.id = id + let job.cmd = a:cmd startinsert " resize new term if needed. @@ -74,7 +75,7 @@ function! go#term#newmode(bang, cmd, mode) return id endfunction -function! s:on_stdout(job_id, data) +function! s:on_stdout(job_id, data, event) dict abort if !has_key(s:jobs, a:job_id) return endif @@ -83,7 +84,7 @@ function! s:on_stdout(job_id, data) call extend(job.stdout, a:data) endfunction -function! s:on_stderr(job_id, data) +function! s:on_stderr(job_id, data, event) dict abort if !has_key(s:jobs, a:job_id) return endif @@ -92,7 +93,7 @@ function! s:on_stderr(job_id, data) call extend(job.stderr, a:data) endfunction -function! s:on_exit(job_id, exit_status) +function! s:on_exit(job_id, exit_status, event) dict abort if !has_key(s:jobs, a:job_id) return endif @@ -113,9 +114,9 @@ function! s:on_exit(job_id, exit_status) if !empty(errors) " close terminal we don't need it anymore - close + close - call go#list#Populate(l:listtype, errors) + call go#list#Populate(l:listtype, errors, job.cmd) call go#list#Window(l:listtype, len(errors)) if !self.bang call go#list#JumpToFirst(l:listtype) diff --git a/sources_non_forked/vim-go/autoload/go/textobj.vim b/sources_non_forked/vim-go/autoload/go/textobj.vim index 53dfacd4..be0c7718 100644 --- a/sources_non_forked/vim-go/autoload/go/textobj.vim +++ b/sources_non_forked/vim-go/autoload/go/textobj.vim @@ -13,7 +13,7 @@ endif " < > " t for tag -function! go#textobj#Function(mode) +function! go#textobj#Function(mode) abort let offset = go#util#OffsetCursor() let fname = shellescape(expand("%:p")) @@ -84,7 +84,7 @@ function! go#textobj#Function(mode) call cursor(info.rbrace.line-1, 1) endfunction -function! go#textobj#FunctionJump(mode, direction) +function! go#textobj#FunctionJump(mode, direction) abort " get count of the motion. This should be done before all the normal " expressions below as those reset this value(because they have zero " count!). We abstract -1 because the index starts from 0 in motion. diff --git a/sources_non_forked/vim-go/autoload/go/tool.vim b/sources_non_forked/vim-go/autoload/go/tool.vim index fe7f2575..7b7e1af2 100644 --- a/sources_non_forked/vim-go/autoload/go/tool.vim +++ b/sources_non_forked/vim-go/autoload/go/tool.vim @@ -1,4 +1,4 @@ -function! go#tool#Files() +function! go#tool#Files() abort if go#util#IsWin() let format = '{{range $f := .GoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}' else @@ -9,7 +9,7 @@ function! go#tool#Files() return split(out, '\n') endfunction -function! go#tool#Deps() +function! go#tool#Deps() abort if go#util#IsWin() let format = '{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}' else @@ -20,7 +20,7 @@ function! go#tool#Deps() return split(out, '\n') endfunction -function! go#tool#Imports() +function! go#tool#Imports() abort let imports = {} if go#util#IsWin() let format = '{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}' @@ -43,7 +43,18 @@ function! go#tool#Imports() return imports endfunction -function! go#tool#PackageName() +function! go#tool#Info(auto) abort + let l:mode = get(g:, 'go_info_mode', 'gocode') + if l:mode == 'gocode' + call go#complete#Info(a:auto) + elseif l:mode == 'guru' + call go#guru#DescribeInfo() + else + call go#util#EchoError('go_info_mode value: '. l:mode .' is not valid. Valid values are: [gocode, guru]') + endif +endfunction + +function! go#tool#PackageName() abort let command = "go list -f \"{{.Name}}\"" let out = go#tool#ExecuteInDir(command) if go#util#ShellError() != 0 @@ -53,7 +64,7 @@ function! go#tool#PackageName() return split(out, '\n')[0] endfunction -function! go#tool#ParseErrors(lines) +function! go#tool#ParseErrors(lines) abort let errors = [] for line in a:lines @@ -85,7 +96,7 @@ endfunction "FilterValids filters the given items with only items that have a valid "filename. Any non valid filename is filtered out. -function! go#tool#FilterValids(items) +function! go#tool#FilterValids(items) abort " Remove any nonvalid filename from the location list to avoid opening an " empty buffer. See https://github.com/fatih/vim-go/issues/287 for " details. @@ -141,7 +152,7 @@ endfunction " Exists checks whether the given importpath exists or not. It returns 0 if " the importpath exists under GOPATH. -function! go#tool#Exists(importpath) +function! go#tool#Exists(importpath) abort let command = "go list ". a:importpath let out = go#tool#ExecuteInDir(command) @@ -155,7 +166,7 @@ endfunction " following two functions are from: https://github.com/mattn/gist-vim " thanks @mattn -function! s:get_browser_command() +function! s:get_browser_command() abort let go_play_browser_command = get(g:, 'go_play_browser_command', '') if go_play_browser_command == '' if go#util#IsWin() @@ -173,7 +184,7 @@ function! s:get_browser_command() return go_play_browser_command endfunction -function! go#tool#OpenBrowser(url) +function! go#tool#OpenBrowser(url) abort let cmd = s:get_browser_command() if len(cmd) == 0 redraw diff --git a/sources_non_forked/vim-go/autoload/go/ui.vim b/sources_non_forked/vim-go/autoload/go/ui.vim index ad8b517b..3f612576 100644 --- a/sources_non_forked/vim-go/autoload/go/ui.vim +++ b/sources_non_forked/vim-go/autoload/go/ui.vim @@ -1,7 +1,7 @@ let s:buf_nr = -1 "OpenWindow opens a new scratch window and put's the content into the window -function! go#ui#OpenWindow(title, content, filetype) +function! go#ui#OpenWindow(title, content, filetype) abort " Ensure there's only one return window in this session/tabpage call go#util#Windo("unlet! w:vim_go_return_window") " Mark the window we're leaving as such @@ -54,7 +54,7 @@ function! go#ui#OpenWindow(title, content, filetype) echon endfunction -function! go#ui#GetReturnWindow() +function! go#ui#GetReturnWindow() abort for l:wn in range(1, winnr("$")) if !empty(getwinvar(l:wn, "vim_go_return_window")) return l:wn @@ -63,7 +63,7 @@ function! go#ui#GetReturnWindow() endfunction " CloseWindow closes the current window -function! go#ui#CloseWindow() +function! go#ui#CloseWindow() abort " Close any window associated with the ui buffer, if it's there if bufexists(s:buf_nr) let ui_window_number = bufwinnr(s:buf_nr) @@ -82,7 +82,7 @@ endfunction " OpenDefinition parses the current line and jumps to it by openening a new " tab -function! go#ui#OpenDefinition(filter) +function! go#ui#OpenDefinition(filter) abort let curline = getline('.') " don't touch our first line or any blank line diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim index 8792e230..aaf7273d 100644 --- a/sources_non_forked/vim-go/autoload/go/util.vim +++ b/sources_non_forked/vim-go/autoload/go/util.vim @@ -1,5 +1,5 @@ " PathSep returns the appropriate OS specific path separator. -function! go#util#PathSep() +function! go#util#PathSep() abort if go#util#IsWin() return '\' endif @@ -7,7 +7,7 @@ function! go#util#PathSep() endfunction " PathListSep returns the appropriate OS specific path list separator. -function! go#util#PathListSep() +function! go#util#PathListSep() abort if go#util#IsWin() return ";" endif @@ -15,7 +15,7 @@ function! go#util#PathListSep() endfunction " LineEnding returns the correct line ending, based on the current fileformat -function! go#util#LineEnding() +function! go#util#LineEnding() abort if &fileformat == 'dos' return "\r\n" elseif &fileformat == 'mac' @@ -27,12 +27,12 @@ endfunction " Join joins any number of path elements into a single path, adding a " Separator if necessary and returns the result -function! go#util#Join(...) +function! go#util#Join(...) abort return join(a:000, go#util#PathSep()) endfunction " IsWin returns 1 if current OS is Windows or 0 otherwise -function! go#util#IsWin() +function! go#util#IsWin() abort let win = ['win16', 'win32', 'win64', 'win95'] for w in win if (has(w)) @@ -43,12 +43,18 @@ function! go#util#IsWin() return 0 endfunction +function! go#util#has_job() abort + " job was introduced in 7.4.xxx however there are multiple bug fixes and one + " of the latest is 8.0.0087 which is required for a stable async API. + return has('job') && has("patch-8.0.0087") +endfunction + let s:env_cache = {} " env returns the go environment variable for the given key. Where key can be " GOARCH, GOOS, GOROOT, etc... It caches the result and returns the cached " version. -function! go#util#env(key) +function! go#util#env(key) abort let l:key = tolower(a:key) if has_key(s:env_cache, l:key) return s:env_cache[l:key] @@ -68,81 +74,49 @@ function! go#util#env(key) return l:var endfunction -function! go#util#goarch() +function! go#util#goarch() abort return substitute(go#util#System('go env GOARCH'), '\n', '', 'g') endfunction -function! go#util#goos() +function! go#util#goos() abort return substitute(go#util#System('go env GOOS'), '\n', '', 'g') endfunction -function! go#util#goroot() +function! go#util#goroot() abort return substitute(go#util#System('go env GOROOT'), '\n', '', 'g') endfunction -function! go#util#gopath() +function! go#util#gopath() abort return substitute(go#util#System('go env GOPATH'), '\n', '', 'g') endfunction -function! go#util#osarch() +function! go#util#osarch() abort return go#util#goos() . '_' . go#util#goarch() endfunction -"Check if has vimproc -function! s:has_vimproc() - if !exists('g:go#use_vimproc') - if go#util#IsWin() - try - call vimproc#version() - let exists_vimproc = 1 - catch - let exists_vimproc = 0 - endtry - else - let exists_vimproc = 0 - endif - - let g:go#use_vimproc = exists_vimproc - endif - - return g:go#use_vimproc -endfunction - -if s:has_vimproc() - let s:vim_system = get(g:, 'gocomplete#system_function', 'vimproc#system2') - let s:vim_shell_error = get(g:, 'gocomplete#shell_error_function', 'vimproc#get_last_status') -else - let s:vim_system = get(g:, 'gocomplete#system_function', 'system') - let s:vim_shell_error = '' -endif - " System runs a shell command. It will reset the shell to /bin/sh for Unix-like " systems if it is executable. -function! go#util#System(str, ...) +function! go#util#System(str, ...) abort let l:shell = &shell if !go#util#IsWin() && executable('/bin/sh') let &shell = '/bin/sh' endif try - let l:output = call(s:vim_system, [a:str] + a:000) + let l:output = call('system', [a:str] + a:000) return l:output finally let &shell = l:shell endtry endfunction -function! go#util#ShellError() - if empty(s:vim_shell_error) - return v:shell_error - endif - return call(s:vim_shell_error, []) +function! go#util#ShellError() abort + return v:shell_error endfunction - " StripPath strips the path's last character if it's a path separator. " example: '/foo/bar/' -> '/foo/bar' -function! go#util#StripPathSep(path) +function! go#util#StripPathSep(path) abort let last_char = strlen(a:path) - 1 if a:path[last_char] == go#util#PathSep() return strpart(a:path, 0, last_char) @@ -153,13 +127,13 @@ endfunction " StripTrailingSlash strips the trailing slash from the given path list. " example: ['/foo/bar/'] -> ['/foo/bar'] -function! go#util#StripTrailingSlash(paths) +function! go#util#StripTrailingSlash(paths) abort return map(copy(a:paths), 'go#util#StripPathSep(v:val)') endfunction " Shelljoin returns a shell-safe string representation of arglist. The " {special} argument of shellescape() may optionally be passed. -function! go#util#Shelljoin(arglist, ...) +function! go#util#Shelljoin(arglist, ...) abort try let ssl_save = &shellslash set noshellslash @@ -174,9 +148,6 @@ function! go#util#Shelljoin(arglist, ...) endfunction fu! go#util#Shellescape(arg) - if s:has_vimproc() - return vimproc#shellescape(a:arg) - endif try let ssl_save = &shellslash set noshellslash @@ -188,7 +159,7 @@ endf " Shelllist returns a shell-safe representation of the items in the given " arglist. The {special} argument of shellescape() may optionally be passed. -function! go#util#Shelllist(arglist, ...) +function! go#util#Shelllist(arglist, ...) abort try let ssl_save = &shellslash set noshellslash @@ -202,7 +173,7 @@ function! go#util#Shelllist(arglist, ...) endfunction " Returns the byte offset for line and column -function! go#util#Offset(line, col) +function! go#util#Offset(line, col) abort if &encoding != 'utf-8' let sep = go#util#LineEnding() let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep) @@ -213,13 +184,13 @@ function! go#util#Offset(line, col) endfunction " " Returns the byte offset for the cursor -function! go#util#OffsetCursor() +function! go#util#OffsetCursor() abort return go#util#Offset(line('.'), col('.')) endfunction " Windo is like the built-in :windo, only it returns to the window the command " was issued from -function! go#util#Windo(command) +function! go#util#Windo(command) abort let s:currentWindow = winnr() try execute "windo " . a:command @@ -231,7 +202,7 @@ endfunction " snippetcase converts the given word to given preferred snippet setting type " case. -function! go#util#snippetcase(word) +function! go#util#snippetcase(word) abort let l:snippet_case = get(g:, 'go_snippet_case_type', "snakecase") if l:snippet_case == "snakecase" return go#util#snakecase(a:word) @@ -244,7 +215,7 @@ endfunction " snakecase converts a string to snake case. i.e: FooBar -> foo_bar " Copied from tpope/vim-abolish -function! go#util#snakecase(word) +function! go#util#snakecase(word) abort let word = substitute(a:word,'::','/','g') let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g') let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g') @@ -255,7 +226,7 @@ endfunction " camelcase converts a string to camel case. i.e: FooBar -> fooBar " Copied from tpope/vim-abolish -function! go#util#camelcase(word) +function! go#util#camelcase(word) abort let word = substitute(a:word, '-', '_', 'g') if word !~# '_' && word =~# '\l' return substitute(word,'^.','\l&','') @@ -264,7 +235,7 @@ function! go#util#camelcase(word) endif endfunction -function! go#util#AddTags(line1, line2, ...) +function! go#util#AddTags(line1, line2, ...) abort " default is json let l:keys = ["json"] if a:0 @@ -311,21 +282,27 @@ endfunction " TODO(arslan): I couldn't parameterize the highlight types. Check if we can " simplify the following functions - +" +" NOTE(arslan): echon doesn't work well with redraw, thus echo doesn't print +" even though we order it. However echom seems to be work fine. function! go#util#EchoSuccess(msg) - redraw | echon "vim-go: " | echohl Function | echon a:msg | echohl None + redraw | echohl Function | echom "vim-go: " . a:msg | echohl None endfunction function! go#util#EchoError(msg) - redraw | echon "vim-go: " | echohl ErrorMsg | echon a:msg | echohl None + redraw | echohl ErrorMsg | echom "vim-go: " . a:msg | echohl None endfunction function! go#util#EchoWarning(msg) - redraw | echon "vim-go: " | echohl WarningMsg | echon a:msg | echohl None + redraw | echohl WarningMsg | echom "vim-go: " . a:msg | echohl None endfunction function! go#util#EchoProgress(msg) - redraw | echon "vim-go: " | echohl Identifier | echon a:msg | echohl None + redraw | echohl Identifier | echom "vim-go: " . a:msg | echohl None +endfunction + +function! go#util#EchoInfo(msg) + redraw | echohl Debug | echom "vim-go: " . a:msg | echohl None endfunction " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 75189496..87c59118 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -327,7 +327,9 @@ CTRL-t :GoInfo Show type information about the identifier under the cursor. For example putting it above a function call is going to show the full function - signature. It uses gocode to get the type informations. + signature. By default it uses `gocode` to get the type informations. To + change the underlying tool from `gocode` to another tool, see + |g:go_info_mode|. *:GoInstall* @@ -786,6 +788,10 @@ annotation. Calls `goimports` for the current package + *(go-lint)* + +Calls `golint` for the current package + *(go-vet)* Calls `go vet` for the current package @@ -946,13 +952,17 @@ vim-go also defines the following text motion objects: ============================================================================== FUNCTIONS *go-functions* - *go#jobcontrol#Statusline()* + *go#statusline#Show()* Shows the status of a job running asynchronously. Can be used to plug into the statusline. It works to show the status per package instead of per file. Assume you have three files open, all belonging to the same package, if -the package build (`:GoBuild`) is successful, all statusline's will be empty -(means SUCCESS), if you it fails all file's statusline will show FAILED. +the package build (`:GoBuild`) is successful, all statusline's will show +`success`, if you it fails all file's statusline will show `failed`. + +To avoid always showing old status information, the status information is +cleaned for each package after `60` seconds. This can be changed with the +|g:go_statusline_duration| setting. *go#complete#GetInfo()* @@ -989,17 +999,35 @@ with |:GoPlay|. By default it's enabled. > Use this option to show the type info (|:GoInfo|) for the word under the cursor automatically. Whenever the cursor changes the type info will be -updated. By default it's disabled. +updated. By default it's disabled. The delay can be configured with the +'g:go_updatetime' setting. > let g:go_auto_type_info = 0 < + + *'g:go_info_mode'* + +Use this option to define the command to be used for |:GoInfo|. By default +`gocode` is being used as it's the fastest option. But one might also use +`guru` as it's covers more cases and is more accurate. Current valid options +are: `[gocode, guru]` > + + let g:go_info_mode = 'gocode' +< *'g:go_auto_sameids'* Use this option to highlight all uses of the identifier under the cursor (:GoSameIds) automatically. By default it's disabled. The delay can be -configured with the 'updatetime' setting. +configured with the 'g:go_updatetime' setting. > let g:go_auto_sameids = 0 +< + *'g:go_updatetime'* + +Use this option to configure the a custom 'updatetime' for Go source files. If +set to 0, no custom time will be configured. By default it's set to 800ms. +> + let g:go_updatetime = 800 < *'g:go_jump_to_error'* @@ -1078,14 +1106,6 @@ Use this option to jump to an existing buffer for the split, vsplit and tab mappings of |:GoDef|. By default it's disabled. > let g:go_def_reuse_buffer = 0 -< - *'g:go_dispatch_enabled'* - -Use this option to enable/disable the use of Dispatch to execute the `:GoRun`, -`:GoBuild` and `:GoGenerate` commands. More information about Dispatch is -available at https://github.com/tpope/vim-dispatch. Default is disabled. > - - let g:go_dispatch_enabled = 0 < *'g:go_doc_command'* @@ -1332,9 +1352,9 @@ appropriate kind of list for the command that was called. Supported values are < *'g:go_asmfmt_autosave'* -Use this option to auto |:AsmFmt| on save. By default it's enabled. > +Use this option to auto |:AsmFmt| on save. By default it's disabled. > - let g:go_asmfmt_autosave = 1 + let g:go_asmfmt_autosave = 0 < *'g:go_term_mode'* @@ -1399,9 +1419,11 @@ to an autocompletion proposals. By default it is enabled. *'g:go_gocode_unimported_packages'* Specifies whether `gocode` should include suggestions from unimported packages. -By default it is enabled +By default it is disabled. > - let g:go_gocode_unimported_packages = 1 + let g:go_gocode_unimported_packages = 0 +< + *'g:go_gocode_socket_type'* Specifies whether `gocode` should use a different socket type. By default @@ -1420,6 +1442,9 @@ If the new file is created in an already prepopulated package (with other Go files), in this case a Go code template with only the Go package declaration (which is automatically determined according to the current package) is added. +To always use the package name instead of the template, enable the +|`g:go_template_use_pkg`| setting. + By default it is enabled. > let g:go_template_autocreate = 1 @@ -1431,15 +1456,45 @@ is created. Checkout |'g:go_template_autocreate'| for more info. By default the `hello_world.go` file is used. > let g:go_template_file = "hello_world.go" +< + *'g:go_template_use_pkg'* + +Specifies that, rather than using a template, the package name is used if a new +Go file is created. Checkout |'g:go_template_autocreate'| for more info. By +default the template file specified by |'g:go_template_file'| is used. + +> + let g:go_template_use_pkg = 0 < *'g:go_decls_includes'* - Only useful if `ctrlp.vim` is installed. This sets which declarations to - show for |:GoDecls|. - It is a Comma delimited list Possible options are: {func,type}. - The default is: > +Only useful if `ctrlp.vim` is installed. This sets which declarations to show +for |:GoDecls|. It is a Comma delimited list Possible options are: +{func,type}. The default is: > let g:go_decls_includes = 'func,type' +< + *'g:go_echo_command_info'* + +Echoes information about various Go commands, such as `:GoBuild`, `:GoTest`, +`:GoCoverage`, etc... Useful to disable if you use the statusline integration, +i.e: |go#statusline#Show()|. By default it's enabled +> + let g:go_echo_command_info = 1 +< + *'g:go_echo_go_info'* + +Use this option to show the identifier information when completion is done. By +default it's enabled > + + let g:go_echo_go_info = 1 +< + *'g:go_statusline_duration'* + +Specifices the duration of statusline information being showed per package. By +default it's 60 seconds. Must be in milliseconds. +> + let g:go_statusline_duration = 60000 < ============================================================================== TROUBLESHOOTING *go-troubleshooting* diff --git a/sources_non_forked/vim-go/ftplugin/go.vim b/sources_non_forked/vim-go/ftplugin/go.vim index dfe068f4..de830f9c 100644 --- a/sources_non_forked/vim-go/ftplugin/go.vim +++ b/sources_non_forked/vim-go/ftplugin/go.vim @@ -57,7 +57,75 @@ if get(g:, "go_textobj_enabled", 1) endif if get(g:, "go_auto_type_info", 0) || get(g:, "go_auto_sameids", 0) - setlocal updatetime=800 + let &l:updatetime= get(g:, "go_updatetime", 800) endif +" NOTE(arslan): experimental, disabled by default, doesn't work well. No +" documentation as well. If anyone feels adventerous, enable the following and +" try to search for Go identifiers ;) +" +" if get(g:, "go_sameid_search_enabled", 0) +" autocmd FileType go nnoremap <buffer> <silent> * :<c-u>call Sameids_search(0)<CR> +" autocmd FileType go nnoremap <buffer> <silent> # :<c-u>call Sameids_search(1)<CR> +" autocmd FileType go nnoremap <buffer> <silent> n :<c-u>call Sameids_repeat(0)<CR> +" autocmd FileType go nnoremap <buffer> <silent> N :<c-u>call Sameids_repeat(1)<CR> +" autocmd FileType go cabbrev nohlsearch <C-r>=Sameids_nohlsearch()<CR> +" endif + +" " mode 0: next 1: prev +" function! Sameids_repeat(mode) +" let matches = getmatches() +" if empty(matches) +" return +" endif +" let cur_offset = go#util#OffsetCursor() + +" " reverse list to make it easy to find the prev occurence +" if a:mode +" call reverse(matches) +" endif + +" for m in matches +" if !has_key(m, "group") +" return +" endif + +" if m.group != "goSameId" +" return +" endif + +" let offset = go#util#Offset(m.pos1[0], m.pos1[1]) + +" if a:mode && cur_offset > offset +" call cursor(m.pos1[0], m.pos1[1]) +" return +" elseif !a:mode && cur_offset < offset +" call cursor(m.pos1[0], m.pos1[1]) +" return +" endif +" endfor + +" " reached start/end, jump to the end/start +" let initial_match = matches[0] +" if !has_key(initial_match, "group") +" return +" endif + +" if initial_match.group != "goSameId" +" return +" endif + +" call cursor(initial_match.pos1[0], initial_match.pos1[1]) +" endfunction + +" function! Sameids_search(mode) +" call go#guru#SameIds() +" call Sameids_repeat(a:mode) +" endfunction + +" function! Sameids_nohlsearch() +" call go#guru#ClearSameIds() +" return "nohlsearch" +" endfunction + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim index c54de24c..d8bff665 100644 --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim @@ -17,15 +17,15 @@ command! -nargs=? GoGuruTags call go#guru#Tags(<f-args>) command! -nargs=* -range GoAddTags call go#util#AddTags(<line1>, <line2>, <f-args>) -command! -range=% GoSameIds call go#guru#SameIds(<count>) +command! -range=0 GoSameIds call go#guru#SameIds() command! -range=0 GoSameIdsClear call go#guru#ClearSameIds() -command! -range=% GoSameIdsToggle call go#guru#ToggleSameIds(<count>) +command! -range=0 GoSameIdsToggle call go#guru#ToggleSameIds() command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds() " -- tool command! -nargs=0 GoFiles echo go#tool#Files() command! -nargs=0 GoDeps echo go#tool#Deps() -command! -nargs=* GoInfo call go#complete#Info(0) +command! -nargs=* GoInfo call go#tool#Info(0) command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo() " -- cmd diff --git a/sources_non_forked/vim-go/ftplugin/go/mappings.vim b/sources_non_forked/vim-go/ftplugin/go/mappings.vim index b798209d..e1bbe46e 100644 --- a/sources_non_forked/vim-go/ftplugin/go/mappings.vim +++ b/sources_non_forked/vim-go/ftplugin/go/mappings.vim @@ -31,7 +31,7 @@ nnoremap <silent> <Plug>(go-coverage-browser) :<C-u>call go#coverage#Browser(!g: nnoremap <silent> <Plug>(go-files) :<C-u>call go#tool#Files()<CR> nnoremap <silent> <Plug>(go-deps) :<C-u>call go#tool#Deps()<CR> -nnoremap <silent> <Plug>(go-info) :<C-u>call go#complete#Info(0)<CR> +nnoremap <silent> <Plug>(go-info) :<C-u>call go#tool#Info(0)<CR> nnoremap <silent> <Plug>(go-import) :<C-u>call go#import#SwitchImport(1, '', expand('<cword>'), '')<CR> nnoremap <silent> <Plug>(go-imports) :<C-u>call go#fmt#Format(1)<CR> @@ -43,9 +43,9 @@ nnoremap <silent> <Plug>(go-callstack) :<C-u>call go#guru#Callstack(-1)<CR> xnoremap <silent> <Plug>(go-freevars) :<C-u>call go#guru#Freevars(0)<CR> nnoremap <silent> <Plug>(go-channelpeers) :<C-u>call go#guru#ChannelPeers(-1)<CR> nnoremap <silent> <Plug>(go-referrers) :<C-u>call go#guru#Referrers(-1)<CR> -nnoremap <silent> <Plug>(go-sameids) :<C-u>call go#guru#SameIds(-1)<CR> +nnoremap <silent> <Plug>(go-sameids) :<C-u>call go#guru#SameIds()<CR> nnoremap <silent> <Plug>(go-whicherrs) :<C-u>call go#guru#Whicherrs(-1)<CR> -nnoremap <silent> <Plug>(go-sameids-toggle) :<C-u>call go#guru#ToggleSameIds(-1)<CR> +nnoremap <silent> <Plug>(go-sameids-toggle) :<C-u>call go#guru#ToggleSameIds()<CR> nnoremap <silent> <Plug>(go-rename) :<C-u>call go#rename#Rename(!g:go_jump_to_error)<CR> @@ -65,6 +65,7 @@ nnoremap <silent> <Plug>(go-doc-split) :<C-u>call go#doc#Open("new", "split")<CR nnoremap <silent> <Plug>(go-doc-browser) :<C-u>call go#doc#OpenBrowser()<CR> nnoremap <silent> <Plug>(go-metalinter) :<C-u>call go#lint#Gometa(0)<CR> +nnoremap <silent> <Plug>(go-lint) :<C-u>call go#lint#Golint()<CR> nnoremap <silent> <Plug>(go-vet) :<C-u>call go#lint#Vet(!g:go_jump_to_error)<CR> nnoremap <silent> <Plug>(go-alternate-edit) :<C-u>call go#alternate#Switch(0, "edit")<CR> diff --git a/sources_non_forked/vim-go/indent/gohtmltmpl.vim b/sources_non_forked/vim-go/indent/gohtmltmpl.vim index d95cbc24..864913df 100644 --- a/sources_non_forked/vim-go/indent/gohtmltmpl.vim +++ b/sources_non_forked/vim-go/indent/gohtmltmpl.vim @@ -30,13 +30,13 @@ function! GetGoHTMLTmplIndent(lnum) " If need to indent based on last line let last_line = getline(a:lnum-1) - if last_line =~ '^\s*{{\s*\%(if\|else\|range\|with\|define\|block\).*}}' + if last_line =~ '^\s*{{-\=\s*\%(if\|else\|range\|with\|define\|block\).*}}' let ind += sw endif " End of FuncMap block let current_line = getline(a:lnum) - if current_line =~ '^\s*{{\s*\%(else\|end\).*}}' + if current_line =~ '^\s*{{-\=\s*\%(else\|end\).*}}' let ind -= sw endif diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim index 8a9eaf2a..3e2f6a1e 100644 --- a/sources_non_forked/vim-go/plugin/go.vim +++ b/sources_non_forked/vim-go/plugin/go.vim @@ -126,6 +126,10 @@ endfunction " ============================================================================ " function! s:echo_go_info() + if !get(g:, "go_echo_go_info", 1) + return + endif + if !exists('v:completed_item') || empty(v:completed_item) return endif @@ -145,14 +149,14 @@ endfunction function! s:auto_type_info() " GoInfo automatic update if get(g:, "go_auto_type_info", 0) - call go#complete#Info(1) + call go#tool#Info(1) endif endfunction function! s:auto_sameids() " GoSameId automatic update if get(g:, "go_auto_sameids", 0) - call go#guru#SameIds(-1) + call go#guru#SameIds() endif endfunction @@ -165,7 +169,7 @@ endfunction function! s:asmfmt_autosave() " Go asm formatting on save - if get(g:, "go_asmfmt_autosave", 1) + if get(g:, "go_asmfmt_autosave", 0) call go#asmfmt#Format() endif endfunction diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim index 54afa6ac..9b23eb6c 100644 --- a/sources_non_forked/vim-go/syntax/go.vim +++ b/sources_non_forked/vim-go/syntax/go.vim @@ -374,12 +374,7 @@ endif hi def link goCoverageNormalText Comment function! s:hi() - " :GoSameIds - if &background == 'dark' - hi def goSameId term=bold cterm=bold ctermbg=white ctermfg=black guibg=white guifg=black - else - hi def goSameId term=bold cterm=bold ctermbg=14 guibg=Cyan - endif + hi def link goSameId Search " :GoCoverage commands hi def goCoverageCovered ctermfg=green guifg=#A6E22E diff --git a/sources_non_forked/vim-snipmate/autoload/snipMate.vim b/sources_non_forked/vim-snipmate/autoload/snipMate.vim index 76cc6481..e3b4ca6d 100644 --- a/sources_non_forked/vim-snipmate/autoload/snipMate.vim +++ b/sources_non_forked/vim-snipmate/autoload/snipMate.vim @@ -28,13 +28,9 @@ function! snipMate#expandSnip(snip, version, col) abort let [snippet, b:snip_state.stops] = snipmate#parse#snippet(a:snip) " Build stop/mirror info let b:snip_state.stop_count = s:build_stops(snippet, b:snip_state.stops, lnum, col, indent) - let snipLines = map(copy(snippet), - \ 'snipMate#sniplist_str(v:val, b:snip_state.stops)') else let snippet = snipmate#legacy#process_snippet(a:snip) let [b:snip_state.stops, b:snip_state.stop_count] = snipmate#legacy#build_stops(snippet, lnum, col - indent, indent) - let snipLines = split(substitute(snippet, printf('%s\d\+\|%s{\d\+.\{-}}', - \ g:snipmate#legacy#sigil, g:snipmate#legacy#sigil), '', 'g'), "\n", 1) endif " Abort if the snippet is empty @@ -42,23 +38,7 @@ function! snipMate#expandSnip(snip, version, col) abort return '' endif - " Expand snippet onto current position - let afterCursor = strpart(line, col - 1) - " Keep text after the cursor - if afterCursor != "\t" && afterCursor != ' ' - let line = strpart(line, 0, col - 1) - let snipLines[-1] .= afterCursor - else - let afterCursor = '' - " For some reason the cursor needs to move one right after this - if line != '' && col == 1 && &ve != 'all' && &ve != 'onemore' - let col += 1 - endif - endif - - " Insert snippet with proper indentation - call setline(lnum, line . snipLines[0]) - call append(lnum, map(snipLines[1:], "empty(v:val) ? v:val : '" . strpart(line, 0, indent - 1) . "' . v:val")) + let col = s:insert_snippet_text(snippet, lnum, col, indent) " Open any folds snippet expands into if &foldenable @@ -77,6 +57,50 @@ function! snipMate#expandSnip(snip, version, col) abort return b:snip_state.set_stop(0) endfunction +function! s:insert_snippet_text(snippet, lnum, col, indent) + let line = getline(a:lnum) + let col = a:col + let snippet = type(a:snippet) == type([]) ? a:snippet : split(a:snippet, "\n", 1) + let lnum = a:lnum + + " Keep text after the cursor + let afterCursor = strpart(line, col - 1) + if afterCursor != "\t" && afterCursor != ' ' + let line = strpart(line, 0, col - 1) + else + let afterCursor = '' + " For some reason the cursor needs to move one right after this + if line != '' && col == 1 && &ve != 'all' && &ve != 'onemore' + let col += 1 + endif + endif + + call setline(lnum, '') + call append(lnum, repeat([''], len(snippet) - 1)) + + for item in snippet + let add = lnum == a:lnum ? line : strpart(line, 0, a:indent - 1) + + if !(empty(item) || (type(item) == type([]) && empty(item[0]))) + if type(item) == type([]) + call setline(lnum, add . + \ snipMate#sniplist_str(item, b:snip_state.stops)) + else + call setline(lnum, add . + \ substitute(item, printf('%s\d\+\|%s{\d\+.\{-}}', + \ g:snipmate#legacy#sigil, g:snipmate#legacy#sigil), + \ '', 'g')) + endif + endif + + let lnum += 1 + endfor + + call setline(lnum - 1, getline(lnum - 1) . afterCursor) + + return col +endfunction + function! snipMate#placeholder_str(num, stops) abort return snipMate#sniplist_str(a:stops[a:num].placeholder, a:stops) endfunction diff --git a/sources_non_forked/vim-snippets/AUTHORS b/sources_non_forked/vim-snippets/AUTHORS new file mode 100644 index 00000000..907daef1 --- /dev/null +++ b/sources_non_forked/vim-snippets/AUTHORS @@ -0,0 +1,383 @@ +Authors +=============================================================================== + +Generated with "git log --oneline --pretty="%an" | sort | uniq > AUTHORS + +Aaron Broder +Adnan Zafar +afolmert +aisensiy +Alexander Ross +Alexandre de Oliveira +Alexey Shevchenko +Alex Tan +Allen.M +Alvin Chan +ALX-Liu-Xiao +Andrea Giardini +Andreas Krennmair +Andreas Steinel +Andrei Cristian Petcu +Andrej Radovic +Andre Walker +Andrey Paskal +Andy Waite +Angel Alonso +Ãngel Alonso +Anne Douwe Bouma +Anthony Wilson +Arvind +ashfinal +Audrius Kažukauskas +Austin Wood +Aydar Khabibullin +babybeasimple +Benjamin Nørgaard +Bernhard Graf +Bill Casarin +binaryplease +Björn +Björn-Egil Dahlberg +BlackEagle +Boone Severson +bounceme +Bradlee Speice +Brandon Dulaney +Brandon Hilkert +Brian Hogan +Brian van Burken +Bruno Sutic +Camilo Payan +carme +Cézar Antáres +Chad Paradis +Chen Zhongzheng +Ches Martin +ChickenNuggers +Chipairon +Chris Dueck +Chris Nicola +Chris Sims +Christian +Christian Höltje +Christian Neumüller +Christopher Joslyn +chrisyue +Ciro Santilli +Ciro Santilli 六四事件 法轮功 +Claudio Maradonna +Connor Atherton +Cooper LeBrun +Corentin Peuvrel +Craig Paterson +Craig P Jolicoeur +crazymaster +daa84 +Daeyun Shin +Dale Roberts +Daniel Hahler +Dan Loewenherz +Danny Navarro +daoo +Darrell Hamilton +David Arvelo +David Barnett +David C. Bishop +David Deryl Downey - AKA Deryl R. Doucette +David Rodríguez de Dios +David Sanson +dengyaolong +Derek Morey +dhilipsiva +djdt +Dmitry Dementev +Donny Yang +DSIW +dzikie drożdże +Eduardo Gurgel +Eli Gundry +emzap79 +Enric Lluelles +Enrico Maria De Angelis +Erich Heine +Erik Westrup +Ernest +Eugene Kalinin +Eustaquio Rangel +Eustáquio Rangel +Fatih Arslan +Felix Jung +Filipe Giusti +Florent Lévigne +Florian Sattler +frans +Fuad Saud +Gabriel Chavez +Gaël Chamoulaud +Gea-Suan Lin +George Guimarães +George Lee +Georgios Samaras +Gert +gfixler +Gilad Peleg +gk +goonnow +Gueunet Charles +Gui Lin +guneysus +Gustavo Chain +Gustavo Ferreira +Hans-Guenter +Harald Wartig +Henrik Kjelsberg +HIRAKI Satoru +Holger Rapp +Honza +Honza Pokorny +hulufei +Igor Goldvekht +Ilker Cetinkaya +indi +Indra Susila +Ionică Bizău +Iuri Fernandes +Jack Stalnaker +Jacobo de Vera +Jacques Kvam +jake romer +Jakub Stasiak +James Turley +Jan Mollowitz +Jason S. Jones +Jean Jordaan +Jeffrey Tratner +Jens Hoepken +jiangyc0 +Jim Deville +Jinzhu +Joey Curtin +Johannes Wienke +jonasac +Jonas Bygdén +Jonathan Martin +Jorge GarciÌa +Jorge López Pérez +Joseph Lin +Josh Bode +Josh Davis +Josh Matthews +Josh Vandergrift +Josh Wainwright +JuanPablo +Julian Bennecker +Julien Deniau +Julien Pivard +Julien Stechele +Julien STECHELE +Kalinin Eugene +kenshin54 +Kentaro Imai +Kevin Koltz +Kevin Lui +Kevin Mees +Kevin Murray +Kevin Schaul +Konstantin +Konstantin Gorodinskiy +Laas Toom +Laurent Georget +laxtiz +Leandro Moreira +Leonardo B +Leonidez Acosta +linduxed +Li Xin +Louis +Louis Pilfold +Lucas Hoffmann +Luis Carlos Cruz +Luis Carlos Cruz Carballo +Luiz Gonzaga dos Santos Filho +majjoha +mangege +Marc Camuzat +Marcelo D Montu +Marcelo Jacobus +Marcin Kulik +Marcus Kammer +Marc Weber +Mario de Frutos +Markus Benning +marocchino +Martin Atukunda +Martin Heuschober +Martxel Lasa +MatÄ›j Cepl +Mathew Attlee +Mathieu Comandon +Matthew Barry +Matthias Viehweger +Mattia Tezzele +Matt Rasband +Matt Stevens +Mauro Porras P +Maximiliano Robaina +Mayeu (Cast) +Meng Zhuo +Michael Gehring +Michael Hinrichs +Michael Rutter +Michael Thessel +Michi Huber +Mickey +midchildan +Mike Foley +Mike Smullin +Miki Tebeka +Minjong Chung +M. Maxwell Watson +mMontu +mockturtl +m-pilia +Muhammad Hallaj Subery +mwcz +Namit +Nan Cloudio Jiang +Nan Zheng +Nate Mara +netei +Ngo The Trung +Nguyen Le +Nick Janetakis +Nicklasos +Nick Papanastasiou +Nicolas G. Querol +Nico Suhl +No Ducks +Norman Messtorff +obaoba +oddlydrawn +Oleg Voronkovich +Ole Hansen +Oliver Andrich +Ondrej Slinták +onemanstartup +opennota +Paco Esteban +Panagiotis Mavrogiorgos +Paolo Cretaro +Pascal +Paulo Romeira +Pawel Jankowski +phcerdan +Philippe Mongeau +Philipp Jovanovic +Piotr Jawniak +Piotr Yordanov +Pirogov Evgenij +Pompeu +Povilas Balzaravicius Pawka +Procras +protream +pydave +r4d2 +RadosÅ‚aw Szymczyszyn +Ralph-Wang +Raül Torralba +raydeal +rcolombo +Rekky +René +Rene Vergara +Renzo Poddighe +Reyes Yang +ricardogcolombo +Ricardo Jesus +Rich Layte +Roberto Miranda +robin +Robin Grindrod +Rok Garbas +Roland Sommer +Rory McNamara +rsw0x +rtorralba +Ruben Vereecken +Ryan Bright +Ryan Pineo +Ryan Wang +Sam Shepherd +Santiago Gallego +sasidhar-d +Sathors +Sebastian Röder +Sebastian Wiesner +Sergey Lebedev +Sergey Zasenko +Serhiy Oplakanets +SevereOverfl0w +Simeon F. Willbanks +Simeon Willbanks +Simon Désaulniers +sirex +skv +Sokovikov +Srijan Choudhary +Steeve +stefan +Stephen Tudor +Stephen Woods +Steve Brown +Steven Humphrey +Steven Oliver +Stuart Grimshaw +Sudar +¨switch87¨ +Tevin Zhang +theocrite +Thiago de Arruda +Thomas Duerr +Thomas Szymanski +tinyladi +Tobias Witt +Tobie Warburton +Tomasz Wisniewski +Tom Vincent +Tony +Tony Narlock +toogley +Torbjørn Vatn +tormaroe +ToruIwashita +Travis Holton +Trevor Sullivan +troydm +tUrG0n +twabiko +Tyler Ball +tyronepost +Tyrone Post +Vadim Khohlov +Vincent Hsu +Vladimir Rybas +Vladislav Khvostov +Vorzard +Vzaa +Waldecir Santos +Wildsky Fann +William Ma +William Travis Holton +X4fyr +xz.zhang +Yamamoto Yuji +Yannick Brehon +yerv000 +Yike Lu +yuhuanbo +Yu Huanbo +Yves Lange +yvhn +zauguin +Zaven Muradyan +ZPH diff --git a/sources_non_forked/vim-snippets/UltiSnips/cuda.snippets b/sources_non_forked/vim-snippets/UltiSnips/cuda.snippets new file mode 100644 index 00000000..2a9a7e5e --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/cuda.snippets @@ -0,0 +1,5 @@ +priority -50 + +extends cpp + +# vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/python.snippets b/sources_non_forked/vim-snippets/UltiSnips/python.snippets index fa3ff8b9..5d8e2641 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/python.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/python.snippets @@ -486,6 +486,11 @@ def __coerce__(self, other): ${25:pass} endsnippet +snippet deff +def ${1:fname}(`!p snip.rv = vim.eval('indent(".") ? "self" : ""')`$2): + $0 +endsnippet + snippet def "function with docstrings" b def ${1:function}(`!p if snip.indent: diff --git a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets index 4c7e44b4..f43de5ee 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets @@ -10,7 +10,7 @@ endsnippet snippet tab "tabular / array environment" b \begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}} -$0${2/((?<=.)c|l|r)|./(?1: & )/g} +$0${2/(?<=.)(c|l|r)|./(?1: & )/g} \end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}} endsnippet @@ -20,7 +20,7 @@ snippet table "Table environment" b \caption{${2:caption}} \label{tab:${3:label}} \begin{${4:t}${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${5:c}} - $0${5/((?<=.)c|l|r)|./(?1: & )/g} + $0${5/(?<=.)(c|l|r)|./(?1: & )/g} \end{$4${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}} \end{table} endsnippet diff --git a/sources_non_forked/vim-snippets/snippets/_.snippets b/sources_non_forked/vim-snippets/snippets/_.snippets index 0153a146..ad0235f1 100644 --- a/sources_non_forked/vim-snippets/snippets/_.snippets +++ b/sources_non_forked/vim-snippets/snippets/_.snippets @@ -279,3 +279,11 @@ snippet AGPL You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. +snippet ISC + ${1:one line to give the program's name and a brief description} + Copyright `&enc[:2] == "utf" ? "©" : "(c)"` `strftime("%Y")`, ${2:`g:snips_author`} + + Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + ${0} diff --git a/sources_non_forked/vim-snippets/snippets/cuda.snippets b/sources_non_forked/vim-snippets/snippets/cuda.snippets new file mode 100644 index 00000000..425ca67f --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/cuda.snippets @@ -0,0 +1 @@ +extends cpp diff --git a/sources_non_forked/vim-snippets/snippets/fortran.snippets b/sources_non_forked/vim-snippets/snippets/fortran.snippets index c9ab0602..8fecd330 100644 --- a/sources_non_forked/vim-snippets/snippets/fortran.snippets +++ b/sources_non_forked/vim-snippets/snippets/fortran.snippets @@ -26,6 +26,11 @@ snippet doc ! Description: $1 ! """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" $0 +snippet dox + !> @brief ${1} + !> ${2} + !> @author `g:snips_author` + ${0} # Variables definitions # Boolean snippet bool @@ -49,7 +54,7 @@ snippet type snippet const ${1:type}, parameter :: $2 = $0 snippet arr - ${1:type}, allocatable, dimension(${2::}) :: $0 + ${1:type}, ${2:allocatable, }dimension(${3::}) :: $0 snippet intent ${1:type}, intent(inout) :: $0 # Array @@ -57,7 +62,7 @@ snippet / (/ $1 /) ${2:,&} $0 snippet if if (${1:condition}) then - $2 + $0 end if snippet case select case (${1:expr}) @@ -66,8 +71,8 @@ snippet case $3 end select $0 snippet do - do ${1:i} = ${2:start},${3:end}, ${4:incr} - $4 + do ${1:i} = ${2:start}, ${3:end}, ${4:incr} + $0 end do snippet dow do while (${1:condition}) @@ -84,10 +89,10 @@ snippet func snippet pr write(*,*) $0 snippet read - read( unit = ${1:fp}, file = ${2:filename}${3:, iostat = IERR }) $0 + read(unit = ${1:fp}, file = ${2:filename}, iostat = ${3:ierr}) $0 snippet write - write( unit = ${1:fp}, file = ${2:filename}${3:, iostat = IERR }) $0 + write(unit = ${1:fp}, file = ${2:filename}, iostat = ${3:ierr}) $0 snippet open - open (unit = ${1:fp}, file = ${2:filename}, status = unknown${3:, iostat = IERR }) $0 + open(unit = ${1:fp}, file = ${2:filename}, status = ${3:unknown}, iostat = ${4:ierr}) $0 snippet close - close ( unit = ${1:fp} ) $0 + close(unit = ${1:fp}) $0 diff --git a/sources_non_forked/vim-snippets/snippets/handlebars.snippets b/sources_non_forked/vim-snippets/snippets/handlebars.snippets new file mode 100644 index 00000000..d1ab0f03 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/handlebars.snippets @@ -0,0 +1,14 @@ +snippet if # {{#if value}} ... {{/if}} + {{#if ${1:value}}} + ${0} + {{/if}} +snippet ifn # {{#unless value}} ... {{/unless}} + {{#unless ${1:value}}} + ${0} + {{/unless}} +snippet ife # {{#if value}} ... {{else}} .. {{/if}} + {{#if ${1:value}}} + ${2} + {{else}} + ${3} + {{/if}} diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets index 16e46328..a1adedef 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets @@ -2,8 +2,12 @@ snippet const const ${1} = ${0}; snippet let let ${1} = ${0}; -snippet im - import ${1} from '${0}'; +snippet im "import xyz from 'xyz'" + import ${1} from '${2:$1}'; +snippet imas "import * as xyz from 'xyz'" + import * as ${1} from '${2:$1}'; +snippet imm "import { member } from 'xyz'" + import { ${1} } from '${2}'; snippet cla class ${1} { ${0} @@ -18,9 +22,8 @@ snippet clac ${0} } } -# For of loop -snippet foro - for (let ${1:prop} of ${2:object}) { +snippet foro "for (const prop of object}) { ... }" + for (const ${1:prop} of ${2:object}) { ${0:$1} } # Generator diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.node.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.node.snippets index 2b5aefb4..489e0abb 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.node.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.node.snippets @@ -5,7 +5,7 @@ snippet ex module.exports = ${1}; # require snippet re - ${1:var} ${2} = require('${3:module_name}'); + ${1:const} ${2} = require('${3:module_name}'); # EventEmitter snippet on on('${1:event_name}', function(${2:stream}) { diff --git a/sources_non_forked/vim-snippets/snippets/mustache.snippets b/sources_non_forked/vim-snippets/snippets/mustache.snippets index 8296afcb..ad8723ed 100644 --- a/sources_non_forked/vim-snippets/snippets/mustache.snippets +++ b/sources_non_forked/vim-snippets/snippets/mustache.snippets @@ -1,15 +1,12 @@ -# if {{#value}} ... {{/value}} -snippet if +snippet if # {{#value}} ... {{/value}} {{#${1:value}}} ${0} {{/$1}} -# if not {{^value}} ... {{/value}} -snippet ifn +snippet ifn # {{^value}} ... {{/value}} {{^${1:value}}} ${0} {{/$1}} -# if else {{#value}} ... {{/value}} {{^value}} ... {{/value}} -snippet ife +snippet ife # {{#value}} ... {{/value}} {{^value}} ... {{/value}} {{#${1:value}}} ${2} {{/$1}} diff --git a/sources_non_forked/vim-snippets/snippets/purescript.snippets b/sources_non_forked/vim-snippets/snippets/purescript.snippets new file mode 100644 index 00000000..06d6b34a --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/purescript.snippets @@ -0,0 +1,52 @@ +snippet mod + module `substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')` + ( + ) where + + import Prelude + + ${0} +snippet imp + import ${0:Data.List} +snippet impq + import ${1:Data.List} as ${0:List} +snippet fn0 + ${1:name} :: ${2:a} + $1 = ${0:undefined} +snippet fn + ${1:fn} :: ${2:a} -> ${3:a} + $1 ${4}= ${0} +snippet fn1 + ${1:fn} :: ${2:a} -> ${3:a} + $1 ${4}= ${0} +snippet fn2 + ${1:fn} :: ${2:a} -> ${3:a} -> ${4:a} + $1 ${5}= ${0} +snippet fn3 + ${1:fn} :: ${2:a} -> ${3:a} -> ${4:a} -> ${5:a} + $1 ${6}= ${0} +snippet case + case ${1} of + ${2} -> ${0} +snippet let + let + ${1} = ${2} + in + ${3} +snippet where + where + ${1} = ${0} +snippet testunit + module Test.Main where + + import Prelude + import Test.Unit (suite, test) + import Test.Unit.Main (runTest) + import Test.Unit.Assert as Assert + + main = runTest do + suite "${1}" do + test "${2:the tests run}" do + Assert.equal + "Hello, world!" + "Hello, sailor!" diff --git a/sources_non_forked/vim-snippets/snippets/rails.snippets b/sources_non_forked/vim-snippets/snippets/rails.snippets index e8342222..6a5c5ff0 100644 --- a/sources_non_forked/vim-snippets/snippets/rails.snippets +++ b/sources_non_forked/vim-snippets/snippets/rails.snippets @@ -325,7 +325,7 @@ snippet xpost snippet xput xhr :put, :${1:update}, id: ${2:1}, ${3:object}: ${4:object} snippet test - test 'should ${1:do something}' do + test '${1:should do something}' do ${0} end ########################### diff --git a/sources_non_forked/vim-snippets/snippets/tex.snippets b/sources_non_forked/vim-snippets/snippets/tex.snippets index 68ac5d05..05ec852c 100644 --- a/sources_non_forked/vim-snippets/snippets/tex.snippets +++ b/sources_non_forked/vim-snippets/snippets/tex.snippets @@ -1,317 +1,327 @@ +#version 1 #PREAMBLE #newcommand snippet nc \newcommand - \newcommand{\\${1:cmd}}[${2:opt}]{${3:realcmd}} ${0} + \\newcommand{\\${1:cmd}}[${2:opt}]{${3:realcmd}} ${0} #usepackage snippet up \usepackage - \usepackage[${1:options}]{${2:package}} ${0} + \\usepackage[${1:options}]{${2:package}} ${0} #newunicodechar snippet nuc \newunicodechar - \newunicodechar{${1}}{${2:\ensuremath}${3:tex-substitute}}} ${0} + \\newunicodechar{${1}}{${2:\\ensuremath}${3:tex-substitute}}} ${0} #DeclareMathOperator snippet dmo \DeclareMathOperator - \DeclareMathOperator{${1}}{${2}} ${0} + \\DeclareMathOperator{${1}}{${2}} ${0} #DOCUMENT # \begin{}...\end{} snippet begin \begin{} ... \end{} block - \begin{${1:env}} + \\begin{${1:env}} ${0:${VISUAL}} - \end{$1} + \\end{$1} # Tabular snippet tab tabular (or arbitrary) environment - \begin{${1:tabular}}{${2:c}} + \\begin{${1:tabular}}{${2:c}} ${0:${VISUAL}} - \end{$1} + \\end{$1} snippet thm thm (or arbitrary) environment with optional argument - \begin[${1:author}]{${2:thm}} + \\begin[${1:author}]{${2:thm}} ${0:${VISUAL}} - \end{$2} + \\end{$2} snippet center center environment - \begin{center} + \\begin{center} ${0:${VISUAL}} - \end{center} + \\end{center} # Align(ed) snippet ali align(ed) environment - \begin{align${1:ed}} - \label{eq:${2}} + \\begin{align${1:ed}} + \\label{eq:${2}} ${0:${VISUAL}} - \end{align$1} + \\end{align$1} # Gather(ed) snippet gat gather(ed) environment - \begin{gather${1:ed}} + \\begin{gather${1:ed}} ${0:${VISUAL}} - \end{gather$1} + \\end{gather$1} # Equation snippet eq equation environment - \begin{equation} + \\begin{equation} ${0:${VISUAL}} - \end{equation} + \\end{equation} # Equation snippet eql Labeled equation environment - \begin{equation} - \label{eq:${2}} + \\begin{equation} + \\label{eq:${2}} ${0:${VISUAL}} - \end{equation} + \\end{equation} # Equation snippet eq* unnumbered equation environment - \begin{equation*} + \\begin{equation*} ${0:${VISUAL}} - \end{equation*} + \\end{equation*} # Unnumbered Equation snippet \ unnumbered equation: \[ ... \] - \[ + \\[ ${0:${VISUAL}} - \] + \\] # Equation array snippet eqnarray eqnarray environment - \begin{eqnarray} + \\begin{eqnarray} ${0:${VISUAL}} - \end{eqnarray} + \\end{eqnarray} # Label snippet lab \label - \label{${1:eq:}${2:fig:}${3:tab:}${0}} + \\label{${1:eq:}${2:fig:}${3:tab:}${0}} # Enumerate snippet enum enumerate environment - \begin{enumerate} - \item ${0} - \end{enumerate} + \\begin{enumerate} + \\item ${0} + \\end{enumerate} snippet enuma enumerate environment - \begin{enumerate}[(a)] - \item ${0} - \end{enumerate} + \\begin{enumerate}[(a)] + \\item ${0} + \\end{enumerate} snippet enumi enumerate environment - \begin{enumerate}[(i)] - \item ${0} - \end{enumerate} + \\begin{enumerate}[(i)] + \\item ${0} + \\end{enumerate} # Itemize snippet itemize itemize environment - \begin{itemize} - \item ${0} - \end{itemize} + \\begin{itemize} + \\item ${0} + \\end{itemize} snippet item \item - \item ${1:${VISUAL}} + \\item ${1:${VISUAL}} # Description snippet desc description environment - \begin{description} - \item[${1}] ${0} - \end{description} + \\begin{description} + \\item[${1}] ${0} + \\end{description} # Endless new item snippet ]i \item (recursive) - \item ${1} + \\item ${1} ${0:]i} # Matrix snippet mat smart matrix environment - \begin{${1:p/b/v/V/B/small}matrix} + \\begin{${1:p/b/v/V/B/small}matrix} ${0:${VISUAL}} - \end{$1matrix} + \\end{$1matrix} # Cases snippet cas cases environment - \begin{cases} - ${1:equation}, &\text{ if }${2:case}\\ + \\begin{cases} + ${1:equation}, &\\text{ if }${2:case}\\ ${0:${VISUAL}} - \end{cases} + \\end{cases} # Split snippet spl split environment - \begin{split} + \\begin{split} ${0:${VISUAL}} - \end{split} + \\end{split} # Part snippet part document \part - \part{${1:part name}} % (fold) - \label{prt:${2:$1}} + \\part{${1:part name}} % (fold) + \\label{prt:${2:$1}} ${0} % part $2 (end) # Chapter snippet cha \chapter - \chapter{${1:chapter name}} - \label{cha:${2:$1}} + \\chapter{${1:chapter name}} + \\label{cha:${2:$1}} ${0} # Section snippet sec \section - \section{${1:section name}} - \label{sec:${2:$1}} + \\section{${1:section name}} + \\label{sec:${2:$1}} ${0} # Section without number snippet sec* \section* - \section*{${1:section name}} - \label{sec:${2:$1}} + \\section*{${1:section name}} + \\label{sec:${2:$1}} ${0} # Sub Section snippet sub \subsection - \subsection{${1:subsection name}} - \label{sub:${2:$1}} + \\subsection{${1:subsection name}} + \\label{sub:${2:$1}} ${0} # Sub Section without number snippet sub* \subsection* - \subsection*{${1:subsection name}} - \label{sub:${2:$1}} + \\subsection*{${1:subsection name}} + \\label{sub:${2:$1}} ${0} # Sub Sub Section snippet subs \subsubsection - \subsubsection{${1:subsubsection name}} - \label{ssub:${2:$1}} + \\subsubsection{${1:subsubsection name}} + \\label{ssub:${2:$1}} ${0} # Sub Sub Section without number snippet subs* \subsubsection* - \subsubsection*{${1:subsubsection name}} - \label{ssub:${2:$1}} + \\subsubsection*{${1:subsubsection name}} + \\label{ssub:${2:$1}} ${0} # Paragraph snippet par \paragraph - \paragraph{${1:paragraph name}} - \label{par:${2:$1}} + \\paragraph{${1:paragraph name}} + \\label{par:${2:$1}} ${0} # Sub Paragraph snippet subp \subparagraph - \subparagraph{${1:subparagraph name}} - \label{subp:${2:$1}} + \\subparagraph{${1:subparagraph name}} + \\label{subp:${2:$1}} ${0} snippet ni \noindent - \noindent + \\noindent ${0} #References snippet itd description \item - \item[${1:description}] ${0:item} + \\item[${1:description}] ${0:item} snippet figure reference to a figure - ${1:Figure}~\ref{${2:fig:}} + ${1:Figure}~\\ref{${2:fig:}} snippet table reference to a table - ${1:Table}~\ref{${2:tab:}} + ${1:Table}~\\ref{${2:tab:}} snippet listing reference to a listing - ${1:Listing}~\ref{${2:list}} + ${1:Listing}~\\ref{${2:list}} snippet section reference to a section - ${1:Section}~\ref{sec:${2}} ${0} + ${1:Section}~\\ref{sec:${2}} ${0} snippet page reference to a page - ${1:page}~\pageref{${2}} ${0} + ${1:page}~\\pageref{${2}} ${0} snippet index \index - \index{${1:index}} ${0} + \\index{${1:index}} ${0} #Citations snippet citen \citen - \citen{${1}} ${0} + \\citen{${1}} ${0} # natbib citations snippet citep \citep - \citep{${1}} ${0} + \\citep{${1}} ${0} snippet citet \citet - \citet{${1}} ${0} + \\citet{${1}} ${0} snippet cite \cite[]{} - \cite[${1}]{${2}} ${0} + \\cite[${1}]{${2}} ${0} snippet citea \citeauthor - \citeauthor{${1}} ${0} + \\citeauthor{${1}} ${0} snippet citey \citeyear - \citeyear{${1}} ${0} + \\citeyear{${1}} ${0} snippet fcite \footcite[]{} - \footcite[${1}]{${2}}${0} + \\footcite[${1}]{${2}}${0} #Formating text: italic, bold, underline, small capital, emphase .. snippet it italic text - \textit{${0:${VISUAL:text}}} + \\textit{${0:${VISUAL:text}}} snippet bf bold face text - \textbf{${0:${VISUAL:text}}} + \\textbf{${0:${VISUAL:text}}} snippet under underline text - \underline{${0:${VISUAL:text}}} + \\underline{${0:${VISUAL:text}}} snippet emp emphasize text - \emph{${0:${VISUAL:text}}} + \\emph{${0:${VISUAL:text}}} snippet sc small caps text - \textsc{${0:${VISUAL:text}}} + \\textsc{${0:${VISUAL:text}}} #Choosing font snippet sf sans serife text - \textsf{${0:${VISUAL:text}}} + \\textsf{${0:${VISUAL:text}}} snippet rm roman font text - \textrm{${0:${VISUAL:text}}} + \\textrm{${0:${VISUAL:text}}} snippet tt typewriter (monospace) text - \texttt{${0:${VISUAL:text}}} + \\texttt{${0:${VISUAL:text}}} #Math font snippet mf mathfrak - \mathfrak{${0:${VISUAL:text}}} + \\mathfrak{${0:${VISUAL:text}}} snippet mc mathcal - \mathcal{${0:${VISUAL:text}}} + \\mathcal{${0:${VISUAL:text}}} snippet ms mathscr - \mathscr{${0:${VISUAL:text}}} + \\mathscr{${0:${VISUAL:text}}} #misc snippet ft \footnote - \footnote{${0:${VISUAL:text}}} + \\footnote{${0:${VISUAL:text}}} snippet fig figure environment (includegraphics) - \begin{figure} - \begin{center} - \includegraphics[scale=${1}]{Figures/${2}} - \end{center} - \caption{${3}} - \label{fig:${4}} - \end{figure} + \\begin{figure} + \\begin{center} + \\includegraphics[scale=${1}]{Figures/${2}} + \\end{center} + \\caption{${3}} + \\label{fig:${4}} + \\end{figure} ${0} snippet tikz figure environment (tikzpicture) - \begin{figure} - \begin{center} - \begin{tikzpicture}[scale=${1:1}] + \\begin{figure}[htpb] + \\begin{center} + \\begin{tikzpicture}[scale=${1:1}, transform shape] ${2} - \end{tikzpicture} - \end{center} - \caption{${3}} - \label{fig:${4}} - \end{figure} + \\end{tikzpicture} + \\end{center} + \\caption{${3}} + \\label{fig:${4}} + \\end{figure} + ${0} +snippet subfig subfigure environment + \\begin{subfigure}[${1}]{${2:\\textwidth}} + \\begin{center} + ${3} + \\end{center} + \\caption{${4}} + \\label{fig:${5}} + \\end{subfigure} ${0} #math snippet stackrel \stackrel{}{} - \stackrel{${1:above}}{${2:below}} ${0} + \\stackrel{${1:above}}{${2:below}} ${0} snippet frac \frac{}{} - \frac{${1:num}}{${2:denom}} ${0} + \\frac{${1:num}}{${2:denom}} ${0} snippet sum \sum^{}_{} - \sum^{${1:n}}_{${2:i=1}} ${0} + \\sum^{${1:n}}_{${2:i=1}} ${0} snippet lim \lim_{} - \lim_{${1:n \to \infty}} ${0} + \\lim_{${1:n \\to \\infty}} ${0} snippet frame frame environment - \begin{frame}[${1:t}]{${2:title}} + \\begin{frame}[${1:t}]{${2:title}} ${0:${VISUAL}} - \end{frame} + \\end{frame} snippet block block environment - \begin{block}{${1:title}} - ${0:${VISUAL}} - \end{block} + \\begin{block}{${1:title}} + ${0:${VISUAL}} + \\end{block} snippet alert alertblock environment - \begin{alertblock}{${1:title}} - ${0:${VISUAL}} - \end{alertblock} + \\begin{alertblock}{${1:title}} + ${0:${VISUAL}} + \\end{alertblock} snippet example exampleblock environment - \begin{exampleblock}{${1:title}} - ${0:${VISUAL}} - \end{exampleblock} + \\begin{exampleblock}{${1:title}} + ${0:${VISUAL}} + \\end{exampleblock} snippet col2 two-column environment - \begin{columns} - \begin{column}{0.5\textwidth} + \\begin{columns} + \\begin{column}{0.5\\textwidth} ${1} - \end{column} - \begin{column}{0.5\textwidth} + \\end{column} + \\begin{column}{0.5\\textwidth} ${0} - \end{column} - \end{columns} + \\end{column} + \\end{columns} snippet \{ \{ \} \\{ ${0} \\} #delimiter snippet lr left right - \left${1} ${0} \right$1 -snippet lr( left( right) - \left( ${0} \right) -snippet lr| left| right| - \left| ${0} \right| -snippet lr{ left\{ right\} - \left\\{ ${0} \right\\} -snippet lr[ left[ right] - \left[ ${0} \right] -snippet lra langle rangle - \langle ${0} \rangle + \\left${1} ${0} \\right$1 +snippet lr( left( right) + \\left( ${0} \\right) +snippet lr| left| right| + \\left| ${0} \\right| +snippet lr{ left\{ right\} + \\left\\{ ${0} \\right\\} +snippet lr[ left[ right] + \\left[ ${0} \\right] +snippet lra langle rangle + \\langle ${0} \\rangle # Code listings snippet lst - \begin{listing}[language=${1:language}] + \\begin{listing}[language=${1:language}] ${0:${VISUAL}} - \end{listing} + \\end{listing} snippet lsi - \lstinline|${1}| ${0} + \\lstinline|${1}| ${0} # Hyperlinks snippet url - \url{${1}} ${0} + \\url{${1}} ${0} snippet href - \href{${1}}{${2}} ${0} + \\href{${1}}{${2}} ${0} # URL from Clipboard. snippet urlc - \url{`@+`} ${0} + \\url{`@+`} ${0} snippet hrefc - \href{`@+`}{${1}} ${0} + \\href{`@+`}{${1}} ${0} From fe46dfbbe6464506edd92e1eaf841183e7ba4ae4 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 11 Feb 2017 14:01:38 +0100 Subject: [PATCH 195/254] Updated plugins --- .../ctrlp.vim/autoload/ctrlp.vim | 12 +- .../ctrlp.vim/autoload/ctrlp/tag.vim | 4 +- sources_non_forked/ctrlp.vim/doc/ctrlp.txt | 4 + sources_non_forked/goyo.vim/autoload/goyo.vim | 4 +- .../nerdtree/lib/nerdtree/path.vim | 4 +- .../syntastic/doc/syntastic-checkers.txt | 2 +- .../syntastic/plugin/syntastic.vim | 18 +- .../erlang/erlang_check_file.erl | 213 +++- .../syntastic/syntax_checkers/haxe/haxe.vim | 7 +- .../syntax_checkers/javascript/flow.vim | 6 +- .../syntastic/syntax_checkers/vala/valac.vim | 54 +- .../vim-coffee-script/after/indent/html.vim | 2 +- .../vim-coffee-script/after/syntax/html.vim | 2 +- .../vim-coffee-script/test/test.html | 10 + .../vim-fugitive/plugin/fugitive.vim | 12 +- sources_non_forked/vim-go/.gitignore | 4 + sources_non_forked/vim-go/.travis.yml | 22 + sources_non_forked/vim-go/CHANGELOG.md | 46 +- sources_non_forked/vim-go/Makefile | 7 + sources_non_forked/vim-go/README.md | 49 +- sources_non_forked/vim-go/Rakefile | 13 - .../vim-go/autoload/go/asmfmt.vim | 2 +- sources_non_forked/vim-go/autoload/go/cmd.vim | 7 +- .../vim-go/autoload/go/complete.vim | 12 +- .../vim-go/autoload/go/coverage.vim | 2 +- sources_non_forked/vim-go/autoload/go/def.vim | 13 +- .../vim-go/autoload/go/def_test.vim | 32 + sources_non_forked/vim-go/autoload/go/doc.vim | 14 +- sources_non_forked/vim-go/autoload/go/fmt.vim | 283 ++--- .../vim-go/autoload/go/fmt_test.vim | 31 + .../vim-go/autoload/go/guru.vim | 16 +- .../vim-go/autoload/go/jobcontrol.vim | 44 +- .../vim-go/autoload/go/lint.vim | 31 +- .../vim-go/autoload/go/path.vim | 3 + .../vim-go/autoload/go/rename.vim | 4 +- .../autoload/go/test-fixtures/def/jump.go | 7 + .../autoload/go/test-fixtures/fmt/hello.go | 7 + .../go/test-fixtures/fmt/hello_golden.go | 7 + .../vim-go/autoload/go/textobj.vim | 4 +- .../vim-go/autoload/go/util.vim | 13 + sources_non_forked/vim-go/doc/vim-go.txt | 3 +- .../vim-go/gosnippets/UltiSnips/go.snippets | 8 + .../vim-go/gosnippets/snippets/go.snip | 7 + sources_non_forked/vim-go/plugin/go.vim | 2 +- sources_non_forked/vim-go/scripts/runtest.vim | 81 ++ sources_non_forked/vim-go/scripts/test.sh | 86 +- sources_non_forked/vim-go/syntax/go.vim | 14 +- sources_non_forked/vim-go/t/coverlay.vim | 191 ---- .../vim-go/t/fixtures/src/buildfail/sample.go | 13 - .../t/fixtures/src/buildfail/sample_test.go | 7 - .../t/fixtures/src/buildtestfail/sample.go | 7 - .../fixtures/src/buildtestfail/sample_test.go | 15 - .../vim-go/t/fixtures/src/failtest/sample.go | 12 - .../t/fixtures/src/failtest/sample_test.go | 8 - .../vim-go/t/fixtures/src/parsefail/sample.go | 14 - .../t/fixtures/src/parsefail/sample_test.go | 7 - .../vim-go/t/fixtures/src/pkg1/sample.go | 12 - .../vim-go/t/fixtures/src/pkg1/sample.out | 6 - .../vim-go/t/fixtures/src/pkg1/sample_test.go | 7 - sources_non_forked/vim-pug/README.markdown | 2 + sources_non_forked/vim-pug/syntax/pug.vim | 5 +- sources_non_forked/vim-snippets/README.md | 6 +- .../vim-snippets/UltiSnips/all.snippets | 10 +- .../vim-snippets/UltiSnips/c.snippets | 20 +- .../UltiSnips/coffee-react.snippets | 24 +- .../vim-snippets/UltiSnips/cpp.snippets | 4 +- .../vim-snippets/UltiSnips/crystal.snippets | 13 + .../vim-snippets/UltiSnips/cs.snippets | 2 +- .../vim-snippets/UltiSnips/css.snippets | 6 - .../vim-snippets/UltiSnips/d.snippets | 110 +- .../vim-snippets/UltiSnips/django.snippets | 36 +- .../vim-snippets/UltiSnips/eruby.snippets | 14 +- .../vim-snippets/UltiSnips/go.snippets | 2 +- .../vim-snippets/UltiSnips/html.snippets | 98 +- .../UltiSnips/html_minimal.snippets | 12 +- .../UltiSnips/htmldjango.snippets | 112 +- .../vim-snippets/UltiSnips/java.snippets | 6 +- .../UltiSnips/javascript-angular.snippets | 14 +- .../UltiSnips/javascript-node.snippets | 24 +- .../UltiSnips/javascript-openui5.snippets | 272 ++--- .../UltiSnips/javascript.snippets | 88 +- .../UltiSnips/php-laravel.snippets | 18 +- .../UltiSnips/php-phpspec.snippets | 28 +- .../UltiSnips/php-symfony2.snippets | 48 +- .../vim-snippets/UltiSnips/php.snippets | 2 +- .../vim-snippets/UltiSnips/proto.snippets | 6 +- .../vim-snippets/UltiSnips/puppet.snippets | 50 +- .../vim-snippets/UltiSnips/python.snippets | 2 +- .../vim-snippets/UltiSnips/r.snippets | 32 +- .../vim-snippets/UltiSnips/rails.snippets | 36 +- .../vim-snippets/UltiSnips/rst.snippets | 20 +- .../vim-snippets/UltiSnips/rust.snippets | 40 +- .../UltiSnips/supercollider.snippets | 2 +- .../vim-snippets/UltiSnips/tcl.snippets | 14 +- .../vim-snippets/UltiSnips/tex.snippets | 18 +- .../vim-snippets/UltiSnips/vim.snippets | 4 +- .../snippets/actionscript.snippets | 6 +- .../vim-snippets/snippets/ada.snippets | 10 +- .../vim-snippets/snippets/apache.snippets | 8 +- .../vim-snippets/snippets/arduino.snippets | 2 +- .../vim-snippets/snippets/awk.snippets | 4 +- .../vim-snippets/snippets/c.snippets | 14 +- .../snippets/coffee/coffee.snippets | 8 +- .../vim-snippets/snippets/crystal.snippets | 82 ++ .../vim-snippets/snippets/cs.snippets | 14 +- .../vim-snippets/snippets/css.snippets | 10 +- .../vim-snippets/snippets/d.snippets | 6 +- .../vim-snippets/snippets/dart.snippets | 4 +- .../vim-snippets/snippets/eelixir.snippets | 4 +- .../vim-snippets/snippets/elixir.snippets | 14 +- .../vim-snippets/snippets/elm.snippets | 2 +- .../vim-snippets/snippets/erlang.snippets | 2 +- .../vim-snippets/snippets/eruby.snippets | 2 +- .../vim-snippets/snippets/go.snippets | 27 +- .../vim-snippets/snippets/haml.snippets | 4 +- .../vim-snippets/snippets/handlebars.snippets | 6 +- .../vim-snippets/snippets/html.snippets | 4 +- .../snippets/htmltornado.snippets | 2 +- .../vim-snippets/snippets/java.snippets | 4 +- .../snippets/javascript-mocha.snippets | 34 +- .../snippets/javascript.es6.react.snippets | 2 +- .../javascript/javascript.es6.snippets | 16 +- .../snippets/javascript/javascript.snippets | 127 +-- .../vim-snippets/snippets/julia.snippets | 2 +- .../vim-snippets/snippets/ls.snippets | 2 +- .../vim-snippets/snippets/make.snippets | 8 +- .../vim-snippets/snippets/mako.snippets | 2 +- .../vim-snippets/snippets/mustache.snippets | 6 +- .../vim-snippets/snippets/php.snippets | 123 ++- .../vim-snippets/snippets/processing.snippets | 4 +- .../vim-snippets/snippets/python.snippets | 26 +- .../vim-snippets/snippets/rst.snippets | 4 +- .../vim-snippets/snippets/ruby.snippets | 14 +- .../vim-snippets/snippets/rust.snippets | 14 +- .../vim-snippets/snippets/sass.snippets | 993 +++++++++++++++++- .../vim-snippets/snippets/scala.snippets | 16 +- .../vim-snippets/snippets/sh.snippets | 12 +- .../vim-snippets/snippets/tex.snippets | 11 +- .../vim-snippets/snippets/twig.snippets | 8 +- .../vim-snippets/snippets/vim.snippets | 10 +- .../vim-snippets/snippets/zsh.snippets | 20 +- 141 files changed, 2790 insertions(+), 1630 deletions(-) create mode 100644 sources_non_forked/vim-go/.travis.yml create mode 100644 sources_non_forked/vim-go/Makefile delete mode 100644 sources_non_forked/vim-go/Rakefile create mode 100644 sources_non_forked/vim-go/autoload/go/def_test.vim create mode 100644 sources_non_forked/vim-go/autoload/go/fmt_test.vim create mode 100644 sources_non_forked/vim-go/autoload/go/test-fixtures/def/jump.go create mode 100644 sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello.go create mode 100644 sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go create mode 100644 sources_non_forked/vim-go/scripts/runtest.vim delete mode 100644 sources_non_forked/vim-go/t/coverlay.vim delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/buildfail/sample.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/buildfail/sample_test.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample_test.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/failtest/sample.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/failtest/sample_test.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/parsefail/sample.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/parsefail/sample_test.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.go delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.out delete mode 100644 sources_non_forked/vim-go/t/fixtures/src/pkg1/sample_test.go create mode 100644 sources_non_forked/vim-snippets/UltiSnips/crystal.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/crystal.snippets diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index fc8b8830..65589393 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -303,7 +303,6 @@ fu! s:match_window_opts() let s:mw_res = \ s:mw =~ 'results:[^,]\+' ? str2nr(matchstr(s:mw, 'results:\zs\d\+')) \ : min([s:mw_max, &lines]) - let s:mw_res = max([s:mw_res, 1]) endf "}}}1 " * Open & Close {{{1 @@ -1995,9 +1994,14 @@ fu! s:bufnrfilpath(line) en let filpath = fnamemodify(filpath, ':p') let bufnr = bufnr('^'.filpath.'$') - if (a:line =~ '[\/]\?\[\d\+\*No Name\]$' && !filereadable(filpath) && bufnr < 1) - let bufnr = str2nr(matchstr(a:line, '[\/]\?\[\zs\d\+\ze\*No Name\]$')) - let filpath = bufnr + if (!filereadable(filpath) && bufnr < 1) + if (a:line =~ '[\/]\?\[\d\+\*No Name\]$') + let bufnr = str2nr(matchstr(a:line, '[\/]\?\[\zs\d\+\ze\*No Name\]$')) + let filpath = bufnr + else + let bufnr = bufnr(a:line) + retu [bufnr, a:line] + en en retu [bufnr, filpath] endf diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim index 31504dcc..c2294805 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim @@ -137,8 +137,8 @@ fu! ctrlp#tag#id() endf fu! ctrlp#tag#enter() - let tfs = tagfiles() - let s:tagfiles = tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'), + let tfs = get(g:, 'ctrlp_custom_tag_files', tagfiles()) + let s:tagfiles = type(tfs) == 3 && tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'), \ 'filereadable(v:val)') : [] endf "}}} diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt index 1107497b..f703ba4f 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt @@ -148,6 +148,7 @@ The minimum and maximum heights: The maximum number of results: results:{n} - list maximum {n} results (default: sync with max height). + 0 mean no-limit. Note: When a setting isn't set, its default value will be used. @@ -1497,6 +1498,9 @@ Special thanks:~ =============================================================================== CHANGELOG *ctrlp-changelog* + * New option |g:ctrlp_custom_tag_files| to specify custom tag files. + * Accept 0 for g:ctrlp_match_window no-limited window size. + Before 2016/11/28~ + New command: |YankLine()| to yank current line. diff --git a/sources_non_forked/goyo.vim/autoload/goyo.vim b/sources_non_forked/goyo.vim/autoload/goyo.vim index 3e014667..735c950a 100644 --- a/sources_non_forked/goyo.vim/autoload/goyo.vim +++ b/sources_non_forked/goyo.vim/autoload/goyo.vim @@ -122,7 +122,7 @@ function! s:tranquilize() endfunction function! s:hide_statusline() - let &l:statusline = repeat(' ', winwidth(0)) + setlocal statusline=\ endfunction function! s:hide_linenr() @@ -239,7 +239,7 @@ function! s:goyo_on(dim) set showtabline=0 set noruler set fillchars+=vert:\ - set fillchars+=stl:. + set fillchars+=stl:\ set fillchars+=stlnc:\ set sidescroll=1 set sidescrolloff=0 diff --git a/sources_non_forked/nerdtree/lib/nerdtree/path.vim b/sources_non_forked/nerdtree/lib/nerdtree/path.vim index 5f3b16ad..26db4a31 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/path.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/path.vim @@ -301,10 +301,10 @@ endfunction "FUNCTION: Path._escChars() {{{1 function! s:Path._escChars() if nerdtree#runningWindows() - return " `\|\"#%&,?()\*^<>" + return " `\|\"#%&,?()\*^<>$" endif - return " \\`\|\"#%&,?()\*^<>[]" + return " \\`\|\"#%&,?()\*^<>[]$" endfunction "FUNCTION: Path.getDir() {{{1 diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index d8fb584d..48536491 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -3226,7 +3226,7 @@ accepts the standard options described at |syntastic-config-makeprg|. Notes~ -Syntastic requires "Flow" version 0.18.1 or later. +Syntastic requires "Flow" version 0.34.0 or later. To use "Flow" with your projects, you must: diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 2c8bdbad..4e65ea07 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-10' +let g:_SYNTASTIC_VERSION = '3.8.0-21' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 @@ -67,6 +67,15 @@ else endif lockvar g:_SYNTASTIC_UNAME +" XXX Ugly hack to make g:_SYNTASTIC_UNAME available to :SyntasticInfo without +" polluting session namespaces +let g:syntastic_version = + \ g:_SYNTASTIC_VERSION . + \ ' (Vim ' . v:version . (has('nvim') ? ', Neovim' : '') . ', ' . + \ g:_SYNTASTIC_UNAME . + \ (has('gui') ? ', GUI' : '') . ')' +lockvar g:syntastic_version + " }}}1 " Defaults {{{1 @@ -344,13 +353,6 @@ function! s:BufWinEnterHook(fname) abort " {{{2 endfunction " }}}2 function! s:VimEnterHook() abort " {{{2 - let g:syntastic_version = - \ g:_SYNTASTIC_VERSION . - \ ' (Vim ' . v:version . (has('nvim') ? ', Neovim' : '') . ', ' . - \ g:_SYNTASTIC_UNAME . - \ (has('gui') ? ', GUI' : '') . ')' - lockvar g:syntastic_version - let buf = bufnr('') call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, \ 'autocmd: VimEnter, buffer ' . buf . ' = ' . string(bufname(buf)) . ', &buftype = ' . string(&buftype)) diff --git a/sources_non_forked/syntastic/syntax_checkers/erlang/erlang_check_file.erl b/sources_non_forked/syntastic/syntax_checkers/erlang/erlang_check_file.erl index 730e6005..89884345 100644 --- a/sources_non_forked/syntastic/syntax_checkers/erlang/erlang_check_file.erl +++ b/sources_non_forked/syntastic/syntax_checkers/erlang/erlang_check_file.erl @@ -13,28 +13,58 @@ main([File]) -> %% `rebar.config` is looked for, %% but it is not necessarily the one in the project root. %% I.e. it may be one deeper in the project file hierarchy. - RebarFile = rebar_file(Dir), - %% `rebar.config` might contain relative paths. - %% They are relative to the file! Not to the project root. - RebarOpts = rebar_opts(Dir ++ "/" ++ RebarFile), + Profile = which_compile_opts_profile(filename:absname(File)), + CompileOpts = case which_build_tool(Dir, Profile) of + {rebar, RebarFile} -> + %% `rebar.config` might contain relative paths. + %% They are relative to the file! Not to the project root. + %% rebar specific begin + rebar_opts(RebarFile); + %% rebar specific end + {erlangmk, ErlangMkDir} -> + %% Erlang.mk specific begin + erlangmk_opts(ErlangMkDir, Profile); + %% Erlang.mk specific end + undefined -> + fallback_opts() + end, code:add_patha(filename:absname("ebin")), %% `compile:file/2` requires the `{i, Path}` to be relative %% to CWD - no surprise here. - compile:file(File, Defs ++ translate_paths(Dir, RebarOpts)); + compile:file(File, Defs ++ translate_paths(Dir, CompileOpts)); main(_) -> io:format("Usage: ~s <file>~n", [escript:script_name()]), halt(1). -rebar_file(Dir) -> - DirList = filename:split(Dir), - case lists:last(DirList) of - "test" -> - "rebar.test.config"; - _ -> - "rebar.config" +which_compile_opts_profile(File) -> + case filename:basename(filename:dirname(File)) of + "test" -> test; + _ -> normal end. +which_build_tool(Dir, Profile) -> + %% rebar specific begin + RebarFile = rebar_file(Dir, Profile), + %% rebar specific end + case filelib:is_file(RebarFile) of + true -> + {rebar, RebarFile}; + false -> + %% Erlang.mk specific begin + ErlangMk = erlangmk_file(Dir), + %% Erlang.mk specific end + case filelib:is_file(ErlangMk) of + true -> {erlangmk, Dir}; + false -> undefined + end + end. + +rebar_file(Dir, normal) -> filename:join(Dir, "rebar.config"); +rebar_file(Dir, test) -> filename:join(Dir, "rebar.test.config"). + +erlangmk_file(Dir) -> filename:join(Dir, "erlang.mk"). + rebar_opts(RebarFile) -> Dir = get_root(filename:dirname(RebarFile)), case file:consult(RebarFile) of @@ -54,6 +84,165 @@ rebar_opts(RebarFile) -> rebar_opts("rebar.config") end. +erlangmk_opts(BaseDir, Profile) -> + Make = + case os:getenv("MAKE") of + false -> + case os:find_executable("gmake") of + false -> "make"; + Path -> Path + end; + Cmd -> + case (lists:member($/, Cmd) orelse lists:member($\\, Cmd)) of + true -> Cmd; + false -> os:find_executable(Cmd) + end + end, + ERLC_OPTS_Target = + case Profile of + normal -> "show-ERLC_OPTS"; + test -> "show-TEST_ERLC_OPTS" + end, + Args = [ + "--no-print-directory", + "-C", BaseDir, + "show-ERL_LIBS", + ERLC_OPTS_Target + ], + try + Port = erlang:open_port({spawn_executable, Make}, [ + {args, Args}, + exit_status, use_stdio, stderr_to_stdout]), + case erlangmk_port_receive_loop(Port, "", BaseDir) of + {error, _} -> + fallback_opts(); + {ok, {ErlLibs, ErlcOpts}} -> + [code:add_pathsa(filelib:wildcard( + filename:join([ErlLib, "*", "ebin"]))) + || ErlLib <- ErlLibs], + ErlcOpts + end + catch + error:_ -> + fallback_opts() + end. + +erlangmk_port_receive_loop(Port, Stdout, BaseDir) -> + receive + {Port, {exit_status, 0}} -> + erlangmk_format_opts(Stdout, BaseDir); + {Port, {exit_status, _}} -> + {error, {erlangmk, make_target_failure}}; + {Port, {data, Out}} -> + erlangmk_port_receive_loop(Port, Stdout ++ Out, BaseDir) + end. + +erlangmk_format_opts(Stdout, BaseDir) -> + case string:tokens(Stdout, "\n") of + [ErlLibsLine | ErlcOptsLines] -> + ErlLibs = erlangmk_format_erl_libs(ErlLibsLine), + ErlcOpts = erlangmk_format_erlc_opts(ErlcOptsLines, BaseDir), + {ok, {ErlLibs, ErlcOpts}}; + _ -> + {error, {erlangmk, incorrect_output}} + end. + +erlangmk_format_erl_libs(ErlLibsLine) -> + case os:type() of + {win32, _} -> string:tokens(ErlLibsLine, ";"); + _ -> string:tokens(ErlLibsLine, ":") + end. + +erlangmk_format_erlc_opts(ErlcOptsLines, BaseDir) -> + erlangmk_format_erlc_opts(ErlcOptsLines, [], BaseDir). + +erlangmk_format_erlc_opts(["+" ++ Option | Rest], Opts, BaseDir) -> + case make_term(Option) of + {error, _} -> erlangmk_format_erlc_opts(Rest, Opts, BaseDir); + Opt -> erlangmk_format_erlc_opts(Rest, [Opt | Opts], BaseDir) + end; +erlangmk_format_erlc_opts(["-I" ++ Opt | Rest], Opts, BaseDir) + when Opt =/= "" -> + erlangmk_format_erlc_opts(["-I", Opt | Rest], Opts, BaseDir); +erlangmk_format_erlc_opts(["-I", [C | _] = Dir | Rest], Opts, BaseDir) + when C =/= $- andalso C =/= $+ -> + AbsDir = filename:absname(Dir, BaseDir), + erlangmk_format_erlc_opts(Rest, [{i, AbsDir} | Opts], BaseDir); +erlangmk_format_erlc_opts(["-W" ++ Warn | Rest], Opts, BaseDir) + when Warn =/= "" -> + erlangmk_format_erlc_opts(["-W", Warn | Rest], Opts, BaseDir); +erlangmk_format_erlc_opts(["-W", Warn | Rest], Opts, BaseDir) -> + case Warn of + "all" -> + erlangmk_format_erlc_opts(Rest, [{warn_format, 999} | Opts], + BaseDir); + "error" -> + erlangmk_format_erlc_opts(Rest, [warnings_as_errors | Opts], + BaseDir); + "" -> + erlangmk_format_erlc_opts(Rest, [{warn_format, 1} | Opts], + BaseDir); + _ -> + try list_to_integer(Warn) of + Level -> + erlangmk_format_erlc_opts(Rest, + [{warn_format, Level} | Opts], BaseDir) + catch + error:badarg -> + erlangmk_format_erlc_opts(Rest, Opts, BaseDir) + end + end; +erlangmk_format_erlc_opts(["-D" ++ Opt | Rest], Opts, BaseDir) + when Opt =/= "" -> + erlangmk_format_erlc_opts(["-D", Opt | Rest], Opts, BaseDir); +erlangmk_format_erlc_opts(["-D", [C | _] = Val0 | Rest], Opts, BaseDir) + when C =/= $- andalso C =/= $+ -> + {Key0, Val1} = split_at_equals(Val0, []), + Key = list_to_atom(Key0), + case Val1 of + [] -> + erlangmk_format_erlc_opts(Rest, [{d, Key} | Opts], BaseDir); + Val2 -> + case make_term(Val2) of + {error, _} -> + erlangmk_format_erlc_opts(Rest, Opts, BaseDir); + Val -> + erlangmk_format_erlc_opts(Rest, [{d, Key, Val} | Opts], BaseDir) + end + end; +erlangmk_format_erlc_opts([PathFlag, [_ | _] = Dir | Rest], Opts, BaseDir) + when PathFlag =:= "-pa" orelse PathFlag =:= "-pz" -> + AbsDir = filename:absname(Dir, BaseDir), + case PathFlag of + "-pa" -> code:add_patha(AbsDir); + "-pz" -> code:add_pathz(AbsDir) + end, + erlangmk_format_erlc_opts(Rest, Opts, BaseDir); +erlangmk_format_erlc_opts([_ | Rest], Opts, BaseDir) -> + erlangmk_format_erlc_opts(Rest, Opts, BaseDir); +erlangmk_format_erlc_opts([], Opts, _) -> + lists:reverse(Opts). + +%% Function imported from erl_compile.erl from Erlang 19.1. +make_term(Str) -> + case erl_scan:string(Str) of + {ok, Tokens, _} -> + case erl_parse:parse_term(Tokens ++ [{dot, 1}]) of + {ok, Term} -> Term; + {error, Reason} -> {error, Reason} + end; + {error, Reason, _} -> + {error, Reason} + end. + +%% Function imported from erl_compile.erl from Erlang 19.1. +split_at_equals([$=|T], Acc) -> + {lists:reverse(Acc),T}; +split_at_equals([H|T], Acc) -> + split_at_equals(T, [H|Acc]); +split_at_equals([], Acc) -> + {lists:reverse(Acc),[]}. + fallback_opts() -> code:add_pathsa(filelib:wildcard("deps/*/ebin")), code:add_pathsa(nested_app_ebins()), diff --git a/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim b/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim index 789e9f3a..99ab4a17 100644 --- a/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim +++ b/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim @@ -32,9 +32,12 @@ function! SyntaxCheckers_haxe_haxe_GetLocList() dict if hxml !=# '' let makeprg = self.makeprgBuild({ - \ 'fname': syntastic#util#shescape(fnamemodify(hxml, ':t')) }) + \ 'fname': syntastic#util#shescape(fnamemodify(hxml, ':t')), + \ 'args_after' : ['--no-output'] }) - let errorformat = '%E%f:%l: characters %c-%n : %m' + let errorformat = + \ '%W%f:%l: characters %c-%n : Warning : %m,' . + \ '%E%f:%l: characters %c-%n : %m' let loclist = SyntasticMake({ \ 'makeprg': makeprg, diff --git a/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim b/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim index 02826548..456db2b2 100644 --- a/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim +++ b/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim @@ -25,7 +25,7 @@ function! SyntaxCheckers_javascript_flow_IsAvailable() dict if !executable(self.getExec()) return 0 endif - return syntastic#util#versionIsAtLeast(self.getVersion(self.getExecEscaped() . ' version'), [0, 18, 1]) + return syntastic#util#versionIsAtLeast(self.getVersion(self.getExecEscaped() . ' version'), [0, 34]) endfunction function! SyntaxCheckers_javascript_flow_GetLocList() dict @@ -34,8 +34,8 @@ function! SyntaxCheckers_javascript_flow_GetLocList() dict endif let makeprg = self.makeprgBuild({ - \ 'exe': self.getExecEscaped() . ' check', - \ 'args_after': '--show-all-errors --json' }) + \ 'exe': self.getExecEscaped() . ' status', + \ 'args_after': '--quiet --show-all-errors --json' }) let errorformat = \ '%f:%l:%c:%n: %m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim b/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim index a60c2497..8b11d456 100644 --- a/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim +++ b/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim @@ -24,9 +24,12 @@ function! SyntaxCheckers_vala_valac_GetHighlightRegex(pos) " {{{1 endfunction " }}}1 function! SyntaxCheckers_vala_valac_GetLocList() dict " {{{1 - let vala_pkg_args = join(map(s:GetValaModules(), '"--pkg ".v:val'), ' ') - let vala_vapi_args = join(map(s:GetValaVapiDirs(), '"--vapidir ".v:val'), ' ') - let makeprg = self.makeprgBuild({ 'args': '-C ' . vala_pkg_args . ' ' . vala_vapi_args }) + let buf = bufnr('') + let makeprg = self.makeprgBuild({ + \ 'args': '-C ' . + \ s:GetValaOpts(buf, 'modules', 'modules', '--pkg') . ' ' . + \ s:GetValaOpts(buf, 'vapi_dirs', 'vapidirs', '--vapidir'), + \ }) let errorformat = \ '%A%f:%l.%c-%\d%\+.%\d%\+: %t%[a-z]%\+: %m,'. @@ -40,38 +43,27 @@ endfunction " }}}1 " Utilities {{{1 -function! s:GetValaModules() " {{{2 - if exists('g:syntastic_vala_modules') || exists('b:syntastic_vala_modules') - let modules = syntastic#util#var('vala_modules') - if type(modules) == type('') - return split(modules, '\m\s\+') - elseif type(modules) == type([]) - return copy(modules) +function! s:GetValaOpts(buf, name, comment, cmd) " {{{2 + let var = syntastic#util#var('vala_' . a:name) + if type(var) == type([]) + let opts = map(copy(var), 'syntastic#util#shescape(v:val)') + elseif type(var) == type('') + if var !=# '' + let opts = split(var, '\s\+') else - echoerr 'syntastic_vala_modules must be either list or string: fallback to in file modules string' + let opts = [] + for line in filter(getbufline(a:buf, 1, 100), 'v:val =~# ' . string('\m^//\s\+' . a:comment . ':\s*')) + call extend(opts, split( matchstr(line, '\m^//\s\+' . a:comment . ':\s*\zs.*'), '\s\+' )) + endfor + + call map( filter(opts, 'v:val !=# ""'), 'syntastic#util#shescape(v:val)' ) endif + else + call syntastic#log#error('syntastic_vala_' . a:name . ' must be either a list, or a string') + return '' endif - let modules_line = search('^// modules: ', 'n') - let modules_str = getline(modules_line) - return split(strpart(modules_str, 12), '\m\s\+') -endfunction " }}}2 - -function! s:GetValaVapiDirs() " {{{2 - if exists('g:syntastic_vala_vapi_dirs') || exists('b:syntastic_vala_vapi_dirs') - let vapi_dirs = syntastic#util#var('vala_vapi_dirs') - if type(vapi_dirs) == type('') - return split(vapi_dirs, '\m\s\+') - elseif type(vapi_dirs) == type([]) - return copy(vapi_dirs) - else - echoerr 'syntastic_vala_vapi_dirs must be either a list, or a string: fallback to in-file modules string' - endif - endif - - let vapi_line = search('^//\s*vapidirs:\s*','n') - let vapi_str = getline(vapi_line) - return split( substitute( vapi_str, '\m^//\s*vapidirs:\s*', '', 'g' ), '\m\s\+' ) + return join(map(opts, string(a:cmd . ' ') . ' . v:val')) endfunction " }}}2 " }}}1 diff --git a/sources_non_forked/vim-coffee-script/after/indent/html.vim b/sources_non_forked/vim-coffee-script/after/indent/html.vim index 2fa86371..0823e689 100644 --- a/sources_non_forked/vim-coffee-script/after/indent/html.vim +++ b/sources_non_forked/vim-coffee-script/after/indent/html.vim @@ -18,7 +18,7 @@ setlocal indentexpr=GetCoffeeHtmlIndent(v:lnum) function! GetCoffeeHtmlIndent(curlinenum) " See if we're inside a coffeescript block. - let scriptlnum = searchpair('<script [^>]*type="text/coffeescript"[^>]*>', '', + let scriptlnum = searchpair('<script [^>]*type=[''"]\?text/coffeescript[''"]\?[^>]*>', '', \ '</script>', 'bWn') let prevlnum = prevnonblank(a:curlinenum) diff --git a/sources_non_forked/vim-coffee-script/after/syntax/html.vim b/sources_non_forked/vim-coffee-script/after/syntax/html.vim index aa01e7e9..a78ba88d 100644 --- a/sources_non_forked/vim-coffee-script/after/syntax/html.vim +++ b/sources_non_forked/vim-coffee-script/after/syntax/html.vim @@ -9,7 +9,7 @@ endif " Syntax highlighting for text/coffeescript script tags syn include @htmlCoffeeScript syntax/coffee.vim -syn region coffeeScript start=#<script [^>]*type="text/coffeescript"[^>]*># +syn region coffeeScript start=#<script [^>]*type=['"]\?text/coffeescript['"]\?[^>]*># \ end=#</script>#me=s-1 keepend \ contains=@htmlCoffeeScript,htmlScriptTag,@htmlPreproc \ containedin=htmlHead diff --git a/sources_non_forked/vim-coffee-script/test/test.html b/sources_non_forked/vim-coffee-script/test/test.html index 34791453..0da7b62d 100644 --- a/sources_non_forked/vim-coffee-script/test/test.html +++ b/sources_non_forked/vim-coffee-script/test/test.html @@ -4,4 +4,14 @@ def: 42 } </script> + <script type='text/coffeescript'> + abc = { + def: 42 + } + </script> + <script type=text/coffeescript> + abc = { + def: 42 + } + </script> </head> diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index 576dda19..1185ff15 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -195,7 +195,7 @@ function! fugitive#detect(path) abort nnoremap <buffer> <silent> y<C-G> :call setreg(v:register, <SID>recall())<CR> endif let buffer = fugitive#buffer() - if expand('%:p') =~# '//' + if expand('%:p') =~# '://' call buffer.setvar('&path', s:sub(buffer.getvar('&path'), '^\.%(,|$)', '')) endif if stridx(buffer.getvar('&tags'), escape(b:git_dir, ', ')) == -1 @@ -700,7 +700,11 @@ function! s:Git(bang, args) abort let args = matchstr(a:args,'\v\C.{-}%($|\\@<!%(\\\\)*\|)@=') if exists(':terminal') let dir = s:repo().tree() - -tabedit % + if expand('%') != '' + -tabedit % + else + -tabnew + endif execute 'lcd' fnameescape(dir) execute 'terminal' git args else @@ -2295,9 +2299,9 @@ function! s:Browse(bang,line1,count,...) abort if empty(remote) let remote = '.' - let raw = s:repo().git_chomp('config','remote.origin.url') + let raw = s:repo().git_chomp('remote','get-url','origin') else - let raw = s:repo().git_chomp('config','remote.'.remote.'.url') + let raw = s:repo().git_chomp('remote','get-url',remote) endif if raw ==# '' let raw = remote diff --git a/sources_non_forked/vim-go/.gitignore b/sources_non_forked/vim-go/.gitignore index bdeb2b82..4449737b 100644 --- a/sources_non_forked/vim-go/.gitignore +++ b/sources_non_forked/vim-go/.gitignore @@ -1,2 +1,6 @@ doc/tags .DS_Store + +# Test specific files +FAILED +test.log diff --git a/sources_non_forked/vim-go/.travis.yml b/sources_non_forked/vim-go/.travis.yml new file mode 100644 index 00000000..a5ee1559 --- /dev/null +++ b/sources_non_forked/vim-go/.travis.yml @@ -0,0 +1,22 @@ +language: go + +env: + global: + - DEPS=$HOME/deps + - PATH=$DEPS/bin:$PATH + - PATCH="v8.0.0134" + +install: | + git config --global user.email "you@example.com" + git config --global user.name "Your Name" + + # check out if we can pre-compiled Vim releases somehow, + git clone --branch $PATCH --depth 1 https://github.com/vim/vim + cd vim + ./configure --prefix=$DEPS --with-features=huge --disable-gui + make + make install + cd - + +script: ./scripts/test.sh + diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 0a6be1cf..b2f47f58 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -1,7 +1,33 @@ -## 1.11 - Unplanned +## unplanned FEATURES: +* Add new `errl` snippet that expands to [gh-1185]: + +``` +if err != nil { + log.Fatal(err) +} +``` + +IMPROVEMENTS: + +* Lowercase `<Leader>` in mappings examples for consisten documentation across the README [gh-1192] +* All of files should be written in utf-8 if the file will be passed to external command. [gh-1184] + +BUG FIXES: + +* Honor `g:go_echo_command_info` when dispatching builds in neovim [gh-1176] +* Fix `:GoBuild` error in neovim due to invalid jobcontrol handler function signatures (`s:on_stdout`, `s:on_stderr`)[gh-1176] +* Update statusline before and after `go#jobcontrol#Spawn` command is executed [gh-1176] +* Correctly report the value of the 'g:go_guru_tags' variable [gh-1177] +* Ensure no trailing `:` exist in GOPATH detection if initial GOPATH is not set [gh-1194] + +## 1.11 - (January 9, 2017) + +FEATURES: + +* Travis test integration has been added. Now any file that is added as `<name>_test.vim` will be automatically tested in for every Pull Request (just like how we add tests to Go with `_test.go`). Going forward this will tremendously increase the stability and decrease the maintaince burden of vim-go. [gh-1157] * Add new `g:go_updatetime` setting to change the default updatetime (which was hardcoded previously) [gh-1055] * Add new `g:go_template_use_pkg` setting to enable to use cwd as package name instead of basic template file [gh-1124] @@ -9,6 +35,8 @@ IMPROVEMENTS: * Add `statusline` support for `:GoMetaLinter` [gh-1120] * Quickfix and Location lists contain now a descriptive title (requires at least Vim `7.4.2200`)[gh-1004] +* Check `go env GOPATH` as well for `:GoInstallBinaries` as Go has now a default path for GOPATH ("~/go")starting with 1.8 [gh-1152] +* `:GoDocBrowser` now also works on import paths [gh-1174] BUG FIXES: @@ -24,6 +52,22 @@ BUG FIXES: * Fix referencing a non defined variable for async commands when bang (!) was used * Fix `:GoDef` failing for a modified buffer if `hidden` was not set [gh-1132] * Fix `:GoDefStack` to allow popping from jump list when buffer is modified [gh-1133] +* Improve internal defining of functions and referencing them for async operations [gh-1155] +* Fix `:GoMetaLinter` failing if `go_metalinter_command` is set. [gh-1160] +* Fix `:GoMetaLinter`'s `go_metalinter_deadline` setting for async mode [gh-1146] + +BACKWARDS INCOMPATIBILITIES: + +* The following syntax options are now disabled by default. If you're using them be sure to set them in your .vimrc [gh-1167] + +```viml +g:go_highlight_array_whitespace_error +g:go_highlight_chan_whitespace_error +g:go_highlight_extra_types +g:go_highlight_space_tab_error +g:go_highlight_trailing_whitespace_error +``` + ## 1.10 (November 24, 2016) diff --git a/sources_non_forked/vim-go/Makefile b/sources_non_forked/vim-go/Makefile new file mode 100644 index 00000000..20b296d7 --- /dev/null +++ b/sources_non_forked/vim-go/Makefile @@ -0,0 +1,7 @@ +all: test + +test: + @echo "==> Running tests" + @./scripts/test.sh + +.PHONY: all test diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md index 504149b2..b5542fb5 100644 --- a/sources_non_forked/vim-go/README.md +++ b/sources_non_forked/vim-go/README.md @@ -1,4 +1,4 @@ -# vim-go +# vim-go [![Build Status](http://img.shields.io/travis/fatih/vim-go.svg?style=flat-square)](https://travis-ci.org/fatih/vim-go) <p align="center"> <img style="float: right;" src="assets/vim-go.png" alt="Vim-go logo"/> @@ -137,43 +137,43 @@ current buffer. You can also open the definition/declaration, in a new vertical, horizontal, or tab, for the word under your cursor: ```vim -au FileType go nmap <Leader>ds <Plug>(go-def-split) -au FileType go nmap <Leader>dv <Plug>(go-def-vertical) -au FileType go nmap <Leader>dt <Plug>(go-def-tab) +au FileType go nmap <leader>ds <Plug>(go-def-split) +au FileType go nmap <leader>dv <Plug>(go-def-vertical) +au FileType go nmap <leader>dt <Plug>(go-def-tab) ``` Open the relevant Godoc for the word under the cursor with `<leader>gd` or open it vertically with `<leader>gv` ```vim -au FileType go nmap <Leader>gd <Plug>(go-doc) -au FileType go nmap <Leader>gv <Plug>(go-doc-vertical) +au FileType go nmap <leader>gd <Plug>(go-doc) +au FileType go nmap <leader>gv <Plug>(go-doc-vertical) ``` Or open the Godoc in browser ```vim -au FileType go nmap <Leader>gb <Plug>(go-doc-browser) +au FileType go nmap <leader>gb <Plug>(go-doc-browser) ``` Show a list of interfaces which is implemented by the type under your cursor with `<leader>s` ```vim -au FileType go nmap <Leader>s <Plug>(go-implements) +au FileType go nmap <leader>s <Plug>(go-implements) ``` Show type info for the word under your cursor with `<leader>i` (useful if you have disabled auto showing type info via `g:go_auto_type_info`) ```vim -au FileType go nmap <Leader>i <Plug>(go-info) +au FileType go nmap <leader>i <Plug>(go-info) ``` Rename the identifier under the cursor to a new name ```vim -au FileType go nmap <Leader>e <Plug>(go-rename) +au FileType go nmap <leader>e <Plug>(go-rename) ``` More `<Plug>` mappings can be seen with `:he go-mappings`. Also these are just @@ -245,8 +245,8 @@ Run `:GoRun` in a new tab, horizontal split or vertical split terminal ```vim au FileType go nmap <leader>rt <Plug>(go-run-tab) -au FileType go nmap <Leader>rs <Plug>(go-run-split) -au FileType go nmap <Leader>rv <Plug>(go-run-vertical) +au FileType go nmap <leader>rs <Plug>(go-run-split) +au FileType go nmap <leader>rv <Plug>(go-run-vertical) ``` By default new terminals are opened in a vertical split. To change it @@ -288,6 +288,31 @@ information. It includes section](https://github.com/fatih/vim-go/wiki/FAQ-Troubleshooting), and many other [various pieces](https://github.com/fatih/vim-go/wiki) of information. +## Development & Testing + +vim-go supports now test files. Please check `autoload` folder for examples. If +you add a new feature be sure you also include the `_test.vim` file next to the +script. Test functions should be starting with `Test_`, example: + + +```viml +function Test_run_fmt() + call assert_equal(expected, actual) + ... +endfunction +``` + +You can locally test it by running: + +``` +make +``` + +This will run all tests and print either `PASS` or `FAIL` to indicate the final +status of all tests. + +Additionally, each new pull request will trigger a new Travis-ci job. + ## Donation People have asked for this for a long time, now you can be a fully supporter by diff --git a/sources_non_forked/vim-go/Rakefile b/sources_non_forked/vim-go/Rakefile deleted file mode 100644 index 64346ff0..00000000 --- a/sources_non_forked/vim-go/Rakefile +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env rake - -task :ci => [:dump, :test] - -task :dump do - sh 'vim --version' -end - -# Firstly, `bundle install; bundle install --deployment` -# Then, `rake test` -task :test do - sh 'bundle exec vim-flavor test' -end diff --git a/sources_non_forked/vim-go/autoload/go/asmfmt.vim b/sources_non_forked/vim-go/autoload/go/asmfmt.vim index 07779b57..cc8acd3b 100644 --- a/sources_non_forked/vim-go/autoload/go/asmfmt.vim +++ b/sources_non_forked/vim-go/autoload/go/asmfmt.vim @@ -25,7 +25,7 @@ function! go#asmfmt#Format() abort " Write the current buffer to a tempfile. let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) + call writefile(go#util#GetLines(), l:tmpname) " Run asmfmt. let path = go#path#CheckBinPath("asmfmt") diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index e7a5daf7..fbc62823 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -32,8 +32,11 @@ function! go#cmd#Build(bang, ...) abort \}) return elseif has('nvim') + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("building dispatched ...") + endif + " if we have nvim, call it asynchronously and return early ;) - call go#util#EchoProgress("building dispatched ...") call go#jobcontrol#Spawn(a:bang, "build", args) return endif @@ -419,7 +422,7 @@ function s:cmd_job(args) abort call go#statusline#Update(status_dir, status) endfunction - let a:args.error_info_cb = function('s:error_info_cb') + let a:args.error_info_cb = funcref('s:error_info_cb') let callbacks = go#job#Spawn(a:args) let start_options = { diff --git a/sources_non_forked/vim-go/autoload/go/complete.vim b/sources_non_forked/vim-go/autoload/go/complete.vim index 2663afbd..2bd4eae7 100644 --- a/sources_non_forked/vim-go/autoload/go/complete.vim +++ b/sources_non_forked/vim-go/autoload/go/complete.vim @@ -1,18 +1,8 @@ let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix' function! s:gocodeCurrentBuffer() abort - let buf = getline(1, '$') - if &encoding != 'utf-8' - let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")') - endif - if &l:fileformat == 'dos' - " XXX: line2byte() depend on 'fileformat' option. - " so if fileformat is 'dos', 'buf' must include '\r'. - let buf = map(buf, 'v:val."\r"') - endif let file = tempname() - call writefile(buf, file) - + call writefile(go#util#GetLines(), file) return file endfunction diff --git a/sources_non_forked/vim-go/autoload/go/coverage.vim b/sources_non_forked/vim-go/autoload/go/coverage.vim index 9b027861..56113b93 100644 --- a/sources_non_forked/vim-go/autoload/go/coverage.vim +++ b/sources_non_forked/vim-go/autoload/go/coverage.vim @@ -283,7 +283,7 @@ function s:coverage_job(args) call go#statusline#Update(status_dir, status) endfunction - let a:args.error_info_cb = function('s:error_info_cb') + let a:args.error_info_cb = funcref('s:error_info_cb') let callbacks = go#job#Spawn(a:args) let start_options = { diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim index d3b51c26..cf7c5c4a 100644 --- a/sources_non_forked/vim-go/autoload/go/def.vim +++ b/sources_non_forked/vim-go/autoload/go/def.vim @@ -16,7 +16,7 @@ function! go#def#Jump(mode) abort if &modified " Write current unsaved buffer to a temp file and use the modified content let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) + call writefile(go#util#GetLines(), l:tmpname) let fname = l:tmpname endif @@ -41,8 +41,7 @@ function! go#def#Jump(mode) abort let stdin_content = "" if &modified - let sep = go#util#LineEnding() - let content = join(getline(1, '$'), sep) + let content = join(go#util#GetLines(), "\n") let stdin_content = fname . "\n" . strlen(content) . "\n" . content call add(cmd, "-modified") endif @@ -87,7 +86,7 @@ function! go#def#Jump(mode) abort return endif - call s:jump_to_declaration(out, a:mode, bin_name) + call go#def#jump_to_declaration(out, a:mode, bin_name) let $GOPATH = old_gopath endfunction @@ -96,10 +95,10 @@ function! s:jump_to_declaration_cb(mode, bin_name, job, exit_status, data) abort return endif - call s:jump_to_declaration(a:data[0], a:mode, a:bin_name) + call go#def#jump_to_declaration(a:data[0], a:mode, a:bin_name) endfunction -function! s:jump_to_declaration(out, mode, bin_name) abort +function! go#def#jump_to_declaration(out, mode, bin_name) abort let final_out = a:out if a:bin_name == "godef" " append the type information to the same line so our we can parse it. @@ -299,7 +298,7 @@ function s:def_job(args) abort " do not print anything during async definition search&jump endfunction - let a:args.error_info_cb = function('s:error_info_cb') + let a:args.error_info_cb = funcref('s:error_info_cb') let callbacks = go#job#Spawn(a:args) let start_options = { diff --git a/sources_non_forked/vim-go/autoload/go/def_test.vim b/sources_non_forked/vim-go/autoload/go/def_test.vim new file mode 100644 index 00000000..a5ed24fe --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/def_test.vim @@ -0,0 +1,32 @@ +func Test_jump_to_declaration_guru() + let file_name = "test-fixtures/def/jump.go" + let lnum = 5 + let col = 6 + + let out = printf("%s:%d:%d: defined here as func main", file_name, lnum, col) + let bin_name = "guru" + + call go#def#jump_to_declaration(out, "", bin_name) + + call assert_equal(file_name, bufname("%")) + call assert_equal(lnum, getcurpos()[1]) + call assert_equal(col, getcurpos()[2]) +endfunc + +func Test_jump_to_declaration_godef() + let file_name = "test-fixtures/def/jump.go" + let lnum = 5 + let col = 6 + + " note that the output of godef has two lines + let out = printf("%s:%d:%d\ndefined here as func main", file_name, lnum, col) + let bin_name = "godef" + + call go#def#jump_to_declaration(out, "", bin_name) + + call assert_equal(file_name, bufname("%")) + call assert_equal(lnum, getcurpos()[1]) + call assert_equal(col, getcurpos()[2]) +endfunc + +" vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/doc.vim b/sources_non_forked/vim-go/autoload/go/doc.vim index 3756167d..22ea8cc7 100644 --- a/sources_non_forked/vim-go/autoload/go/doc.vim +++ b/sources_non_forked/vim-go/autoload/go/doc.vim @@ -31,12 +31,11 @@ function! go#doc#OpenBrowser(...) abort let import = out["import"] let name = out["name"] - - " if import is empty, it means we selected a package name - if import ==# "" - let godoc_url = "https://godoc.org/" . name - else - let godoc_url = "https://godoc.org/" . import . "#" . name + let decl = out["decl"] + + let godoc_url = "https://godoc.org/" . import + if decl !~ "^package" + let godoc_url .= "#" . name endif echo godoc_url @@ -153,8 +152,7 @@ function! s:gogetdoc(json) abort " file size followed by newline " file contents let in = "" - let sep = go#util#LineEnding() - let content = join(getline(1, '$'), sep) + let content = join(go#util#GetLines(), "\n") let in = fname . "\n" . strlen(content) . "\n" . content let command .= " -modified" let out = go#util#System(command, in) diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim index 391fca93..8a327d3b 100644 --- a/sources_non_forked/vim-go/autoload/go/fmt.vim +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim @@ -2,26 +2,8 @@ " Use of this source code is governed by a BSD-style " license that can be found in the LICENSE file. " -" fmt.vim: Vim command to format Go files with gofmt. -" -" This filetype plugin add a new commands for go buffers: -" -" :Fmt -" -" Filter the current Go buffer through gofmt. -" It tries to preserve cursor position and avoids -" replacing the buffer with stderr output. -" -" Options: -" -" g:go_fmt_command [default="gofmt"] -" -" Flag naming the gofmt executable to use. -" -" g:go_fmt_autosave [default=1] -" -" Flag to auto call :Fmt when saved file -" +" fmt.vim: Vim command to format Go files with gofmt (and gofmt compatible +" toorls, such as goimports). if !exists("g:go_fmt_command") let g:go_fmt_command = "gofmt" @@ -67,6 +49,13 @@ function! go#fmt#Format(withGoimport) abort catch let l:curw = winsaveview() endtry + + " save our undo file to be restored after we are done. This is needed to + " prevent an additional undo jump due to BufWritePre auto command and also + " restore 'redo' history because it's getting being destroyed every + " BufWritePre + let tmpundofile = tempname() + exe 'wundo! ' . tmpundofile else " Save cursor position and many other things. let l:curw = winsaveview() @@ -74,135 +63,32 @@ function! go#fmt#Format(withGoimport) abort " Write current unsaved buffer to a temp file let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) - - if g:go_fmt_experimental == 1 - " save our undo file to be restored after we are done. This is needed to - " prevent an additional undo jump due to BufWritePre auto command and also - " restore 'redo' history because it's getting being destroyed every - " BufWritePre - let tmpundofile = tempname() - exe 'wundo! ' . tmpundofile - endif - - " get the command first so we can test it - let bin_name = g:go_fmt_command - if a:withGoimport == 1 - let bin_name = g:go_goimports_bin - endif - - " check if the user has installed command binary. - " For example if it's goimports, let us check if it's installed, - " if not the user get's a warning via go#path#CheckBinPath() - let bin_path = go#path#CheckBinPath(bin_name) - if empty(bin_path) - return - endif - - if bin_name != "gofmt" - " change GOPATH too, so goimports can pick up the correct library - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() - endif - - " populate the final command with user based fmt options - let command = bin_path . ' -w ' - if a:withGoimport != 1 - let command = command . g:go_fmt_options - endif - - if bin_name == "goimports" - if !exists('b:goimports_vendor_compatible') - let out = go#util#System(bin_path . " --help") - if out !~ "-srcdir" - call go#util#EchoWarning(printf("vim-go: goimports (%s) does not support srcdir. Update with: :GoUpdateBinaries", bin_path)) - else - let b:goimports_vendor_compatible = 1 - endif - endif - - if exists('b:goimports_vendor_compatible') && b:goimports_vendor_compatible - let ssl_save = &shellslash - set noshellslash - let command = command . '-srcdir ' . shellescape(expand("%:p")) - let &shellslash = ssl_save - endif - endif - - " execute our command... + call writefile(go#util#GetLines(), l:tmpname) if go#util#IsWin() let l:tmpname = tr(l:tmpname, '\', '/') endif - let out = go#util#System(command . " " . l:tmpname) - if bin_name != "gofmt" - let $GOPATH = old_gopath + let bin_name = g:go_fmt_command + if a:withGoimport == 1 + let bin_name = g:go_goimports_bin endif - let l:listtype = "locationlist" - "if there is no error on the temp file replace the output with the current - "file (if this fails, we can always check the outputs first line with: - "splitted =~ 'package \w\+') + let out = go#fmt#run(bin_name, l:tmpname, expand('%')) if go#util#ShellError() == 0 - " remove undo point caused via BufWritePre - try | silent undojoin | catch | endtry - - " Replace current file with temp file, then reload buffer - let old_fileformat = &fileformat - if exists("*getfperm") - " save old file permissions - let original_fperm = getfperm(expand('%')) - endif - call rename(l:tmpname, expand('%')) - " restore old file permissions - if exists("*setfperm") && original_fperm != '' - call setfperm(expand('%'), original_fperm) - endif - silent edit! - let &fileformat = old_fileformat - let &syntax = &syntax - - " clean up previous location list, but only if it's due to fmt - if exists('b:got_fmt_error') && b:got_fmt_error - let b:got_fmt_error = 0 - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) - endif + call go#fmt#update_file(l:tmpname, expand('%')) elseif g:go_fmt_fail_silently == 0 - let splitted = split(out, '\n') - "otherwise get the errors and put them to location list - let errors = [] - for line in splitted - let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') - if !empty(tokens) - call add(errors, {"filename": @%, - \"lnum": tokens[2], - \"col": tokens[3], - \"text": tokens[4]}) - endif - endfor - if empty(errors) - % | " Couldn't detect gofmt error format, output errors - endif - if !empty(errors) - call go#list#Populate(l:listtype, errors, 'Format') - echohl Error | echomsg "Gofmt returned error" | echohl None - endif - - let b:got_fmt_error = 1 - call go#list#Window(l:listtype, len(errors)) - - " We didn't use the temp file, so clean up - call delete(l:tmpname) + let errors = s:parse_errors(out) + call s:show_errors(errors) endif + " We didn't use the temp file, so clean up + call delete(l:tmpname) + if g:go_fmt_experimental == 1 " restore our undo history silent! exe 'rundo ' . tmpundofile call delete(tmpundofile) - endif - if g:go_fmt_experimental == 1 " Restore our cursor/windows positions, folds, etc. if empty(l:curw) silent! loadview @@ -215,6 +101,134 @@ function! go#fmt#Format(withGoimport) abort endif endfunction +" update_file updates the target file with the given formatted source +function! go#fmt#update_file(source, target) + " remove undo point caused via BufWritePre + try | silent undojoin | catch | endtry + + let old_fileformat = &fileformat + if exists("*getfperm") + " save file permissions + let original_fperm = getfperm(a:target) + endif + + call rename(a:source, a:target) + + " restore file permissions + if exists("*setfperm") && original_fperm != '' + call setfperm(a:target , original_fperm) + endif + + " reload buffer to reflect latest changes + silent! edit! + + let &fileformat = old_fileformat + let &syntax = &syntax + + " clean up previous location list + let l:listtype = "locationlist" + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) +endfunction + +" run runs the gofmt/goimport command for the given source file and returns +" the the output of the executed command. Target is the real file to be +" formated. +function! go#fmt#run(bin_name, source, target) + let cmd = s:fmt_cmd(a:bin_name, a:source, a:target) + if cmd[0] == "goimports" + " change GOPATH too, so goimports can pick up the correct library + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + endif + + let command = join(cmd, " ") + + " execute our command... + let out = go#util#System(command) + + if cmd[0] == "goimports" + let $GOPATH = old_gopath + endif + + return out +endfunction + +" fmt_cmd returns a dict that contains the command to execute gofmt (or +" goimports). args is dict with +function! s:fmt_cmd(bin_name, source, target) + " check if the user has installed command binary. + " For example if it's goimports, let us check if it's installed, + " if not the user get's a warning via go#path#CheckBinPath() + let bin_path = go#path#CheckBinPath(a:bin_name) + if empty(bin_path) + return + endif + + " start constructing the command + let cmd = [bin_path] + call add(cmd, "-w") + + if a:bin_name != "goimports" + call extend(cmd, split(g:go_fmt_options, " ")) + else + " lazy check if goimports support `-srcdir`. We should eventually remove + " this in the future + if !exists('b:goimports_vendor_compatible') + let out = go#util#System(bin_path . " --help") + if out !~ "-srcdir" + call go#util#EchoWarning(printf("vim-go: goimports (%s) does not support srcdir. Update with: :GoUpdateBinaries", bin_path)) + else + let b:goimports_vendor_compatible = 1 + endif + endif + + if exists('b:goimports_vendor_compatible') && b:goimports_vendor_compatible + let ssl_save = &shellslash + set noshellslash + call extend(cmd, ["-srcdir", shellescape(fnamemodify(a:target, ":p"))]) + let &shellslash = ssl_save + endif + endif + + call add(cmd, a:source) + return cmd +endfunction + +" parse_errors parses the given errors and returns a list of parsed errors +function! s:parse_errors(content) abort + let splitted = split(a:content, '\n') + + " list of errors to be put into location list + let errors = [] + for line in splitted + let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') + if !empty(tokens) + call add(errors,{ + \"lnum": tokens[2], + \"col": tokens[3], + \"text": tokens[4], + \ }) + endif + endfor + + return errors +endfunction + +" show_errors opens a location list and shows the given errors. If the given +" errors is empty, it closes the the location list +function! s:show_errors(errors) abort + let l:listtype = "locationlist" + if !empty(a:errors) + call go#list#Populate(l:listtype, a:errors, 'Format') + echohl Error | echomsg "Gofmt returned error" | echohl None + endif + + " this closes the window if there are no errors or it opens + " it if there is any + call go#list#Window(l:listtype, len(a:errors)) +endfunction + function! go#fmt#ToggleFmtAutoSave() abort if get(g:, "go_fmt_autosave", 1) let g:go_fmt_autosave = 0 @@ -225,4 +239,5 @@ function! go#fmt#ToggleFmtAutoSave() abort let g:go_fmt_autosave = 1 call go#util#EchoProgress("auto fmt enabled") endfunction + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/fmt_test.vim b/sources_non_forked/vim-go/autoload/go/fmt_test.vim new file mode 100644 index 00000000..0de2933c --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/fmt_test.vim @@ -0,0 +1,31 @@ +func Test_run_fmt() + let actual_file = tempname() + call writefile(readfile("test-fixtures/fmt/hello.go"), actual_file) + + let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n") + + " run our code + call go#fmt#run("gofmt", actual_file, "test-fixtures/fmt/hello.go") + + " this should now contain the formatted code + let actual = join(readfile(actual_file), "\n") + + call assert_equal(expected, actual) +endfunc + +func Test_update_file() + let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n") + let source_file = tempname() + call writefile(readfile("test-fixtures/fmt/hello_golden.go"), source_file) + + let target_file = tempname() + call writefile([""], target_file) + + " update_file now + call go#fmt#update_file(source_file, target_file) + + " this should now contain the formatted code + let actual = join(readfile(target_file), "\n") + + call assert_equal(expected, actual) +endfunc diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim index 78cacc0b..206ca87b 100644 --- a/sources_non_forked/vim-go/autoload/go/guru.vim +++ b/sources_non_forked/vim-go/autoload/go/guru.vim @@ -1,6 +1,6 @@ " guru.vim -- Vim integration for the Go guru. -" guru_cmd returns a dict that contains the command to execute guru. option +" guru_cmd returns a dict that contains the command to execute guru. args " is dict with following options: " mode : guru mode, such as 'implements' " format : output format, either 'plain' or 'json' @@ -34,10 +34,8 @@ function! s:guru_cmd(args) range abort let cmd = [bin_path] let filename = fnamemodify(expand("%"), ':p:gs?\\?/?') - let stdin_content = "" if &modified - let sep = go#util#LineEnding() - let content = join(getline(1, '$'), sep ) + let content = join(go#util#GetLines(), "\n") let result.stdin_content = filename . "\n" . strlen(content) . "\n" . content call add(cmd, "-modified") endif @@ -127,7 +125,7 @@ function! s:sync_guru(args) abort " run, forrest run!!! let command = join(result.cmd, " ") - if &modified + if has_key(result, 'stdin_content') let out = go#util#System(command, result.stdin_content) else let out = go#util#System(command) @@ -198,10 +196,10 @@ function! s:async_guru(args) abort endfunction let start_options = { - \ 'close_cb': function("s:close_cb"), + \ 'close_cb': funcref("s:close_cb"), \ } - if &modified + if has_key(result, 'stdin_content') let l:tmpname = tempname() call writefile(split(result.stdin_content, "\n"), l:tmpname, "b") let l:start_options.in_io = "file" @@ -543,7 +541,7 @@ function! go#guru#ClearSameIds() abort endfor " remove the autocmds we defined - if exists("#BufWinEnter<buffer>") + if exists("#BufWinEnter#<buffer>") autocmd! BufWinEnter <buffer> endif endfunction @@ -635,7 +633,7 @@ function! go#guru#Tags(...) abort if !exists('g:go_guru_tags') call go#util#EchoSuccess("guru tags is not set") else - call go#util#EchoSuccess("current guru tags: ". a:1) + call go#util#EchoSuccess("current guru tags: ". g:go_guru_tags) endif endfunction diff --git a/sources_non_forked/vim-go/autoload/go/jobcontrol.vim b/sources_non_forked/vim-go/autoload/go/jobcontrol.vim index 189ed5f4..d914cb8c 100644 --- a/sources_non_forked/vim-go/autoload/go/jobcontrol.vim +++ b/sources_non_forked/vim-go/autoload/go/jobcontrol.vim @@ -38,6 +38,16 @@ endfunction " GOPATH when g:go_autodetect_gopath is enabled. The job is started inside the " current files folder. function! s:spawn(bang, desc, args) abort + let status_type = a:args[0] + let status_dir = expand('%:p:h') + let started_at = reltime() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': status_type, + \ 'state': "started", + \}) + let job = { \ 'desc': a:desc, \ 'bang': a:bang, @@ -49,6 +59,9 @@ function! s:spawn(bang, desc, args) abort \ 'on_stdout': function('s:on_stdout'), \ 'on_stderr': function('s:on_stderr'), \ 'on_exit' : function('s:on_exit'), + \ 'status_type' : status_type, + \ 'status_dir' : status_dir, + \ 'started_at' : started_at, \ } " modify GOPATH if needed @@ -91,6 +104,23 @@ endfunction " on_stderr handler. If there are no errors and a quickfix window is open, " it'll be closed. function! s:on_exit(job_id, exit_status, event) dict abort + let status = { + \ 'desc': 'last status', + \ 'type': self.status_type, + \ 'state': "success", + \ } + + if a:exit_status + let status.state = "failed" + endif + + let elapsed_time = reltimestr(reltime(self.started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(self.status_dir, status) + let std_combined = self.stderr + self.stdout let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' @@ -105,14 +135,20 @@ function! s:on_exit(job_id, exit_status, event) dict abort call go#list#Window(l:listtype) let self.state = "SUCCESS" - call go#util#EchoSuccess("SUCCESS") + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoSuccess("[" . self.status_type . "] SUCCESS") + endif execute cd . fnameescape(dir) return endif let self.state = "FAILED" - call go#util#EchoError("FAILED") + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoError("[" . self.status_type . "] FAILED") + endif let errors = go#tool#ParseErrors(std_combined) let errors = go#tool#FilterValids(errors) @@ -148,13 +184,13 @@ endfunction " on_stdout is the stdout handler for jobstart(). It collects the output of " stderr and stores them to the jobs internal stdout list. -function! s:on_stdout(job_id, data) dict abort +function! s:on_stdout(job_id, data, event) dict abort call extend(self.stdout, a:data) endfunction " on_stderr is the stderr handler for jobstart(). It collects the output of " stderr and stores them to the jobs internal stderr list. -function! s:on_stderr(job_id, data) dict abort +function! s:on_stderr(job_id, data, event) dict abort call extend(self.stderr, a:data) endfunction diff --git a/sources_non_forked/vim-go/autoload/go/lint.vim b/sources_non_forked/vim-go/autoload/go/lint.vim index d81072a1..c62f2520 100644 --- a/sources_non_forked/vim-go/autoload/go/lint.vim +++ b/sources_non_forked/vim-go/autoload/go/lint.vim @@ -10,10 +10,6 @@ if !exists("g:go_metalinter_enabled") let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] endif -if !exists("g:go_metalinter_deadline") - let g:go_metalinter_deadline = "5s" -endif - if !exists("g:go_golint_bin") let g:go_golint_bin = "golint" endif @@ -48,16 +44,33 @@ function! go#lint#Gometa(autosave, ...) abort let cmd += [expand('%:p:h')] else " the user wants something else, let us use it. - let cmd += [split(g:go_metalinter_command, " ")] + let cmd += split(g:go_metalinter_command, " ") endif + " gometalinter has a default deadline of 5 seconds. + " + " For async mode (s:lint_job), we want to override the default deadline only + " if we have a deadline configured. + " + " For sync mode (go#tool#ExecuteInDir), always explicitly pass the 5 seconds + " deadline if there is no other deadline configured. If a deadline is + " configured, then use it. + + " Call gometalinter asynchronously. if go#util#has_job() && has('lambda') + let deadline = get(g:, 'go_metalinter_deadline', 0) + if deadline != 0 + let cmd += ["--deadline=" . deadline] + endif + call s:lint_job({'cmd': cmd}) return endif - " we add deadline only for sync mode - let cmd += ["--deadline=" . g:go_metalinter_deadline] + " We're calling gometalinter synchronously. + + let cmd += ["--deadline=" . get(g:, 'go_metalinter_deadline', "5s")] + if a:autosave " include only messages for the active buffer let cmd += ["--include='^" . expand('%:p') . ".*$'"] @@ -283,8 +296,8 @@ function s:lint_job(args) endfunction let start_options = { - \ 'callback': function("s:callback"), - \ 'close_cb': function("s:close_cb"), + \ 'callback': funcref("s:callback"), + \ 'close_cb': funcref("s:close_cb"), \ } call job_start(a:args.cmd, start_options) diff --git a/sources_non_forked/vim-go/autoload/go/path.vim b/sources_non_forked/vim-go/autoload/go/path.vim index a9b74e97..740a2681 100644 --- a/sources_non_forked/vim-go/autoload/go/path.vim +++ b/sources_non_forked/vim-go/autoload/go/path.vim @@ -110,6 +110,9 @@ function! go#path#Detect() abort endif endif + " Fix up the case where initial $GOPATH is empty, + " and we end up with a trailing : + let gopath = substitute(gopath, ":$", "", "") return gopath endfunction diff --git a/sources_non_forked/vim-go/autoload/go/rename.vim b/sources_non_forked/vim-go/autoload/go/rename.vim index df8047e1..7d5579d2 100644 --- a/sources_non_forked/vim-go/autoload/go/rename.vim +++ b/sources_non_forked/vim-go/autoload/go/rename.vim @@ -85,8 +85,8 @@ function s:rename_job(args) endfunction let start_options = { - \ 'callback': function("s:callback"), - \ 'close_cb': function("s:close_cb"), + \ 'callback': funcref("s:callback"), + \ 'close_cb': funcref("s:close_cb"), \ } " modify GOPATH if needed diff --git a/sources_non_forked/vim-go/autoload/go/test-fixtures/def/jump.go b/sources_non_forked/vim-go/autoload/go/test-fixtures/def/jump.go new file mode 100644 index 00000000..50e8d8d3 --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/test-fixtures/def/jump.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello.go b/sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello.go new file mode 100644 index 00000000..3be42f6a --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + + func main() { +fmt.Println("vim-go") +} diff --git a/sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go b/sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go new file mode 100644 index 00000000..50e8d8d3 --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/sources_non_forked/vim-go/autoload/go/textobj.vim b/sources_non_forked/vim-go/autoload/go/textobj.vim index be0c7718..da0bb7e2 100644 --- a/sources_non_forked/vim-go/autoload/go/textobj.vim +++ b/sources_non_forked/vim-go/autoload/go/textobj.vim @@ -20,7 +20,7 @@ function! go#textobj#Function(mode) abort if &modified " Write current unsaved buffer to a temp file and use the modified content let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) + call writefile(go#util#GetLines(), l:tmpname) let fname = l:tmpname endif @@ -107,7 +107,7 @@ function! go#textobj#FunctionJump(mode, direction) abort if &modified " Write current unsaved buffer to a temp file and use the modified content let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) + call writefile(go#util#GetLines(), l:tmpname) let fname = l:tmpname endif diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim index aaf7273d..65cf2750 100644 --- a/sources_non_forked/vim-go/autoload/go/util.vim +++ b/sources_non_forked/vim-go/autoload/go/util.vim @@ -305,4 +305,17 @@ function! go#util#EchoInfo(msg) redraw | echohl Debug | echom "vim-go: " . a:msg | echohl None endfunction +function! go#util#GetLines() + let buf = getline(1, '$') + if &encoding != 'utf-8' + let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")') + endif + if &l:fileformat == 'dos' + " XXX: line2byte() depend on 'fileformat' option. + " so if fileformat is 'dos', 'buf' must include '\r'. + let buf = map(buf, 'v:val."\r"') + endif + return buf +endfunction + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 87c59118..2d7a03b2 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -1382,8 +1382,7 @@ For example here is how to set each to 30. This option is Neovim only. Use it to change the behavior of the test commands. If set to 1 it opens the test commands inside a new terminal according to |'g:go_term_mode'|, otherwise it will run them in the background -just like `:GoBuild` and then display the status with -|go#jobcontrol#Statusline()|. By default it is disabled. +just like `:GoBuild`. By default it is disabled. > let g:go_term_enabled = 0 < diff --git a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets index fcb82985..4a5b87f8 100644 --- a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets +++ b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets @@ -151,6 +151,14 @@ if err != nil { ${0} endsnippet +# error log snippet +snippet errl "Error with log.Fatal(err)" !b +if err != nil { + log.Fatal(err) +} +${0} +endsnippet + # error multiple return snippet errn, "Error return with two return values" !b if err != nil { diff --git a/sources_non_forked/vim-go/gosnippets/snippets/go.snip b/sources_non_forked/vim-go/gosnippets/snippets/go.snip index 942a82e0..2db20f57 100644 --- a/sources_non_forked/vim-go/gosnippets/snippets/go.snip +++ b/sources_non_forked/vim-go/gosnippets/snippets/go.snip @@ -132,6 +132,13 @@ abbr if err != nil { ... } t.Fatal(err) } +# error snippet in log.Fatal +snippet errl +abbr if err != nil { ... } + if err != nil { + log.Fatal(err) + } + # error snippet with two return values snippet errn, abbr if err != nil { return [...], err } diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim index 3e2f6a1e..26547310 100644 --- a/sources_non_forked/vim-go/plugin/go.vim +++ b/sources_non_forked/vim-go/plugin/go.vim @@ -32,7 +32,7 @@ command! -nargs=? -complete=dir GoPath call go#path#GoPath(<f-args>) " target install directory. GoInstallBinaries doesn't install binaries if they " exist, to update current binaries pass 1 to the argument. function! s:GoInstallBinaries(updateBinaries) - if $GOPATH == "" + if $GOPATH == "" && go#util#gopath() == "" echohl Error echomsg "vim.go: $GOPATH is not set" echohl None diff --git a/sources_non_forked/vim-go/scripts/runtest.vim b/sources_non_forked/vim-go/scripts/runtest.vim new file mode 100644 index 00000000..a096036d --- /dev/null +++ b/sources_non_forked/vim-go/scripts/runtest.vim @@ -0,0 +1,81 @@ +let total_started = reltime() + +" add vim-go the only plugin inside the runtimepath +let git_root_path = system("git rev-parse --show-toplevel | tr -d '\\n'") +exe 'set rtp=' . git_root_path + +" source the passed test file +source % + +" cd into the folder of the test file +let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' +let dir = getcwd() +execute cd . expand('%:p:h') + +" initialize variables +let g:testname = expand('%') +let s:fail = 0 +let s:done = 0 +let s:logs = [] + +" get a list of all Test_ functions for the given file +set nomore +redir @q +silent function /^Test_ +redir END +let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g')) + +" Iterate over all tests and execute them +for s:test in sort(s:tests) + let started = reltime() + + call add(s:logs, printf("=== RUN %s", s:test[:-3])) + exe 'call ' . s:test + + let elapsed_time = reltimestr(reltime(started)) + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + + let s:done += 1 + + if len(v:errors) > 0 + let s:fail += 1 + call add(s:logs, printf("--- FAIL: %s (%ss)", s:test[:-3], elapsed_time)) + call extend(s:logs, map(v:errors, '" ". v:val')) + + " reset so we can capture failures of next test + let v:errors = [] + else + call add(s:logs, printf("--- PASS: %s (%ss)", s:test[:-3], elapsed_time)) + endif +endfor + +" pop out into the scripts folder +execute cd . fnameescape(dir) + +" create an empty fail to indicate that the test failed +if s:fail > 0 + split FAILED + write +endif + +let total_elapsed_time = reltimestr(reltime(total_started)) +let total_elapsed_time = substitute(total_elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + +let message = 'Executed ' . s:done . (s:done > 1 ? ' tests' : ' test') . '. Total test time: '. total_elapsed_time .'s' +call add(s:logs, "") +call add(s:logs, message) + +" store all error messages from within vim into test.log +redir > test.log +silent messages +redir END + +" also store all internal messages from s:logs: as well +split test.log +call append(line('$'), '') +call append(line('$'), 'From ' . g:testname . ':') +call append(line('$'), s:logs) +write + +" bye, bye! +qall! diff --git a/sources_non_forked/vim-go/scripts/test.sh b/sources_non_forked/vim-go/scripts/test.sh index d8a5b895..cda33504 100644 --- a/sources_non_forked/vim-go/scripts/test.sh +++ b/sources_non_forked/vim-go/scripts/test.sh @@ -1,77 +1,29 @@ -#!/bin/bash -e -# -# Copyright 2012 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. -# -# Tests for import.vim. +#!/bin/bash + +set -e cd $(dirname $0) -cat > base.go <<EOF -package test +# cleanup test.log +if [ -f "test.log" ]; then + rm test.log +fi -import ( - "bytes" - "io" - "net" +if [ -f "FAILED" ]; then + rm FAILED +fi - "mycorp/foo" -) -EOF +for test_file in ../autoload/go/*_test.vim +do + vim -u NONE -S runtest.vim $test_file +done -fail=0 +if [ -f "test.log" ]; then + cat test.log +fi -# usage: test_one command pattern -# Pattern is a PCRE expression that will match across lines. -test_one() { - echo 2>&1 -n "$1: " - vim -e -s -u /dev/null -U /dev/null --noplugin -c "source import.vim" \ - -c "$1" -c 'wq! test.go' base.go - # ensure blank lines are treated correctly - if ! gofmt test.go | cmp test.go -; then - echo 2>&1 "gofmt conflict" - gofmt test.go | diff -u test.go - | sed "s/^/ /" 2>&1 - fail=1 - return - fi - if ! [[ $(cat test.go) =~ $2 ]]; then - echo 2>&1 "$2 did not match" - cat test.go | sed "s/^/ /" 2>&1 - fail=1 - return - fi - echo 2>&1 "ok" -} - -# Tests for Import - -test_one "Import baz" '"baz".*"bytes"' -test_one "Import io/ioutil" '"io".*"io/ioutil".*"net"' -test_one "Import myc" '"io".*"myc".*"net"' # prefix of a site prefix -test_one "Import nat" '"io".*"nat".*"net"' -test_one "Import net/http" '"net".*"net/http".*"mycorp/foo"' -test_one "Import zoo" '"net".*"zoo".*"mycorp/foo"' -test_one "Import mycorp/bar" '"net".*"mycorp/bar".*"mycorp/foo"' -test_one "Import mycorp/goo" '"net".*"mycorp/foo".*"mycorp/goo"' - -# Tests for Drop - -cat > base.go <<EOF -package test - -import ( - "foo" - - "something" - "zoo" -) -EOF - -test_one "Drop something" '\([^"]*"foo"[^"]*"zoo"[^"]*\)' - -rm -f base.go test.go -if [ $fail -gt 0 ]; then +# if Failed exists, test failed +if [ -f "FAILED" ]; then echo 2>&1 "FAIL" exit 1 fi diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim index 9b23eb6c..8d7560f9 100644 --- a/sources_non_forked/vim-go/syntax/go.vim +++ b/sources_non_forked/vim-go/syntax/go.vim @@ -10,9 +10,7 @@ " let OPTION_NAME = 0 " in your ~/.vimrc file to disable particular options. You can also write: " let OPTION_NAME = 1 -" to enable particular options. -" At present, all options default to on, except highlight of: -" functions, methods, structs, operators, build constraints and interfaces. +" to enable particular options. At present, all options default to off: " " - go_highlight_array_whitespace_error " Highlights white space after "[]". @@ -36,23 +34,23 @@ if exists("b:current_syntax") endif if !exists("g:go_highlight_array_whitespace_error") - let g:go_highlight_array_whitespace_error = 1 + let g:go_highlight_array_whitespace_error = 0 endif if !exists("g:go_highlight_chan_whitespace_error") - let g:go_highlight_chan_whitespace_error = 1 + let g:go_highlight_chan_whitespace_error = 0 endif if !exists("g:go_highlight_extra_types") - let g:go_highlight_extra_types = 1 + let g:go_highlight_extra_types = 0 endif if !exists("g:go_highlight_space_tab_error") - let g:go_highlight_space_tab_error = 1 + let g:go_highlight_space_tab_error = 0 endif if !exists("g:go_highlight_trailing_whitespace_error") - let g:go_highlight_trailing_whitespace_error = 1 + let g:go_highlight_trailing_whitespace_error = 0 endif if !exists("g:go_highlight_operators") diff --git a/sources_non_forked/vim-go/t/coverlay.vim b/sources_non_forked/vim-go/t/coverlay.vim deleted file mode 100644 index 9d60c21d..00000000 --- a/sources_non_forked/vim-go/t/coverlay.vim +++ /dev/null @@ -1,191 +0,0 @@ -" to execute, `rake test` on parent dir - -describe 'go#coverage#Buffer' - before - new - let g:curdir = expand('<sfile>:p:h') . '/' - let g:srcpath = 't/fixtures/src/' - let g:sample = 'pkg1/sample.go' - let g:sampleabs = g:curdir . g:srcpath . 'pkg1/sample.go' - let g:samplecover = g:curdir . g:srcpath . 'pkg1/sample.out' - let g:go_gopath = g:curdir . 't/fixtures' - execute "badd " . g:srcpath . g:sample - execute "buffer " . bufnr("$") - end - after - execute "bprev" - execute "bdelete " . g:srcpath . g:sample - close! - end - - it 'puts match to the list' - call go#coverage#Buffer(0) - Expect len(go#coverlay#matches()) == 5 - call go#coverlay#Clearlay() - Expect len(go#coverlay#matches()) == 0 - - call go#coverage#Buffer(0) - Expect len(go#coverlay#matches()) == 5 - call go#coverlay#Clearlay() - Expect len(go#coverlay#matches()) == 0 - - call go#coverage#Buffer(0) - Expect len(go#coverlay#matches()) == 5 - call go#coverage#Buffer(0) - Expect len(go#coverlay#matches()) == 5 - call go#coverlay#Clearlay() - Expect len(go#coverlay#matches()) == 0 - end -end - -describe 'go#coverage#Buffer fail' - before - new - let g:curdir = expand('<sfile>:p:h') . '/' - let g:srcpath = 't/fixtures/src/' - let g:sample = 'failtest/sample.go' - let g:sampletest = 'failtest/sample_test.go' - let g:sampleabs = g:curdir . g:srcpath . 'failtest/sample.go' - let g:go_gopath = g:curdir . 't/fixtures' - execute "badd " . g:srcpath . g:sample - execute "buffer " . bufnr("$") - end - after - execute "bprev" - execute "bdelete " . g:srcpath . g:sampletest - execute "bdelete " . g:srcpath . g:sample - end - - it 'does nothing if test fail' - call go#coverage#Buffer(0) - Expect len(go#coverlay#matches()) == 0 - Expect len(getqflist()) == 1 - end -end - -describe 'go#coverage#Buffer build fail' - before - new - let g:curdir = expand('<sfile>:p:h') . '/' - let g:srcpath = 't/fixtures/src/' - let g:sample = 'buildfail/sample.go' - let g:sampleabs = g:curdir . g:srcpath . 'buildfail/sample.go' - let g:go_gopath = g:curdir . 't/fixtures' - execute "badd " . g:srcpath . g:sample - execute "buffer " . bufnr("$") - end - after - execute "bprev" - execute "bdelete " . g:srcpath . g:sample - end - - it 'does nothing if test fail' - call go#coverage#Buffer(0) - Expect len(go#coverlay#matches()) == 0 - end -end - -describe 'go#coverage#Buffer build test fail' - before - new - let g:curdir = expand('<sfile>:p:h') . '/' - let g:srcpath = 't/fixtures/src/' - let g:sample = 'buildtestfail/sample.go' - let g:sampleabs = g:curdir . g:srcpath . 'buildtestfail/sample.go' - let g:go_gopath = g:curdir . 't/fixtures' - execute "badd " . g:srcpath . g:sample - execute "buffer " . bufnr("$") - end - after - execute "bprev" - execute "bdelete " . g:srcpath . g:sample - end - - it 'does nothing if test fail' - call go#coverage#Buffer(0) - Expect len(go#coverlay#matches()) == 0 - end -end - -describe 'go#coverlay#findbufnr' - before - new - let g:curdir = expand('<sfile>:p:h') . '/' - let g:srcpath = 't/fixtures/src/' - let g:sample = 'pkg1/sample.go' - let g:sample2 = 'pkg2/sample.go' - let g:sampleabs = g:curdir . g:srcpath . 'pkg1/sample.go' - let g:sampleabs2 = g:curdir . g:srcpath . 'pkg2/sample.go' - let g:go_gopath = g:curdir . 't/fixtures' - execute "badd " . g:srcpath . g:sample - execute "badd " . g:srcpath . g:sample2 - end - after - execute "bdelete " . g:srcpath . g:sample2 - execute "bdelete " . g:srcpath . g:sample - close! - end - - it 'returns BUFNR if FILE is opened at BUFNR' - Expect go#coverlay#findbufnr('_' . g:sampleabs) == bufnr(g:sampleabs) - Expect go#coverlay#findbufnr(g:sample) == bufnr(g:sampleabs) - - Expect go#coverlay#findbufnr('_' . g:sampleabs2) == bufnr(g:sampleabs2) - Expect go#coverlay#findbufnr(g:sample2) == bufnr(g:sampleabs2) - end - - it 'returns -1 if FILE is not exists' - Expect go#coverlay#findbufnr('pkg1/NOTEXISTS.go') == -1 - Expect go#coverlay#findbufnr('_' . g:curdir . g:srcpath . 'pkg1/NOTEXISTS.go') == -1 - end -end - -describe 'go#coverlay#isopenedon' - before - new - let g:curdir = expand('<sfile>:p:h') . '/' - let g:srcpath = 't/fixtures/src/' - let g:sample = 'pkg1/sample.go' - let g:sampleabs = g:curdir . g:srcpath . 'pkg1/sample.go' - let g:go_gopath = g:curdir . 't/fixtures' - execute "badd " . g:srcpath . g:sample - end - after - execute "bdelete " . g:srcpath . g:sample - close! - end - - it 'returns 1 if FILE is opened at BUFNR' - Expect go#coverlay#isopenedon('_' . g:sampleabs, bufnr(g:sampleabs)) == 1 - Expect go#coverlay#isopenedon(g:sample, bufnr(g:sampleabs)) == 1 - end - - it 'returns 0 if FILE is not opened at BUFNR' - Expect go#coverlay#isopenedon('_' . g:sampleabs, 42) == 0 - Expect go#coverlay#isopenedon(g:sample, 42) == 0 - end - - it 'returns 0 if FILE is not exists' - Expect go#coverlay#isopenedon('_' . g:curdir . g:srcpath . 'pkg1/NOTEXISTS', bufnr(g:sampleabs)) == 0 - Expect go#coverlay#isopenedon('pkg1/NOTEXISTS.go', bufnr(g:sampleabs)) == 0 - end -end - - - -describe 'go#coverlay#parsegocoverline' - it 'parses a go cover output line and returns as dict' - let d = {'file': 'f',"startline": "1", "startcol": "2", "endline": "3", "endcol": "4", "numstmt": "5", "cnt": "6"} - " file:startline.col,endline.col numstmt count - Expect go#coverlay#parsegocoverline("f:1.2,3.4 5 6") == d - end -end - -describe 'go#coverlay#genmatch' - it 'generate mark pattern from cover data' - let d = {'file': 'f',"startline": "1", "startcol": "2", "endline": "3", "endcol": "4", "numstmt": "5", "cnt": "6"} - Expect go#coverlay#genmatch(d) == {'group': 'covered', "pattern": '\%>1l\_^\s\+\%<3l\|\%1l\_^\s\+\|\%3l\_^\s\+\(\}$\)\@!', "priority": 6} - let d = {'file': 'f',"startline": "1", "startcol": "2", "endline": "3", "endcol": "4", "numstmt": "5", "cnt": "0"} - Expect go#coverlay#genmatch(d) == {'group': 'uncover', "pattern": '\%>1l\_^\s\+\%<3l\|\%1l\_^\s\+\|\%3l\_^\s\+\(\}$\)\@!', "priority": 5} - end -end diff --git a/sources_non_forked/vim-go/t/fixtures/src/buildfail/sample.go b/sources_non_forked/vim-go/t/fixtures/src/buildfail/sample.go deleted file mode 100644 index 45fc006a..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/buildfail/sample.go +++ /dev/null @@ -1,13 +0,0 @@ -// set gopath before -//go:generate go test --coverprofile=sample.out -// go1.5.3 example output: -// GOPATH=`pwd`/fixtures go test --coverprofile=log.out buildfail -// # buildfail -// /tmp/go-build264733986/buildfail/_test/_obj_test/sample.go:7: undefined: IT_SHOULD_BE_BUILD_FAILED -// /tmp/go-build264733986/buildfail/_test/_obj_test/sample.go:8: missing return at end of function -// FAIL buildfail [build failed] -package pkg - -func Sample() int { - IT_SHOULD_BE_BUILD_FAILED -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/buildfail/sample_test.go b/sources_non_forked/vim-go/t/fixtures/src/buildfail/sample_test.go deleted file mode 100644 index 2356d3ed..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/buildfail/sample_test.go +++ /dev/null @@ -1,7 +0,0 @@ -package pkg - -import "testing" - -func TestSample(t *testing.T) { - Sample() -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample.go b/sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample.go deleted file mode 100644 index 792f1234..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample.go +++ /dev/null @@ -1,7 +0,0 @@ -// set gopath before -//go:generate go test --coverprofile=sample.out -package pkg - -func Sample() int { - return 1 -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample_test.go b/sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample_test.go deleted file mode 100644 index 17c4d463..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/buildtestfail/sample_test.go +++ /dev/null @@ -1,15 +0,0 @@ -// go1.5.3 example output: -// GOPATH=`pwd`/fixtures go test --coverprofile=log.out buildtestfail -// # buildtestfail -// fixtures/src/buildtestfail/sample_test.go:14: undefined: IT_SHOULD_BE_BUILD_FAILED -// FAIL buildtestfail [build failed] -// echo $? -// 2 - -package pkg - -import "testing" - -func TestSample(t *testing.T) { - IT_SHOULD_BE_BUILD_FAILED -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/failtest/sample.go b/sources_non_forked/vim-go/t/fixtures/src/failtest/sample.go deleted file mode 100644 index 5859e926..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/failtest/sample.go +++ /dev/null @@ -1,12 +0,0 @@ -// set gopath before -//go:generate go test --coverprofile=sample.out -package pkg - -func Sample() int { - if false { - return 0 - } else if false { - return 0 - } - return 1 -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/failtest/sample_test.go b/sources_non_forked/vim-go/t/fixtures/src/failtest/sample_test.go deleted file mode 100644 index 7f1ade0d..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/failtest/sample_test.go +++ /dev/null @@ -1,8 +0,0 @@ -package pkg - -import "testing" - -func TestSample(t *testing.T) { - Sample() - t.Fatal("itwillfail") -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/parsefail/sample.go b/sources_non_forked/vim-go/t/fixtures/src/parsefail/sample.go deleted file mode 100644 index e9f3faa9..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/parsefail/sample.go +++ /dev/null @@ -1,14 +0,0 @@ -// set gopath before -//go:generate go test --coverprofile=sample.out -// go1.5.3 example output: -// GOPATH=`pwd`/fixtures go test --coverprofile=log.out parsefail -// # cover parsefail -// 2016/01/17 23:59:08 cover: /home/sey/vimfiles/_vim/bundle/vim-go-coverlay/t/fixtures/src/parsefail/sample.go: /home/sey/vimfiles/_vim/bundle/vim-go-coverlay/t/fixtures/src/parsefail/sample.go:10:1: expected declaration, found 'IDENT' PARSEFAIL -// FAIL parsefail [build failed] -// echo $? -// 2 -package pkg - -PARSEFAIL Sample() int { - return 0 -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/parsefail/sample_test.go b/sources_non_forked/vim-go/t/fixtures/src/parsefail/sample_test.go deleted file mode 100644 index 2356d3ed..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/parsefail/sample_test.go +++ /dev/null @@ -1,7 +0,0 @@ -package pkg - -import "testing" - -func TestSample(t *testing.T) { - Sample() -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.go b/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.go deleted file mode 100644 index 6ce94b39..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.go +++ /dev/null @@ -1,12 +0,0 @@ -// set gopath before -//go:generate go test --coverprofile=sample.out -package pkg1 - -func Sample() int { - if false { - return 0 - } else if false { - return 0 - } - return 1 -} diff --git a/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.out b/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.out deleted file mode 100644 index 909a63f1..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample.out +++ /dev/null @@ -1,6 +0,0 @@ -mode: set -pkg1/sample.go:5.19,6.11 1 1 -pkg1/sample.go:11.2,11.10 1 1 -pkg1/sample.go:6.11,8.3 1 0 -pkg1/sample.go:8.3,8.18 1 1 -pkg1/sample.go:8.18,10.3 1 0 diff --git a/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample_test.go b/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample_test.go deleted file mode 100644 index e39d7ba8..00000000 --- a/sources_non_forked/vim-go/t/fixtures/src/pkg1/sample_test.go +++ /dev/null @@ -1,7 +0,0 @@ -package pkg1 - -import "testing" - -func TestSample(t *testing.T) { - Sample() -} diff --git a/sources_non_forked/vim-pug/README.markdown b/sources_non_forked/vim-pug/README.markdown index c41f9ddd..7665388f 100644 --- a/sources_non_forked/vim-pug/README.markdown +++ b/sources_non_forked/vim-pug/README.markdown @@ -2,6 +2,8 @@ Vim syntax highlighting for Pug (formerly Jade) templates. +For best results consider using this with an (improved) HTML5 syntax plugin. + Installation ------------ diff --git a/sources_non_forked/vim-pug/syntax/pug.vim b/sources_non_forked/vim-pug/syntax/pug.vim index 09e6b9b9..2d80f471 100644 --- a/sources_non_forked/vim-pug/syntax/pug.vim +++ b/sources_non_forked/vim-pug/syntax/pug.vim @@ -36,8 +36,9 @@ syntax keyword pugCommentTodo contained TODO FIXME XXX TBD syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo syn region pugCommentBlock start="\z(\s\+\|^\)\/\/.*$" end="^\%(\z1\s\|\s*$\)\@!" contains=pugCommentTodo keepend syn region pugHtmlConditionalComment start="<!--\%(.*\)>" end="<!\%(.*\)-->" contains=pugCommentTodo -syn region pugAttributes matchgroup=pugAttributesDelimiter start="(" end=")" contained contains=@htmlJavascript,pugHtmlArg,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@pugComponent -syn match pugClassChar "\." contained nextgroup=pugClass +syn region pugAngular2 start="(" end=")" contains=htmlEvent +syn region pugAttributes matchgroup=pugAttributesDelimiter start="(" end=")" contained contains=@htmlJavascript,pugHtmlArg,pugAngular2,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@pugComponent +syn match pugClassChar "\." containedin=htmlTagName nextgroup=pugClass syn match pugBlockExpansionChar ":\s\+" contained nextgroup=pugTag,pugClassChar,pugIdChar syn match pugIdChar "#[[{]\@!" contained nextgroup=pugId syn match pugClass "\%(\w\|-\)\+" contained nextgroup=@pugComponent diff --git a/sources_non_forked/vim-snippets/README.md b/sources_non_forked/vim-snippets/README.md index d4e83c33..5567c5d9 100644 --- a/sources_non_forked/vim-snippets/README.md +++ b/sources_non_forked/vim-snippets/README.md @@ -131,14 +131,14 @@ Don't add useless placeholder default texts like: ``` if (${1:condition}){ - ${2:some code here} + ${0:some code here} } ``` instead use: ``` if (${1}){ - ${2} + ${0:${VISUAL}} } ``` @@ -148,6 +148,8 @@ get vim-dev plugin which has function completion Thus for conditions (while, if ..) and block bodies just use ${N} - Thanks +When the snippet can be used to wrap existing code leverage `${VISUAL}` + Open questions: What about one line if ee then .. else .. vs if \n .. then \n ... \n else \n .. ? Which additional policies to add? diff --git a/sources_non_forked/vim-snippets/UltiSnips/all.snippets b/sources_non_forked/vim-snippets/UltiSnips/all.snippets index 215487ec..49a9c80e 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/all.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/all.snippets @@ -77,23 +77,23 @@ endsnippet # DATES # ######### snippet date "YYYY-MM-DD" w -`date +%Y-%m-%d` +`!v strftime("%F")` endsnippet snippet ddate "Month DD, YYYY" w -`date +%B\ %d,\ %Y` +`!v strftime("%b %d, %Y")` endsnippet snippet diso "ISO format datetime" w -`date +%Y-%m-%dT%H:%M:%S%:z` +`!v strftime("%F %H:%M:%S%z")` endsnippet snippet time "hh:mm" w -`date +%H:%M` +`!v strftime("%H:%M")` endsnippet snippet datetime "YYYY-MM-DD hh:mm" w -`date +%Y-%m-%d\ %H:%M` +`!v strftime("%Y-%m-%d %H:%M")` endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/c.snippets b/sources_non_forked/vim-snippets/UltiSnips/c.snippets index c9894649..6851a272 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/c.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/c.snippets @@ -5,7 +5,7 @@ priority -50 snippet def "#define ..." -#define ${1} +#define $1 endsnippet snippet #ifndef "#ifndef ... #define ... #endif" @@ -16,7 +16,7 @@ endsnippet snippet #if "#if #endif" b #if ${1:0} -${VISUAL}${0} +${VISUAL}$0 #endif endsnippet @@ -32,20 +32,20 @@ endsnippet snippet main "main() (main)" int main(int argc, char *argv[]) { - ${VISUAL}${0} + ${VISUAL}$0 return 0; } endsnippet snippet for "for loop (for)" for (${2:i} = 0; $2 < ${1:count}; ${3:++$2}) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet snippet fori "for int loop (fori)" for (${4:int} ${2:i} = 0; $2 < ${1:count}; ${3:++$2}) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet @@ -60,7 +60,7 @@ else: snip.rv = snip.c`} #define $1 -${VISUAL}${0} +${VISUAL}$0 #endif /* end of include guard: $1 */ endsnippet @@ -71,7 +71,7 @@ endsnippet snippet eli "else if .. (eli)" else if (${1:/* condition */}) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet @@ -86,14 +86,14 @@ struct ${1:`!p snip.rv = (snip.basename or "name") + "_t"`} { endsnippet snippet fun "function" b -${1:void} ${2:function_name}(${3}) +${1:void} ${2:function_name}($3) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet snippet fund "function declaration" b -${1:void} ${2:function_name}(${3}); +${1:void} ${2:function_name}($3); endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/coffee-react.snippets b/sources_non_forked/vim-snippets/UltiSnips/coffee-react.snippets index 4cdb40f8..3090c571 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/coffee-react.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/coffee-react.snippets @@ -12,7 +12,7 @@ snippet createClass "React define Class" b ${1:classname}Class = React.createClass displayName: "$1" render: -> - ${2} + $2 $1 = React.createFactory($1) endsnippet @@ -23,58 +23,58 @@ endsnippet snippet propType "React propType (key/value)" b ${1:myVar}: React.PropTypes.${2:type}${3:.isRequired} -${4} +$4 endsnippet snippet setState "React setState" b @setState ${1:myvar}: ${2:myvalue} - ${3} + $3 endsnippet snippet getInitialState "React define getInitialState" b getInitialState: -> ${1:myvar}: ${2:myvalue} - ${3} + $3 endsnippet snippet getDefaultProps "React define getDefaultProps" b getDefaultProps: -> ${1:myvar}: ${2:myvalue} - ${3} + $3 endsnippet snippet componentWillMount "React define componentWillMount" b componentWillMount: -> - ${1} + $1 endsnippet snippet componentDidMount "React define componentDidMount" b componentDidMount: -> - ${1} + $1 endsnippet snippet componentWillReceiveProps "React define componentWillReceiveProps" b componentWillReceiveProps: (nextProps) -> - ${1} + $1 endsnippet snippet shouldComponentUpdate "React define shouldComponentUpdate" b shouldComponentUpdate: (nextProps, nextState) -> - ${1} + $1 endsnippet snippet componentWillUpdate "React define componentWillUpdate" b componentWillUpdate: (nextProps, nextState) -> - ${1} + $1 endsnippet snippet componentDidUpdate "React define componentDidUpdate" b componentDidUpdate: (prevProps, prevState) -> - ${1} + $1 endsnippet snippet componentWillUnmount "React define componentWillUnmount" b componentWillUnmount: -> - ${1} + $1 endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets b/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets index f7c2bd83..c83ec605 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets @@ -27,7 +27,7 @@ endsnippet snippet ns "namespace .. (namespace)" namespace${1/.+/ /m}${1:`!p snip.rv = snip.basename or "name"`} { - ${VISUAL}${0} + ${VISUAL}$0 }${1/.+/ \/* /m}$1${1/.+/ *\/ /m} endsnippet @@ -61,7 +61,7 @@ snippet cla "An entire .h generator" b class ${1:`!v substitute(substitute(vim_snippets#Filename('$1','ClassName'),'^.','\u&',''), '_\(\w\)', '\u\1', 'g')`} { private: - ${3} + $3 public: $1(); diff --git a/sources_non_forked/vim-snippets/UltiSnips/crystal.snippets b/sources_non_forked/vim-snippets/UltiSnips/crystal.snippets new file mode 100644 index 00000000..cab946f4 --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/crystal.snippets @@ -0,0 +1,13 @@ +priority -50 + +snippet "\b(de)?f" "def <name>..." r +def ${1:method_name}${2:(${3:*args})} + $0 +end +endsnippet + +snippet "\b(pde)?f" "private def <name>..." r +private def ${1:method_name}${2:(${3:*args})} + $0 +end +endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/cs.snippets b/sources_non_forked/vim-snippets/UltiSnips/cs.snippets index aca245e5..89b61ca0 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/cs.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/cs.snippets @@ -259,7 +259,7 @@ finally endsnippet snippet throw "throw" -throw new ${1}Exception("${2}"); +throw new $1Exception("$2"); endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/css.snippets b/sources_non_forked/vim-snippets/UltiSnips/css.snippets index ff265093..f5ccd2ff 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/css.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/css.snippets @@ -1,11 +1,5 @@ priority -50 -snippet . "selector { }" -$1 { - $0 -} -endsnippet - snippet p "padding" padding: ${1:0};$0 endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/d.snippets b/sources_non_forked/vim-snippets/UltiSnips/d.snippets index 9ce27513..a9d89b84 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/d.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/d.snippets @@ -23,7 +23,7 @@ mixin ${1:/*mixed_in*/} ${2:/*name*/}; endsnippet snippet new "new (new)" -new ${1}(${2}); +new $1($2); endsnippet snippet scpn "@safe const pure nothrow (scpn)" @@ -98,7 +98,7 @@ endsnippet snippet enf "enforce (enf)" b enforce(${1:/*condition*/}, - new ${2}Exception(${3:/*args*/})); + new $2Exception(${3:/*args*/})); endsnippet # Branches @@ -106,14 +106,14 @@ endsnippet snippet if "if .. (if)" if(${1:/*condition*/}) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet snippet ife "if .. else (ife)" b if(${1:/*condition*/}) { - ${2} + $2 } else { @@ -124,14 +124,14 @@ endsnippet snippet el "else (el)" b else { - ${VISUAL}${1} + ${VISUAL}$1 } endsnippet snippet elif "else if (elif)" b else if(${1:/*condition*/}) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet @@ -139,10 +139,10 @@ snippet sw "switch (sw)" switch(${1:/*var*/}) { case ${2:/*value*/}: - ${3} + $3 break; case ${4:/*value*/}: - ${5} + $5 break; ${7:/*more cases*/} default: @@ -154,10 +154,10 @@ snippet fsw "final switch (fsw)" final switch(${1:/*var*/}) { case ${2:/*value*/}: - ${3} + $3 break; case ${4:/*value*/}: - ${5} + $5 break; ${7:/*more cases*/} } @@ -165,7 +165,7 @@ endsnippet snippet case "case (case)" b case ${1:/*value*/}: - ${2} + $2 break; endsnippet @@ -178,42 +178,42 @@ endsnippet snippet do "do while (do)" b do { - ${VISUAL}${2} + ${VISUAL}$2 } while(${1:/*condition*/}); endsnippet snippet wh "while (wh)" b while(${1:/*condition*/}) { - ${VISUAL}${2} + ${VISUAL}$2 } endsnippet snippet for "for (for)" b for (${4:size_t} ${2:i} = 0; $2 < ${1:count}; ${3:++$2}) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet snippet forever "forever (forever)" b for(;;) { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet snippet fore "foreach (fore)" foreach(${1:/*elem*/}; ${2:/*range*/}) { - ${VISUAL}${3} + ${VISUAL}$3 } endsnippet snippet forif "foreach if (forif)" b foreach(${1:/*elem*/}; ${2:/*range*/}) if(${3:/*condition*/}) { - ${VISUAL}${4} + ${VISUAL}$4 } endsnippet @@ -222,7 +222,7 @@ snippet in "in contract (in)" b in { assert(${1:/*condition*/}, "${2:error message}"); - ${3} + $3 } body endsnippet @@ -231,7 +231,7 @@ snippet out "out contract (out)" b out${1:(result)} { assert(${2:/*condition*/}, "${3:error message}"); - ${4} + $4 } body endsnippet @@ -240,7 +240,7 @@ snippet inv "invariant (inv)" b invariant() { assert(${1:/*condition*/}, "${2:error message}"); - ${3} + $3 } endsnippet @@ -249,21 +249,21 @@ endsnippet snippet fun "function definition (fun)" ${1:void} ${2:/*function name*/}(${3:/*args*/}) ${4:@safe pure nothrow} { - ${VISUAL}${5} + ${VISUAL}$5 } endsnippet snippet void "void function definition (void)" void ${1:/*function name*/}(${2:/*args*/}) ${3:@safe pure nothrow} { - ${VISUAL}${4} + ${VISUAL}$4 } endsnippet snippet this "ctor (this)" w this(${1:/*args*/}) { - ${VISUAL}${2} + ${VISUAL}$2 } endsnippet @@ -295,16 +295,16 @@ endsnippet snippet scope "scope (scope)" b scope(${1:exit}) { - ${VISUAL}${2} + ${VISUAL}$2 } endsnippet # With snippet with "with (with)" -with(${1}) +with($1) { - ${VISUAL}${2} + ${VISUAL}$2 } endsnippet @@ -315,7 +315,7 @@ try { ${VISUAL}${1:/*code to try*/} } -catch(${2}Exception e) +catch($2Exception e) { ${3:/*handle exception*/} } @@ -326,7 +326,7 @@ try { ${VISUAL}${1:/*code to try*/} } -catch(${2}Exception e) +catch($2Exception e) { ${3:/*handle exception*/} } @@ -337,14 +337,14 @@ finally endsnippet snippet catch "catch (catch)" b -catch(${1}Exception e) +catch($1Exception e) { ${2:/*handle exception*/} } endsnippet snippet thr "throw (thr)" -throw new ${1}Exception("${2}"); +throw new $1Exception("$2"); endsnippet @@ -353,35 +353,35 @@ endsnippet snippet struct "struct (struct)" struct ${1:`!p snip.rv = (snip.basename or "name")`} { - ${2} + $2 } endsnippet snippet union "union (union)" union ${1:`!p snip.rv = (snip.basename or "name")`} { - ${2} + $2 } endsnippet snippet class "class (class)" class ${1:`!p snip.rv = (snip.basename or "name")`} { - ${2} + $2 } endsnippet snippet inter "interface (inter)" interface ${1:`!p snip.rv = (snip.basename or "name")`} { - ${2} + $2 } endsnippet snippet enum "enum (enum)" enum ${1:`!p snip.rv = (snip.basename or "name")`} { - ${2} + $2 } endsnippet @@ -390,7 +390,7 @@ endsnippet snippet exc "exception declaration (exc)" b /// ${3:/*documentation*/} -class ${1}Exception : ${2}Exception +class $1Exception : $2Exception { public this(string msg, string file = __FILE__, int line = __LINE__) { @@ -405,14 +405,14 @@ endsnippet snippet version "version (version)" b version(${1:/*version name*/}) { - ${VISUAL}${2} + ${VISUAL}$2 } endsnippet snippet debug "debug" b debug { - ${VISUAL}${1} + ${VISUAL}$1 } endsnippet @@ -422,7 +422,7 @@ endsnippet snippet temp "template (temp)" b template ${2:/*name*/}(${1:/*args*/}) { - ${3} + $3 } endsnippet @@ -440,7 +440,7 @@ endsnippet snippet unittest "unittest (unittest)" b unittest { - ${1} + $1 } endsnippet @@ -450,21 +450,21 @@ endsnippet snippet opDis "opDispatch (opDis)" b ${1:/*return type*/} opDispatch(string s)() { - ${2}; + $2; } endsnippet snippet op= "opAssign (op=)" b -void opAssign(${1} rhs) ${2:@safe pure nothrow} +void opAssign($1 rhs) ${2:@safe pure nothrow} { - ${2} + $2 } endsnippet snippet opCmp "opCmp (opCmp)" b -int opCmp(${1} rhs) @safe const pure nothrow +int opCmp($1 rhs) @safe const pure nothrow { - ${2} + $2 } endsnippet @@ -484,7 +484,7 @@ endsnippet snippet toString "toString (toString)" b string toString() @safe const pure nothrow { - ${1} + $1 } endsnippet @@ -493,7 +493,7 @@ endsnippet snippet todo "TODO (todo)" -// TODO: ${1} +// TODO: $1 endsnippet @@ -509,16 +509,16 @@ snippet fdoc "function ddoc block (fdoc)" b /// ${1:description} /// /// ${2:Params: ${3:param} = ${4:param description} -/// ${5}} +/// $5} /// /// ${6:Returns: ${7:return value}} /// -/// ${8:Throws: ${9}Exception ${10}} +/// ${8:Throws: $9Exception $10} endsnippet snippet Par "Params (Par)" Params: ${1:param} = ${2:param description} -/// ${3} +/// $3 endsnippet snippet Ret "Returns (Ret)" @@ -526,7 +526,7 @@ Returns: ${1:return value/s} endsnippet snippet Thr "Throws (Thr)" -Throws: ${1}Exception ${2} +Throws: $1Exception $2 endsnippet snippet Example "Examples (Example)" @@ -556,7 +556,7 @@ snippet gpl "GPL (gpl)" b // // Copyright (C) ${1:Author}, `!v strftime("%Y")` -${2} +$2 endsnippet snippet boost "Boost (boost)" b @@ -565,7 +565,7 @@ snippet boost "Boost (boost)" b // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -${2} +$2 endsnippet @@ -577,8 +577,8 @@ snippet module "New module (module)" b // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -module ${2}.`!v vim_snippets#Filename('$1', 'name')`; +module $2.`!v vim_snippets#Filename('$1', 'name')`; -${3} +$3 endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/django.snippets b/sources_non_forked/vim-snippets/UltiSnips/django.snippets index 0ba6c9d5..8f836288 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/django.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/django.snippets @@ -124,7 +124,7 @@ endsnippet snippet model "Model" b class ${1:MODELNAME}(models.Model): - ${0} + $0 class Meta: verbose_name = "$1" verbose_name_plural = "$1s" @@ -275,19 +275,19 @@ endsnippet # VIEWS SNIPPETS snippet adminview "Model Admin View" b -class ${1}Admin(admin.ModelAdmin): +class $1Admin(admin.ModelAdmin): ''' - Admin View for ${1} + Admin View for $1 ''' - list_display = ('${2}',) - list_filter = ('${3}',) + list_display = ('$2',) + list_filter = ('$3',) inlines = [ - ${4}Inline, + $4Inline, ] - raw_id_fields = ('${5}',) - readonly_fields = ('${6}',) - search_fields = ['${7}'] -admin.site.register(${1}, ${1}Admin) + raw_id_fields = ('$5',) + readonly_fields = ('$6',) + search_fields = ['$7'] +admin.site.register($1, $1Admin) endsnippet snippet createview "Generic Create View" b @@ -315,27 +315,27 @@ class ${1:MODEL_NAME}ListView(ListView): endsnippet snippet stackedinline "Stacked Inline" b -class ${1}Inline(admin.StackedInline): +class $1Inline(admin.StackedInline): ''' - Stacked Inline View for ${1} + Stacked Inline View for $1 ''' - model = ${2:${1}} + model = ${2:$1} min_num = ${3:3} max_num = ${4:20} extra = ${5:1} - raw_id_fields = (${6},) + raw_id_fields = ($6,) endsnippet snippet tabularinline "Tabular Inline" b -class ${1}Inline(admin.TabularInline): +class $1Inline(admin.TabularInline): ''' - Tabular Inline View for ${1} + Tabular Inline View for $1 ''' - model = ${2:${1}} + model = ${2:$1} min_num = ${3:3} max_num = ${4:20} extra = ${5:1} - raw_id_fields = (${6},) + raw_id_fields = ($6,) endsnippet snippet templateview "Generic Template View" b diff --git a/sources_non_forked/vim-snippets/UltiSnips/eruby.snippets b/sources_non_forked/vim-snippets/UltiSnips/eruby.snippets index fe38c2fc..ef93be44 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/eruby.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/eruby.snippets @@ -27,12 +27,12 @@ def textmate_var(var, snip): endglobal -snippet % "<% ${0} %>" i -`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`${0}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_INLINE', snip)` +snippet % "<% $0 %>" i +`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`$0`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_INLINE', snip)` endsnippet -snippet = "<%= ${0} %>" i -`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`${0}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` +snippet = "<%= $0 %>" i +`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`$0`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` endsnippet ########################################################################### @@ -150,11 +150,11 @@ snippet licai "link_to (controller, action, id)" w endsnippet snippet linpp "link_to (nested path plural)" w -`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${10:parent}_${11:child}_path(${12:@}${13:${10}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` +`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${10:parent}_${11:child}_path(${12:@}${13:$10})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` endsnippet snippet linp "link_to (nested path)" w -`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` +`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:parent}_${13:child}_path(${14:@}${15:$12}, ${16:@}${17:$13})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` endsnippet snippet lipp "link_to (path plural)" w @@ -162,7 +162,7 @@ snippet lipp "link_to (path plural)" w endsnippet snippet lip "link_to (path)" w -`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:model}_path(${13:@}${14:${12}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` +`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:model}_path(${13:@}${14:$12})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` endsnippet snippet lim "link_to model" w diff --git a/sources_non_forked/vim-snippets/UltiSnips/go.snippets b/sources_non_forked/vim-snippets/UltiSnips/go.snippets index b6891ff0..35cf9091 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/go.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/go.snippets @@ -53,7 +53,7 @@ endsnippet snippet switch "Switch statement" b switch ${1:expression}${1/(.+)/ /}{ -case${0} +case$0 } endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/html.snippets b/sources_non_forked/vim-snippets/UltiSnips/html.snippets index 026985cb..6d98cb1c 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/html.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/html.snippets @@ -12,33 +12,6 @@ def x(snip): snip.rv = "" endglobal -############ -# Doctypes # -############ -snippet doctype "DocType XHTML 1.0 Strict" b -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - -endsnippet - -snippet doctype "DocType XHTML 1.0 Transitional" b -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -endsnippet - -snippet doctype "DocType XHTML 1.1" b -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" - "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> - -endsnippet - -snippet doctype "HTML - 4.0 Transitional (doctype)" b -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> - -endsnippet - snippet doctype "HTML - 5.0 (doctype)" b <!DOCTYPE html> @@ -83,45 +56,6 @@ snippet left "Left (left)" ← endsnippet -snippet option "Option (option)" -⌥ -endsnippet - -####################### -# Conditional inserts # -####################### -snippet ! "IE Conditional Comment: Internet Explorer 5_0 only" -<!--[if IE 5.0]>${1:IE Conditional Comment: Internet Explorer 5.0 only }<![endif]-->$0 -endsnippet - -snippet ! "IE Conditional Comment: Internet Explorer 5_5 only" -<!--[if IE 5.5000]>${1:IE Conditional Comment: Internet Explorer 5.5 only }<![endif]-->$0 -endsnippet - -snippet ! "IE Conditional Comment: Internet Explorer 5_x" -<!--[if lt IE 6]>${1:IE Conditional Comment: Internet Explorer 5.x }<![endif]-->$0 -endsnippet - -snippet ! "IE Conditional Comment: Internet Explorer 6 and below" -<!--[if lte IE 6]>${1:IE Conditional Comment: Internet Explorer 6 and below }<![endif]-->$0 -endsnippet - -snippet ! "IE Conditional Comment: Internet Explorer 6 only" -<!--[if IE 6]>${1:IE Conditional Comment: Internet Explorer 6 only }<![endif]-->$0 -endsnippet - -snippet ! "IE Conditional Comment: Internet Explorer 7+" -<!--[if gte IE 7]>${1:IE Conditional Comment: Internet Explorer 7 and above }<![endif]-->$0 -endsnippet - -snippet ! "IE Conditional Comment: Internet Explorer" -<!--[if IE]>${1: IE Conditional Comment: Internet Explorer }<![endif]-->$0 -endsnippet - -snippet ! "IE Conditional Comment: NOT Internet Explorer" -<!--[if !IE]><!-->${1: IE Conditional Comment: NOT Internet Explorer }<!-- <![endif]-->$0 -endsnippet - ############# # HTML TAGS # ############# @@ -129,12 +63,12 @@ snippet input "Input with Label" w <label for="${2:${1/[[:alpha:]]+|( )/(?1:_:\L$0)/g}}">$1</label><input type="${3:text/submit/hidden/button}" name="${4:$2}" value="$5"${6: id="${7:$2}"}`!p x(snip)`> endsnippet -snippet input "XHTML <input>" w +snippet input "HTML <input>" w <input type="${1:text/submit/hidden/button}" name="${2:some_name}" value="$3"${4: id="${5:$2}"}`!p x(snip)`> endsnippet -snippet opt "Option" w +snippet option "Option" w <option${1: value="${2:option}"}>${3:$2}</option> endsnippet @@ -145,15 +79,15 @@ snippet select "Select Box" w endsnippet -snippet textarea "XHTML <textarea>" w +snippet textarea "HTML <textarea>" w <textarea name="${1:Name}" rows="${2:8}" cols="${3:40}">$0</textarea> endsnippet -snippet mailto "XHTML <a mailto: >" w +snippet mailto "HTML <a mailto: >" w <a href="mailto:${1:joe@example.com}?subject=${2:feedback}">${3:email me}</a> endsnippet -snippet base "XHTML <base>" w +snippet base "HTML <base>" w <base href="$1"${2: target="$3"}`!p x(snip)`> endsnippet @@ -229,12 +163,12 @@ snippet meta "XHTML <meta>" w <meta name="${1:name}" content="${2:content}"`!p x(snip)`> endsnippet -snippet scriptsrc "XHTML <script src...>" w -<script src="$1" type="text/javascript" charset="${3:utf-8}"></script> +snippet scriptsrc "HTML <script src...>" w +<script src="$1" charset="${3:utf-8}"></script> endsnippet -snippet script "XHTML <script>" w -<script type="text/javascript" charset="utf-8"> +snippet script "HTML <script>" w +<script charset="utf-8"> ${0:${VISUAL}} </script> endsnippet @@ -304,20 +238,6 @@ snippet fieldset "Fieldset" w </fieldset> endsnippet -snippet movie "Embed QT movie (movie)" b -<object width="$2" height="$3" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab"> - <param name="src" value="$1"`!p x(snip)`> - <param name="controller" value="$4"`!p x(snip)`> - <param name="autoplay" value="$5"`!p x(snip)`> - <embed src="${1:movie.mov}" - width="${2:320}" height="${3:240}" - controller="${4:true}" autoplay="${5:true}" - scale="tofit" cache="true" - pluginspage="http://www.apple.com/quicktime/download/" - `!p x(snip)`> -</object> -endsnippet - snippet viewport "Responsive viewport meta" w <meta name="viewport" content="width=device-width, initial-scale=1"> endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/html_minimal.snippets b/sources_non_forked/vim-snippets/UltiSnips/html_minimal.snippets index e7ca5e06..5fb75223 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/html_minimal.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/html_minimal.snippets @@ -4,24 +4,24 @@ priority -50 snippet id -id="${1}"${2} +id="$1"$2 endsnippet snippet idn -id="${1}" name="${2:$1}" +id="$1" name="${2:$1}" endsnippet snippet label_and_input -<label for="${2:$1}">${1}</label> -<input type="${3:text}" name="${4:$2}"${5: id="${6:$2}"} value="${7}" />${8} +<label for="${2:$1}">$1</label> +<input type="${3:text}" name="${4:$2}"${5: id="${6:$2}"} value="$7" />$8 endsnippet snippet input -<input type="${1:text}" value="${2}" name="${3}"${4: id="${5:$3}"}/>${7} +<input type="${1:text}" value="$2" name="$3"${4: id="${5:$3}"}/>$7 endsnippet snippet submit -<input type="submit" value="${2}" ${3}/>${7} +<input type="submit" value="$2" $3/>$7 endsnippet snippet textarea diff --git a/sources_non_forked/vim-snippets/UltiSnips/htmldjango.snippets b/sources_non_forked/vim-snippets/UltiSnips/htmldjango.snippets index 37fa85fd..2ef004e2 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/htmldjango.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/htmldjango.snippets @@ -4,30 +4,30 @@ extends html # Generic Tags snippet % "" bi -{% ${1} %}${2} +{% $1 %}$2 endsnippet snippet %% "" bi {% ${1:tag_name} %} - ${2} + $2 {% end$1 %} endsnippet snippet { "" bi -{{ ${1} }}${2} +{{ $1 }}$2 endsnippet # Template Tags snippet autoescape "" bi {% autoescape ${1:off} %} - ${2} + $2 {% endautoescape %} endsnippet snippet block "" bi -{% block ${1} %} - ${2} +{% block $1 %} + $2 {% endblock $1 %} endsnippet @@ -37,12 +37,12 @@ endsnippet snippet comment "" bi {% comment %} - ${1} + $1 {% endcomment %} endsnippet snippet cycle "" bi -{% cycle ${1:val1} ${2:val2} ${3:as ${4}} %} +{% cycle ${1:val1} ${2:val2} ${3:as $4} %} endsnippet snippet debug "" bi @@ -54,76 +54,76 @@ snippet extends "" bi endsnippet snippet filter "" bi -{% filter ${1} %} - ${2} +{% filter $1 %} + $2 {% endfilter %} endsnippet snippet firstof "" bi -{% firstof ${1} %} +{% firstof $1 %} endsnippet snippet for "" bi -{% for ${1} in ${2} %} - ${3} +{% for $1 in $2 %} + $3 {% endfor %} endsnippet snippet empty "" bi {% empty %} - ${1} + $1 endsnippet snippet if "" bi -{% if ${1} %} - ${2} +{% if $1 %} + $2 {% endif %} endsnippet snippet iif "" bi -{% if ${1} %}${2}{% endif %} +{% if $1 %}$2{% endif %} endsnippet snippet ielse "" bi -{% else %}${1} +{% else %}$1 endsnippet snippet else "" bi {% else %} - ${1} + $1 endsnippet snippet ielif "" bi -{% elif %}${1} +{% elif %}$1 endsnippet snippet elif "" bi {% elif %} - ${1} + $1 endsnippet snippet ifchanged "" bi -{% ifchanged %}${1}{% endifchanged %} +{% ifchanged %}$1{% endifchanged %} endsnippet snippet ifequal "" bi -{% ifequal ${1} ${2} %} - ${3} +{% ifequal $1 $2 %} + $3 {% endifequal %} endsnippet snippet ifnotequal "" bi -{% ifnotequal ${1} ${2} %} - ${3} +{% ifnotequal $1 $2 %} + $3 {% endifnotequal %} endsnippet snippet include "" bi -{% include "${1}" %} +{% include "$1" %} endsnippet snippet load "" bi -{% load ${1} %} +{% load $1 %} endsnippet snippet now "" bi @@ -131,15 +131,15 @@ snippet now "" bi endsnippet snippet regroup "" bi -{% regroup ${1} by ${2} as ${3} %} +{% regroup $1 by $2 as $3 %} endsnippet snippet spaceless "" bi -{% spaceless %}${1}{% endspaceless %} +{% spaceless %}$1{% endspaceless %} endsnippet snippet ssi "" bi -{% ssi ${1} %} +{% ssi $1 %} endsnippet snippet trans "" bi @@ -147,7 +147,7 @@ snippet trans "" bi endsnippet snippet url "" bi -{% url ${1} as ${2} %} +{% url $1 as $2 %} endsnippet snippet widthratio "" bi @@ -155,7 +155,7 @@ snippet widthratio "" bi endsnippet snippet with "" bi -{% with ${1} as ${2} %} +{% with $1 as $2 %} ${VISUAL} {% endwith %} endsnippet @@ -197,7 +197,7 @@ snippet blocktrans "" bi endsnippet snippet lorem "" bi -{% lorem ${1} %} +{% lorem $1 %} endsnippet # Template Filters @@ -209,91 +209,91 @@ endsnippet # Note: Template tags that take no arguments are not implemented. snippet add "" bi -add:"${1}" +add:"$1" endsnippet snippet center "" bi -center:"${1}" +center:"$1" endsnippet snippet cut "" bi -cut:"${1}" +cut:"$1" endsnippet snippet date "" bi -date:"${1}" +date:"$1" endsnippet snippet default "" bi -default:"${1}" +default:"$1" endsnippet snippet defaultifnone "" bi -default_if_none:"${1}" +default_if_none:"$1" endsnippet snippet dictsort "" bi -dictsort:"${1}" +dictsort:"$1" endsnippet snippet dictsortrev "" bi -dictsortreversed:"${1}" +dictsortreversed:"$1" endsnippet snippet divisibleby "" bi -divisibleby:"${1}" +divisibleby:"$1" endsnippet snippet floatformat "" bi -floatformat:"${1}" +floatformat:"$1" endsnippet snippet getdigit "" bi -get_digit:"${1}" +get_digit:"$1" endsnippet snippet join "" bi -join:"${1}" +join:"$1" endsnippet snippet lengthis "" bi -length_is:"${1}" +length_is:"$1" endsnippet snippet pluralize "" bi -pluralize:"${1}" +pluralize:"$1" endsnippet snippet removetags "" bi -removetags:"${1}" +removetags:"$1" endsnippet snippet slice "" bi -slice:"${1}" +slice:"$1" endsnippet snippet stringformat "" bi -stringformat:"${1}" +stringformat:"$1" endsnippet snippet time "" bi -time:"${1}" +time:"$1" endsnippet snippet truncatewords "" bi -truncatewords:${1} +truncatewords:$1 endsnippet snippet truncatewordshtml "" bi -truncatewords_html:${1} +truncatewords_html:$1 endsnippet snippet urlizetrunc "" bi -urlizetrunc:${1} +urlizetrunc:$1 endsnippet snippet wordwrap "" bi -wordwrap:${1} +wordwrap:$1 endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/java.snippets b/sources_non_forked/vim-snippets/UltiSnips/java.snippets index 54d026df..55883a36 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/java.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/java.snippets @@ -48,7 +48,7 @@ $0 endsnippet snippet /o|v/ "new Object or variable" br -${1:Object} ${2:var} = new $1(${3}); +${1:Object} ${2:var} = new $1($3); endsnippet snippet f "field" b @@ -310,13 +310,13 @@ try { endsnippet snippet mt "method throws" b -${1:private} ${2:void} ${3:method}(${4}) ${5:throws $6 }{ +${1:private} ${2:void} ${3:method}($4) ${5:throws $6 }{ $0 } endsnippet snippet m "method" b -${1:private} ${2:void} ${3:method}(${4}) { +${1:private} ${2:void} ${3:method}($4) { $0 } endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript-angular.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript-angular.snippets index 91b59316..c231ece1 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript-angular.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript-angular.snippets @@ -19,7 +19,7 @@ config(function($1) { endsnippet snippet acont "angular controller" i -controller('${1:name}', [${2}function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { +controller('${1:name}', [$2function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { $0 }]); endsnippet @@ -31,29 +31,29 @@ controller('${1:name}', [${2:'$scope', }function(${2/('|")([A-Z_$]+)?\1?((, ?)$) endsnippet snippet adir "angular directive" i -directive('${1}', [${2}function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { +directive('$1', [$2function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { return { restrict: '${3:EA}', link: function(scope, element, attrs) { - ${0} + $0 } }; }]); endsnippet snippet adirs "angular directive with scope" i -directive('${1}', [${2:'$scope', }function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { +directive('$1', [${2:'$scope', }function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { return { restrict: '${3:EA}', link: function(scope, element, attrs) { - ${0} + $0 } }; }]); endsnippet snippet afact "angular factory" i -factory('${1:name}', [${2}function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { +factory('${1:name}', [$2function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { $0 }]); endsnippet @@ -65,7 +65,7 @@ factory('${1:name}', [${2:'$scope', }function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$ endsnippet snippet aserv "angular service" i -service('${1:name}', [${2}function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { +service('${1:name}', [$2function(${2/('|")([A-Z_$]+)?\1?((, ?)$)?/$2(?3::$4)/ig}) { $0 }]); endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript-node.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript-node.snippets index 7a14deeb..e4a64e95 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript-node.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript-node.snippets @@ -5,48 +5,48 @@ snippet #! "shebang" endsnippet snippet vreq "assign a CommonJS-style module to a var" -var ${0:${1/(.+\/)*(\w+)(-|\b|$)(\..+$)?/\u$2/g}} = require('${1}'); +var ${0:${1/(.+\/)*(\w+)(-|\b|$)(\..+$)?/\u$2/g}} = require('$1'); endsnippet snippet ex "module.exports" -module.exports = ${1}; +module.exports = $1; endsnippet snippet hcs "http.createServer" -http.createServer(${1}).listen(${2}); +http.createServer($1).listen($2); endsnippet snippet ncs "net.createServer" net.createServer(function(${1:socket}){ - ${1}.on('data', function(${3:data}){ - ${4} + $1.on('data', function(${3:data}){ + $4 }); - ${1}.on('end', function(){ - ${5} + $1.on('end', function(){ + $5 }); }).listen(${6:8124}); endsnippet snippet pipe "pipe" -pipe(${1:stream})${2} +pipe(${1:stream})$2 endsnippet # Express snippets snippet eget "express GET" -${1:app}.get('${2}', ${3}); +${1:app}.get('$2', $3); endsnippet snippet epost "express POST" -${1:app}.post('${2}', ${3}); +${1:app}.post('$2', $3); endsnippet snippet eput "express PUT" -${1:app}.put('${2}', ${3}); +${1:app}.put('$2', $3); endsnippet snippet edelete "express DELETE" -${1:app}.delete('${2}', ${3}); +${1:app}.delete('$2', $3); endsnippet # process snippets diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript-openui5.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript-openui5.snippets index 5553c79a..db4481cd 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript-openui5.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript-openui5.snippets @@ -1,80 +1,80 @@ snippet sapmlabel - var ${1} = new sap.m.Label({ - design : ${2}, - text : ${3}, - visible : ${4}, - textAlign : ${5}, - textDirection : ${6}, - width : ${7}, - required : ${7} + var $1 = new sap.m.Label({ + design : $2, + text : $3, + visible : $4, + textAlign : $5, + textDirection : $6, + width : $7, + required : $7 }); snippet sapmtext - var ${1} = new sap.m.Text({ - text :${2}, - textDirection :${3}, - visible :${4}, - wrapping : ${5}, - textAlign : ${6}, - width :${7}, - maxLines :${8} + var $1 = new sap.m.Text({ + text :$2, + textDirection :$3, + visible :$4, + wrapping : $5, + textAlign : $6, + width :$7, + maxLines :$8 }); snippet sapmbutton - var ${1} = new sap.m.Button({ - text : ${2}, - type : ${3}, - width : ${4}, - enabled :${5}, - visible :${6}, - icon : ${7}, - iconFirst : ${8}, - activeIcon :${9}, - iconDensityAware : ${10}, + var $1 = new sap.m.Button({ + text : $2, + type : $3, + width : $4, + enabled :$5, + visible :$6, + icon : $7, + iconFirst : $8, + activeIcon :$9, + iconDensityAware : $10, }); snippet sapmflexbox - var ${1} = new sap.m.FlexBox({ - visible : ${2}, - height : ${3}, - width : ${4}, - displayInline :${5}, - direction :${6}, - fitContainer : ${7}, - renderType : ${8}, - justifyContent :${9}, - alignItems : ${10}, + var $1 = new sap.m.FlexBox({ + visible : $2, + height : $3, + width : $4, + displayInline :$5, + direction :$6, + fitContainer : $7, + renderType : $8, + justifyContent :$9, + alignItems : $10, items:[] }); snippet sapmhbox - var ${1} = new sap.m.HBox({ - visible : ${2}, - height : ${3}, - width : ${4}, - displayInline :${5}, - direction :${6}, - fitContainer : ${7}, - renderType : ${8}, - justifyContent :${9}, - alignItems : ${10}, + var $1 = new sap.m.HBox({ + visible : $2, + height : $3, + width : $4, + displayInline :$5, + direction :$6, + fitContainer : $7, + renderType : $8, + justifyContent :$9, + alignItems : $10, items:[] }); snippet sapmvbox - var ${1} = new sap.m.VBox({ - visible : ${2}, - height : ${3}, - width : ${4}, - displayInline :${5}, - direction :${6}, - fitContainer : ${7}, - renderType : ${8}, - justifyContent :${9}, - alignItems : ${10}, + var $1 = new sap.m.VBox({ + visible : $2, + height : $3, + width : $4, + displayInline :$5, + direction :$6, + fitContainer : $7, + renderType : $8, + justifyContent :$9, + alignItems : $10, items:[] }); snippet sapcomponent - sap.ui.controller("${1}", { + sap.ui.controller("$1", { onInit: function(){ }, onAfterRendering: function() { @@ -86,120 +86,120 @@ snippet sapcomponent }); snippet sapminput - var ${1} = new sap.m.Input({ - value :${2}, - width : ${3}, - enabled :${4}, - visible :${5}, - valueState :${6}, - name : ${7}, - placeholder : ${8}, - editable : ${9}, - type : ${10}, - maxLength :${11}, - valueStateText :${12}, - showValueStateMessage :${13}, - dateFormat :${14}, - showValueHelp :${15}, - showSuggestion :${16}, - valueHelpOnly :${17}, - filterSuggests :${18}, - maxSuggestionWidth :${19}, - startSuggestion : ${20}, - showTableSuggestionValueHelp : ${21}, - description : ${22}, - fieldWidth : ${23}, - valueLiveUpdate :${24}, - suggestionItems :[${25}], - suggestionColumns : [${26}], - suggestionRows : [${27}], - liveChange : ${28}, - valueHelpRequest :${29}, - suggest : ${30}, - suggestionItemSelected : ${31} + var $1 = new sap.m.Input({ + value :$2, + width : $3, + enabled :$4, + visible :$5, + valueState :$6, + name : $7, + placeholder : $8, + editable : $9, + type : $10, + maxLength :$11, + valueStateText :$12, + showValueStateMessage :$13, + dateFormat :$14, + showValueHelp :$15, + showSuggestion :$16, + valueHelpOnly :$17, + filterSuggests :$18, + maxSuggestionWidth :$19, + startSuggestion : $20, + showTableSuggestionValueHelp : $21, + description : $22, + fieldWidth : $23, + valueLiveUpdate :$24, + suggestionItems :[$25], + suggestionColumns : [$26], + suggestionRows : [$27], + liveChange : $28, + valueHelpRequest :$29, + suggest : $30, + suggestionItemSelected : $31 }); snippet _sthis var _self = this; snippet sapmresponsivepopup - var ${1} = new sap.m.ResponsivePopover({ - placement :${2} ,//sap.m.PlacementType (default: sap.m.PlacementType.Right) - showHeader :${3} ,//boolean (default: true) - title : ${4},//string - icon :${5} ,//sap.ui.core.URI - modal :${6} ,// boolean - offsetX :${7}, //int - offsetY :${8}, //int - contentWidth : ${9},//sap.ui.core.CSSSize - contentHeight :${10}, //sap.ui.core.CSSSize - horizontalScrolling :${11}, //boolean - verticalScrolling :${12}, //boolean - showCloseButton :${13}, //boolean (default: true) + var $1 = new sap.m.ResponsivePopover({ + placement :$2 ,//sap.m.PlacementType (default: sap.m.PlacementType.Right) + showHeader :$3 ,//boolean (default: true) + title : $4,//string + icon :$5 ,//sap.ui.core.URI + modal :$6 ,// boolean + offsetX :$7, //int + offsetY :$8, //int + contentWidth : $9,//sap.ui.core.CSSSize + contentHeight :$10, //sap.ui.core.CSSSize + horizontalScrolling :$11, //boolean + verticalScrolling :$12, //boolean + showCloseButton :$13, //boolean (default: true) //Aggregations - content :${14}, //sap.ui.core.Control[] - customHeader :${15}, //sap.m.IBar - subHeader : ${16}, //sap.m.IBar - beginButton :${17}, //sap.m.Button - endButton : ${18}, //sap.m.Button + content :$14, //sap.ui.core.Control[] + customHeader :$15, //sap.m.IBar + subHeader : $16, //sap.m.IBar + beginButton :$17, //sap.m.Button + endButton : $18, //sap.m.Button //Associations - initialFocus : ${19}, //string | sap.ui.core.Control + initialFocus : $19, //string | sap.ui.core.Control //Events - beforeOpen :${20}, //fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject] - afterOpen : ${21}, //fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject] - beforeClose : ${22}, //fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject] - afterClose : ${23} //fnList + beforeOpen :$20, //fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject] + afterOpen : $21, //fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject] + beforeClose : $22, //fnListenerFunction or [fnListenerFunction, oListenerObject] or [oData, fnListenerFunction, oListenerObject] + afterClose : $23 //fnList }); snippet sapicon - var ${1} = new sap.ui.core.Icon({ - src :${2} , //sap.ui.core.URI - size :${3} , //sap.ui.core.CSSSize - color :${4} , //sap.ui.core.CSSColor - hoverColor : ${5} , // sap.ui.core.CSSColor - activeColor :${6} , //sap.ui.core.CSSColor - width :${7} , //sap.ui.core.CSSSize - height : ${8} ,//sap.ui.core.CSSSize - backgroundColor :${8} , //sap.ui.core.CSSColor - hoverBackgroundColor :${9} , //sap.ui.core.CSSColor - activeBackgroundColor :${10} , //sap.ui.core.CSSColor - visible :${11} , //boolean (default: true) - decorative : ${12} ,//boolean (default: true) + var $1 = new sap.ui.core.Icon({ + src :$2 , //sap.ui.core.URI + size :$3 , //sap.ui.core.CSSSize + color :$4 , //sap.ui.core.CSSColor + hoverColor : $5 , // sap.ui.core.CSSColor + activeColor :$6 , //sap.ui.core.CSSColor + width :$7 , //sap.ui.core.CSSSize + height : $8 ,//sap.ui.core.CSSSize + backgroundColor :$8 , //sap.ui.core.CSSColor + hoverBackgroundColor :$9 , //sap.ui.core.CSSColor + activeBackgroundColor :$10 , //sap.ui.core.CSSColor + visible :$11 , //boolean (default: true) + decorative : $12 ,//boolean (default: true) }); snippet extendVerticalL - sap.ui.layout.VerticalLayout.extend("${1}", { + sap.ui.layout.VerticalLayout.extend("$1", { metadata: { properties: { - ${2} + $2 }, aggregations: { - ${3} + $3 }, events: { - ${4} + $4 } }, init: function(){ - ${5} + $5 }, - renderer: "${6}" + renderer: "$6" }); snippet extendHorizontalL - sap.ui.layout.HorizontalLayout.extend("${1}", { + sap.ui.layout.HorizontalLayout.extend("$1", { metadata: { properties: { - ${2} + $2 }, aggregations: { - ${3} + $3 }, events: { - ${4} + $4 } }, init: function(){ - ${5} + $5 }, - renderer: "${6}" + renderer: "$6" }); diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets index 8821c5ca..29bf9ed1 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets @@ -34,18 +34,6 @@ ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) { endsnippet -snippet for "for (...) {...} (counting up)" b -for (var ${1:i} = 0, ${2:len} = ${3:Things.length}; $1 < $2; $1++) { - ${VISUAL}$0 -} -endsnippet - -snippet ford "for (...) {...} (counting down, faster)" b -for (var ${2:i} = ${1:Things.length} - 1; $2 >= 0; $2--) { - ${VISUAL}$0 -} -endsnippet - snippet fun "function (fun)" w function ${1:function_name}(${2:argument}) { ${VISUAL}$0 @@ -53,7 +41,7 @@ function ${1:function_name}(${2:argument}) { endsnippet snippet vf "Function assigned to var" -${1:var }${2:function_name} = function $2(${3}) { +${1:var }${2:function_name} = function $2($3) { ${VISUAL}$0 }; endsnippet @@ -84,78 +72,4 @@ for (${1:prop} in ${2:obj}){ } endsnippet -# Snippets for Console Debug Output - -snippet ca "console.assert" b -console.assert(${1:assertion}, ${2:"${3:message}"}); -endsnippet - -snippet cclear "console.clear" b -console.clear(); -endsnippet - -snippet cdir "console.dir" b -console.dir(${1:object}); -endsnippet - -snippet cdirx "console.dirxml" b -console.dirxml(${1:object}); -endsnippet - -snippet ce "console.error" b -console.error(${1:"${2:value}"}); -endsnippet - -snippet cgroup "console.group" b -console.group("${1:label}"); -${VISUAL}$0 -console.groupEnd(); -endsnippet - -snippet cgroupc "console.groupCollapsed" b -console.groupCollapsed("${1:label}"); -${VISUAL}$0 -console.groupEnd(); -endsnippet - -snippet ci "console.info" b -console.info(${1:"${2:value}"}); -endsnippet - -snippet cl "console.log" b -console.log(${1:"${2:value}"}); -endsnippet - -snippet cd "console.debug" b -console.debug(${1:"${2:value}"}); -endsnippet - -snippet cprof "console.profile" b -console.profile("${1:label}"); -${VISUAL}$0 -console.profileEnd(); -endsnippet - -snippet ctable "console.table" b -console.table(${1:"${2:value}"}); -endsnippet - -snippet ctime "console.time" b -console.time("${1:label}"); -${VISUAL}$0 -console.timeEnd("$1"); -endsnippet - -snippet ctimestamp "console.timeStamp" b -console.timeStamp("${1:label}"); -endsnippet - -snippet ctrace "console.trace" b -console.trace(); -endsnippet - -snippet cw "console.warn" b -console.warn(${1:"${2:value}"}); -endsnippet - # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets b/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets index de244736..903d8586 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/php-laravel.snippets @@ -53,9 +53,9 @@ use Illuminate\Support\ServiceProvider; class ${2:`!v expand('%:t:r')`} extends ServiceProvider { public function register() { - $this->app->bind('${4}Service', function ($app) { - return new ${5}( - $app->make('Repositories\\${6}Interface') + $this->app->bind('$4Service', function ($app) { + return new $5( + $app->make('Repositories\\$6Interface') ); }); } @@ -121,7 +121,7 @@ class ${2:`!v expand('%:t:r')`} extends \Eloquent { public $timestamps = ${5:false}; - protected $hidden = [${6}]; + protected $hidden = [$6]; protected $guarded = [${7:'id'}]; } @@ -208,10 +208,10 @@ snippet l_r "Laravel Repository" b * \date `!v strftime('%d-%m-%y')` */ -namespace ${1:Repositories\\${2}}; +namespace ${1:Repositories\\$2}; -class ${3:`!v expand('%:t:r')`} extends \\${6} implements ${4:$3RepositoryInterface} { - ${7} +class ${3:`!v expand('%:t:r')`} extends \\$6 implements ${4:$3RepositoryInterface} { + $7 } endsnippet @@ -227,7 +227,7 @@ snippet l_s "Laravel Service" b * \date `!v strftime('%d-%m-%y')` */ -namespace Services\\${1}; +namespace Services\\$1; use ${3:Repositories\\${4:Interface}}; @@ -265,6 +265,6 @@ class ${2:`!v expand('%:t:r')`} extends Facade { * * \return string */ - protected static function getFacadeAccessor() { return '${4:${3}Service}'; } + protected static function getFacadeAccessor() { return '${4:$3Service}'; } } endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/php-phpspec.snippets b/sources_non_forked/vim-snippets/UltiSnips/php-phpspec.snippets index 08d84a05..a0acfc3a 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/php-phpspec.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/php-phpspec.snippets @@ -23,15 +23,15 @@ class `!p snip.rv = re.match(r'.*(?=\.)', fn).group() ` extends ObjectBehavior { - function it_${1}() + function it_$1() { - $0 + ${0:${VISUAL}} } } endsnippet snippet it "function it_does_something() { ... }" -function it_${1}() +function it_$1() { ${0:${VISUAL}} } @@ -53,7 +53,7 @@ endsnippet # Object construction snippet cw "$this->beConstructedWith($arg)" -$this->beConstructedWith(${1}); +$this->beConstructedWith($1); endsnippet snippet ct "$this->beConstructedThrough($methodName, [$arg])" @@ -112,44 +112,44 @@ endsnippet # Type matchers snippet stype "$this->shouldHaveType('Type')" -$this->shouldHaveType(${1}); +$this->shouldHaveType($1); endsnippet snippet sntype "$this->shouldNotHaveType('Type')" -$this->shouldNotHaveType(${1}); +$this->shouldNotHaveType($1); endsnippet snippet srinstance "$this->shouldReturnAnInstanceOf('Type')" -$this->shouldReturnAnInstanceOf(${1}); +$this->shouldReturnAnInstanceOf($1); endsnippet snippet snrinstance "$this->shouldNotReturnAnInstanceOf('Type')" -$this->shouldNotReturnAnInstanceOf(${1}); +$this->shouldNotReturnAnInstanceOf($1); endsnippet snippet sbinstance "$this->shouldBeAnInstanceOf('Type')" -$this->shouldBeAnInstanceOf(${1}); +$this->shouldBeAnInstanceOf($1); endsnippet snippet snbinstance "$this->shouldNotBeAnInstanceOf('Type')" -$this->shouldNotBeAnInstanceOf(${1}); +$this->shouldNotBeAnInstanceOf($1); endsnippet snippet simplement "$this->shouldImplement('Type')" -$this->shouldImplement(${1}); +$this->shouldImplement($1); endsnippet snippet snimplement "$this->shouldNotImplement('Type')" -$this->shouldNotImplement(${1}); +$this->shouldNotImplement($1); endsnippet # Object state matchers snippet sbstate "$this->shouldBeXYZ()" -$this->shouldBe${1}(); +$this->shouldBe$1(); endsnippet snippet snbstate "$this->shouldNotBeXYZ()" -$this->shouldNotBe${1}(); +$this->shouldNotBe$1(); endsnippet # Count matchers diff --git a/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets b/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets index 9bca168c..7e3d5804 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/php-symfony2.snippets @@ -67,25 +67,25 @@ endsnippet snippet act "Symfony2 action" b /** - * @Route("${3}", name="${4}") + * @Route("$3", name="$4") * @Method({${5:"POST"}}) * @Template() */ -public function ${1}Action(${2}) +public function $1Action($2) { - ${6} + $6 } endsnippet snippet actt "Symfony2 action and template" b /** - * @Route("${3}", name="${4}") + * @Route("$3", name="$4") * @Method({${5:"GET"}}) * @Template() */ -public function ${1}Action(${2}) +public function $1Action($2) { - ${6} + $6 return []; }`!p relpath = os.path.relpath(path)` @@ -116,8 +116,8 @@ snip.rv = re.match(r'.*(?=\.)', fn).group() { protected function configure() { - $this->setName('${1}') - ->setDescription('${2}') + $this->setName('$1') + ->setDescription('$2') ->setDefinition([ new InputArgument('', InputArgument::REQUIRED, ''), new InputOption('', null, InputOption::VALUE_NONE, ''), @@ -186,14 +186,14 @@ snip.rv = re.match(r'.*(?=\.)', fn).group() /** * {@inheritDoc} */ - public function transform(${1}) + public function transform($1) { } /** * {@inheritDoc} */ - public function reverseTransform(${2}) + public function reverseTransform($2) { } } @@ -279,7 +279,7 @@ snip.rv = re.match(r'.*(?=\.)', fn).group() */ public function getName() { - return '${1}'; + return '$1'; } } endsnippet @@ -307,54 +307,54 @@ snip.rv = re.match(r'.*(?=\.)', fn).group() endsnippet snippet redir "Symfony2 redirect" b -$this->redirect($this->generateUrl('${1}', ${2})); +$this->redirect($this->generateUrl('$1', $2)); endsnippet snippet usecontroller "Symfony2 use Symfony\..\Controller" b -use Symfony\Bundle\FrameworkBundle\Controller\Controller;${1} +use Symfony\Bundle\FrameworkBundle\Controller\Controller;$1 endsnippet snippet usereauest "Symfony2 use Symfony\..\Request" b -use Symfony\Component\HttpFoundation\Request;${1} +use Symfony\Component\HttpFoundation\Request;$1 endsnippet snippet useroute "Symfony2 use Sensio\..\Route" b -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;${1} +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;$1 endsnippet snippet useresponse "Symfony2 use Symfony\..\Response" b -use Symfony\Component\HttpFoundation\Response;${1} +use Symfony\Component\HttpFoundation\Response;$1 endsnippet snippet usefile "Symfony2 use Symfony\..\File" b -use Symfony\Component\HttpFoundation\File\UploadedFile;${1} +use Symfony\Component\HttpFoundation\File\UploadedFile;$1 endsnippet snippet useassert "Symfony2 use Symfony\..\Constraints as Assert" b -use Symfony\Component\Validator\Constraints as Assert;${1} +use Symfony\Component\Validator\Constraints as Assert;$1 endsnippet snippet usetemplate "Symfony2 use Sensio\..\Template" b -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;${1} +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;$1 endsnippet snippet usecache "Symfony2 use Sensio\..\Cache" b -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;${1} +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;$1 endsnippet snippet usemethod "Symfony2 use Sensio\..\Method" b -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;${1} +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;$1 endsnippet snippet usearray "Symfony2 use Doctrine\..\ArrayCollection" b -use Doctrine\Common\Collections\ArrayCollection;${1} +use Doctrine\Common\Collections\ArrayCollection;$1 endsnippet snippet useorm "Symfony2 use Doctrine\..\Mapping as ORM" b -use Doctrine\ORM\Mapping as ORM;${1} +use Doctrine\ORM\Mapping as ORM;$1 endsnippet snippet usesecure "Symfony2 use JMS\..\Secure" b -use JMS\SecurityExtraBundle\Annotation\Secure;${1} +use JMS\SecurityExtraBundle\Annotation\Secure;$1 endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/php.snippets b/sources_non_forked/vim-snippets/UltiSnips/php.snippets index c7344a59..dde0def9 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/php.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/php.snippets @@ -250,7 +250,7 @@ class `!p snip.rv = re.match(r'.*(?=\.)', fn).group() ` extends \PHPUnit_Framework_TestCase { - public function test${1}() + public function test$1() { ${0:${VISUAL}} } diff --git a/sources_non_forked/vim-snippets/UltiSnips/proto.snippets b/sources_non_forked/vim-snippets/UltiSnips/proto.snippets index 923be578..11e90107 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/proto.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/proto.snippets @@ -32,17 +32,17 @@ endsnippet snippet reqf "Required field" b // ${4:TODO(`whoami`): Describe this field.} -optional ${1}`!p snip.rv = complete(t[1], FIELD_TYPES)` ${2:name} = ${3:1}; // Required +optional $1`!p snip.rv = complete(t[1], FIELD_TYPES)` ${2:name} = ${3:1}; // Required endsnippet snippet optf "Optional field" b // ${4:TODO(`whoami`): Describe this field.} -optional ${1}`!p snip.rv = complete(t[1], FIELD_TYPES)` ${2:name} = ${3:1}; +optional $1`!p snip.rv = complete(t[1], FIELD_TYPES)` ${2:name} = ${3:1}; endsnippet snippet repf "Repeated field" b // ${4:TODO(`whoami`): Describe this field.} -repeated ${1}`!p snip.rv = complete(t[1], FIELD_TYPES)` ${2:name} = ${3:1}; +repeated $1`!p snip.rv = complete(t[1], FIELD_TYPES)` ${2:name} = ${3:1}; endsnippet snippet enum "Enumeration" b diff --git a/sources_non_forked/vim-snippets/UltiSnips/puppet.snippets b/sources_non_forked/vim-snippets/UltiSnips/puppet.snippets index 1b2cfc57..7b39094c 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/puppet.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/puppet.snippets @@ -133,103 +133,103 @@ endsnippet ######################################################################## snippet alert "Alert Function" b -alert("${1:message}")${0} +alert("${1:message}")$0 endsnippet snippet crit "Crit Function" b -crit("${1:message}")${0} +crit("${1:message}")$0 endsnippet snippet debug "Debug Function" b -debug("${1:message}")${0} +debug("${1:message}")$0 endsnippet snippet defined "Defined Function" b -defined(${1:Resource}["${2:name}"])${0} +defined(${1:Resource}["${2:name}"])$0 endsnippet snippet emerg "Emerg Function" b -emerg("${1:message}")${0} +emerg("${1:message}")$0 endsnippet snippet extlookup "Simple Extlookup" b -$${1:Variable} = extlookup("${2:Lookup}")${0} +$${1:Variable} = extlookup("${2:Lookup}")$0 endsnippet snippet extlookup "Extlookup with defaults" b -$${1:Variable} = extlookup("${2:Lookup}", ${3:Default})${0} +$${1:Variable} = extlookup("${2:Lookup}", ${3:Default})$0 endsnippet snippet extlookup "Extlookup with defaults and custom data file" b -$${1:Variable} = extlookup("${2:Lookup}", ${3:Default}, ${4:Data Source})${0} +$${1:Variable} = extlookup("${2:Lookup}", ${3:Default}, ${4:Data Source})$0 endsnippet snippet fail "Fail Function" b -fail("${1:message}")${0} +fail("${1:message}")$0 endsnippet snippet hiera "Hiera Function" b -$${1:Variable} = hiera("${2:Lookup}")${0} +$${1:Variable} = hiera("${2:Lookup}")$0 endsnippet snippet hiera "Hiera with defaults" b -$${1:Variable} = hiera("${2:Lookup}", ${3:Default})${0} +$${1:Variable} = hiera("${2:Lookup}", ${3:Default})$0 endsnippet snippet hiera "Hiera with defaults and override" b -$${1:Variable} = hiera("${2:Lookup}", ${3:Default}, ${4:Override})${0} +$${1:Variable} = hiera("${2:Lookup}", ${3:Default}, ${4:Override})$0 endsnippet snippet hiera_hash "Hiera Hash Function" b -$${1:Variable} = hiera_hash("${2:Lookup}")${0} +$${1:Variable} = hiera_hash("${2:Lookup}")$0 endsnippet snippet hiera_hash "Hiera Hash with defaults" b -$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default})${0} +$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default})$0 endsnippet snippet hiera_hash "Hiera Hash with defaults and override" b -$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default}, ${4:Override})${0} +$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default}, ${4:Override})$0 endsnippet snippet hiera_include "Hiera Include Function" b -hiera_include("${1:Lookup}")${0} +hiera_include("${1:Lookup}")$0 endsnippet snippet include "Include Function" b -include ${1:classname}${0} +include ${1:classname}$0 endsnippet snippet info "Info Function" b -info("${1:message}")${0} +info("${1:message}")$0 endsnippet snippet inline_template "Inline Template Function" b -inline_template("<%= ${1:template} %>")${0} +inline_template("<%= ${1:template} %>")$0 endsnippet snippet notice "Notice Function" b -notice("${1:message}")${0} +notice("${1:message}")$0 endsnippet snippet realize "Realize Function" b -realize(${1:Resource}["${2:name}"])${0} +realize(${1:Resource}["${2:name}"])$0 endsnippet snippet regsubst "Regsubst Function" b -regsubst($${1:Target}, '${2:regexp}', '${3:replacement}')${0} +regsubst($${1:Target}, '${2:regexp}', '${3:replacement}')$0 endsnippet snippet split "Split Function" b -$${1:Variable} = split($${1:Target}, '${2:regexp}')${0} +$${1:Variable} = split($${1:Target}, '${2:regexp}')$0 endsnippet snippet versioncmp "Version Compare Function" b -$${1:Variable} = versioncmp('${1:version}', '${2:version}')${0} +$${1:Variable} = versioncmp('${1:version}', '${2:version}')$0 endsnippet snippet warning "Warning Function" b -warning("${1:message}")${0} +warning("${1:message}")$0 endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/python.snippets b/sources_non_forked/vim-snippets/UltiSnips/python.snippets index 5d8e2641..686226e7 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/python.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/python.snippets @@ -19,7 +19,7 @@ endsnippet snippet with "with" b with ${1:expr}`!p snip.rv = " as " if t[2] else ""`${2:var}: ${3:${VISUAL:pass}} -${0} +$0 endsnippet snippet for "for loop" b diff --git a/sources_non_forked/vim-snippets/UltiSnips/r.snippets b/sources_non_forked/vim-snippets/UltiSnips/r.snippets index 02c4c259..44624b3b 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/r.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/r.snippets @@ -24,11 +24,11 @@ setwd("${1:`!p snip.rv = os.getcwd()`}") endsnippet snippet as "Apply type on variable" w -as.$1`!p snip.rv = complete(t[1], FIELD_TYPES)`(${2}${VISUAL}) +as.$1`!p snip.rv = complete(t[1], FIELD_TYPES)`($2${VISUAL}) endsnippet snippet is "Test type on variable" w -is.$1`!p snip.rv = complete(t[1], FIELD_TYPES)`(${2}${VISUAL}) +is.$1`!p snip.rv = complete(t[1], FIELD_TYPES)`($2${VISUAL}) endsnippet snippet dl "Download and install a package" b @@ -50,51 +50,51 @@ source('${0:file}') endsnippet snippet if "If statement" -if (${1}) { - ${0} +if ($1) { + $0 } endsnippet snippet eif "Else-If statement" -else if (${1}) { - ${0} +else if ($1) { + $0 } endsnippet snippet el "Else statement" else { - ${0} + $0 } endsnippet snippet ife "if .. else" -if (${1}) { - ${2} +if ($1) { + $2 } else { - ${3} + $3 } endsnippet snippet wh "while loop" -while(${1}) { - ${2} +while($1) { + $2 } endsnippet snippet for "for loop" for (${1:item} in ${2:list}) { - ${3} + $3 } endsnippet snippet fun "Function definition" -${1:name} <- function (${2}) { - ${0} +${1:name} <- function ($2) { + $0 } endsnippet snippet ret "Return call" -return(${0}) +return($0) endsnippet snippet df "Data frame" diff --git a/sources_non_forked/vim-snippets/UltiSnips/rails.snippets b/sources_non_forked/vim-snippets/UltiSnips/rails.snippets index e7b2757b..9aefe667 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/rails.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/rails.snippets @@ -22,7 +22,7 @@ class ${1:Model}Controller < ApplicationController $0 private - def find_${2} + def find_$2 @$2 = ${3:$1}.find(params[:id]) if params[:id] end end @@ -253,7 +253,7 @@ after_validation_on_update $0 endsnippet snippet asg "assert(var = assigns(:var))" -assert(${1:var} = assigns(:${1}), "Cannot find @${1}") +assert(${1:var} = assigns(:$1), "Cannot find @$1") $0 endsnippet @@ -270,11 +270,11 @@ end endsnippet snippet artnpp "assert_redirected_to (nested path plural)" -assert_redirected_to ${10:${2:parent}_${3:child}_path(${4:@}${5:${2}})} +assert_redirected_to ${10:${2:parent}_${3:child}_path(${4:@}${5:$2})} endsnippet snippet artnp "assert_redirected_to (nested path)" -assert_redirected_to ${2:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})} +assert_redirected_to ${2:${12:parent}_${13:child}_path(${14:@}${15:$12}, ${16:@}${17:$13})} endsnippet snippet artpp "assert_redirected_to (path plural)" @@ -282,7 +282,7 @@ assert_redirected_to ${10:${2:model}s_path} endsnippet snippet artp "assert_redirected_to (path)" -assert_redirected_to ${2:${12:model}_path(${13:@}${14:${12}})} +assert_redirected_to ${2:${12:model}_path(${13:@}${14:$12})} endsnippet snippet asrj "assert_rjs" @@ -324,7 +324,7 @@ before_validation_on_update endsnippet snippet bt "belongs_to (bt)" -belongs_to :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:${1}_id}"} +belongs_to :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:$1_id}"} endsnippet snippet crw "cattr_accessor" @@ -358,7 +358,7 @@ endsnippet snippet deftg "def get request" def test_should_get_${1:action} ${2:@${3:model} = ${4:$3s}(:${5:fixture_name}) - }get :${1}${6:, :id => @$3.to_param} + }get :$1${6:, :id => @$3.to_param} assert_response :success $0 end @@ -367,7 +367,7 @@ endsnippet snippet deftp "def post request" def test_should_post_${1:action} ${3:@$2 = ${4:$2s}(:${5:fixture_name}) - }post :${1}${6:, :id => @$2.to_param}, :${2:model} => { $0 } + }post :$1${6:, :id => @$2.to_param}, :${2:model} => { $0 } assert_response :redirect end @@ -400,23 +400,23 @@ end endsnippet snippet habtm "has_and_belongs_to_many (habtm)" -has_and_belongs_to_many :${1:object}${2:, :join_table => "${3:table_name}", :foreign_key => "${4:${1}_id}"} +has_and_belongs_to_many :${1:object}${2:, :join_table => "${3:table_name}", :foreign_key => "${4:$1_id}"} endsnippet snippet hm "has_many (hm)" -has_many :${1:object}s${2:, :class_name => "${1}", :foreign_key => "${4:reference}_id"} +has_many :${1:object}s${2:, :class_name => "$1", :foreign_key => "${4:reference}_id"} endsnippet snippet hmt "has_many (through)" -has_many :${1:objects}, :through => :${2:join_association}${3:, :source => :${4:${2}_table_foreign_key_to_${1}_table}} +has_many :${1:objects}, :through => :${2:join_association}${3:, :source => :${4:$2_table_foreign_key_to_$1_table}} endsnippet snippet hmd "has_many :dependent => :destroy" -has_many :${1:object}s${2:, :class_name => "${1}", :foreign_key => "${4:reference}_id"}, :dependent => :destroy$0 +has_many :${1:object}s${2:, :class_name => "$1", :foreign_key => "${4:reference}_id"}, :dependent => :destroy$0 endsnippet snippet ho "has_one (ho)" -has_one :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:${1}_id}"} +has_one :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:$1_id}"} endsnippet snippet logd "logger.debug" @@ -514,11 +514,11 @@ redirect_to :controller => "${1:items}", :action => "${2:show}", :id => ${0:@ite endsnippet snippet renpp "redirect_to (nested path plural)" -redirect_to(${2:${10:parent}_${11:child}_path(${12:@}${13:${10}})}) +redirect_to(${2:${10:parent}_${11:child}_path(${12:@}${13:$10})}) endsnippet snippet renp "redirect_to (nested path)" -redirect_to(${2:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})}) +redirect_to(${2:${12:parent}_${13:child}_path(${14:@}${15:$12}, ${16:@}${17:$13})}) endsnippet snippet repp "redirect_to (path plural)" @@ -526,7 +526,7 @@ redirect_to(${2:${10:model}s_path}) endsnippet snippet rep "redirect_to (path)" -redirect_to(${2:${12:model}_path(${13:@}${14:${12}})}) +redirect_to(${2:${12:model}_path(${13:@}${14:$12})}) endsnippet snippet reb "redirect_to :back" @@ -882,12 +882,12 @@ end endsnippet snippet trans "Translation snippet" -I18n.t('`!v substitute(substitute(substitute(@%, substitute(getcwd() . "/", "\/", "\\\\/", "g"), "", ""), "\\(\\.\\(html\\|js\\)\\.\\(haml\\|erb\\)\\|\\(_controller\\)\\?\\.rb\\)$", "", ""), "/", ".", "g")`.${2:${1/[^\w]/_/g}}${3}', :default => "${1:some_text}"${4})${5:$0} +I18n.t('`!v substitute(substitute(substitute(@%, substitute(getcwd() . "/", "\/", "\\\\/", "g"), "", ""), "\\(\\.\\(html\\|js\\)\\.\\(haml\\|erb\\)\\|\\(_controller\\)\\?\\.rb\\)$", "", ""), "/", ".", "g")`.${2:${1/[^\w]/_/g}}$3', :default => "${1:some_text}"$4)${5:$0} endsnippet snippet route_spec it 'routes to #${1:action}' do - ${2:get}('/${3:url}').should route_to('`!v substitute(expand('%:t:r'), '_routing_spec$', '', '')`#$1'${4:, ${5:params}})${6} + ${2:get}('/${3:url}').should route_to('`!v substitute(expand('%:t:r'), '_routing_spec$', '', '')`#$1'${4:, ${5:params}})$6 end endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/rst.snippets b/sources_non_forked/vim-snippets/UltiSnips/rst.snippets index 0596eee1..9a2b4c0c 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/rst.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/rst.snippets @@ -28,7 +28,7 @@ SPECIFIC_ADMONITIONS = ["attention", "caution", "danger", #http://docutils.sourceforge.net/docs/ref/rst/directives.html DIRECTIVES = ['topic','sidebar','math','epigraph', 'parsed-literal','code','highlights', - 'pull-quote','compound','container', + 'pull-quote','compound','container','table','csv-table', 'list-table','class','sectnum', 'role','default-role','unicode', 'raw'] @@ -238,6 +238,7 @@ if di == 'im': if di == 'fi': content=""" :alt: {0} + {0}""".format(real_name) ` ..`!p snip.rv = " %s" % link if link else ""` $1`!p @@ -281,6 +282,23 @@ snippet ro "Text Roles" w path))`:\`$2\`\ endsnippet +snippet eu "Embedded URI" i +`!p +if has_cjk(vim.current.line): + snip.rv = "\ "`\`${1:${VISUAL:Text}} <${2:URI}>\`_`!p +if has_cjk(vim.current.line): + snip.rv ="\ " +else: + snip.rv = "" +`$0 +endsnippet + +snippet fnt "Footnote or Citation" i +[${1:Label}]_ $0 + +.. [$1] ${2:Reference} +endsnippet + ############ # Sphinx # ############ diff --git a/sources_non_forked/vim-snippets/UltiSnips/rust.snippets b/sources_non_forked/vim-snippets/UltiSnips/rust.snippets index 40e76055..482f78e4 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/rust.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/rust.snippets @@ -5,22 +5,22 @@ priority -50 snippet let "let variable declaration" b -let ${1:name}${2:: ${3:type}} = ${4}; +let ${1:name}${2:: ${3:type}} = $4; endsnippet snippet letm "let mut variable declaration" b -let mut ${1:name}${2:: ${3:type}} = ${4}; +let mut ${1:name}${2:: ${3:type}} = $4; endsnippet snippet fn "A function, optionally with arguments and return type." -fn ${1:function_name}(${2})${3/..*/ -> /}${3} { - ${VISUAL}${0} +fn ${1:function_name}($2)${3/..*/ -> /}$3 { + ${VISUAL}$0 } endsnippet snippet pfn "A public function, optionally with arguments and return type." -pub fn ${1:function_name}(${2})${3/..*/ -> /}${3} { - ${VISUAL}${0} +pub fn ${1:function_name}($2)${3/..*/ -> /}$3 { + ${VISUAL}$0 } endsnippet @@ -29,44 +29,44 @@ ${1:a}: ${2:T}${3:, arg} endsnippet snippet || "Closure, anonymous function (inline)" i -${1:move }|${2}| { $3 } +${1:move }|$2| { $3 } endsnippet snippet |} "Closure, anonymous function (block)" i -${1:move }|${2}| { +${1:move }|$2| { $3 } endsnippet snippet pri "print!(..)" b -print!("${1}"${2/..*/, /}${2}); +print!("$1"${2/..*/, /}$2); endsnippet snippet pln "println!(..)" b -println!("${1}"${2/..*/, /}${2}); +println!("$1"${2/..*/, /}$2); endsnippet snippet fmt "format!(..)" -format!("${1}"${2/..*/, /}${2}); +format!("$1"${2/..*/, /}$2); endsnippet snippet macro "macro_rules!" b macro_rules! ${1:name} { (${2:matcher}) => ( - ${3} + $3 ) } endsnippet snippet mod "A module" b mod ${1:`!p snip.rv = snip.basename.lower() or "name"`} { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet snippet for "for .. in .." b -for ${1:i} in ${2} { - ${VISUAL}${0} +for ${1:i} in $2 { + ${VISUAL}$0 } endsnippet @@ -76,19 +76,19 @@ endsnippet snippet st "Struct" b struct ${1:`!p snip.rv = snip.basename.title() or "Name"`} { - ${VISUAL}${0} + ${VISUAL}$0 } endsnippet # TODO: fancy dynamic field mirroring like Python slotclass snippet stn "Struct with new constructor." b pub struct ${1:`!p snip.rv = snip.basename.title() or "Name"`} { - fd${0} + fd$0 } impl $1 { - pub fn new(${2}) -> $1 { - $1 { ${3} } + pub fn new($2) -> $1 { + $1 { $3 } } } endsnippet @@ -99,7 +99,7 @@ endsnippet snippet impl "Struct/Trait implementation" b impl ${1:Type/Trait}${2: for ${3:Type}} { - ${0} + $0 } endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/supercollider.snippets b/sources_non_forked/vim-snippets/UltiSnips/supercollider.snippets index b8538aa9..3fe8e53f 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/supercollider.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/supercollider.snippets @@ -5,6 +5,6 @@ for (${1:1}, ${2:10}) {${3: |i}|} endsnippet snippet sdef SynthDef(\\${1:synthName}, {${2: |${3:x}|} - ${0} + $0 }).add; endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/tcl.snippets b/sources_non_forked/vim-snippets/UltiSnips/tcl.snippets index 65849157..739098be 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/tcl.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/tcl.snippets @@ -5,21 +5,21 @@ priority -50 ########################################################################### snippet for "for... (for)" b for {${1:set i 0}} {${2:\$i < \$n}} {${3:incr i}} { - ${4} + $4 } endsnippet snippet foreach "foreach... (foreach)" foreach ${1:var} ${2:\$list} { - ${3} + $3 } endsnippet snippet if "if... (if)" b if {${1:condition}} { - ${2} + $2 } endsnippet @@ -27,7 +27,7 @@ endsnippet snippet proc "proc... (proc)" b proc ${1:name} {${2:args}} \ { - ${3} + $3 } endsnippet @@ -35,16 +35,16 @@ endsnippet snippet switch "switch... (switch)" b switch ${1:-exact} -- ${2:\$var} { ${3:match} { - ${4} + $4 } - default {${5}} + default {$5} } endsnippet snippet while "while... (while)" b while {${1:condition}} { - ${2} + $2 } endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets index f43de5ee..9957b3f7 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets @@ -53,7 +53,7 @@ snippet desc "Description" b endsnippet snippet it "Individual item" b -\item ${1} +\item $1 $0 endsnippet @@ -61,54 +61,54 @@ snippet part "Part" b \part{${1:part name}} \label{prt:${2:${1/(\w+)|\W+/(?1:\L$0\E:_)/ga}}} -${0} +$0 endsnippet snippet cha "Chapter" b \chapter{${1:chapter name}} \label{cha:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} -${0} +$0 endsnippet snippet sec "Section" b \section{${1:section name}} \label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} -${0} +$0 endsnippet snippet sub "Subsection" b \subsection{${1:subsection name}} \label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} -${0} +$0 endsnippet snippet ssub "Subsubsection" b \subsubsection{${1:subsubsection name}} \label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} -${0} +$0 endsnippet snippet par "Paragraph" b \paragraph{${1:paragraph name}} \label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} -${0} +$0 endsnippet snippet subp "Subparagraph" b \subparagraph{${1:subparagraph name}} \label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} -${0} +$0 endsnippet snippet ni "Non-indented paragraph" b \noindent -${0} +$0 endsnippet snippet pac "Package" b diff --git a/sources_non_forked/vim-snippets/UltiSnips/vim.snippets b/sources_non_forked/vim-snippets/UltiSnips/vim.snippets index dbb2396d..65a18973 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/vim.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/vim.snippets @@ -13,11 +13,11 @@ snippet guard "script reload guard" b if exists('${1:did_`!p snip.rv = snip.fn.replace('.','_')`}') || &cp${2: || version < 700} finish endif -let $1 = 1${3} +let $1 = 1$3 endsnippet snippet f "function" b -fun ${1:function_name}(${2}) +fun ${1:function_name}($2) ${3:" code} endf endsnippet diff --git a/sources_non_forked/vim-snippets/snippets/actionscript.snippets b/sources_non_forked/vim-snippets/snippets/actionscript.snippets index b7aa7cb3..5d744390 100644 --- a/sources_non_forked/vim-snippets/snippets/actionscript.snippets +++ b/sources_non_forked/vim-snippets/snippets/actionscript.snippets @@ -96,7 +96,7 @@ snippet interface } snippet try try { - ${1} + ${1:${VISUAL}} } catch (error:ErrorType) { ${2} } finally { @@ -115,11 +115,11 @@ snippet forr # If Condition snippet if if (${1:/* condition */}) { - ${0} + ${0:${VISUAL}} } snippet el else { - ${0} + ${0:${VISUAL}} } # Ternary conditional snippet t diff --git a/sources_non_forked/vim-snippets/snippets/ada.snippets b/sources_non_forked/vim-snippets/snippets/ada.snippets index 1039946f..c0ed2801 100644 --- a/sources_non_forked/vim-snippets/snippets/ada.snippets +++ b/sources_non_forked/vim-snippets/snippets/ada.snippets @@ -90,19 +90,19 @@ snippet fors for some snippet if if if ${1} then - ${0} + ${0:${VISUAL}} end if; snippet ife if ... else if ${1} then - ${2} + ${2:${VISUAL}} else ${0} end if; snippet el else else - ${0} + ${0:${VISUAL}} snippet eif elsif elsif ${1} then @@ -110,13 +110,13 @@ snippet eif elsif snippet wh while while ${1} loop - ${0} + ${0:${VISUAL}} end loop; snippet nwh named while ${1}: while ${2} loop - ${0} + ${0:${VISUAL}} end loop $1; snippet for for diff --git a/sources_non_forked/vim-snippets/snippets/apache.snippets b/sources_non_forked/vim-snippets/snippets/apache.snippets index db3256e9..de5672c2 100644 --- a/sources_non_forked/vim-snippets/snippets/apache.snippets +++ b/sources_non_forked/vim-snippets/snippets/apache.snippets @@ -9,22 +9,22 @@ snippet dir # <FilesMatch> snippet filesmatch <FilesMatch "${1:regex}"> - ${0} + ${0:${VISUAL}} </FilesMatch> # <IfModule> snippet ifmodule <IfModule ${1:mod_example.c}> - ${0} + ${0:${VISUAL}} </IfModule> # <LimitExcept> snippet limitexcept <LimitExcept ${1:POST GET}> - ${0} + ${0:${VISUAL}} </LimitExcept> # <Proxy> snippet proxy <Proxy ${1:*}> - ${0} + ${0:${VISUAL}} </Proxy> # <VirtualHost> snippet virtualhost diff --git a/sources_non_forked/vim-snippets/snippets/arduino.snippets b/sources_non_forked/vim-snippets/snippets/arduino.snippets index 6f7f4137..a2732a5e 100644 --- a/sources_non_forked/vim-snippets/snippets/arduino.snippets +++ b/sources_non_forked/vim-snippets/snippets/arduino.snippets @@ -20,7 +20,7 @@ snippet def # if snippet if if (${1:/* condition */}) { - ${2} + ${0:${VISUAL}} } # else snippet el diff --git a/sources_non_forked/vim-snippets/snippets/awk.snippets b/sources_non_forked/vim-snippets/snippets/awk.snippets index 32e56f2f..5c94734a 100644 --- a/sources_non_forked/vim-snippets/snippets/awk.snippets +++ b/sources_non_forked/vim-snippets/snippets/awk.snippets @@ -43,12 +43,12 @@ snippet ign IGNORECASE snippet if if {...} if (${1}) { - ${0} + ${0:${VISUAL}} } snippet ife if ... else ... if (${1}) { - ${2} + ${2:${VISUAL}} } else { ${0} } diff --git a/sources_non_forked/vim-snippets/snippets/c.snippets b/sources_non_forked/vim-snippets/snippets/c.snippets index 524b5b86..ea744d54 100644 --- a/sources_non_forked/vim-snippets/snippets/c.snippets +++ b/sources_non_forked/vim-snippets/snippets/c.snippets @@ -37,7 +37,7 @@ snippet ifdef # if snippet #if #if ${1:FOO} - ${0} + ${0:${VISUAL}} #endif # header include guard snippet once @@ -53,23 +53,23 @@ snippet once # if snippet if if (${1:true}) { - ${0} + ${0:${VISUAL}} } snippet ife if (${1:true}) { - ${2} + ${2:${VISUAL}} } else { ${0} } # else snippet el else { - ${0} + ${0:${VISUAL}} } # else if snippet elif else if (${1:true}) { - ${0} + ${0:${VISUAL}} } # ifi snippet ifi @@ -115,12 +115,12 @@ snippet forr # while snippet wh while (${1:/* condition */}) { - ${2} + ${0:${VISUAL}} } # do... while snippet do do { - ${2} + ${0:${VISUAL}} } while (${1:/* condition */}); ## ## Functions diff --git a/sources_non_forked/vim-snippets/snippets/coffee/coffee.snippets b/sources_non_forked/vim-snippets/snippets/coffee/coffee.snippets index bb964346..f23156cc 100644 --- a/sources_non_forked/vim-snippets/snippets/coffee/coffee.snippets +++ b/sources_non_forked/vim-snippets/snippets/coffee/coffee.snippets @@ -55,17 +55,17 @@ snippet cla class .. extends .. constructor: .. # If snippet if if ${1:condition} - ${0:# body...} + ${0:${VISUAL}} # If __ Else snippet ife if ${1:condition} - ${2:# body...} + ${2:${VISUAL}} else ${0:# body...} # Else if snippet eif else if ${1:condition} - ${0:# body...} + ${0:${VISUAL}} # Ternary If snippet ifte if ${1:condition} then ${2:value} else ${0:other} @@ -84,7 +84,7 @@ snippet log # Try __ Catch snippet try try - ${1} + ${1:${VISUAL}} catch ${2:error} ${0} # Require diff --git a/sources_non_forked/vim-snippets/snippets/crystal.snippets b/sources_non_forked/vim-snippets/snippets/crystal.snippets new file mode 100644 index 00000000..34d25406 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/crystal.snippets @@ -0,0 +1,82 @@ +snippet req require + require "${1}" +snippet case + case ${1:object} + when ${2:condition} + ${0} + end +snippet when + when ${1:condition} + ${0} +snippet def + def ${1:method_name} + ${0} + end +snippet pdef + private def ${1:method_name} + ${0} + end +snippet if + if ${1:condition} + ${0:${VISUAL}} + end +snippet ife + if ${1:condition} + ${2:${VISUAL}} + else + ${0} + end +snippet wh + while ${1:condition} + ${0:${VISUAL}} + end +snippet cla class .. end + class ${1:`substitute(vim_snippets#Filename(), "\(_\|^\)\(.\)", "\u\2", "g")`} + ${0} + end +snippet mod class .. end + module ${1:`substitute(vim_snippets#Filename(), "\(_\|^\)\(.\)", "\u\2", "g")`} + ${0} + end +snippet r + getter ${0:name} +snippet r! + getter! ${0:name} +snippet r? + getter? ${0:name} +snippet w + setter ${0:name} +snippet w! + setter! ${0:name} +snippet w? + setter? ${0:name} +snippet rw + property ${0:name} +snippet rw! + property! ${0:name} +snippet rw? + property? ${0:name} +snippet defs + def self.${1:class_method_name} + ${0} + end +snippet defi + def initialize(${1}) + ${0} + end +snippet do + do + ${0:${VISUAL}} + end +snippet dov + do |${1:v}| + ${2} + end +snippet desc + describe ${1:`substitute(substitute(vim_snippets#Filename(), "_spec$", "", ""), "\(_\|^\)\(.\)", "\u\2", "g")`} do + ${0} + end +snippet it + it "${1}" do + ${0} + end diff --git a/sources_non_forked/vim-snippets/snippets/cs.snippets b/sources_non_forked/vim-snippets/snippets/cs.snippets index 40e9c8f9..391984bb 100644 --- a/sources_non_forked/vim-snippets/snippets/cs.snippets +++ b/sources_non_forked/vim-snippets/snippets/cs.snippets @@ -76,15 +76,15 @@ snippet svm # if condition snippet if if (${1:true}) { - ${0} + ${0:${VISUAL}} } snippet el else { - ${0} + ${0:${VISUAL}} } snippet ifs if (${1}) - ${0} + ${0:${VISUAL}} # ternary conditional snippet t ${1} ? ${2} : ${0} @@ -93,12 +93,12 @@ snippet ? # do while loop snippet do do { - ${0} + ${0:${VISUAL}} } while (${1:true}); # while loop snippet wh while (${1:true}) { - ${0} + ${0:${VISUAL}} } # for loop snippet for @@ -451,14 +451,14 @@ snippet switch # try snippet try try { - ${0} + ${0:${VISUAL}} } catch (${1:System.Exception}) { throw; } snippet tryf try { - ${0} + ${0:${VISUAL}} } finally { ${1} diff --git a/sources_non_forked/vim-snippets/snippets/css.snippets b/sources_non_forked/vim-snippets/snippets/css.snippets index c4a74dec..08b6cdf3 100644 --- a/sources_non_forked/vim-snippets/snippets/css.snippets +++ b/sources_non_forked/vim-snippets/snippets/css.snippets @@ -1,8 +1,8 @@ -snippet . +snippet . "selector { }" ${1} { - ${0} + ${0:${VISUAL}} } -snippet ! +snippet ! "!important" !important snippet bdi:m+ -moz-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${0:stretch}; @@ -31,9 +31,9 @@ snippet @f } snippet @i @import url(${0}); -snippet @m +snippet @m "@media mediatype { }" @media ${1:print} { - ${0} + ${0:${VISUAL}} } snippet bg+ background: #${1:FFF} url(${2}) ${3:0} ${4:0} ${0:no-repeat}; diff --git a/sources_non_forked/vim-snippets/snippets/d.snippets b/sources_non_forked/vim-snippets/snippets/d.snippets index 216a4d89..e32a2998 100644 --- a/sources_non_forked/vim-snippets/snippets/d.snippets +++ b/sources_non_forked/vim-snippets/snippets/d.snippets @@ -88,13 +88,13 @@ snippet fsw } snippet try try { - ${1} + ${1:${VISUAL}} } catch(${2:Exception} ${3:e}) { ${4} } snippet tcf try { - ${0} + ${0:${VISUAL}} } catch(${1:Exception} ${2:e}) { ${3} } finally { @@ -102,7 +102,7 @@ snippet tcf } snippet wh while(${1:cond}) { - ${0} + ${0:${VISUAL}} } snippet dowh do { diff --git a/sources_non_forked/vim-snippets/snippets/dart.snippets b/sources_non_forked/vim-snippets/snippets/dart.snippets index 0093f2bf..78625c6c 100644 --- a/sources_non_forked/vim-snippets/snippets/dart.snippets +++ b/sources_non_forked/vim-snippets/snippets/dart.snippets @@ -71,12 +71,12 @@ snippet as assert(${0:/* condition */}); snippet try try { - ${0} + ${0:${VISUAL}} } catch (${1:Exception e}) { } snippet tryf try { - ${0} + ${0:${VISUAL}} } catch (${1:Exception e}) { } finally { } diff --git a/sources_non_forked/vim-snippets/snippets/eelixir.snippets b/sources_non_forked/vim-snippets/snippets/eelixir.snippets index 3d6e33d4..6286cee4 100644 --- a/sources_non_forked/vim-snippets/snippets/eelixir.snippets +++ b/sources_non_forked/vim-snippets/snippets/eelixir.snippets @@ -12,11 +12,11 @@ snippet for <% end %> snippet if <%= if ${1} do %> - ${0} + ${0:${VISUAL}} <% end %> snippet ife <%= if ${1} do %> - ${2} + ${2:${VISUAL}} <%= else %> ${0} <% end %> diff --git a/sources_non_forked/vim-snippets/snippets/elixir.snippets b/sources_non_forked/vim-snippets/snippets/elixir.snippets index 058f986c..ccc5fb73 100644 --- a/sources_non_forked/vim-snippets/snippets/elixir.snippets +++ b/sources_non_forked/vim-snippets/snippets/elixir.snippets @@ -1,16 +1,16 @@ snippet do do - ${0} + ${0:${VISUAL}} end snippet if if .. do .. end if ${1} do - ${0} + ${0:${VISUAL}} end snippet if: if .. do: .. if ${1:condition}, do: ${0} snippet ife if .. do .. else .. end if ${1:condition} do - ${2} + ${2:${VISUAL}} else ${0} end @@ -18,13 +18,13 @@ snippet ife: if .. do: .. else: if ${1:condition}, do: ${2}, else: ${0} snippet unless unless .. do .. end unless ${1} do - ${0} + ${0:${VISUAL}} end snippet unless: unless .. do: .. unless ${1:condition}, do: ${0} snippet unlesse unless .. do .. else .. end unless ${1:condition} do - ${2} + ${2:${VISUAL}} else ${0} end @@ -33,7 +33,7 @@ snippet unlesse: unless .. do: .. else: snippet cond cond do ${1} -> - ${0} + ${0:${VISUAL}} end snippet case case ${1} do @@ -143,7 +143,7 @@ snippet exunit end snippet try try .. rescue .. end try do - ${1} + ${1:${VISUAL}} rescue ${2} -> ${0} end diff --git a/sources_non_forked/vim-snippets/snippets/elm.snippets b/sources_non_forked/vim-snippets/snippets/elm.snippets index 6a15c83a..7898d5f3 100644 --- a/sources_non_forked/vim-snippets/snippets/elm.snippets +++ b/sources_non_forked/vim-snippets/snippets/elm.snippets @@ -39,7 +39,7 @@ snippet let ${0} snippet if if ${1} then - ${2} + ${2:${VISUAL}} else ${0} snippet ty diff --git a/sources_non_forked/vim-snippets/snippets/erlang.snippets b/sources_non_forked/vim-snippets/snippets/erlang.snippets index 5440d7c4..bd379f3d 100644 --- a/sources_non_forked/vim-snippets/snippets/erlang.snippets +++ b/sources_non_forked/vim-snippets/snippets/erlang.snippets @@ -46,7 +46,7 @@ snippet fun # try...catch snippet try try - ${1} + ${1:${VISUAL}} catch ${2:_:_} -> ${0:got_some_exception} end diff --git a/sources_non_forked/vim-snippets/snippets/eruby.snippets b/sources_non_forked/vim-snippets/snippets/eruby.snippets index 64f79ef3..b8879c5c 100644 --- a/sources_non_forked/vim-snippets/snippets/eruby.snippets +++ b/sources_non_forked/vim-snippets/snippets/eruby.snippets @@ -120,7 +120,7 @@ snippet sslt <%= stylesheet_link_tag "${0}" %> snippet if <% if ${1} %> - ${0} + ${0:${VISUAL}} <% end %> snippet ife <% if ${1} %> diff --git a/sources_non_forked/vim-snippets/snippets/go.snippets b/sources_non_forked/vim-snippets/snippets/go.snippets index b2bdc9e0..05d80c9b 100644 --- a/sources_non_forked/vim-snippets/snippets/go.snippets +++ b/sources_non_forked/vim-snippets/snippets/go.snippets @@ -30,7 +30,7 @@ snippet ch # case snippet cs case ${1:value}: - ${0} + ${0:${VISUAL}} # const snippet c const ${1:NAME} = ${0:0} @@ -50,7 +50,7 @@ snippet df snippet dfr defer func() { if err := recover(); err != nil { - ${0} + ${0:${VISUAL}} } }() # int @@ -72,18 +72,18 @@ snippet inf # if condition snippet if if ${1:/* condition */} { - ${2} + ${2:${VISUAL}} } snippet ife if ${1:/* condition */} { - ${2} + ${2:${VISUAL}} } else { ${0} } # else snippet snippet el else { - ${1} + ${0:${VISUAL}} } # error snippet snippet ir @@ -106,28 +106,20 @@ snippet f3 # float64 snippet f6 float64 -# if else -snippet ie - if ${1:/* condition */} { - ${2} - } else { - ${3} - } - ${0} # for int loop snippet for for ${1}{ - ${0} + ${0:${VISUAL}} } # for int loop snippet fori for ${2:i} := 0; $2 < ${1:count}; $2${3:++} { - ${0} + ${0:${VISUAL}} } # for range loop snippet forr for ${1:e} := range ${2:collection} { - ${0} + ${0:${VISUAL}} } # function simple snippet fun @@ -225,9 +217,8 @@ snippet ga }(${0}) snippet test test function func Test${1:name}(t *testing.T) { - ${2} + ${0:${VISUAL}} } - ${0} snippet bench benchmark function func Benchmark${1:name}(b *testing.B) { for i := 0; i < b.N; i++ { diff --git a/sources_non_forked/vim-snippets/snippets/haml.snippets b/sources_non_forked/vim-snippets/snippets/haml.snippets index 09217c6c..b8a74e27 100644 --- a/sources_non_forked/vim-snippets/snippets/haml.snippets +++ b/sources_non_forked/vim-snippets/snippets/haml.snippets @@ -27,11 +27,11 @@ snippet mts = mail_to ${1:email_address}, ${2:name}, :subject => ${3}, :body => ${4} snippet ife - if ${1:condition} - ${2} + ${2:${VISUAL}} - else ${0} snippet ifp - if ${1:condition}.presence? - ${0} + ${0:${VISUAL}} snippet ntc = number_to_currency(${1}) diff --git a/sources_non_forked/vim-snippets/snippets/handlebars.snippets b/sources_non_forked/vim-snippets/snippets/handlebars.snippets index d1ab0f03..401dfbdd 100644 --- a/sources_non_forked/vim-snippets/snippets/handlebars.snippets +++ b/sources_non_forked/vim-snippets/snippets/handlebars.snippets @@ -1,14 +1,14 @@ snippet if # {{#if value}} ... {{/if}} {{#if ${1:value}}} - ${0} + ${0:${VISUAL}} {{/if}} snippet ifn # {{#unless value}} ... {{/unless}} {{#unless ${1:value}}} - ${0} + ${0:${VISUAL}} {{/unless}} snippet ife # {{#if value}} ... {{else}} .. {{/if}} {{#if ${1:value}}} - ${2} + ${2:${VISUAL}} {{else}} ${3} {{/if}} diff --git a/sources_non_forked/vim-snippets/snippets/html.snippets b/sources_non_forked/vim-snippets/snippets/html.snippets index 85d0e526..e91b0716 100644 --- a/sources_non_forked/vim-snippets/snippets/html.snippets +++ b/sources_non_forked/vim-snippets/snippets/html.snippets @@ -733,7 +733,7 @@ snippet samp ${0} </samp> snippet script - <script type="text/javascript" charset="utf-8"> + <script charset="utf-8"> ${0} </script> snippet scripts @@ -743,7 +743,7 @@ snippet scriptt ${0} </script> snippet scriptsrc - <script src="${0}.js" type="text/javascript" charset="utf-8"></script> + <script src="${0}.js" charset="utf-8"></script> snippet section <section> ${0} diff --git a/sources_non_forked/vim-snippets/snippets/htmltornado.snippets b/sources_non_forked/vim-snippets/snippets/htmltornado.snippets index 46f5dab4..1620e11d 100644 --- a/sources_non_forked/vim-snippets/snippets/htmltornado.snippets +++ b/sources_non_forked/vim-snippets/snippets/htmltornado.snippets @@ -43,7 +43,7 @@ snippet set {% set ${1:x} = ${0:y} %} snippet try {% try %} - ${1} + ${1:${VISUAL}} {% except %} ${2} {% finallly %} diff --git a/sources_non_forked/vim-snippets/snippets/java.snippets b/sources_non_forked/vim-snippets/snippets/java.snippets index 39cc850a..66821c16 100644 --- a/sources_non_forked/vim-snippets/snippets/java.snippets +++ b/sources_non_forked/vim-snippets/snippets/java.snippets @@ -163,12 +163,12 @@ snippet ths throws ${0} snippet try try { - ${0} + ${0:${VISUAL}} } catch(${1:Exception} ${2:e}) { } snippet tryf try { - ${0} + ${0:${VISUAL}} } catch(${1:Exception} ${2:e}) { } finally { } diff --git a/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets b/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets index cabfd401..eb5c381d 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript-mocha.snippets @@ -1,18 +1,34 @@ -snippet des "Describe" b +snippet des "describe('thing', () => { ... })" b describe('${1:}', () => { - ${0} + ${0:${VISUAL}} }); -snippet it "it" b +snippet it "it('should do', () => { ... })" b it('${1:}', () => { - ${0} + ${0:${VISUAL}} }); -snippet xit "xit" b +snippet xit "xit('should do', () => { ... })" b xit('${1:}', () => { - ${0} + ${0:${VISUAL}} }); -snippet exp "expect" b +snippet bef "before(() => { ... })" b + before(() => { + ${0:${VISUAL}} + }); +snippet befe "beforeEach(() => { ... })" b + beforeEach(() => { + ${0:${VISUAL}} + }); +snippet aft "after(() => { ... })" b + after(() => { + ${0:${VISUAL}} + }); +snippet afte "afterEach(() => { ... })" b + afterEach(() => { + ${0:${VISUAL}} + }); +snippet exp "expect(...)" b expect(${1:})${0}; -snippet expe "expect" b +snippet expe "expect(...).to.equal(...)" b expect(${1:}).to.equal(${0}); -snippet expd "expect" b +snippet expd "expect(...).to.deep.equal(...)" b expect(${1:}).to.deep.equal(${0}); diff --git a/sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets b/sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets index 0762eb6b..2894ac5d 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript.es6.react.snippets @@ -61,7 +61,7 @@ snippet rdp # Lifecycle Methods snippet rcdm componentDidMount() { - ${0} + ${0:${VISUAL}} } # State diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets index a1adedef..7e885e6e 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets @@ -10,16 +10,16 @@ snippet imm "import { member } from 'xyz'" import { ${1} } from '${2}'; snippet cla class ${1} { - ${0} + ${0:${VISUAL}} } snippet clax class ${1} extends ${2} { - ${0} + ${0:${VISUAL}} } snippet clac class ${1} { constructor(${2}) { - ${0} + ${0:${VISUAL}} } } snippet foro "for (const prop of object}) { ... }" @@ -29,23 +29,23 @@ snippet foro "for (const prop of object}) { ... }" # Generator snippet fun* function* ${1:function_name}(${2}) { - ${0} + ${0:${VISUAL}} } snippet c=> const ${1:function_name} = (${2}) => { - ${0} + ${0:${VISUAL}} } snippet caf const ${1:function_name} = (${2}) => { - ${0} + ${0:${VISUAL}} } snippet => (${1}) => { - ${0} + ${0:${VISUAL}} } snippet af (${1}) => { - ${0} + ${0:${VISUAL}} } snippet sym const ${1} = Symbol('${0}'); diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets index 0ac0bfb4..df0669bd 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.snippets @@ -2,37 +2,37 @@ # prototype snippet proto ${1:class_name}.prototype.${2:method_name} = function(${3}) { - ${0} + ${0:${VISUAL}} }; # Function snippet fun function ${1:function_name}(${2}) { - ${0} + ${0:${VISUAL}} } # Anonymous Function snippet f "" w function(${1}) { - ${0} + ${0:${VISUAL}} } # Anonymous Function assigned to variable snippet vaf var ${1:function_name} = function(${2}) { - ${0} + ${0:${VISUAL}} }; # Function assigned to variable snippet vf var ${1:function_name} = function $1(${2}) { - ${0} + ${0:${VISUAL}} }; # Immediate function snippet (f (function(${1}) { - ${0} + ${0:${VISUAL}} }(${2})); # Minify safe iife snippet ;fe ;(function(${1}) { - ${0} + ${0:${VISUAL}} }(${2})) # self-defining function snippet sdf @@ -40,21 +40,21 @@ snippet sdf ${3} $1 = function ($2) { - ${0} + ${0:${VISUAL}} }; }; # Flow control # if -snippet if +snippet if "if (condition) { ... }" if (${1:true}) { - ${0} + ${0:${VISUAL}} } # if ... else -snippet ife +snippet ife "if (condition) { ... } else { ... }" if (${1:true}) { - ${2} + ${0:${VISUAL}} } else { - ${0} + ${2} } # tertiary conditional snippet ter @@ -69,25 +69,21 @@ snippet switch default: ${2} } -# case -snippet case +snippet case "case 'xyz': ... break" case '${1:case}': - ${2} + ${0:${VISUAL}} break; - ${0} -# try -snippet try +snippet try "try { ... } catch(e) { ... }" try { - ${1} - } catch (${2:e}) { - ${0:/* handle error */} + ${0:${VISUAL}} + } catch (${1:e}) { + ${2:/* handle error */} } -# try finally -snippet tryf +snippet tryf "try { ... } catch(e) { ... } finally { ... }" try { - ${1} - } catch (${2:e}) { - ${0:/* handle error */} + ${0:${VISUAL}} + } catch (${1:e}) { + ${2:/* handle error */} } finally { ${3:/* be executed regardless of the try / catch result*/} } @@ -97,25 +93,21 @@ snippet terr # return snippet ret return ${0:result}; -# for loop -snippet for - for (var ${2:i} = 0, l = ${1:arr}.length; $2 < l; $2++) { - var ${3:v} = $1[$2];${0:} +snippet for "for (...) {...}" + for (var ${1:i} = 0, ${2:len} = ${3:Things.length}; $1 < $2; $1++) { + ${0:${VISUAL}} } -# Reversed for loop -snippet forr - for (var ${2:i} = ${1:arr}.length - 1; $2 >= 0; $2--) { - var ${3:v} = $1[$2];${0:} +snippet forr "reversed for (...) {...}" + for (var ${2:i} = ${1:Things.length} - 1; $2 >= 0; $2--) { + ${0:${VISUAL}} } -# While loop -snippet wh +snippet wh "(condition) { ... }" while (${1:/* condition */}) { - ${0} + ${0:${VISUAL}} } -# Do while loop -snippet do +snippet do "do { ... } while (condition)" do { - ${0} + ${0:${VISUAL}} } while (${1:/* condition */}); # For in loop snippet fori @@ -126,7 +118,7 @@ snippet fori # Object Method snippet :f ${1:method_name}: function (${2:attribute}) { - ${3} + ${0:${VISUAL}} }, # hasOwnProperty snippet has @@ -240,33 +232,46 @@ snippet qsa # Debugging snippet de debugger; -# console.log -snippet cl +snippet cl "console.log" console.log(${0}); -# console.debug -snippet cd +snippet cd "console.debug" console.debug(${0}); -# console.error -snippet ce +snippet ce "console.error" console.error(${0}); -# console.warn -snippet cw +snippet cw "console.warn" console.warn(${0}); -# console.info -snippet ci +snippet ci "console.info" console.info(${0}); -# console.trace -snippet ct +snippet ct "console.trace" console.trace(${0:label}); -# console.time -snippet ctime - console.time(${0:label}); -# console.assert -snippet ca +snippet ctime "console.time ... console.timeEnd" + console.time("${1:label}"); + ${0:${VISUAL}} + console.timeEnd("$1"); +snippet ctimestamp "console.timeStamp" + console.timeStamp("${1:label}"); +snippet ca "console.assert" console.assert(${1:expression}, ${0:obj}); -# console.dir -snippet cdir +snippet cclear "console.clear" + console.clear(); +snippet cdir "console.dir" console.dir(${0:obj}); +snippet cdirx "console.dirxml" + console.dirxml(${1:object}); +snippet cgroup "console.group" + console.group("${1:label}"); + ${0:${VISUAL}} + console.groupEnd(); +snippet cgroupc "console.groupCollapsed" + console.groupCollapsed("${1:label}"); + ${0:${VISUAL}} + console.groupEnd(); +snippet cprof "console.profile" + console.profile("${1:label}"); + ${0:${VISUAL}} + console.profileEnd(); +snippet ctable "console.table" + console.table(${1:"${2:value}"}); # Misc # 'use strict'; snippet us diff --git a/sources_non_forked/vim-snippets/snippets/julia.snippets b/sources_non_forked/vim-snippets/snippets/julia.snippets index 1876ed84..490d050d 100644 --- a/sources_non_forked/vim-snippets/snippets/julia.snippets +++ b/sources_non_forked/vim-snippets/snippets/julia.snippets @@ -75,7 +75,7 @@ snippet tern ternary operator # Exceptions snippet try try catch try - ${1} + ${1:${VISUAL}} catch ${2} ${0} end diff --git a/sources_non_forked/vim-snippets/snippets/ls.snippets b/sources_non_forked/vim-snippets/snippets/ls.snippets index 909b35ee..7c924e64 100644 --- a/sources_non_forked/vim-snippets/snippets/ls.snippets +++ b/sources_non_forked/vim-snippets/snippets/ls.snippets @@ -93,7 +93,7 @@ snippet str # Try __ Catch snippet try try - ${1} + ${1:${VISUAL}} catch ${2:error} ${3} # Require diff --git a/sources_non_forked/vim-snippets/snippets/make.snippets b/sources_non_forked/vim-snippets/snippets/make.snippets index 332d6fc9..9104804d 100644 --- a/sources_non_forked/vim-snippets/snippets/make.snippets +++ b/sources_non_forked/vim-snippets/snippets/make.snippets @@ -27,24 +27,24 @@ snippet print # ifeq snippet if ifeq (${1:cond0}, ${2:cond1}) - ${0} + ${0:${VISUAL}} endif # ifeq ... else ... endif snippet ife ifeq (${1:cond0}, ${2:cond1}) - ${3} + ${3:${VISUAL}} else ${0} endif # else ... snippet el else - ${0} + ${0:${VISUAL}} # .DEFAULT_GOAL := target snippet default .DEFAULT_GOAL := ${1} # help target for self-documented Makefile snippet help help: ## Prints help for targets with comments - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $\$1, $\$2}' + @cat $(MAKEFILE_LIST) | grep -E '^[a-zA-Z_-]+:.*?## .*$$' | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $\$1, $\$2}' ${0} diff --git a/sources_non_forked/vim-snippets/snippets/mako.snippets b/sources_non_forked/vim-snippets/snippets/mako.snippets index 2264eac6..659caf77 100644 --- a/sources_non_forked/vim-snippets/snippets/mako.snippets +++ b/sources_non_forked/vim-snippets/snippets/mako.snippets @@ -30,7 +30,7 @@ snippet ife if/else % endif snippet try % try: - ${1:} + ${1:${VISUAL}} % except${2:}: ${0:pass} % endtry diff --git a/sources_non_forked/vim-snippets/snippets/mustache.snippets b/sources_non_forked/vim-snippets/snippets/mustache.snippets index ad8723ed..cf589406 100644 --- a/sources_non_forked/vim-snippets/snippets/mustache.snippets +++ b/sources_non_forked/vim-snippets/snippets/mustache.snippets @@ -1,14 +1,14 @@ snippet if # {{#value}} ... {{/value}} {{#${1:value}}} - ${0} + ${0:${VISUAL}} {{/$1}} snippet ifn # {{^value}} ... {{/value}} {{^${1:value}}} - ${0} + ${0:${VISUAL}} {{/$1}} snippet ife # {{#value}} ... {{/value}} {{^value}} ... {{/value}} {{#${1:value}}} - ${2} + ${2:${VISUAL}} {{/$1}} {{^$1}} ${3} diff --git a/sources_non_forked/vim-snippets/snippets/php.snippets b/sources_non_forked/vim-snippets/snippets/php.snippets index 2d9f5152..52572da9 100644 --- a/sources_non_forked/vim-snippets/snippets/php.snippets +++ b/sources_non_forked/vim-snippets/snippets/php.snippets @@ -1,7 +1,7 @@ snippet <? <?php - ${0} + ${0:${VISUAL}} snippet dst "declare(strict_types=1)" declare(strict_types=${1:1}); snippet ec @@ -17,37 +17,38 @@ snippet ? <?php ${0} ?> snippet ?f <?php foreach ($${1:vars} as $${2:$var}): ?> - ${0} + ${0:${VISUAL}} <?php endforeach ?> snippet ?i <?php if ($${1:var}): ?> - ${0} + ${0:${VISUAL}} <?php endif ?> snippet ns namespace ${1:Foo\Bar\Baz}; - ${0} + + ${0:${VISUAL}} snippet c class ${1:`vim_snippets#Filename()`} { - ${0} + ${0:${VISUAL}} } snippet i interface ${1:`vim_snippets#Filename()`} { - ${0} + ${0:${VISUAL}} } snippet t. $this-> snippet f function ${1}(${3}) { - ${0} + ${0:${VISUAL}} } # method snippet m ${1:protected} function ${2:foo}() { - ${0} + ${0:${VISUAL}} } snippet sm "PHP Class Setter" /** @@ -158,7 +159,7 @@ snippet doc_c */ ${1:}class ${2:} { - ${0} + ${0:${VISUAL}} } // END $1class $2 # Constant Definition - post doc snippet doc_dp @@ -232,7 +233,7 @@ snippet interface */ interface ${1:`vim_snippets#Filename()`} { - ${0} + ${0:${VISUAL}} } # Trait snippet trait @@ -244,7 +245,7 @@ snippet trait */ trait ${1:`vim_snippets#Filename()`} { - ${0} + ${0:${VISUAL}} } # class ... snippet class @@ -267,7 +268,7 @@ snippet nc ${2:abstract }class ${3:`vim_snippets#Filename()`} { - ${0} + ${0:${VISUAL}} } # define(...) snippet def "define('VARIABLE_NAME', 'definition')" @@ -277,45 +278,43 @@ snippet def? ${1}defined('${2}') snippet wh "while (condition) { ... }" while (${1:/* condition */}) { - ${0} + ${0:${VISUAL}} } snippet do "do { ... } while (condition)" do { - ${0} + ${0:${VISUAL}} } while (${1}); snippet if "if (condition) { ... }" if (${1}) { - ${0} + ${0:${VISUAL}} } snippet ifn "if (!condition) { ... }" if (!${1}) { - ${2} + ${0:${VISUAL}} } snippet ifil "<?php if (condition): ?> ... <?php endif; ?>" <?php if (${1}): ?> - ${0} + ${0:${VISUAL}} <?php endif; ?> snippet ife "if (cond) { ... } else { ... }" if (${1}) { - ${2} + ${0:${VISUAL}} } else { - ${3} + ${2} } - ${0} snippet ifeil "<?php if (condition): ?> ... <?php else: ?> ... <?php endif; ?>" <?php if (${1}): ?> - ${2} + ${0:${VISUAL}} <?php else: ?> - ${3} + ${2} <?php endif; ?> - ${0} snippet el "else { ... }" else { - ${0} + ${0:${VISUAL}} } snippet eif "elseif(condition) { ... }" elseif (${1}) { - ${0} + ${0:${VISUAL}} } snippet switch "switch($var) { case 'xyz': ... default: .... }" switch ($${1:variable}) { @@ -329,23 +328,23 @@ snippet switch "switch($var) { case 'xyz': ... default: .... }" } snippet case "case 'value': ... break" case '${1:value}': - ${2} + ${0:${VISUAL}} break; snippet for "for ($i = 0; $i < $count; $i++) { ... }" for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) { - ${0} + ${0:${VISUAL}} } snippet foreach "foreach ($var as $value) { .. }" foreach ($${1:variable} as $${2:value}) { - ${0} + ${0:${VISUAL}} } snippet foreachil "<?php foreach ($var as $value): ?> ... <?php endforeach; ?>" <?php foreach ($${1:variable} as $${2:value}): ?> - ${0} + ${0:${VISUAL}} <?php endforeach; ?> snippet foreachk "foreach ($var as $key => $value) { .. }" foreach ($${1:variable} as $${2:key} => $${3:value}) { - ${0} + ${0:${VISUAL}} } snippet foreachkil "<?php foreach ($var as $key => $value): ?> ... <?php endforeach; ?>" <?php foreach ($${1:variable} as $${2:key} => $${3:value}): ?> @@ -355,7 +354,7 @@ snippet array "$... = ['' => ]" $${1:arrayName} = ['${2}' => ${3}]; snippet try "try { ... } catch (Exception $e) { ... }" try { - ${0} + ${0:${VISUAL}} } catch (${1:Exception} $e) { } # lambda with closure @@ -590,48 +589,70 @@ snippet CSVIterator } // end class # phpunit -snippet ase "$this->assertEquals()" - $this->assertEquals(${1:expected}, ${2:actual}); -snippet asne "$this->assertNotEquals()" - $this->assertNotEquals(${1:expected}, ${2:actual}); -snippet asf "$this->assertFalse()" +snippet ase "$this->assertEquals($a, $b)" + $this->assertEquals(${1:$expected}, ${2:$actual}); +snippet asne "$this->assertNotEquals($a, $b)" + $this->assertNotEquals(${1:$expected}, ${2:$actual}); +snippet asf "$this->assertFalse($a)" $this->assertFalse(${1}); -snippet ast "$this->assertTrue()" +snippet ast "$this->assertTrue($a)" $this->assertTrue(${1}); -snippet asfex "$this->assertFileExists()" +snippet asfex "$this->assertFileExists('path/to/file')" $this->assertFileExists(${1:'path/to/file'}); -snippet asfnex "$this->assertFileNotExists()" +snippet asfnex "$this->assertFileNotExists('path/to/file')" $this->assertFileNotExists(${1:'path/to/file'}); -snippet ascon "$this->assertContains()" +snippet ascon "$this->assertContains($needle, $haystack)" $this->assertContains(${1:$needle}, ${2:$haystack}); -snippet ashk "$this->assertArrayHasKey()" +snippet asncon "$this->assertNotContains($needle, $haystack)" + $this->assertNotContains(${1:$needle}, ${2:$haystack}); +snippet ascono "$this->assertContainsOnly($needle, $haystack)" + $this->assertContainsOnly(${1:$needle}, ${2:$haystack}); +snippet asconoi "$this->assertContainsOnlyInstancesOf(Example::class, $haystack)" + $this->assertContainsOnlyInstancesOf(${1:Example}::class, ${2:$haystack}); +snippet ashk "$this->assertArrayHasKey($key, $array)" $this->assertArrayHasKey(${1:$key}, ${2:$array}); -snippet asnhk "$this->assertArrayNotHasKey()" +snippet asnhk "$this->assertArrayNotHasKey($key, $array)" this->assertArrayNotHasKey(${1:$key}, ${2:$array}); -snippet ascha "$this->assertClassHasAttribute()" - $this->assertClassHasAttribute(${1:$attributeName}, '${2:$className}'); -snippet asi "$this->assertInstanceOf(...)" - $this->assertInstanceOf(${1:expected}, ${2:actual}); +snippet ascha "$this->assertClassHasAttribute($name, Example::class)" + $this->assertClassHasAttribute(${1:$attributeName}, ${2:Example}::class); +snippet asi "$this->assertInstanceOf(Example::class, $actual)" + $this->assertInstanceOf(${1:Example}::class, ${2:$actual}); +snippet ast "$this->assertInternalType('string', $actual)" + $this->assertInternalType(${1:'string'}, ${2:actual}); +snippet asco "$this->assertCount($count, $haystack)" + $this->assertCount(${1:$expectedCount}, ${2:$haystack}); +snippet asnco "$this->assertNotCount($count, $haystack)" + $this->assertNotCount(${1:$count}, ${2:$haystack}); +snippet assub "$this->assertArraySubset($subset, $array)" + $this->assertArraySubset(${1:$subset}, ${2:$array}); +snippet asnu "$this->assertNull($a)" + $this->assertNull(${1}); +snippet asnnu "$this->assertNotNull($a)" + $this->assertNotNull(${1}); snippet test "public function testXYZ() { ... }" public function test${1}() { - ${0} + ${0:${VISUAL}} } snippet setup "protected function setUp() { ... }" protected function setUp() { - ${0} + ${0:${VISUAL}} } snippet teardown "protected function tearDown() { ... }" protected function tearDown() { - ${0} + ${0:${VISUAL}} } +snippet proph "$observer = $this->prophesize(SomeClass::class);" + $${1:observer} = $this->prophesize(${2:SomeClass}::class); +snippet mock "$mock = $this->createMock(SomeClass::class);" + $${1:mock} = $this->createMock(${2:SomeClass}::class); snippet exp "phpunit expects" expects($this->${1:once}()) ->method('${2}') - ->with($this->equalTo(${3})${4}) - ->will($this->returnValue(${5})); + ->with(${3}) + ->willReturn(${4}); snippet testcmt "phpunit comment with group" /** * @group ${1} diff --git a/sources_non_forked/vim-snippets/snippets/processing.snippets b/sources_non_forked/vim-snippets/snippets/processing.snippets index 015af4a5..798e5458 100644 --- a/sources_non_forked/vim-snippets/snippets/processing.snippets +++ b/sources_non_forked/vim-snippets/snippets/processing.snippets @@ -93,13 +93,13 @@ snippet switch #try snippet try try { - ${0} + ${0:${VISUAL}} } catch(${1:Exception} ${2:e}) { } #try catch finally snippet tryf try { - ${0} + ${0:${VISUAL}} } catch(${1:Exception} ${2:e}) { } finally { } diff --git a/sources_non_forked/vim-snippets/snippets/python.snippets b/sources_non_forked/vim-snippets/snippets/python.snippets index 0f68acbd..b32ef0a8 100644 --- a/sources_non_forked/vim-snippets/snippets/python.snippets +++ b/sources_non_forked/vim-snippets/snippets/python.snippets @@ -23,7 +23,7 @@ snippet docs snippet wh while ${1:condition}: - ${0} + ${0:${VISUAL}} # dowh - does the same as do...while in other languages snippet dowh while True: @@ -32,7 +32,7 @@ snippet dowh break snippet with with ${1:expr} as ${2:var}: - ${0} + ${0:${VISUAL}} # New Class snippet cl class ${1:ClassName}(${2:object}): @@ -68,13 +68,13 @@ snippet property # Ifs snippet if if ${1:condition}: - ${0} + ${0:${VISUAL}} snippet el else: - ${0} + ${0:${VISUAL}} snippet ei elif ${1:condition}: - ${0} + ${0:${VISUAL}} # For snippet for for ${1:item} in ${2:items}: @@ -93,27 +93,27 @@ snippet . self. snippet try Try/Except try: - ${1} - except ${2:Exception}, ${3:e}: + ${1:${VISUAL}} + except ${2:Exception} as ${3:e}: ${0:raise $3} snippet try Try/Except/Else try: - ${1} - except ${2:Exception}, ${3:e}: + ${1:${VISUAL}} + except ${2:Exception} as ${3:e}: ${4:raise $3} else: ${0} snippet try Try/Except/Finally try: - ${1} - except ${2:Exception}, ${3:e}: + ${1:${VISUAL}} + except ${2:Exception} as ${3:e}: ${4:raise $3} finally: ${0} snippet try Try/Except/Else/Finally try: - ${1} - except ${2:Exception}, ${3:e}: + ${1:${VISUAL}} + except ${2:Exception} as ${3:e}: ${4:raise $3} else: ${5} diff --git a/sources_non_forked/vim-snippets/snippets/rst.snippets b/sources_non_forked/vim-snippets/snippets/rst.snippets index b1852458..dd47863e 100644 --- a/sources_non_forked/vim-snippets/snippets/rst.snippets +++ b/sources_non_forked/vim-snippets/snippets/rst.snippets @@ -85,9 +85,9 @@ snippet toc: ${0} snippet dow: - :download:`${0:text} <${1:path}>` + :download:\`${0:text} <${1:path}>\` snippet ref: - :ref:`${0:text} <${1:path}>` + :ref:\`${0:text} <${1:path}>\` snippet doc: :doc:`${0:text} <${1:path}>` # CJK optimize, CJK has no space between charaters diff --git a/sources_non_forked/vim-snippets/snippets/ruby.snippets b/sources_non_forked/vim-snippets/snippets/ruby.snippets index 772f4644..9dc984fd 100644 --- a/sources_non_forked/vim-snippets/snippets/ruby.snippets +++ b/sources_non_forked/vim-snippets/snippets/ruby.snippets @@ -39,7 +39,7 @@ snippet case end snippet when when ${1:condition} - ${0} + ${0:${VISUAL}} snippet def def ${1:method_name} ${0} @@ -56,17 +56,17 @@ snippet descendants end snippet if if ${1:condition} - ${0} + ${0:${VISUAL}} end snippet ife if ${1:condition} - ${2} + ${2:${VISUAL}} else ${0} end snippet eif elsif ${1:condition} - ${0} + ${0:${VISUAL}} snippet ifee if ${1:condition} $2 @@ -77,7 +77,7 @@ snippet ifee end snippet unless unless ${1:condition} - ${0} + ${0:${VISUAL}} end snippet unlesse unless ${1:condition} @@ -95,7 +95,7 @@ snippet unlesee end snippet wh while ${1:condition} - ${0} + ${0:${VISUAL}} end snippet for for ${1:e} in ${2:c} @@ -103,7 +103,7 @@ snippet for end snippet until until ${1:condition} - ${0} + ${0:${VISUAL}} end snippet cla class .. end class ${1:`substitute(vim_snippets#Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} diff --git a/sources_non_forked/vim-snippets/snippets/rust.snippets b/sources_non_forked/vim-snippets/snippets/rust.snippets index 20532f73..2a353e49 100644 --- a/sources_non_forked/vim-snippets/snippets/rust.snippets +++ b/sources_non_forked/vim-snippets/snippets/rust.snippets @@ -32,7 +32,7 @@ snippet main "Main function" ${0} } snippet let "let variable declaration with type inference" - let ${1} = ${2}; + let ${1} = ${2}; snippet lett "let variable declaration with explicit type annotation" let ${1}: ${2} = ${3}; snippet letm "let mut variable declaration with type inference" @@ -88,21 +88,21 @@ snippet res "Result<T, E>" # Control structures snippet if if ${1} { - ${0} + ${0:${VISUAL}} } snippet ife "if / else" if ${1} { - ${2} + ${2:${VISUAL}} } else { ${0} } snippet el "else" else { - ${0} + ${0:${VISUAL}} } snippet eli "else if" else if ${1} { - ${0} + ${0:${VISUAL}} } snippet mat "match pattern" match ${1} { @@ -112,11 +112,11 @@ snippet case "Case clause of pattern match" ${1:_} => ${2:expression} snippet loop "loop {}" b loop { - ${0} + ${0:${VISUAL}} } snippet wh "while loop" while ${1:condition} { - ${0} + ${0:${VISUAL}} } snippet for "for ... in ... loop" for ${1:i} in ${2} { diff --git a/sources_non_forked/vim-snippets/snippets/sass.snippets b/sources_non_forked/vim-snippets/snippets/sass.snippets index 7207360c..3e84c20e 100644 --- a/sources_non_forked/vim-snippets/snippets/sass.snippets +++ b/sources_non_forked/vim-snippets/snippets/sass.snippets @@ -1,14 +1,12 @@ -extends css - snippet $ $${1:variable}: ${0:value} snippet imp @import '${0}' snippet mix - @mixin ${1:name}(${2}) + =${1:name}(${2}) ${0} snippet inc - @include ${1:mixin}(${2}) + +${1:mixin}(${2}) snippet ext @extend ${0} snippet fun @@ -16,15 +14,15 @@ snippet fun ${0} snippet if @if ${1:condition} - ${0} + ${0:${VISUAL}} snippet ife @if ${1:condition} - ${2} + ${2:${VISUAL}} @else ${0} snippet eif @else if ${1:condition} - ${0} + ${0:${VISUAL}} snippet for @for ${1:$i} from ${2:1} through ${3:3} ${0} @@ -33,4 +31,985 @@ snippet each ${0} snippet while @while ${1:$i} ${2:>} ${3:0} + ${0:${VISUAL}} +snippet ! + !important +snippet bdi:m+ + -moz-border-image: url('${1}') ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${0:stretch} +snippet bdi:m + -moz-border-image: ${0} +snippet bdrz:m + -moz-border-radius: ${0} +snippet bxsh:m+ + -moz-box-shadow: ${1:0} ${2:0} ${3:0} #${0:000} +snippet bxsh:m + -moz-box-shadow: ${0} +snippet bdi:w+ + -webkit-border-image: url('${1}') ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${0:stretch} +snippet bdi:w + -webkit-border-image: ${0} +snippet bdrz:w + -webkit-border-radius: ${0} +snippet bxsh:w+ + -webkit-box-shadow: ${1:0} ${2:0} ${3:0} #${0:000} +snippet bxsh:w + -webkit-box-shadow: ${0} +snippet @f + @font-face + font-family: ${1} + src: url('${0}') +snippet @i + @import url('${0}') +snippet @m + @media ${1:print} ${0} +snippet bg+ + background: #${1:fff} url('${2}') ${3:0} ${4:0} ${0:no-repeat} +snippet bga + background-attachment: ${0} +snippet bga:f + background-attachment: fixed +snippet bga:s + background-attachment: scroll +snippet bgbk + background-break: ${0} +snippet bgbk:bb + background-break: bounding-box +snippet bgbk:c + background-break: continuous +snippet bgbk:eb + background-break: each-box +snippet bgcp + background-clip: ${0} +snippet bgcp:bb + background-clip: border-box +snippet bgcp:cb + background-clip: content-box +snippet bgcp:nc + background-clip: no-clip +snippet bgcp:pb + background-clip: padding-box +snippet bgc + background-color: #${0:fff} +snippet bgc:t + background-color: transparent +snippet bgi + background-image: url('${0}') +snippet bgi:n + background-image: none +snippet bgo + background-origin: ${0} +snippet bgo:bb + background-origin: border-box +snippet bgo:cb + background-origin: content-box +snippet bgo:pb + background-origin: padding-box +snippet bgpx + background-position-x: ${0} +snippet bgpy + background-position-y: ${0} +snippet bgp + background-position: ${1:0} ${0:0} +snippet bgr + background-repeat: ${0} +snippet bgr:n + background-repeat: no-repeat +snippet bgr:x + background-repeat: repeat-x +snippet bgr:y + background-repeat: repeat-y +snippet bgr:r + background-repeat: repeat +snippet bgz + background-size: ${0} +snippet bgz:a + background-size: auto +snippet bgz:ct + background-size: contain +snippet bgz:cv + background-size: cover +snippet bg + background: ${0} +snippet bg:ie + filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1}',sizingMethod='${0:crop}') +snippet bg:n + background: none +snippet bd+ + border: ${1:1px} ${2:solid} #${0:000} +snippet bdb+ + border-bottom: ${1:1px} ${2:solid} #${0:000} +snippet bdbc + border-bottom-color: #${0:000} +snippet bdbi + border-bottom-image: url('${0}') +snippet bdbi:n + border-bottom-image: none +snippet bdbli + border-bottom-left-image: url('${0}') +snippet bdbli:c + border-bottom-left-image: continue +snippet bdbli:n + border-bottom-left-image: none +snippet bdblrz + border-bottom-left-radius: ${0} +snippet bdbri + border-bottom-right-image: url('${0}') +snippet bdbri:c + border-bottom-right-image: continue +snippet bdbri:n + border-bottom-right-image: none +snippet bdbrrz + border-bottom-right-radius: ${0} +snippet bdbs + border-bottom-style: ${0} +snippet bdbs:n + border-bottom-style: none +snippet bdbw + border-bottom-width: ${0} +snippet bdb + border-bottom: ${0} +snippet bdb:n + border-bottom: none +snippet bdbk + border-break: ${0} +snippet bdbk:c + border-break: close +snippet bdcl + border-collapse: ${0} +snippet bdcl:c + border-collapse: collapse +snippet bdcl:s + border-collapse: separate +snippet bdc + border-color: #${0:000} +snippet bdci + border-corner-image: url('${0}') +snippet bdci:c + border-corner-image: continue +snippet bdci:n + border-corner-image: none +snippet bdf + border-fit: ${0} +snippet bdf:c + border-fit: clip +snippet bdf:of + border-fit: overwrite +snippet bdf:ow + border-fit: overwrite +snippet bdf:r + border-fit: repeat +snippet bdf:sc + border-fit: scale +snippet bdf:sp + border-fit: space +snippet bdf:st + border-fit: stretch +snippet bdi + border-image: url('${1}') ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${0:stretch} +snippet bdi:n + border-image: none +snippet bdl+ + border-left: ${1:1px} ${2:solid} #${0:000} +snippet bdlc + border-left-color: #${0:000} +snippet bdli + border-left-image: url('${0}') +snippet bdli:n + border-left-image: none +snippet bdls + border-left-style: ${0} +snippet bdls:n + border-left-style: none +snippet bdlw + border-left-width: ${0} +snippet bdl + border-left: ${0} +snippet bdl:n + border-left: none +snippet bdlt + border-length: ${0} +snippet bdlt:a + border-length: auto +snippet bdrz + border-radius: ${0} +snippet bdr+ + border-right: ${1:1px} ${2:solid} #${0:000} +snippet bdrc + border-right-color: #${0:000} +snippet bdri + border-right-image: url('${0}') +snippet bdri:n + border-right-image: none +snippet bdrs + border-right-style: ${0} +snippet bdrs:n + border-right-style: none +snippet bdrw + border-right-width: ${0} +snippet bdr + border-right: ${0} +snippet bdr:n + border-right: none +snippet bdsp + border-spacing: ${0} +snippet bds + border-style: ${0} +snippet bds:ds + border-style: dashed +snippet bds:dtds + border-style: dot-dash +snippet bds:dtdtds + border-style: dot-dot-dash +snippet bds:dt + border-style: dotted +snippet bds:db + border-style: double +snippet bds:g + border-style: groove +snippet bds:h + border-style: hidden +snippet bds:i + border-style: inset +snippet bds:n + border-style: none +snippet bds:o + border-style: outset +snippet bds:r + border-style: ridge +snippet bds:s + border-style: solid +snippet bds:w + border-style: wave +snippet bdt+ + border-top: ${1:1px} ${2:solid} #${0:000} +snippet bdtc + border-top-color: #${0:000} +snippet bdti + border-top-image: url('${0}') +snippet bdti:n + border-top-image: none +snippet bdtli + border-top-left-image: url('${0}') +snippet bdtli:c + border-corner-image: continue +snippet bdtli:n + border-corner-image: none +snippet bdtlrz + border-top-left-radius: ${0} +snippet bdtri + border-top-right-image: url('${0}') +snippet bdtri:c + border-top-right-image: continue +snippet bdtri:n + border-top-right-image: none +snippet bdtrrz + border-top-right-radius: ${0} +snippet bdts + border-top-style: ${0} +snippet bdts:n + border-top-style: none +snippet bdtw + border-top-width: ${0} +snippet bdt + border-top: ${0} +snippet bdt:n + border-top: none +snippet bdw + border-width: ${0} +snippet bd + border: ${0} +snippet bd:n + border: none +snippet b + bottom: ${0} +snippet b:a + bottom: auto +snippet bxsh+ + box-shadow: ${1:0} ${2:0} ${3:0} #${0:000} +snippet bxsh + box-shadow: ${0} +snippet bxsh:n + box-shadow: none +snippet bxz + box-sizing: ${0} +snippet bxz:bb + box-sizing: border-box +snippet bxz:cb + box-sizing: content-box +snippet cps + caption-side: ${0} +snippet cps:b + caption-side: bottom +snippet cps:t + caption-side: top +snippet cl + clear: ${0} +snippet cl:b + clear: both +snippet cl:l + clear: left +snippet cl:n + clear: none +snippet cl:r + clear: right +snippet cp + clip: ${0} +snippet cp:a + clip: auto +snippet cp:r + clip: rect(${1:0} ${2:0} ${3:0} ${0:0}) +snippet c + color: #${0:000} +snippet ct + content: ${0} +snippet ct:a + content: attr(${0}) +snippet ct:cq + content: close-quote +snippet ct:c + content: counter(${0}) +snippet ct:cs + content: counters(${0}) +snippet ct:ncq + content: no-close-quote +snippet ct:noq + content: no-open-quote +snippet ct:n + content: normal +snippet ct:oq + content: open-quote +snippet coi + counter-increment: ${0} +snippet cor + counter-reset: ${0} +snippet cur + cursor: ${0} +snippet cur:a + cursor: auto +snippet cur:c + cursor: crosshair +snippet cur:d + cursor: default +snippet cur:ha + cursor: hand +snippet cur:he + cursor: help +snippet cur:m + cursor: move +snippet cur:p + cursor: pointer +snippet cur:t + cursor: text +snippet d + display: ${0} +snippet d:mib + display: -moz-inline-box +snippet d:mis + display: -moz-inline-stack +snippet d:b + display: block +snippet d:cp + display: compact +snippet d:ib + display: inline-block +snippet d:itb + display: inline-table +snippet d:i + display: inline +snippet d:li + display: list-item +snippet d:n + display: none +snippet d:ri + display: run-in +snippet d:tbcp + display: table-caption +snippet d:tbc + display: table-cell +snippet d:tbclg + display: table-column-group +snippet d:tbcl + display: table-column +snippet d:tbfg + display: table-footer-group +snippet d:tbhg + display: table-header-group +snippet d:tbrg + display: table-row-group +snippet d:tbr + display: table-row +snippet d:tb + display: table +snippet ec + empty-cells: ${0} +snippet ec:h + empty-cells: hide +snippet ec:s + empty-cells: show +snippet exp + expression() +snippet fl + float: ${0} +snippet fl:l + float: left +snippet fl:n + float: none +snippet fl:r + float: right +snippet f+ + font: ${1:1em} ${2:Arial},${0:sans-serif} +snippet fef + font-effect: ${0} +snippet fef:eb + font-effect: emboss +snippet fef:eg + font-effect: engrave +snippet fef:n + font-effect: none +snippet fef:o + font-effect: outline +snippet femp + font-emphasize-position: ${0} +snippet femp:a + font-emphasize-position: after +snippet femp:b + font-emphasize-position: before +snippet fems + font-emphasize-style: ${0} +snippet fems:ac + font-emphasize-style: accent +snippet fems:c + font-emphasize-style: circle +snippet fems:ds + font-emphasize-style: disc +snippet fems:dt + font-emphasize-style: dot +snippet fems:n + font-emphasize-style: none +snippet fem + font-emphasize: ${0} +snippet ff + font-family: ${0} +snippet ff:c + font-family: ${0:'Monotype Corsiva','Comic Sans MS'},cursive +snippet ff:f + font-family: ${0:Capitals,Impact},fantasy +snippet ff:m + font-family: ${0:Monaco,'Courier New'},monospace +snippet ff:ss + font-family: ${0:Helvetica,Arial},sans-serif +snippet ff:s + font-family: ${0:Georgia,'Times New Roman'},serif +snippet fza + font-size-adjust: ${0} +snippet fza:n + font-size-adjust: none +snippet fz + font-size: ${0} +snippet fsm + font-smooth: ${0} +snippet fsm:aw + font-smooth: always +snippet fsm:a + font-smooth: auto +snippet fsm:n + font-smooth: never +snippet fst + font-stretch: ${0} +snippet fst:c + font-stretch: condensed +snippet fst:e + font-stretch: expanded +snippet fst:ec + font-stretch: extra-condensed +snippet fst:ee + font-stretch: extra-expanded +snippet fst:n + font-stretch: normal +snippet fst:sc + font-stretch: semi-condensed +snippet fst:se + font-stretch: semi-expanded +snippet fst:uc + font-stretch: ultra-condensed +snippet fst:ue + font-stretch: ultra-expanded +snippet fs + font-style: ${0} +snippet fs:i + font-style: italic +snippet fs:n + font-style: normal +snippet fs:o + font-style: oblique +snippet fv + font-variant: ${0} +snippet fv:n + font-variant: normal +snippet fv:sc + font-variant: small-caps +snippet fw + font-weight: ${0} +snippet fw:b + font-weight: bold +snippet fw:br + font-weight: bolder +snippet fw:lr + font-weight: lighter +snippet fw:n + font-weight: normal +snippet f + font: ${0} +snippet h + height: ${0} +snippet h:a + height: auto +snippet l + left: ${0} +snippet l:a + left: auto +snippet lts + letter-spacing: ${0} +snippet lh + line-height: ${0} +snippet lisi + list-style-image: url('${0}') +snippet lisi:n + list-style-image: none +snippet lisp + list-style-position: ${0} +snippet lisp:i + list-style-position: inside +snippet lisp:o + list-style-position: outside +snippet list + list-style-type: ${0} +snippet list:c + list-style-type: circle +snippet list:dclz + list-style-type: decimal-leading-zero +snippet list:dc + list-style-type: decimal +snippet list:d + list-style-type: disc +snippet list:lr + list-style-type: lower-roman +snippet list:n + list-style-type: none +snippet list:s + list-style-type: square +snippet list:ur + list-style-type: upper-roman +snippet lis + list-style: ${0} +snippet lis:n + list-style: none +snippet mb + margin-bottom: ${0} +snippet mb:a + margin-bottom: auto +snippet ml + margin-left: ${0} +snippet ml:a + margin-left: auto +snippet mr + margin-right: ${0} +snippet mr:a + margin-right: auto +snippet mt + margin-top: ${0} +snippet mt:a + margin-top: auto +snippet m + margin: ${0} +snippet m:4 + margin: ${1:0} ${2:0} ${3:0} ${0:0} +snippet m:3 + margin: ${1:0} ${2:0} ${0:0} +snippet m:2 + margin: ${1:0} ${0:0} +snippet m:0 + margin: 0 +snippet m:a + margin: auto +snippet mah + max-height: ${0} +snippet mah:n + max-height: none +snippet maw + max-width: ${0} +snippet maw:n + max-width: none +snippet mih + min-height: ${0} +snippet miw + min-width: ${0} +snippet op + opacity: ${0} +snippet op:ie + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=${0:100}) +snippet op:ms + -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=${0:100})' +snippet orp + orphans: ${0} +snippet o+ + outline: ${1:1px} ${2:solid} #${0:000} +snippet oc + outline-color: ${0:#000} +snippet oc:i + outline-color: invert +snippet oo + outline-offset: ${0} +snippet os + outline-style: ${0} +snippet ow + outline-width: ${0} +snippet o + outline: ${0} +snippet o:n + outline: none +snippet ovs + overflow-style: ${0} +snippet ovs:a + overflow-style: auto +snippet ovs:mq + overflow-style: marquee +snippet ovs:mv + overflow-style: move +snippet ovs:p + overflow-style: panner +snippet ovs:s + overflow-style: scrollbar +snippet ovx + overflow-x: ${0} +snippet ovx:a + overflow-x: auto +snippet ovx:h + overflow-x: hidden +snippet ovx:s + overflow-x: scroll +snippet ovx:v + overflow-x: visible +snippet ovy + overflow-y: ${0} +snippet ovy:a + overflow-y: auto +snippet ovy:h + overflow-y: hidden +snippet ovy:s + overflow-y: scroll +snippet ovy:v + overflow-y: visible +snippet ov + overflow: ${0} +snippet ov:a + overflow: auto +snippet ov:h + overflow: hidden +snippet ov:s + overflow: scroll +snippet ov:v + overflow: visible +snippet pb + padding-bottom: ${0} +snippet pl + padding-left: ${0} +snippet pr + padding-right: ${0} +snippet pt + padding-top: ${0} +snippet p + padding: ${0} +snippet p:4 + padding: ${1:0} ${2:0} ${3:0} ${0:0} +snippet p:3 + padding: ${1:0} ${2:0} ${0:0} +snippet p:2 + padding: ${1:0} ${0:0} +snippet p:0 + padding: 0 +snippet pgba + page-break-after: ${0} +snippet pgba:aw + page-break-after: always +snippet pgba:a + page-break-after: auto +snippet pgba:l + page-break-after: left +snippet pgba:r + page-break-after: right +snippet pgbb + page-break-before: ${0} +snippet pgbb:aw + page-break-before: always +snippet pgbb:a + page-break-before: auto +snippet pgbb:l + page-break-before: left +snippet pgbb:r + page-break-before: right +snippet pgbi + page-break-inside: ${0} +snippet pgbi:a + page-break-inside: auto +snippet pgbi:av + page-break-inside: avoid +snippet pos + position: ${0} +snippet pos:a + position: absolute +snippet pos:f + position: fixed +snippet pos:r + position: relative +snippet pos:s + position: static +snippet q + quotes: ${0} +snippet q:en + quotes: '\201C' '\201D' '\2018' '\2019' +snippet q:n + quotes: none +snippet q:ru + quotes: '\00AB' '\00BB' '\201E' '\201C' +snippet rz + resize: ${0} +snippet rz:b + resize: both +snippet rz:h + resize: horizontal +snippet rz:n + resize: none +snippet rz:v + resize: vertical +snippet r + right: ${0} +snippet r:a + right: auto +snippet tbl + table-layout: ${0} +snippet tbl:a + table-layout: auto +snippet tbl:f + table-layout: fixed +snippet tal + text-align-last: ${0} +snippet tal:a + text-align-last: auto +snippet tal:c + text-align-last: center +snippet tal:l + text-align-last: left +snippet tal:r + text-align-last: right +snippet ta + text-align: ${0} +snippet ta:c + text-align: center +snippet ta:l + text-align: left +snippet ta:r + text-align: right +snippet td + text-decoration: ${0} +snippet td:l + text-decoration: line-through +snippet td:n + text-decoration: none +snippet td:o + text-decoration: overline +snippet td:u + text-decoration: underline +snippet te + text-emphasis: ${0} +snippet te:ac + text-emphasis: accent +snippet te:a + text-emphasis: after +snippet te:b + text-emphasis: before +snippet te:c + text-emphasis: circle +snippet te:ds + text-emphasis: disc +snippet te:dt + text-emphasis: dot +snippet te:n + text-emphasis: none +snippet th + text-height: ${0} +snippet th:a + text-height: auto +snippet th:f + text-height: font-size +snippet th:m + text-height: max-size +snippet th:t + text-height: text-size +snippet ti + text-indent: ${0} +snippet ti:- + text-indent: -9999px +snippet tj + text-justify: ${0} +snippet tj:a + text-justify: auto +snippet tj:d + text-justify: distribute +snippet tj:ic + text-justify: inter-cluster +snippet tj:ii + text-justify: inter-ideograph +snippet tj:iw + text-justify: inter-word +snippet tj:k + text-justify: kashida +snippet tj:t + text-justify: tibetan +snippet to+ + text-outline: ${1:0} ${2:0} #${0:000} +snippet to + text-outline: ${0} +snippet to:n + text-outline: none +snippet tr + text-replace: ${0} +snippet tr:n + text-replace: none +snippet tsh+ + text-shadow: ${1:0} ${2:0} ${3:0} #${0:000} +snippet tsh + text-shadow: ${0} +snippet tsh:n + text-shadow: none +snippet tt + text-transform: ${0} +snippet tt:c + text-transform: capitalize +snippet tt:l + text-transform: lowercase +snippet tt:n + text-transform: none +snippet tt:u + text-transform: uppercase +snippet tw + text-wrap: ${0} +snippet tw:no + text-wrap: none +snippet tw:n + text-wrap: normal +snippet tw:s + text-wrap: suppress +snippet tw:u + text-wrap: unrestricted +snippet t + top: ${0} +snippet t:a + top: auto +snippet va + vertical-align: ${0} +snippet va:bl + vertical-align: baseline +snippet va:b + vertical-align: bottom +snippet va:m + vertical-align: middle +snippet va:sub + vertical-align: sub +snippet va:sup + vertical-align: super +snippet va:tb + vertical-align: text-bottom +snippet va:tt + vertical-align: text-top +snippet va:t + vertical-align: top +snippet v + visibility: ${0} +snippet v:c + visibility: collapse +snippet v:h + visibility: hidden +snippet v:v + visibility: visible +snippet whsc + white-space-collapse: ${0} +snippet whsc:ba + white-space-collapse: break-all +snippet whsc:bs + white-space-collapse: break-strict +snippet whsc:k + white-space-collapse: keep-all +snippet whsc:l + white-space-collapse: loose +snippet whsc:n + white-space-collapse: normal +snippet whs + white-space: ${0} +snippet whs:n + white-space: normal +snippet whs:nw + white-space: nowrap +snippet whs:pl + white-space: pre-line +snippet whs:pw + white-space: pre-wrap +snippet whs:p + white-space: pre +snippet wid + widows: ${0} +snippet w + width: ${0} +snippet w:a + width: auto +snippet wob + word-break: ${0} +snippet wob:ba + word-break: break-all +snippet wob:bs + word-break: break-strict +snippet wob:k + word-break: keep-all +snippet wob:l + word-break: loose +snippet wob:n + word-break: normal +snippet wos + word-spacing: ${0} +snippet wow + word-wrap: ${0} +snippet wow:no + word-wrap: none +snippet wow:n + word-wrap: normal +snippet wow:s + word-wrap: suppress +snippet wow:u + word-wrap: unrestricted +snippet z + z-index: ${0} +snippet z:a + z-index: auto +snippet zoo + zoom: 1 +snippet :h + :hover +snippet :fc + :first-child +snippet :lc + :last-child +snippet :nc + :nth-child(${0}) +snippet :nlc + :nth-last-child(${0}) +snippet :oc + :only-child +snippet :a + :after +snippet :b + :before +snippet ::a + ::after +snippet ::b + ::before diff --git a/sources_non_forked/vim-snippets/snippets/scala.snippets b/sources_non_forked/vim-snippets/snippets/scala.snippets index 003081ef..a6c3f3c7 100644 --- a/sources_non_forked/vim-snippets/snippets/scala.snippets +++ b/sources_non_forked/vim-snippets/snippets/scala.snippets @@ -7,30 +7,30 @@ #if snippet if if (${1}) - ${0} + ${0:${VISUAL}} #if not snippet ifn if (!${1}) - ${0} + ${0:${VISUAL}} #if-else snippet ife if (${1}) - ${2} + ${2:${VISUAL}} else ${0} #if-else-if snippet ifelif if (${1}) - ${2} + ${2:${VISUAL}} else if (${3}) - ${0} + ${0:${VISUAL}} snippet eif else if (${3}) - ${0} + ${0:${VISUAL}} #while loop snippet wh while (${1:obj}) { - ${0} + ${0:${VISUAL}} } #for loop(classic) snippet for @@ -50,7 +50,7 @@ snippet fory #exceptions snippet try try { - ${1} + ${1:${VISUAL}} } catch { case e: FileNotFoundException => ${2} case e: IOException => ${3} diff --git a/sources_non_forked/vim-snippets/snippets/sh.snippets b/sources_non_forked/vim-snippets/snippets/sh.snippets index e470a2ab..12f8115a 100644 --- a/sources_non_forked/vim-snippets/snippets/sh.snippets +++ b/sources_non_forked/vim-snippets/snippets/sh.snippets @@ -12,26 +12,26 @@ snippet sbash snippet if if [[ ${1:condition} ]]; then - ${0:#statements} + ${0:${VISUAL}} fi snippet elif elif [[ ${1:condition} ]]; then - ${0:#statements} + ${0:${VISUAL}} snippet for for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do - ${0:#statements} + ${0:${VISUAL}} done snippet fori for ${1:needle} in ${2:haystack} ; do - ${0:#statements} + ${0:${VISUAL}} done snippet wh while [[ ${1:condition} ]]; do - ${0:#statements} + ${0:${VISUAL}} done snippet until until [[ ${1:condition} ]]; do - ${0:#statements} + ${0:${VISUAL}} done snippet case case ${1:word} in diff --git a/sources_non_forked/vim-snippets/snippets/tex.snippets b/sources_non_forked/vim-snippets/snippets/tex.snippets index 05ec852c..c095b5a4 100644 --- a/sources_non_forked/vim-snippets/snippets/tex.snippets +++ b/sources_non_forked/vim-snippets/snippets/tex.snippets @@ -86,11 +86,11 @@ snippet enumi enumerate environment \\item ${0} \\end{enumerate} # Itemize -snippet itemize itemize environment +snippet item itemize environment \\begin{itemize} \\item ${0} \\end{itemize} -snippet item \item +snippet it \item \\item ${1:${VISUAL}} # Description snippet desc description environment @@ -259,6 +259,13 @@ snippet subfig subfigure environment \\label{fig:${5}} \\end{subfigure} ${0} +snippet tikzcd tikzcd environment + \begin{equation} + \begin{tikzcd} + ${1} + \end{tikzcd} + \end{equation} + ${0} #math snippet stackrel \stackrel{}{} \\stackrel{${1:above}}{${2:below}} ${0} diff --git a/sources_non_forked/vim-snippets/snippets/twig.snippets b/sources_non_forked/vim-snippets/snippets/twig.snippets index 47997c3b..d0d7e1c9 100644 --- a/sources_non_forked/vim-snippets/snippets/twig.snippets +++ b/sources_non_forked/vim-snippets/snippets/twig.snippets @@ -1,6 +1,6 @@ snippet bl "{% block xyz %} .. {% endblock xyz %}" {% block ${1} %} - ${2} + ${2:${VISUAL}} {% endblock $1 %} snippet js "{% javascripts 'xyz' %} .. {% endjavascripts %}" {% javascripts '${1}' %} @@ -12,17 +12,17 @@ snippet css "{% stylesheets 'xyz' %} .. {% endstylesheets %}" {% endstylesheets %} snippet if "{% if %} .. {% endif %}" {% if ${1} %} - ${2} + ${2:${VISUAL}} {% endif %} snippet ife "{% if %} .. {% else %} .. {% endif %}" {% if ${1} %} - ${2} + ${2:${VISUAL}} {% else %} ${0} {% endif %} snippet el "{% else %}" {% else %} - ${0} + ${0:${VISUAL}} snippet eif "{% elseif %}" {% elseif ${1} %} ${0} diff --git a/sources_non_forked/vim-snippets/snippets/vim.snippets b/sources_non_forked/vim-snippets/snippets/vim.snippets index b299f512..c604d9a6 100644 --- a/sources_non_forked/vim-snippets/snippets/vim.snippets +++ b/sources_non_forked/vim-snippets/snippets/vim.snippets @@ -14,13 +14,13 @@ snippet f function endf snippet t try ... catch statement try - ${1} + ${1:${VISUAL}} catch ${2} ${0} endtry snippet for for ... in loop for ${1} in ${2} - ${0} + ${0:${VISUAL}} endfor snippet forkv for [key, value] in loop for [${1},${2}] in items(${3}) @@ -29,15 +29,15 @@ snippet forkv for [key, value] in loop endfor snippet wh while loop while ${1} - ${0} + ${0:${VISUAL}} endw snippet if if statement if ${1} - ${0} + ${0:${VISUAL}} endif snippet ife if ... else statement if ${1} - ${2} + ${2:${VISUAL}} else ${0} endif diff --git a/sources_non_forked/vim-snippets/snippets/zsh.snippets b/sources_non_forked/vim-snippets/snippets/zsh.snippets index fc1c8374..a8173c26 100644 --- a/sources_non_forked/vim-snippets/snippets/zsh.snippets +++ b/sources_non_forked/vim-snippets/snippets/zsh.snippets @@ -4,40 +4,40 @@ snippet #! snippet if if ${1:condition}; then - ${0:# statements} + ${0:${VISUAL}} fi snippet ife if ${1:condition}; then - ${2:# statements} + ${2:${VISUAL}} else ${0:# statements} fi snippet eif elif ${1:condition}; then - ${0:# statements} + ${0:${VISUAL}} snippet for for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do - ${0:# statements} + ${0:${VISUAL}} done snippet fori for ${1:needle} in ${2:haystack}; do - ${0:#statements} + ${0:${VISUAL}} done snippet fore for ${1:item} in ${2:list}; do - ${0:# statements} + ${0:${VISUAL}} done snippet wh while ${1:condition}; do - ${0:# statements} + ${0:${VISUAL}} done snippet until until ${1:condition}; do - ${0:# statements} + ${0:${VISUAL}} done snippet repeat repeat ${1:integer}; do - ${0:# statements} + ${0:${VISUAL}} done snippet case case ${1:word} in @@ -46,7 +46,7 @@ snippet case esac snippet select select ${1:answer} in ${2:choices}; do - ${0:# statements} + ${0:${VISUAL}} done snippet ( ( ${0:#statements} ) From 68213dfb210f275a976f2e2db3897f89e675a149 Mon Sep 17 00:00:00 2001 From: Elliot Schep <elliot.schep@gmail.com> Date: Thu, 16 Feb 2017 23:24:21 +0100 Subject: [PATCH 196/254] [major(?)] Added vim logo On the Opera browser's (http://www.opera.com/) speed dial, you can set images as "logo's" for a website. This image is a nice logo. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 489ec5f9..a1b2ba91 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![VIM](https://camo.githubusercontent.com/bec48ea0e886e5489a8819486bf74075fe626067/68747470733a2f2f7261772e6769746875622e636f6d2f656c6d636173742f656c6d2d76696d2f6d61737465722f73637265656e73686f74732f6c6f676f2e706e67) + # The Ultimate vimrc Over the last 8 years I have used and tweaked Vim. This is my Ultimate vimrc. From 1b18f20cf1ba6a94a29ce85281d379bc43adac6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Del=C3=A9pine?= <GabrielDelepine@users.noreply.github.com> Date: Mon, 6 Mar 2017 09:53:46 +0100 Subject: [PATCH 197/254] Wording: Fix typo in the readme file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 489ec5f9..b0acbb3d 100644 --- a/README.md +++ b/README.md @@ -310,5 +310,5 @@ Vimscript mappings: ## How to uninstall Do following: * Remove `~/.vim_runtime` -* Remove any lines that refernce `.vim_runtime` in your `~/.vimrc` +* Remove any lines that reference `.vim_runtime` in your `~/.vimrc` From ccb7854aa265a90ece0c869ab6e7f491af89f392 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Tue, 7 Mar 2017 18:04:28 +0100 Subject: [PATCH 198/254] Updated plugins --- .../lightline/colorscheme/darcula.vim | 37 +++ .../lightline.vim/doc/lightline.txt | 3 +- .../nerdtree/lib/nerdtree/ui.vim | 166 ++++++------- sources_non_forked/syntastic/README.markdown | 8 +- .../syntastic/autoload/syntastic/util.vim | 4 +- .../syntastic/doc/syntastic.txt | 2 +- .../syntastic/plugin/syntastic.vim | 5 +- .../syntastic/syntax_checkers/asm/gcc.vim | 7 +- .../syntastic/syntax_checkers/c/pc_lint.vim | 3 +- .../syntastic/syntax_checkers/cabal/cabal.vim | 5 +- .../syntastic/syntax_checkers/cuda/nvcc.vim | 22 +- .../syntastic/syntax_checkers/d/dmd.vim | 3 +- .../syntax_checkers/elixir/elixir.vim | 3 +- .../syntax_checkers/erlang/escript.vim | 8 +- .../syntastic/syntax_checkers/eruby/ruby.vim | 5 +- .../syntastic/syntax_checkers/glsl/cgc.vim | 29 +-- .../syntastic/syntax_checkers/go/go.vim | 17 +- .../syntax_checkers/go/gometalinter.vim | 3 +- .../syntastic/syntax_checkers/go/gotype.vim | 5 +- .../syntastic/syntax_checkers/go/govet.vim | 3 +- .../syntax_checkers/haskell/hdevtools.vim | 3 +- .../syntax_checkers/haskell/hlint.vim | 3 +- .../syntastic/syntax_checkers/haxe/haxe.vim | 10 +- .../syntax_checkers/html/validator.vim | 3 +- .../syntastic/syntax_checkers/html/w3.vim | 3 +- .../syntax_checkers/java/checkstyle.vim | 4 +- .../syntastic/syntax_checkers/java/javac.vim | 4 +- .../javascript/closurecompiler.vim | 5 +- .../syntax_checkers/javascript/flow.vim | 3 +- .../syntastic/syntax_checkers/limbo/limbo.vim | 3 +- .../syntastic/syntax_checkers/nasm/nasm.vim | 3 +- .../syntax_checkers/ocaml/camlp4o.vim | 30 +-- .../syntastic/syntax_checkers/perl/perl.vim | 5 +- .../syntastic/syntax_checkers/r/lint.vim | 4 +- .../syntastic/syntax_checkers/r/lintr.vim | 6 +- .../syntastic/syntax_checkers/r/svtools.vim | 4 +- .../syntastic/syntax_checkers/rst/sphinx.vim | 13 +- .../syntastic/syntax_checkers/sass/sass.vim | 11 +- .../syntastic/syntax_checkers/scala/fsc.vim | 3 +- .../syntastic/syntax_checkers/sh/sh.vim | 36 +-- .../syntax_checkers/sh/shellcheck.vim | 13 +- .../syntastic/syntax_checkers/vala/valac.vim | 8 +- .../syntastic/syntax_checkers/vim/vimlint.vim | 14 +- .../syntax_checkers/xquery/basex.vim | 3 +- .../syntastic/syntax_checkers/yaml/yamlxs.vim | 16 +- .../vim-coffee-script/Copying.md | 39 +++ .../vim-coffee-script/Readme.md | 24 +- .../ftdetect/vim-literate-coffeescript.vim | 8 + .../vim-coffee-script/ftplugin/litcoffee.vim | 1 + .../vim-coffee-script/indent/litcoffee.vim | 22 ++ .../vim-coffee-script/syntax/coffee.vim | 2 +- .../vim-coffee-script/syntax/litcoffee.vim | 23 ++ .../vim-coffee-script/test/test.coffee.md | 117 +++++++++ .../vim-coffee-script/test/test.litcoffee | 117 +++++++++ .../vim-fugitive/plugin/fugitive.vim | 3 +- .../vim-go/.github/ISSUE_TEMPLATE.md | 9 +- sources_non_forked/vim-go/.travis.yml | 1 - sources_non_forked/vim-go/CHANGELOG.md | 23 +- sources_non_forked/vim-go/LICENSE | 2 +- sources_non_forked/vim-go/README.md | 8 +- .../vim-go/autoload/ctrlp/decls.vim | 6 +- sources_non_forked/vim-go/autoload/go/cmd.vim | 2 +- .../vim-go/autoload/go/complete.vim | 12 +- .../vim-go/autoload/go/coverage.vim | 22 +- sources_non_forked/vim-go/autoload/go/def.vim | 2 +- sources_non_forked/vim-go/autoload/go/doc.vim | 23 +- sources_non_forked/vim-go/autoload/go/fmt.vim | 20 +- .../vim-go/autoload/go/guru.vim | 24 +- .../vim-go/autoload/go/impl.vim | 4 +- .../vim-go/autoload/go/lint.vim | 8 +- .../vim-go/autoload/go/list.vim | 2 +- .../vim-go/autoload/go/play.vim | 2 +- .../vim-go/autoload/go/statusline.vim | 2 +- .../vim-go/autoload/go/tags.vim | 206 +++++++++++++++ .../vim-go/autoload/go/tags_test.vim | 28 +++ .../vim-go/autoload/go/textobj.vim | 2 +- .../vim-go/autoload/go/tool.vim | 2 +- .../vim-go/autoload/go/util.vim | 2 +- sources_non_forked/vim-go/doc/vim-go.txt | 42 +++- .../vim-go/ftplugin/go/commands.vim | 7 +- .../vim-go/ftplugin/go/tagbar.vim | 6 +- .../vim-go/gosnippets/UltiSnips/go.snippets | 2 +- sources_non_forked/vim-go/plugin/go.vim | 1 + sources_non_forked/vim-go/scripts/test.sh | 3 + sources_non_forked/vim-pug/syntax/pug.vim | 2 +- .../vim-snippets/UltiSnips/all.snippets | 4 + .../vim-snippets/UltiSnips/cpp.snippets | 37 +++ .../javascript-jasmine-arrow.snippets | 234 ++++++++++++++++++ .../UltiSnips/javascript-jasmine.snippets | 18 +- .../UltiSnips/javascript.snippets | 93 +++++-- .../vim-snippets/UltiSnips/matlab.snippets | 24 ++ .../vim-snippets/UltiSnips/ruby.snippets | 68 ++--- .../vim-snippets/UltiSnips/snippets.snippets | 6 +- .../pythonx/javascript_snippets.py | 48 ++++ .../vim-snippets/snippets/c.snippets | 109 +++++++- .../vim-snippets/snippets/cpp.snippets | 57 ++++- .../vim-snippets/snippets/fortran.snippets | 3 + .../vim-snippets/snippets/jinja.snippets | 2 +- .../vim-snippets/snippets/matlab.snippets | 64 +++++ .../vim-snippets/snippets/php.snippets | 4 +- .../vim-snippets/snippets/ruby.snippets | 15 -- .../vim-snippets/snippets/rust.snippets | 2 +- .../vim-snippets/snippets/snippets.snippets | 7 +- 103 files changed, 1729 insertions(+), 445 deletions(-) create mode 100644 sources_non_forked/lightline.vim/autoload/lightline/colorscheme/darcula.vim create mode 100644 sources_non_forked/vim-coffee-script/ftdetect/vim-literate-coffeescript.vim create mode 100644 sources_non_forked/vim-coffee-script/ftplugin/litcoffee.vim create mode 100644 sources_non_forked/vim-coffee-script/indent/litcoffee.vim create mode 100644 sources_non_forked/vim-coffee-script/syntax/litcoffee.vim create mode 100644 sources_non_forked/vim-coffee-script/test/test.coffee.md create mode 100644 sources_non_forked/vim-coffee-script/test/test.litcoffee create mode 100644 sources_non_forked/vim-go/autoload/go/tags.vim create mode 100644 sources_non_forked/vim-go/autoload/go/tags_test.vim create mode 100644 sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine-arrow.snippets create mode 100644 sources_non_forked/vim-snippets/UltiSnips/matlab.snippets create mode 100644 sources_non_forked/vim-snippets/pythonx/javascript_snippets.py create mode 100644 sources_non_forked/vim-snippets/snippets/matlab.snippets diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/darcula.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/darcula.vim new file mode 100644 index 00000000..928e8b76 --- /dev/null +++ b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/darcula.vim @@ -0,0 +1,37 @@ +" ============================================================================= +" Filename: autoload/lightline/colorscheme/darcula.vim +" Author: kkopec +" License: MIT License +" Last Change: 2017/02/11 21:18:54. +" ============================================================================= + +let s:black = [ '#2b2b2b', 235 ] +let s:gray = [ '#323232', 236 ] +let s:white = [ '#a9b7c6', 250 ] +let s:blue = [ '#6897bb' , 67 ] +let s:green = [ '#629755', 71 ] +let s:purple = [ '#9876aa', 104 ] +let s:red = [ '#ff6b68', 204 ] +let s:yellow = [ '#ffc66d', 222 ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:black, s:purple ], [ s:purple, s:gray ] ] +let s:p.normal.right = [ [ s:black, s:purple ], [ s:purple, s:gray ] ] +let s:p.inactive.left = [ [ s:black, s:blue ], [ s:blue, s:gray ] ] +let s:p.inactive.right = [ [ s:black, s:blue ], [ s:blue, s:gray ] ] +let s:p.insert.left = [ [ s:black, s:green ], [ s:green, s:gray ] ] +let s:p.insert.right = [ [ s:black, s:green ], [ s:green, s:gray ] ] +let s:p.replace.left = [ [ s:black, s:red ], [ s:red, s:gray ] ] +let s:p.replace.right = [ [ s:black, s:red ], [ s:red, s:gray ] ] +let s:p.visual.left = [ [ s:black, s:yellow ], [ s:yellow, s:gray ] ] +let s:p.visual.right = [ [ s:black, s:yellow ], [ s:yellow, s:gray ] ] +let s:p.normal.middle = [ [ s:white, s:gray ] ] +let s:p.inactive.middle = [ [ s:white, s:gray ] ] +let s:p.tabline.left = [ [ s:blue, s:gray ] ] +let s:p.tabline.tabsel = [ [ s:black, s:blue ] ] +let s:p.tabline.middle = [ [ s:blue, s:gray ] ] +let s:p.tabline.right = [ [ s:black, s:blue ] ] +let s:p.normal.error = [ [ s:red, s:black ] ] +let s:p.normal.warning = [ [ s:yellow, s:black ] ] + +let g:lightline#colorscheme#darcula#palette = lightline#colorscheme#flatten(s:p) diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index 8b0a580d..1c08d82b 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -223,7 +223,8 @@ OPTIONS *lightline-option* The colorscheme for lightline.vim. Currently, wombat, solarized, powerline, jellybeans, Tomorrow, Tomorrow_Night, Tomorrow_Night_Blue, Tomorrow_Night_Eighties, - PaperColor, seoul256, landscape, one, Dracula, Molokai and 16color are available. + PaperColor, seoul256, landscape, one, Dracula, darcula, + Molokai and 16color are available. The default value is: > let g:lightline.colorscheme = 'default' diff --git a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim index d107814c..65ebfd91 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim @@ -20,108 +20,105 @@ endfunction "FUNCTION: s:UI._dumpHelp {{{1 "prints out the quick help function! s:UI._dumpHelp() - let old_h = @h if self.getShowHelp() - let @h= "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n" - let @h=@h."\" ============================\n" - let @h=@h."\" File node mappings~\n" - let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" - let @h=@h."\" <CR>,\n" + let help = "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n" + let help .= "\" ============================\n" + let help .= "\" File node mappings~\n" + let help .= "\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" + let help .= "\" <CR>,\n" if self.nerdtree.isTabTree() - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n" + let help .= "\" ". g:NERDTreeMapActivateNode .": open in prev window\n" else - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n" + let help .= "\" ". g:NERDTreeMapActivateNode .": open in current window\n" endif if self.nerdtree.isTabTree() - let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n" + let help .= "\" ". g:NERDTreeMapPreview .": preview\n" endif - let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" - let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" - let @h=@h."\" middle-click,\n" - let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n" - let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n" - let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" - let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" + let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= "\" middle-click,\n" + let help .= "\" ". g:NERDTreeMapOpenSplit .": open split\n" + let help .= "\" ". g:NERDTreeMapPreviewSplit .": preview split\n" + let help .= "\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" + let help .= "\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Directory node mappings~\n" - let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n" - let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" - let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n" - let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" - let @h=@h."\" current node recursively\n" - let @h=@h."\" middle-click,\n" - let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Directory node mappings~\n" + let help .= "\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" + let help .= "\" ". g:NERDTreeMapActivateNode .": open & close node\n" + let help .= "\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" + let help .= "\" ". g:NERDTreeMapCloseDir .": close parent of node\n" + let help .= "\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" + let help .= "\" current node recursively\n" + let help .= "\" middle-click,\n" + let help .= "\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Bookmark table mappings~\n" - let @h=@h."\" double-click,\n" - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n" - let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" - let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" - let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Bookmark table mappings~\n" + let help .= "\" double-click,\n" + let help .= "\" ". g:NERDTreeMapActivateNode .": open bookmark\n" + let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= "\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Tree navigation mappings~\n" - let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n" - let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n" - let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" - let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" - let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" - let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Tree navigation mappings~\n" + let help .= "\" ". g:NERDTreeMapJumpRoot .": go to root\n" + let help .= "\" ". g:NERDTreeMapJumpParent .": go to parent\n" + let help .= "\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" + let help .= "\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" + let help .= "\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" + let help .= "\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Filesystem mappings~\n" - let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" - let @h=@h."\" selected dir\n" - let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" - let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" - let @h=@h."\" but leave old root open\n" - let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" - let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" - let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n" - let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n" - let @h=@h."\" selected dir\n" - let @h=@h."\" ". g:NERDTreeMapCWD .":change tree root to CWD\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Filesystem mappings~\n" + let help .= "\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" + let help .= "\" selected dir\n" + let help .= "\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" + let help .= "\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" + let help .= "\" but leave old root open\n" + let help .= "\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" + let help .= "\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" + let help .= "\" ". g:NERDTreeMapMenu .": Show menu\n" + let help .= "\" ". g:NERDTreeMapChdir .":change the CWD to the\n" + let help .= "\" selected dir\n" + let help .= "\" ". g:NERDTreeMapCWD .":change tree root to CWD\n" - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Tree filtering mappings~\n" - let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (self.getShowHidden() ? "on" : "off") . ")\n" - let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (self.isIgnoreFilterEnabled() ? "on" : "off") . ")\n" - let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (self.getShowFiles() ? "on" : "off") . ")\n" - let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (self.getShowBookmarks() ? "on" : "off") . ")\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Tree filtering mappings~\n" + let help .= "\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (self.getShowHidden() ? "on" : "off") . ")\n" + let help .= "\" ". g:NERDTreeMapToggleFilters .": file filters (" . (self.isIgnoreFilterEnabled() ? "on" : "off") . ")\n" + let help .= "\" ". g:NERDTreeMapToggleFiles .": files (" . (self.getShowFiles() ? "on" : "off") . ")\n" + let help .= "\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (self.getShowBookmarks() ? "on" : "off") . ")\n" "add quickhelp entries for each custom key map - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Custom mappings~\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Custom mappings~\n" for i in g:NERDTreeKeyMap.All() if !empty(i.quickhelpText) - let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" + let help .= "\" ". i.key .": ". i.quickhelpText ."\n" endif endfor - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Other mappings~\n" - let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" - let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" - let @h=@h."\" the NERDTree window\n" - let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n" - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Bookmark commands~\n" - let @h=@h."\" :Bookmark [<name>]\n" - let @h=@h."\" :BookmarkToRoot <name>\n" - let @h=@h."\" :RevealBookmark <name>\n" - let @h=@h."\" :OpenBookmark <name>\n" - let @h=@h."\" :ClearBookmarks [<names>]\n" - let @h=@h."\" :ClearAllBookmarks\n" - silent! put h + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Other mappings~\n" + let help .= "\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" + let help .= "\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" + let help .= "\" the NERDTree window\n" + let help .= "\" ". g:NERDTreeMapHelp .": toggle help\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Bookmark commands~\n" + let help .= "\" :Bookmark [<name>]\n" + let help .= "\" :BookmarkToRoot <name>\n" + let help .= "\" :RevealBookmark <name>\n" + let help .= "\" :OpenBookmark <name>\n" + let help .= "\" :ClearBookmarks [<names>]\n" + let help .= "\" :ClearAllBookmarks\n" + silent! put =help elseif !self.isMinimal() - let @h="\" Press ". g:NERDTreeMapHelp ." for help\n" - silent! put h + let help ="\" Press ". g:NERDTreeMapHelp ." for help\n" + silent! put =help endif - - let @h = old_h endfunction @@ -440,10 +437,7 @@ function! s:UI.render() call cursor(line(".")+1, col(".")) "draw the tree - let old_o = @o - let @o = self.nerdtree.root.renderToString() - silent put o - let @o = old_o + silent put =self.nerdtree.root.renderToString() "delete the blank line at the top of the buffer silent 1,1delete _ diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index 7ed8cc87..4212c95a 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -101,10 +101,10 @@ enabled. Syntastic itself has rather relaxed requirements: it doesn't have any external dependencies, and it needs a version of [Vim][vim] compiled with a few common features: `autocmd`, `eval`, `file_in_path`, `modify_fname`, `quickfix`, -`reltime`, and `user_commands`. Not all possible combinations of features that -include the ones above make equal sense on all operating systems, but Vim -version 7 or later with the "normal", "big", or "huge" feature sets should be -fine. +`reltime`, `statusline`, and `user_commands`. Not all possible combinations of +features that include the ones above make equal sense on all operating systems, +but Vim version 7 or later with the "normal", "big", or "huge" feature sets +should be fine. Syntastic should work with any modern plugin managers for Vim, such as [NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam], diff --git a/sources_non_forked/syntastic/autoload/syntastic/util.vim b/sources_non_forked/syntastic/autoload/syntastic/util.vim index deeb0f1f..6ead9ea2 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/util.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/util.vim @@ -132,9 +132,9 @@ endfunction " }}}2 " returns " " {'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} -function! syntastic#util#parseShebang() abort " {{{2 +function! syntastic#util#parseShebang(buf) abort " {{{2 for lnum in range(1, 5) - let line = getline(lnum) + let line = get(getbufline(a:buf, lnum), 0, '') if line =~# '^#!' let line = substitute(line, '\v^#!\s*(\S+/env(\s+-\S+)*\s+)?', '', '') let exe = matchstr(line, '\m^\S*\ze') diff --git a/sources_non_forked/syntastic/doc/syntastic.txt b/sources_non_forked/syntastic/doc/syntastic.txt index db3e99e4..8bc455d3 100644 --- a/sources_non_forked/syntastic/doc/syntastic.txt +++ b/sources_non_forked/syntastic/doc/syntastic.txt @@ -164,7 +164,7 @@ When syntax errors are detected a flag will be shown. The content of the flag is derived from the |'syntastic_stl_format'| option. Please note that these settings might conflict with other Vim plugins that -change the way statusline works. Refer to the |syntastic-compatibility| notes +change the way 'statusline' works. Refer to the |syntastic-compatibility| notes below and to the respective plugins' documentation for possible solutions. In particular see |syntastic-airline| below if you're using the "airline" Vim diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 4e65ea07..47f16cf0 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-21' +let g:_SYNTASTIC_VERSION = '3.8.0-26' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 @@ -36,7 +36,8 @@ for s:feature in [ \ 'modify_fname', \ 'quickfix', \ 'reltime', - \ 'user_commands' + \ 'statusline', + \ 'user_commands', \ ] if !has(s:feature) call syntastic#log#error('need Vim compiled with feature ' . s:feature) diff --git a/sources_non_forked/syntastic/syntax_checkers/asm/gcc.vim b/sources_non_forked/syntastic/syntax_checkers/asm/gcc.vim index d352eeeb..f6a8b410 100644 --- a/sources_non_forked/syntastic/syntax_checkers/asm/gcc.vim +++ b/sources_non_forked/syntastic/syntax_checkers/asm/gcc.vim @@ -34,19 +34,20 @@ function! SyntaxCheckers_asm_gcc_IsAvailable() dict " {{{1 endfunction " }}}1 function! SyntaxCheckers_asm_gcc_GetLocList() dict " {{{1 + let buf = bufnr('') return syntastic#c#GetLocList('asm', 'gcc', { \ 'errorformat': \ '%-G%f:%s:,' . \ '%f:%l:%c: %trror: %m,' . \ '%f:%l:%c: %tarning: %m,' . \ '%f:%l: %m', - \ 'main_flags': '-x assembler -fsyntax-only' . (g:syntastic_asm_generic ? '' : ' -masm=' . s:GetDialect()) }) + \ 'main_flags': '-x assembler -fsyntax-only' . (g:syntastic_asm_generic ? '' : ' -masm=' . s:GetDialect(buf)) }) endfunction " }}}1 " Utilities {{{1 -function! s:GetDialect() " {{{2 - return syntastic#util#var('asm_dialect', expand('%:e', 1) ==? 'asm' ? 'intel' : 'att') +function! s:GetDialect(buf) " {{{2 + return syntastic#util#bufVar(a:buf, 'asm_dialect', fnamemodify(bufname(a:buf), ':e') ==? 'asm' ? 'intel' : 'att') endfunction " }}}2 " }}}1 diff --git a/sources_non_forked/syntastic/syntax_checkers/c/pc_lint.vim b/sources_non_forked/syntastic/syntax_checkers/c/pc_lint.vim index 6efd17a1..0f7f9da7 100644 --- a/sources_non_forked/syntastic/syntax_checkers/c/pc_lint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/c/pc_lint.vim @@ -23,7 +23,8 @@ if !exists('g:syntastic_pc_lint_config_file') endif function! SyntaxCheckers_c_pc_lint_GetLocList() dict - let config = syntastic#util#findFileInParent(g:syntastic_pc_lint_config_file, expand('%:p:h', 1)) + let buf = bufnr('') + let config = syntastic#util#findFileInParent(g:syntastic_pc_lint_config_file, fnamemodify(bufname(buf), ':p:h')) call self.log('config =', config) " -hFs1 - show filename, add space after messages, try to make message 1 line diff --git a/sources_non_forked/syntastic/syntax_checkers/cabal/cabal.vim b/sources_non_forked/syntastic/syntax_checkers/cabal/cabal.vim index e43aefaa..6aa58aff 100644 --- a/sources_non_forked/syntastic/syntax_checkers/cabal/cabal.vim +++ b/sources_non_forked/syntastic/syntax_checkers/cabal/cabal.vim @@ -31,6 +31,7 @@ function! SyntaxCheckers_cabal_cabal_GetHighlightRegex(item) endfunction function! SyntaxCheckers_cabal_cabal_GetLocList() dict + let buf = bufnr('') let makeprg = self.getExecEscaped() . ' check' let errorformat = @@ -40,9 +41,9 @@ function! SyntaxCheckers_cabal_cabal_GetLocList() dict return SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, - \ 'cwd': expand('%:p:h', 1), + \ 'cwd': fnamemodify(bufname(buf), ':p:h'), \ 'preprocess': 'cabal', - \ 'defaults': {'bufnr': bufnr('')} }) + \ 'defaults': {'bufnr': buf} }) endfunction call g:SyntasticRegistry.CreateAndRegisterChecker({ diff --git a/sources_non_forked/syntastic/syntax_checkers/cuda/nvcc.vim b/sources_non_forked/syntastic/syntax_checkers/cuda/nvcc.vim index 34760390..9601e73a 100644 --- a/sources_non_forked/syntastic/syntax_checkers/cuda/nvcc.vim +++ b/sources_non_forked/syntastic/syntax_checkers/cuda/nvcc.vim @@ -18,7 +18,8 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_cuda_nvcc_GetLocList() dict - let arch_flag = syntastic#util#var('cuda_arch') + let buf = bufnr('') + let arch_flag = syntastic#util#bufVar(buf, 'cuda_arch') if arch_flag !=# '' let arch_flag = '-arch=' . arch_flag call syntastic#log#oneTimeWarn('variable g:syntastic_cuda_arch is deprecated, ' . @@ -27,9 +28,9 @@ function! SyntaxCheckers_cuda_nvcc_GetLocList() dict let build_opts = {} let dummy = '' - if index(['h', 'hpp', 'cuh'], expand('%:e', 1), 0, 1) >= 0 - if syntastic#util#var('cuda_check_header', 0) - let dummy = expand('%:p:h', 1) . syntastic#util#Slash() . '.syntastic_dummy.cu' + if index(['h', 'hpp', 'cuh'], fnamemodify(bufname(buf), ':e'), 0, 1) >= 0 + if syntastic#util#bufVar(buf, 'cuda_check_header', 0) + let dummy = fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash() . '.syntastic_dummy.cu' let build_opts = { \ 'exe_before': 'echo > ' . syntastic#util#shescape(dummy) . ' ;', \ 'fname_before': '.syntastic_dummy.cu -include' } @@ -62,7 +63,18 @@ function! SyntaxCheckers_cuda_nvcc_GetLocList() dict \ '%DMaking %*\a in %f,'. \ '%f|%l| %m' - let loclist = SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) + let loclist = SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'defaults': {'type': 'E'} }) + + for e in loclist + let pat = matchstr(e['text'], '\m\c^\s*warning:\s*\zs.*') + if pat !=# '' + let e['text'] = pat + let e['type'] = 'W' + endif + endfor if dummy !=# '' call delete(dummy) diff --git a/sources_non_forked/syntastic/syntax_checkers/d/dmd.vim b/sources_non_forked/syntastic/syntax_checkers/d/dmd.vim index 88979956..de00b8eb 100644 --- a/sources_non_forked/syntastic/syntax_checkers/d/dmd.vim +++ b/sources_non_forked/syntastic/syntax_checkers/d/dmd.vim @@ -44,8 +44,9 @@ function! SyntaxCheckers_d_dmd_IsAvailable() dict " {{{1 endfunction " }}}1 function! SyntaxCheckers_d_dmd_GetLocList() dict " {{{1 + let buf = bufnr('') if !exists('g:syntastic_d_include_dirs') - let g:syntastic_d_include_dirs = s:GetIncludes(self, expand('%:p:h')) + let g:syntastic_d_include_dirs = s:GetIncludes(self, fnamemodify(bufname(buf), ':p:h')) endif return syntastic#c#GetLocList('d', 'dmd', { diff --git a/sources_non_forked/syntastic/syntax_checkers/elixir/elixir.vim b/sources_non_forked/syntastic/syntax_checkers/elixir/elixir.vim index f2ffe67e..939520ed 100644 --- a/sources_non_forked/syntastic/syntax_checkers/elixir/elixir.vim +++ b/sources_non_forked/syntastic/syntax_checkers/elixir/elixir.vim @@ -27,9 +27,10 @@ function! SyntaxCheckers_elixir_elixir_IsAvailable() dict endfunction function! SyntaxCheckers_elixir_elixir_GetLocList() dict + let buf = bufnr('') let make_options = {} let compile_command = 'elixir' - let mix_file = syntastic#util#findFileInParent('mix.exs', expand('%:p:h', 1)) + let mix_file = syntastic#util#findFileInParent('mix.exs', fnamemodify(bufname(buf), ':p:h')) if filereadable(mix_file) let compile_command = 'mix compile' diff --git a/sources_non_forked/syntastic/syntax_checkers/erlang/escript.vim b/sources_non_forked/syntastic/syntax_checkers/erlang/escript.vim index 9fd869fc..f931e6b1 100644 --- a/sources_non_forked/syntastic/syntax_checkers/erlang/escript.vim +++ b/sources_non_forked/syntastic/syntax_checkers/erlang/escript.vim @@ -25,11 +25,13 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_erlang_escript_GetLocList() dict - if expand('%:e', 1) ==# 'hrl' + let buf = bufnr('') + + if fnamemodify(bufname(buf), ':e') ==# 'hrl' return [] endif - let shebang = syntastic#util#parseShebang() + let shebang = syntastic#util#parseShebang(buf) if shebang['exe'] ==# 'escript' let args = '-s' let post_args = '' @@ -39,7 +41,7 @@ function! SyntaxCheckers_erlang_escript_GetLocList() dict endif let makeprg = self.makeprgBuild({ \ 'args_after': args, - \ 'fname': syntastic#util#shexpand('%:p'), + \ 'fname': syntastic#util#shexpand(fnamemodify(bufname(buf), ':p')), \ 'post_args_after': post_args }) let errorformat = diff --git a/sources_non_forked/syntastic/syntax_checkers/eruby/ruby.vim b/sources_non_forked/syntastic/syntax_checkers/eruby/ruby.vim index 16eed623..4850eeef 100644 --- a/sources_non_forked/syntastic/syntax_checkers/eruby/ruby.vim +++ b/sources_non_forked/syntastic/syntax_checkers/eruby/ruby.vim @@ -31,7 +31,8 @@ function! SyntaxCheckers_eruby_ruby_GetLocList() dict let s:ruby_new = syntastic#util#versionIsAtLeast(self.getVersion(), [1, 9]) endif - let fname = "'" . escape(expand('%', 1), "\\'") . "'" + let buf = bufnr('') + let fname = "'" . escape(bufname(buf), "\\'") . "'" " TODO: encodings became useful in ruby 1.9 :) if s:ruby_new @@ -69,7 +70,7 @@ function! SyntaxCheckers_eruby_ruby_GetLocList() dict \ 'makeprg': makeprg, \ 'errorformat': errorformat, \ 'env': env, - \ 'defaults': { 'bufnr': bufnr(''), 'vcol': 1 } }) + \ 'defaults': { 'bufnr': buf, 'vcol': 1 } }) endfunction call g:SyntasticRegistry.CreateAndRegisterChecker({ diff --git a/sources_non_forked/syntastic/syntax_checkers/glsl/cgc.vim b/sources_non_forked/syntastic/syntax_checkers/glsl/cgc.vim index 602399d7..e51f8335 100644 --- a/sources_non_forked/syntastic/syntax_checkers/glsl/cgc.vim +++ b/sources_non_forked/syntastic/syntax_checkers/glsl/cgc.vim @@ -28,8 +28,9 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_glsl_cgc_GetLocList() dict " {{{1 + let buf = bufnr('') let makeprg = self.makeprgBuild({ - \ 'args_before': '-oglsl -profile ' . s:GetProfile(), + \ 'args_before': '-oglsl -profile ' . s:GetProfile(buf), \ 'args': (exists('g:syntastic_glsl_options') ? ' ' . g:syntastic_glsl_options : '') }) let errorformat = @@ -43,27 +44,11 @@ endfunction " }}}1 " Utilities {{{1 -function! s:GetProfile() " {{{2 - let save_view = winsaveview() - let old_foldenable = &foldenable - let old_lazyredraw = &lazyredraw - - let &lazyredraw = 1 - let &foldenable = 0 - call cursor(1, 1) - - let magic = '\m\C^// profile:\s*' - let line = search(magic, 'c') - - call winrestview(save_view) - let &foldenable = old_foldenable - let &lazyredraw = old_lazyredraw - - if line - let profile = matchstr(getline(line), magic . '\zs.*') - else - let extensions = exists('g:syntastic_glsl_extensions') ? g:syntastic_glsl_extensions : s:glsl_extensions - let profile = get(extensions, tolower(expand('%:e', 1)), 'gpu_vert') +function! s:GetProfile(buf) " {{{2 + let profile = matchstr(get(filter(getbufline(a:buf, 1, 100), 'v:val =~# "\\m\\C^//\\s*profile:"'), 0, ''), '\m\C^//\s*profile:\s*\zs.*') + if profile ==# '' + let extensions = syntastic#util#bufVar(a:buf, 'glsl_extensions', s:glsl_extensions) + let profile = get(extensions, tolower(fnamemodify(bufname(a:buf), ':e')), 'gpu_vert') endif return profile diff --git a/sources_non_forked/syntastic/syntax_checkers/go/go.vim b/sources_non_forked/syntastic/syntax_checkers/go/go.vim index f32f505b..c45de08f 100644 --- a/sources_non_forked/syntastic/syntax_checkers/go/go.vim +++ b/sources_non_forked/syntastic/syntax_checkers/go/go.vim @@ -30,6 +30,7 @@ function! SyntaxCheckers_go_go_GetLocList() dict if !exists('s:go_new') let s:go_new = syntastic#util#versionIsAtLeast(self.getVersion(self.getExecEscaped() . ' version'), [1, 5]) endif + let buf = bufnr('') " Check with gofmt first, since `go build` and `go test` might not report " syntax errors in the current file if another file with syntax error is @@ -53,14 +54,14 @@ function! SyntaxCheckers_go_go_GetLocList() dict " Test files, i.e. files with a name ending in `_test.go`, are not " compiled by `go build`, therefore `go test` must be called for those. - if match(expand('%', 1), '\m_test\.go$') == -1 - let cmd = 'build' - let opts = syntastic#util#var('go_go_build_args', s:go_new ? '-buildmode=archive' : '') - let cleanup = 0 - else + if bufname(buf) =~# '\m_test\.go$' let cmd = 'test -c' - let opts = syntastic#util#var('go_go_test_args', s:go_new ? '-buildmode=archive' : '') + let opts = syntastic#util#bufVar(buf, 'go_go_test_args', s:go_new ? '-buildmode=archive' : '') let cleanup = 1 + else + let cmd = 'build' + let opts = syntastic#util#bufVar(buf, 'go_go_build_args', s:go_new ? '-buildmode=archive' : '') + let cleanup = 0 endif let opt_str = (type(opts) != type('') || opts !=# '') ? join(syntastic#util#argsescape(opts)) : opts let makeprg = self.getExecEscaped() . ' ' . cmd . ' ' . opt_str @@ -82,12 +83,12 @@ function! SyntaxCheckers_go_go_GetLocList() dict let errors = SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, - \ 'cwd': expand('%:p:h', 1), + \ 'cwd': fnamemodify(bufname(buf), ':p:h'), \ 'env': {'GOGC': 'off'}, \ 'defaults': {'type': 'e'} }) if cleanup - call delete(expand('%:p:h', 1) . syntastic#util#Slash() . expand('%:p:h:t', 1) . '.test') + call delete(fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash() . fnamemodify(bufname(buf), ':p:h') . '.test') endif return errors diff --git a/sources_non_forked/syntastic/syntax_checkers/go/gometalinter.vim b/sources_non_forked/syntastic/syntax_checkers/go/gometalinter.vim index 780f49b4..1e084fcf 100644 --- a/sources_non_forked/syntastic/syntax_checkers/go/gometalinter.vim +++ b/sources_non_forked/syntastic/syntax_checkers/go/gometalinter.vim @@ -19,9 +19,10 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_go_gometalinter_GetLocList() dict + let buf = bufnr('') let makeprg = self.makeprgBuild({ \ 'args': '-t', - \ 'fname': syntastic#util#shexpand('%:p:h') }) + \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p:h')) }) let errorformat = \ '%f:%l:%c:%trror: %m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim b/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim index 37472eeb..ca276eb7 100644 --- a/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim +++ b/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim @@ -19,8 +19,9 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_go_gotype_GetLocList() dict + let buf = bufnr('') let makeprg = self.makeprgBuild({ - \ 'args': (expand('%', 1) =~# '\m_test\.go$' ? '-a' : ''), + \ 'args': (bufname(buf) =~# '\m_test\.go$' ? '-a' : ''), \ 'fname': '.' }) let errorformat = @@ -34,7 +35,7 @@ function! SyntaxCheckers_go_gotype_GetLocList() dict return SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, - \ 'cwd': expand('%:p:h', 1), + \ 'cwd': fnamemodify(bufname(buf), ':p:h'), \ 'defaults': {'type': 'e'} }) endfunction diff --git a/sources_non_forked/syntastic/syntax_checkers/go/govet.vim b/sources_non_forked/syntastic/syntax_checkers/go/govet.vim index 6c306311..1d8015c5 100644 --- a/sources_non_forked/syntastic/syntax_checkers/go/govet.vim +++ b/sources_non_forked/syntastic/syntax_checkers/go/govet.vim @@ -19,6 +19,7 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_go_govet_GetLocList() dict + let buf = bufnr('') let makeprg = self.getExecEscaped() . ' vet' let errorformat = @@ -33,7 +34,7 @@ function! SyntaxCheckers_go_govet_GetLocList() dict return SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, - \ 'cwd': expand('%:p:h', 1), + \ 'cwd': fnamemodify(bufname(buf), ':p:h'), \ 'defaults': {'type': 'w'} }) endfunction diff --git a/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim b/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim index f2313b3f..18346f76 100644 --- a/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim +++ b/sources_non_forked/syntastic/syntax_checkers/haskell/hdevtools.vim @@ -25,9 +25,10 @@ function! SyntaxCheckers_haskell_hdevtools_GetLocList() dict let g:syntastic_haskell_hdevtools_args = g:hdevtools_options endif + let buf = bufnr('') let makeprg = self.makeprgBuild({ \ 'exe_after': 'check', - \ 'fname': syntastic#util#shexpand('%:p') }) + \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) }) let errorformat = \ '%-Z %#,'. diff --git a/sources_non_forked/syntastic/syntax_checkers/haskell/hlint.vim b/sources_non_forked/syntastic/syntax_checkers/haskell/hlint.vim index c75ea8b4..949a21b1 100644 --- a/sources_non_forked/syntastic/syntax_checkers/haskell/hlint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/haskell/hlint.vim @@ -14,8 +14,9 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_haskell_hlint_GetLocList() dict + let buf = bufnr('') let makeprg = self.makeprgBuild({ - \ 'fname': syntastic#util#shexpand('%:p')}) + \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) }) let errorformat = \ '%E%f:%l:%v: Error while reading hint file\, %m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim b/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim index 99ab4a17..c799624d 100644 --- a/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim +++ b/sources_non_forked/syntastic/syntax_checkers/haxe/haxe.vim @@ -19,12 +19,10 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_haxe_haxe_GetLocList() dict - if exists('b:vaxe_hxml') - let hxml = b:vaxe_hxml - elseif exists('g:vaxe_hxml') - let hxml = g:vaxe_hxml - else - let hxml = syntastic#util#findGlobInParent('*.hxml', expand('%:p:h', 1)) + let buf = bufnr('') + let hxml = syntastic#util#bufRawVar(buf, 'vaxe_hxml') + if hxml ==# '' + let hxml = syntastic#util#findGlobInParent('*.hxml', fnamemodify(bufname(buf), ':p:h')) endif let hxml = fnamemodify(hxml, ':p') diff --git a/sources_non_forked/syntastic/syntax_checkers/html/validator.vim b/sources_non_forked/syntastic/syntax_checkers/html/validator.vim index 14a4c64d..2fbb158e 100644 --- a/sources_non_forked/syntastic/syntax_checkers/html/validator.vim +++ b/sources_non_forked/syntastic/syntax_checkers/html/validator.vim @@ -31,7 +31,8 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_html_validator_GetLocList() dict - let fname = syntastic#util#shexpand('%') + let buf = bufnr('') + let fname = syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) let makeprg = self.getExecEscaped() . ' -q -L -s --compressed -F out=gnu -F asciiquotes=yes' . \ (g:syntastic_html_validator_parser !=# '' ? ' -F parser=' . g:syntastic_html_validator_parser : '') . \ (g:syntastic_html_validator_nsfilter !=# '' ? ' -F nsfilter=' . g:syntastic_html_validator_nsfilter : '') . diff --git a/sources_non_forked/syntastic/syntax_checkers/html/w3.vim b/sources_non_forked/syntastic/syntax_checkers/html/w3.vim index 37ff11a3..8701f99a 100644 --- a/sources_non_forked/syntastic/syntax_checkers/html/w3.vim +++ b/sources_non_forked/syntastic/syntax_checkers/html/w3.vim @@ -23,8 +23,9 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_html_w3_GetLocList() dict + let buf = bufnr('') let makeprg = self.getExecEscaped() . ' -q -L -s -F output=json ' . - \ '-F uploaded_file=@' . syntastic#util#shexpand('%:p') . '\;type=text/html ' . + \ '-F uploaded_file=@' . syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) . '\;type=text/html ' . \ g:syntastic_html_w3_api let errorformat = diff --git a/sources_non_forked/syntastic/syntax_checkers/java/checkstyle.vim b/sources_non_forked/syntastic/syntax_checkers/java/checkstyle.vim index f4eee5e8..53018320 100644 --- a/sources_non_forked/syntastic/syntax_checkers/java/checkstyle.vim +++ b/sources_non_forked/syntastic/syntax_checkers/java/checkstyle.vim @@ -40,6 +40,8 @@ endfunction function! SyntaxCheckers_java_checkstyle_GetLocList() dict + let buf = bufnr('') + " classpath if !exists('s:sep') let s:sep = syntastic#util#isRunningWindows() || has('win32unix') ? ';' : ':' @@ -58,7 +60,7 @@ function! SyntaxCheckers_java_checkstyle_GetLocList() dict \ '-f', 'xml' ]) " filename - let fname = syntastic#util#shescape( expand('%:p:h', 1) . syntastic#util#Slash() . expand('%:t', 1) ) + let fname = syntastic#util#shescape( fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash() . fnamemodify(bufname(buf), ':t') ) if has('win32unix') let fname = substitute(syntastic#util#system('cygpath -m ' . fname), '\m\%x00', '', 'g') endif diff --git a/sources_non_forked/syntastic/syntax_checkers/java/javac.vim b/sources_non_forked/syntastic/syntax_checkers/java/javac.vim index 948c2441..3b5b234c 100644 --- a/sources_non_forked/syntastic/syntax_checkers/java/javac.vim +++ b/sources_non_forked/syntastic/syntax_checkers/java/javac.vim @@ -223,7 +223,7 @@ endfunction " }}}2 function! s:SaveClasspath() " {{{2 " build classpath from lines let path = '' - let lines = getline(1, line('$')) + let lines = getline(1, '$') for l in lines let path = s:AddToClasspath(path, l) endfor @@ -281,7 +281,7 @@ endfunction " }}}2 function! s:SaveConfig() " {{{2 " get lines - let lines = getline(1, line('$')) + let lines = getline(1, '$') if g:syntastic_java_javac_config_file_enabled " save config file lines call writefile(lines, expand(g:syntastic_java_javac_config_file, 1)) diff --git a/sources_non_forked/syntastic/syntax_checkers/javascript/closurecompiler.vim b/sources_non_forked/syntastic/syntax_checkers/javascript/closurecompiler.vim index 8c4190ad..41c1346d 100644 --- a/sources_non_forked/syntastic/syntax_checkers/javascript/closurecompiler.vim +++ b/sources_non_forked/syntastic/syntax_checkers/javascript/closurecompiler.vim @@ -42,11 +42,12 @@ function! SyntaxCheckers_javascript_closurecompiler_GetLocList() dict call syntastic#log#deprecationWarn('javascript_closure_compiler_options', 'javascript_closurecompiler_args') call syntastic#log#deprecationWarn('javascript_closure_compiler_file_list', 'javascript_closurecompiler_file_list') - let flist = expand(get(g:, 'syntastic_javascript_closurecompiler_file_list', ''), 1) + let buf = bufnr('') + let flist = expand(syntastic#util#bufVar(buf, 'javascript_closurecompiler_file_list'), 1) if filereadable(flist) let file_list = map( readfile(flist), 'expand(v:var, 1)' ) else - let file_list = [expand('%', 1)] + let file_list = [bufname(buf)] endif let makeprg = self.makeprgBuild({ diff --git a/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim b/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim index 456db2b2..5bed76f2 100644 --- a/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim +++ b/sources_non_forked/syntastic/syntax_checkers/javascript/flow.vim @@ -29,7 +29,8 @@ function! SyntaxCheckers_javascript_flow_IsAvailable() dict endfunction function! SyntaxCheckers_javascript_flow_GetLocList() dict - if syntastic#util#findFileInParent('.flowconfig', expand('%:p:h', 1)) ==# '' + let buf = bufnr('') + if syntastic#util#findFileInParent('.flowconfig', fnamemodify(bufname(buf), ':p:h')) ==# '' return [] endif diff --git a/sources_non_forked/syntastic/syntax_checkers/limbo/limbo.vim b/sources_non_forked/syntastic/syntax_checkers/limbo/limbo.vim index 0dfe03cd..0c639f95 100644 --- a/sources_non_forked/syntastic/syntax_checkers/limbo/limbo.vim +++ b/sources_non_forked/syntastic/syntax_checkers/limbo/limbo.vim @@ -19,6 +19,7 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_limbo_limbo_GetLocList() dict + let buf = bufnr('') let include = $INFERNO_HOME !=# '' ? '-I$INFERNO_HOME ' : '' " don't generate .dis in current dir while checking syntax, " .dis should be generated by `mk` @@ -27,7 +28,7 @@ function! SyntaxCheckers_limbo_limbo_GetLocList() dict let makeprg = self.makeprgBuild({ 'args_before': include . '-w' . output }) let errorformat = '%E%f:%l:%m' - if expand('%', 1) =~# '\m\.m$' + if bufname(buf) =~# '\m\.m$' let errorformat = '%-G%f:%l: near ` EOF ` : no implementation module,' . errorformat endif diff --git a/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim b/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim index 7ea86d1a..9797d847 100644 --- a/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim +++ b/sources_non_forked/syntastic/syntax_checkers/nasm/nasm.vim @@ -19,9 +19,10 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_nasm_nasm_GetLocList() dict + let buf = bufnr('') let makeprg = self.makeprgBuild({ \ 'args_after': '-X gnu' . - \ ' -I ' . syntastic#util#shescape(expand('%:p:h', 1) . syntastic#util#Slash()) . + \ ' -I ' . syntastic#util#shescape(fnamemodify(bufname(buf), ':p:h') . syntastic#util#Slash()) . \ ' ' . syntastic#c#NullOutput() }) let errorformat = '%f:%l: %t%*[^:]: %m' diff --git a/sources_non_forked/syntastic/syntax_checkers/ocaml/camlp4o.vim b/sources_non_forked/syntastic/syntax_checkers/ocaml/camlp4o.vim index f7f34e71..0a1c4213 100644 --- a/sources_non_forked/syntastic/syntax_checkers/ocaml/camlp4o.vim +++ b/sources_non_forked/syntastic/syntax_checkers/ocaml/camlp4o.vim @@ -44,7 +44,8 @@ function! SyntaxCheckers_ocaml_camlp4o_IsAvailable() dict " {{{1 endfunction " }}}1 function! SyntaxCheckers_ocaml_camlp4o_GetLocList() dict " {{{1 - let makeprg = s:GetMakeprg() + let buf = bufnr('') + let makeprg = s:GetMakeprg(buf) if makeprg ==# '' return [] endif @@ -65,7 +66,7 @@ function! SyntaxCheckers_ocaml_camlp4o_GetLocList() dict " {{{1 let loclist = SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, - \ 'defaults': {'bufnr': bufnr('')} }) + \ 'defaults': {'bufnr': buf} }) for e in loclist if get(e, 'col', 0) && get(e, 'nr', 0) @@ -79,40 +80,41 @@ endfunction " }}}1 " Utilities {{{1 -function! s:GetMakeprg() " {{{2 +function! s:GetMakeprg(buf) " {{{2 return \ g:syntastic_ocaml_use_ocamlc ? g:syntastic_ocaml_use_ocamlc : - \ (g:syntastic_ocaml_use_ocamlbuild && isdirectory('_build')) ? s:GetOcamlcMakeprg() : - \ s:GetOtherMakeprg() + \ (g:syntastic_ocaml_use_ocamlbuild && isdirectory('_build')) ? s:GetOcamlcMakeprg(a:buf) : + \ s:GetOtherMakeprg(a:buf) endfunction " }}}2 -function! s:GetOcamlcMakeprg() " {{{2 +function! s:GetOcamlcMakeprg(buf) " {{{2 let build_cmd = g:syntastic_ocaml_use_janestreet_core ? \ 'ocamlc -I ' . syntastic#util#shexpand(g:syntastic_ocaml_janestreet_core_dir) : 'ocamlc' - let build_cmd .= ' -c ' . syntastic#util#shexpand('%') + let build_cmd .= ' -c ' . syntastic#util#shescape(bufname(a:buf)) return build_cmd endfunction " }}}2 -function! s:GetOcamlBuildMakeprg() " {{{2 +function! s:GetOcamlBuildMakeprg(buf) " {{{2 return 'ocamlbuild -quiet -no-log -tag annot,' . s:ocamlpp . ' -no-links -no-hygiene -no-sanitize ' . - \ syntastic#util#shexpand('%:r') . '.cmi' + \ syntastic#util#shexpand(fnamemodify(bufname(a:buf), ':r')) . '.cmi' endfunction " }}}2 -function! s:GetOtherMakeprg() " {{{2 +function! s:GetOtherMakeprg(buf) " {{{2 "TODO: give this function a better name? " "TODO: should use throw/catch instead of returning an empty makeprg - let extension = expand('%:e', 1) + let fname = bufname(a:buf) + let extension = fnamemodify(fname, ':e') let makeprg = '' if stridx(extension, 'mly') >= 0 && executable('menhir') " ocamlyacc output can't be redirected, so use menhir - let makeprg = 'menhir --only-preprocess ' . syntastic#util#shexpand('%') . ' >' . syntastic#util#DevNull() + let makeprg = 'menhir --only-preprocess ' . syntastic#util#shescape(fname) . ' >' . syntastic#util#DevNull() elseif stridx(extension,'mll') >= 0 && executable('ocamllex') - let makeprg = 'ocamllex -q ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shexpand('%') + let makeprg = 'ocamllex -q ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shescape(fname) else - let makeprg = 'camlp4o ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shexpand('%') + let makeprg = 'camlp4o ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shescape(fname) endif return makeprg diff --git a/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim b/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim index ca3d0d76..c21de2c6 100644 --- a/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim +++ b/sources_non_forked/syntastic/syntax_checkers/perl/perl.vim @@ -51,13 +51,14 @@ function! SyntaxCheckers_perl_perl_IsAvailable() dict " {{{1 endfunction " }}}1 function! SyntaxCheckers_perl_perl_GetLocList() dict " {{{1 + let buf = bufnr('') if type(g:syntastic_perl_lib_path) == type('') call syntastic#log#oneTimeWarn('variable g:syntastic_perl_lib_path should be a list') let includes = split(g:syntastic_perl_lib_path, ',') else - let includes = copy(syntastic#util#var('perl_lib_path', [])) + let includes = copy(syntastic#util#bufVar(buf, 'perl_lib_path', [])) endif - let shebang = syntastic#util#parseShebang() + let shebang = syntastic#util#parseShebang(buf) let extra = map(includes, '"-I" . v:val') + \ (index(shebang['args'], '-T') >= 0 ? ['-T'] : []) + \ (index(shebang['args'], '-t') >= 0 ? ['-t'] : []) diff --git a/sources_non_forked/syntastic/syntax_checkers/r/lint.vim b/sources_non_forked/syntastic/syntax_checkers/r/lint.vim index 854c1709..0e4f0441 100644 --- a/sources_non_forked/syntastic/syntax_checkers/r/lint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/r/lint.vim @@ -43,11 +43,13 @@ function! SyntaxCheckers_r_lint_IsAvailable() dict endfunction function! SyntaxCheckers_r_lint_GetLocList() dict + let buf = bufnr('') + let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' . \ ' -e ' . syntastic#util#shescape(setwd . 'library(lint); ' . \ 'try(lint(commandArgs(TRUE), ' . g:syntastic_r_lint_styles . '))') . - \ ' --args ' . syntastic#util#shexpand('%') + \ ' --args ' . syntastic#util#shescape(bufname(buf)) let errorformat = \ '%t:%f:%l:%v: %m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim b/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim index 7c71ec07..19068c9c 100644 --- a/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim +++ b/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim @@ -38,7 +38,7 @@ set cpo&vim function! SyntaxCheckers_r_lintr_GetHighlightRegex(item) let term = matchstr(a:item['text'], "\\m'\\zs[^']\\+\\ze'") - return term != '' ? '\V' . escape(term, '\') : '' + return term !=# '' ? '\V' . escape(term, '\') : '' endfunction function! SyntaxCheckers_r_lintr_IsAvailable() dict @@ -50,11 +50,13 @@ function! SyntaxCheckers_r_lintr_IsAvailable() dict endfunction function! SyntaxCheckers_r_lintr_GetLocList() dict + let buf = bufnr('') + let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' let makeprg = self.getExecEscaped() . ' --slave --no-restore --no-save' . \ ' -e ' . syntastic#util#shescape(setwd . 'suppressPackageStartupMessages(library(lintr)); ' . \ 'lint(cache = ' . g:syntastic_r_lintr_cache . ', commandArgs(TRUE), ' . g:syntastic_r_lintr_linters . ')') . - \ ' --args ' . syntastic#util#shexpand('%') + \ ' --args ' . syntastic#util#shescape(bufname(buf)) let errorformat = \ '%W%f:%l:%c: style: %m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/r/svtools.vim b/sources_non_forked/syntastic/syntax_checkers/r/svtools.vim index d2a6a748..eb85f8aa 100644 --- a/sources_non_forked/syntastic/syntax_checkers/r/svtools.vim +++ b/sources_non_forked/syntastic/syntax_checkers/r/svtools.vim @@ -46,11 +46,13 @@ function! SyntaxCheckers_r_svtools_IsAvailable() dict endfunction function! SyntaxCheckers_r_svtools_GetLocList() dict + let buf = bufnr('') + let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' . \ ' -e ' . syntastic#util#shescape(setwd . 'library(svTools); ' . \ 'try(lint(commandArgs(TRUE), filename = commandArgs(TRUE), type = "flat", sep = ":"))') . - \ ' --args ' . syntastic#util#shexpand('%') + \ ' --args ' . syntastic#util#shescape(bufname(buf)) let errorformat = \ '%trror:%f:%\s%#%l:%\s%#%v:%m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/rst/sphinx.vim b/sources_non_forked/syntastic/syntax_checkers/rst/sphinx.vim index 3c211f4a..1ef058b3 100644 --- a/sources_non_forked/syntastic/syntax_checkers/rst/sphinx.vim +++ b/sources_non_forked/syntastic/syntax_checkers/rst/sphinx.vim @@ -26,11 +26,12 @@ augroup syntastic augroup END function! SyntaxCheckers_rst_sphinx_GetLocList() dict + let buf = bufnr('') - let srcdir = syntastic#util#var('rst_sphinx_source_dir') - call self.log('g:syntastic_rst_sphinx_source_dir =', srcdir) + let srcdir = syntastic#util#bufVar(buf, 'rst_sphinx_source_dir') + call self.log('syntastic_rst_sphinx_source_dir =', srcdir) if srcdir ==# '' - let config = syntastic#util#findFileInParent('conf.py', expand('%:p:h', 1)) + let config = syntastic#util#findFileInParent('conf.py', fnamemodify(bufname(buf), ':p:h')) if config ==# '' || !filereadable(config) call self.log('conf.py file not found') return [] @@ -38,10 +39,10 @@ function! SyntaxCheckers_rst_sphinx_GetLocList() dict let srcdir = fnamemodify(config, ':p:h') endif - let confdir = syntastic#util#var('rst_sphinx_config_dir') - call self.log('g:syntastic_rst_sphinx_config_dir =', confdir) + let confdir = syntastic#util#bufVar(buf, 'rst_sphinx_config_dir') + call self.log('syntastic_rst_sphinx_config_dir =', confdir) if confdir ==# '' - let config = syntastic#util#findFileInParent('conf.py', expand('%:p:h', 1)) + let config = syntastic#util#findFileInParent('conf.py', fnamemodify(bufname(buf), ':p:h')) let confdir = (config !=# '' && filereadable(config)) ? fnamemodify(config, ':p:h') : srcdir endif diff --git a/sources_non_forked/syntastic/syntax_checkers/sass/sass.vim b/sources_non_forked/syntastic/syntax_checkers/sass/sass.vim index 5f6194f2..f4dd2f6c 100644 --- a/sources_non_forked/syntastic/syntax_checkers/sass/sass.vim +++ b/sources_non_forked/syntastic/syntax_checkers/sass/sass.vim @@ -15,8 +15,8 @@ if exists('g:loaded_syntastic_sass_sass_checker') endif let g:loaded_syntastic_sass_sass_checker = 1 -"sass caching for large files drastically speeds up the checking, but store it -"in a temp location otherwise sass puts .sass_cache dirs in the users project +" sass caching for large files drastically speeds up the checking, but store it +" in a temp location otherwise sass puts .sass_cache dirs in the users project let s:sass_cache_location = syntastic#util#tmpdir() lockvar s:sass_cache_location @@ -24,12 +24,12 @@ augroup syntastic autocmd VimLeave * call syntastic#util#rmrf(s:sass_cache_location) augroup END -"By default do not check partials as unknown variables are a syntax error +" By default do not check partials as unknown variables are a syntax error if !exists('g:syntastic_sass_check_partials') let g:syntastic_sass_check_partials = 0 endif -"use compass imports if available +" use compass imports if available let s:imports = '' if executable('compass') let s:imports = '--compass' @@ -39,7 +39,8 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_sass_sass_GetLocList() dict - if !g:syntastic_sass_check_partials && expand('%:t', 1)[0] ==# '_' + let buf = bufnr('') + if !syntastic#util#bufVar(buf, 'sass_check_partials') && fnamemodify(bufname(buf), ':t')[0] ==# '_' return [] endif diff --git a/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim b/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim index 0398e7ac..811443dd 100644 --- a/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim +++ b/sources_non_forked/syntastic/syntax_checkers/scala/fsc.vim @@ -24,9 +24,10 @@ function! SyntaxCheckers_scala_fsc_GetLocList() dict " fsc has some serious problems with the " working directory changing after being started " that's why we better pass an absolute path + let buf = bufnr('') let makeprg = self.makeprgBuild({ \ 'args': '-Ystop-after:parser', - \ 'fname': syntastic#util#shexpand('%:p') }) + \ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) }) let errorformat = \ '%E%f:%l: %trror: %m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/sh/sh.vim b/sources_non_forked/syntastic/syntax_checkers/sh/sh.vim index 395b81b3..007eec4c 100644 --- a/sources_non_forked/syntastic/syntax_checkers/sh/sh.vim +++ b/sources_non_forked/syntastic/syntax_checkers/sh/sh.vim @@ -19,21 +19,23 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_sh_sh_IsAvailable() dict " {{{1 - call self.log('shell =', s:GetShell()) - return s:IsShellValid() + let buf = bufnr('') + call self.log('shell =', s:GetShell(buf)) + return s:IsShellValid(buf) endfunction " }}}1 function! SyntaxCheckers_sh_sh_GetLocList() dict " {{{1 - if s:GetShell() ==# 'zsh' + let buf = bufnr('') + if s:GetShell(buf) ==# 'zsh' return s:ForwardToZshChecker() endif - if !s:IsShellValid() + if !s:IsShellValid(buf) return [] endif let makeprg = self.makeprgBuild({ - \ 'exe': s:GetShell(), + \ 'exe': s:GetShell(buf), \ 'args_after': '-n' }) let errorformat = '%f: line %l: %m' @@ -45,29 +47,29 @@ endfunction " }}}1 " Utilities {{{1 -function! s:GetShell() " {{{2 - if !exists('b:shell') || b:shell ==# '' - let b:shell = '' - let shebang = syntastic#util#parseShebang()['exe'] +function! s:GetShell(buf) " {{{2 + let shell = syntastic#util#getbufvar(a:buf, 'shell') + if shell ==# '' + let shebang = syntastic#util#parseShebang(a:buf)['exe'] if shebang !=# '' if shebang[-strlen('bash'):-1] ==# 'bash' - let b:shell = 'bash' + let shell = 'bash' elseif shebang[-strlen('zsh'):-1] ==# 'zsh' - let b:shell = 'zsh' + let shell = 'zsh' elseif shebang[-strlen('sh'):-1] ==# 'sh' - let b:shell = 'sh' + let shell = 'sh' endif endif " try to use env variable in case no shebang could be found - if b:shell ==# '' - let b:shell = fnamemodify($SHELL, ':t') + if shell ==# '' + let shell = fnamemodify($SHELL, ':t') endif endif - return b:shell + return shell endfunction " }}}2 -function! s:IsShellValid() " {{{2 - let shell = s:GetShell() +function! s:IsShellValid(buf) " {{{2 + let shell = s:GetShell(a:buf) return shell !=# '' && executable(shell) endfunction " }}}2 diff --git a/sources_non_forked/syntastic/syntax_checkers/sh/shellcheck.vim b/sources_non_forked/syntastic/syntax_checkers/sh/shellcheck.vim index 5189e199..cf86c7e3 100644 --- a/sources_non_forked/syntastic/syntax_checkers/sh/shellcheck.vim +++ b/sources_non_forked/syntastic/syntax_checkers/sh/shellcheck.vim @@ -12,8 +12,9 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_sh_shellcheck_GetLocList() dict " {{{1 + let buf = bufnr('') let makeprg = self.makeprgBuild({ - \ 'args': s:GetShell(), + \ 'args': s:GetShell(buf), \ 'args_after': '-f gcc' }) let errorformat = @@ -38,15 +39,15 @@ endfunction " }}}1 " Utilities {{{1 -function! s:GetShell() " {{{2 +function! s:GetShell(buf) " {{{2 let sh = '' - if syntastic#util#parseShebang()['exe'] ==# '' - if syntastic#util#rawVar('is_kornshell', 0) || syntastic#util#rawVar('is_posix', 0) + if syntastic#util#parseShebang(a:buf)['exe'] ==# '' + if syntastic#util#bufRawVar(a:buf, 'is_kornshell', 0) || syntastic#util#bufRawVar(a:buf, 'is_posix', 0) let sh = 'ksh' - elseif syntastic#util#rawVar('is_bash', 0) + elseif syntastic#util#bufRawVar(a:buf, 'is_bash', 0) let sh = 'bash' - elseif syntastic#util#rawVar('is_sh', 0) + elseif syntastic#util#bufRawVar(a:buf, 'is_sh', 0) let sh = 'sh' endif endif diff --git a/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim b/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim index 8b11d456..6c3fef70 100644 --- a/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim +++ b/sources_non_forked/syntastic/syntax_checkers/vala/valac.vim @@ -44,19 +44,17 @@ endfunction " }}}1 " Utilities {{{1 function! s:GetValaOpts(buf, name, comment, cmd) " {{{2 - let var = syntastic#util#var('vala_' . a:name) + let var = syntastic#util#bufVar(a:buf, 'vala_' . a:name) if type(var) == type([]) let opts = map(copy(var), 'syntastic#util#shescape(v:val)') elseif type(var) == type('') if var !=# '' - let opts = split(var, '\s\+') + let opts = split(var, '\m\s\+') else let opts = [] for line in filter(getbufline(a:buf, 1, 100), 'v:val =~# ' . string('\m^//\s\+' . a:comment . ':\s*')) - call extend(opts, split( matchstr(line, '\m^//\s\+' . a:comment . ':\s*\zs.*'), '\s\+' )) + call extend(opts, split( matchstr(line, '\m^//\s\+' . a:comment . ':\s*\zs.*'), '\m\s\+' )) endfor - - call map( filter(opts, 'v:val !=# ""'), 'syntastic#util#shescape(v:val)' ) endif else call syntastic#log#error('syntastic_vala_' . a:name . ' must be either a list, or a string') diff --git a/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim b/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim index 19cab49e..210eeece 100644 --- a/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim @@ -44,6 +44,8 @@ function! SyntaxCheckers_vim_vimlint_IsAvailable() dict " {{{1 endfunction " }}}1 function! SyntaxCheckers_vim_vimlint_GetLocList() dict " {{{1 + let buf = bufnr('') + " EVL102: unused variable v " EVL103: unused argument v " EVL104: variable may not be initialized on some execution path: v @@ -67,17 +69,15 @@ function! SyntaxCheckers_vim_vimlint_GetLocList() dict " {{{1 \ 'EVL204': 3, \ 'EVL205': 3 } - if exists('g:syntastic_vimlint_options') || exists('b:syntastic_vimlint_options') - let opts = syntastic#util#var('vimlint_options') - if type(opts) == type({}) - let options = filter(copy(opts), 'v:key =~# "\\m^EVL"') - call extend(param, options, 'force') - endif + let opts = syntastic#util#bufVar(buf, 'vimlint_options') + if type(opts) == type({}) + let options = filter(copy(opts), 'v:key =~# "\\m^EVL"') + call extend(param, options, 'force') endif call self.log('options =', param) - return vimlint#vimlint(expand('%', 1), param) + return vimlint#vimlint(bufname(buf), param) endfunction " }}}1 " Utilities {{{1 diff --git a/sources_non_forked/syntastic/syntax_checkers/xquery/basex.vim b/sources_non_forked/syntastic/syntax_checkers/xquery/basex.vim index 640a1910..0d867ad3 100644 --- a/sources_non_forked/syntastic/syntax_checkers/xquery/basex.vim +++ b/sources_non_forked/syntastic/syntax_checkers/xquery/basex.vim @@ -18,10 +18,11 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_xquery_basex_GetLocList() dict + let buf = bufnr('') let makeprg = self.makeprgBuild({ \ 'args_after': '-z', \ 'fname_before': '-q', - \ 'fname': syntastic#util#shescape('inspect:module("' . escape(expand('%:p', 1), '"') . '")') }) + \ 'fname': syntastic#util#shescape('inspect:module("' . escape(fnamemodify(bufname(buf), ':p'), '"') . '")') }) let errorformat = \ '%f:%l:%c:%t:%n:%m,' . diff --git a/sources_non_forked/syntastic/syntax_checkers/yaml/yamlxs.vim b/sources_non_forked/syntastic/syntax_checkers/yaml/yamlxs.vim index ace118a4..55f8c64e 100644 --- a/sources_non_forked/syntastic/syntax_checkers/yaml/yamlxs.vim +++ b/sources_non_forked/syntastic/syntax_checkers/yaml/yamlxs.vim @@ -29,13 +29,14 @@ function! SyntaxCheckers_yaml_yamlxs_IsAvailable() dict " don't call executable() here, to allow things like " let g:syntastic_perl_interpreter='/usr/bin/env perl' - silent! call syntastic#util#system(self.getExecEscaped() . ' ' . s:Modules() . ' -e ' . syntastic#util#shescape('exit(0)')) + silent! call syntastic#util#system(self.getExecEscaped() . ' ' . s:Modules(bufnr('')) . ' -e ' . syntastic#util#shescape('exit(0)')) return v:shell_error == 0 endfunction function! SyntaxCheckers_yaml_yamlxs_GetLocList() dict + let buf = bufnr('') let makeprg = self.makeprgBuild({ - \ 'args_before': s:Modules() . ' -e ' . syntastic#util#shescape('YAML::XS::LoadFile($ARGV[0])') }) + \ 'args_before': s:Modules(buf) . ' -e ' . syntastic#util#shescape('YAML::XS::LoadFile($ARGV[0])') }) let errorformat = \ '%EYAML::XS::Load Error: The problem:,' . @@ -51,12 +52,13 @@ function! SyntaxCheckers_yaml_yamlxs_GetLocList() dict \ 'defaults': {'bufnr': bufnr('')} }) endfunction -function s:Modules() - if type(g:syntastic_perl_lib_path) == type('') - call syntastic#log#oneTimeWarn('variable g:syntastic_perl_lib_path should be a list') - let includes = split(g:syntastic_perl_lib_path, ',') +function s:Modules(buf) + let lib_path = syntastic#util#bufVar(a:buf, 'perl_lib_path') + if type(lib_path) == type('') + call syntastic#log#oneTimeWarn('variable syntastic_perl_lib_path should be a list') + let includes = split(lib_path, ',') else - let includes = copy(syntastic#util#var('perl_lib_path')) + let includes = copy(lib_path) endif return join(map(includes, '"-I" . v:val') + ['-MYAML::XS']) endfunction diff --git a/sources_non_forked/vim-coffee-script/Copying.md b/sources_non_forked/vim-coffee-script/Copying.md index a31ad2ff..9520fb91 100644 --- a/sources_non_forked/vim-coffee-script/Copying.md +++ b/sources_non_forked/vim-coffee-script/Copying.md @@ -1,3 +1,14 @@ +All files except: + +ftdetect/vim-literate-coffeescript.vim +indent/litcoffee.vim +syntax/litcoffee.vim +test/test.coffee.md +test/test.litcoffee +test/test.png + +Issued under WTFPL: + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 @@ -13,3 +24,31 @@ 0. You just DO WHAT THE FUCK YOU WANT TO. +These files issed under this license: + +ftdetect/vim-literate-coffeescript.vim +indent/litcoffee.vim +syntax/litcoffee.vim +test/test.coffee.md +test/test.litcoffee +test/test.png + +Copyright (c) 2013 Michael Smith + +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. diff --git a/sources_non_forked/vim-coffee-script/Readme.md b/sources_non_forked/vim-coffee-script/Readme.md index 08d61f1d..053a71b8 100644 --- a/sources_non_forked/vim-coffee-script/Readme.md +++ b/sources_non_forked/vim-coffee-script/Readme.md @@ -337,23 +337,15 @@ It behaves very similar to `:make`, described [above](#compile-to-javascript). ## Literate CoffeeScript -Literate CoffeeScript syntax and indent support is provided by -[vim-literate-coffeescript]. The `Coffee` commands detect when they're running -on a litcoffee file and pass the `--literate` flag to their respective tools, -but at this time the commands are not automatically loaded when a litcoffee file -is opened. +Literate CoffeeScript syntax and indent support is now built in! The `Coffee` +commands detect when they're running on a litcoffee file and pass the +`--literate` flag to their respective tools. -[vim-literate-coffeescript]: https://github.com/mintplant/vim-literate-coffeescript - -To load them, run - - runtime ftplugin/coffee.vim - -while inside a litcoffee buffer. To do this automatically, add - - autocmd FileType litcoffee runtime ftplugin/coffee.vim - -to your vimrc. +Literate CoffeeScript syntax and indent support was written by @mintplant +(Michael Smith). A standalone repo +[exists](https://github.com/jwhitley/vim-literate-coffeescript), but you'll +need to copy the `ftplugin/litcoffee.vim` file or set up an autocmd to get the +`Coffee` commands to be automatically loaded for litcoffee files. ## CoffeeScript in HTML diff --git a/sources_non_forked/vim-coffee-script/ftdetect/vim-literate-coffeescript.vim b/sources_non_forked/vim-coffee-script/ftdetect/vim-literate-coffeescript.vim new file mode 100644 index 00000000..7f666246 --- /dev/null +++ b/sources_non_forked/vim-coffee-script/ftdetect/vim-literate-coffeescript.vim @@ -0,0 +1,8 @@ +" Language: Literate CoffeeScript +" Maintainer: Michael Smith <michael@diglumi.com> +" URL: https://github.com/mintplant/vim-literate-coffeescript +" License: MIT + +autocmd BufNewFile,BufRead *.litcoffee set filetype=litcoffee +autocmd BufNewFile,BufRead *.coffee.md set filetype=litcoffee + diff --git a/sources_non_forked/vim-coffee-script/ftplugin/litcoffee.vim b/sources_non_forked/vim-coffee-script/ftplugin/litcoffee.vim new file mode 100644 index 00000000..febc730c --- /dev/null +++ b/sources_non_forked/vim-coffee-script/ftplugin/litcoffee.vim @@ -0,0 +1 @@ +runtime ftplugin/coffee.vim diff --git a/sources_non_forked/vim-coffee-script/indent/litcoffee.vim b/sources_non_forked/vim-coffee-script/indent/litcoffee.vim new file mode 100644 index 00000000..599cbea8 --- /dev/null +++ b/sources_non_forked/vim-coffee-script/indent/litcoffee.vim @@ -0,0 +1,22 @@ +if exists('b:did_indent') + finish +endif + +runtime! indent/coffee.vim + +let b:did_indent = 1 + +setlocal indentexpr=GetLitCoffeeIndent() + +if exists('*GetLitCoffeeIndent') + finish +endif + +function GetLitCoffeeIndent() + if searchpair('^ \|\t', '', '$', 'bWnm') > 0 + return GetCoffeeIndent(v:lnum) + else + return -1 + endif +endfunc + diff --git a/sources_non_forked/vim-coffee-script/syntax/coffee.vim b/sources_non_forked/vim-coffee-script/syntax/coffee.vim index 973bb547..88917fe7 100644 --- a/sources_non_forked/vim-coffee-script/syntax/coffee.vim +++ b/sources_non_forked/vim-coffee-script/syntax/coffee.vim @@ -32,7 +32,7 @@ hi def link coffeeConditional Conditional syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display hi def link coffeeException Exception -syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\)\>/ +syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\|await\)\>/ \ display " The `own` keyword is only a keyword after `for`. syn match coffeeKeyword /\<for\s\+own\>/ contained containedin=coffeeRepeat diff --git a/sources_non_forked/vim-coffee-script/syntax/litcoffee.vim b/sources_non_forked/vim-coffee-script/syntax/litcoffee.vim new file mode 100644 index 00000000..c6a4423c --- /dev/null +++ b/sources_non_forked/vim-coffee-script/syntax/litcoffee.vim @@ -0,0 +1,23 @@ +" Language: Literate CoffeeScript +" Maintainer: Michael Smith <michael@diglumi.com> +" URL: https://github.com/mintplant/vim-literate-coffeescript +" License: MIT + +if exists('b:current_syntax') && b:current_syntax == 'litcoffee' + finish +endif + +syn include @markdown syntax/markdown.vim +syn include @coffee syntax/coffee.vim + +" Partition the file into notCoffee and inlineCoffee. Each line will match +" exactly one of these regions. notCoffee matches with a zero-width +" look-behind. +syn region notCoffee start='^\%( \|\t\)\@<!' end='$' contains=@markdown +syn region inlineCoffee start='^ \|\t' end='$' contains=@coffee + +" We defined notCoffee as a region so we can highlight every element in it +" that doesn't have it's own explicit rule. +highlight default link notCoffee Comment + +let b:current_syntax = "litcoffee" diff --git a/sources_non_forked/vim-coffee-script/test/test.coffee.md b/sources_non_forked/vim-coffee-script/test/test.coffee.md new file mode 100644 index 00000000..62b99b7d --- /dev/null +++ b/sources_non_forked/vim-coffee-script/test/test.coffee.md @@ -0,0 +1,117 @@ +The **Scope** class regulates lexical scoping within CoffeeScript. As you +generate code, you create a tree of scopes in the same shape as the nested +function bodies. Each scope knows about the variables declared within it, +and has a reference to its parent enclosing scope. In this way, we know which +variables are new and need to be declared with `var`, and which are shared +with external scopes. + +Import the helpers we plan to use. + + {extend, last} = require './helpers' + + exports.Scope = class Scope + +The `root` is the top-level **Scope** object for a given file. + + @root: null + +Initialize a scope with its parent, for lookups up the chain, +as well as a reference to the **Block** node it belongs to, which is +where it should declare its variables, and a reference to the function that +it belongs to. + + constructor: (@parent, @expressions, @method) -> + @variables = [{name: 'arguments', type: 'arguments'}] + @positions = {} + Scope.root = this unless @parent + +Adds a new variable or overrides an existing one. + + add: (name, type, immediate) -> + return @parent.add name, type, immediate if @shared and not immediate + if Object::hasOwnProperty.call @positions, name + @variables[@positions[name]].type = type + else + @positions[name] = @variables.push({name, type}) - 1 + +When `super` is called, we need to find the name of the current method we're +in, so that we know how to invoke the same method of the parent class. This +can get complicated if super is being called from an inner function. +`namedMethod` will walk up the scope tree until it either finds the first +function object that has a name filled in, or bottoms out. + + namedMethod: -> + return @method if @method.name or !@parent + @parent.namedMethod() + +Look up a variable name in lexical scope, and declare it if it does not +already exist. + + find: (name) -> + return yes if @check name + @add name, 'var' + no + +Reserve a variable name as originating from a function parameter for this +scope. No `var` required for internal references. + + parameter: (name) -> + return if @shared and @parent.check name, yes + @add name, 'param' + +Just check to see if a variable has already been declared, without reserving, +walks up to the root scope. + + check: (name) -> + !!(@type(name) or @parent?.check(name)) + +Generate a temporary variable name at the given index. + + temporary: (name, index) -> + if name.length > 1 + '_' + name + if index > 1 then index - 1 else '' + else + '_' + (index + parseInt name, 36).toString(36).replace /\d/g, 'a' + +Gets the type of a variable. + + type: (name) -> + return v.type for v in @variables when v.name is name + null + +If we need to store an intermediate result, find an available name for a +compiler-generated variable. `_var`, `_var2`, and so on... + + freeVariable: (name, reserve=true) -> + index = 0 + index++ while @check((temp = @temporary name, index)) + @add temp, 'var', yes if reserve + temp + +Ensure that an assignment is made at the top of this scope +(or at the top-level scope, if requested). + + assign: (name, value) -> + @add name, {value, assigned: yes}, yes + @hasAssignments = yes + +Does this scope have any declared variables? + + hasDeclarations: -> + !!@declaredVariables().length + +Return the list of variables first declared in this scope. + + declaredVariables: -> + realVars = [] + tempVars = [] + for v in @variables when v.type is 'var' + (if v.name.charAt(0) is '_' then tempVars else realVars).push v.name + realVars.sort().concat tempVars.sort() + +Return the list of assignments that are supposed to be made at the top +of this scope. + + assignedVariables: -> + "#{v.name} = #{v.type.value}" for v in @variables when v.type.assigned + diff --git a/sources_non_forked/vim-coffee-script/test/test.litcoffee b/sources_non_forked/vim-coffee-script/test/test.litcoffee new file mode 100644 index 00000000..62b99b7d --- /dev/null +++ b/sources_non_forked/vim-coffee-script/test/test.litcoffee @@ -0,0 +1,117 @@ +The **Scope** class regulates lexical scoping within CoffeeScript. As you +generate code, you create a tree of scopes in the same shape as the nested +function bodies. Each scope knows about the variables declared within it, +and has a reference to its parent enclosing scope. In this way, we know which +variables are new and need to be declared with `var`, and which are shared +with external scopes. + +Import the helpers we plan to use. + + {extend, last} = require './helpers' + + exports.Scope = class Scope + +The `root` is the top-level **Scope** object for a given file. + + @root: null + +Initialize a scope with its parent, for lookups up the chain, +as well as a reference to the **Block** node it belongs to, which is +where it should declare its variables, and a reference to the function that +it belongs to. + + constructor: (@parent, @expressions, @method) -> + @variables = [{name: 'arguments', type: 'arguments'}] + @positions = {} + Scope.root = this unless @parent + +Adds a new variable or overrides an existing one. + + add: (name, type, immediate) -> + return @parent.add name, type, immediate if @shared and not immediate + if Object::hasOwnProperty.call @positions, name + @variables[@positions[name]].type = type + else + @positions[name] = @variables.push({name, type}) - 1 + +When `super` is called, we need to find the name of the current method we're +in, so that we know how to invoke the same method of the parent class. This +can get complicated if super is being called from an inner function. +`namedMethod` will walk up the scope tree until it either finds the first +function object that has a name filled in, or bottoms out. + + namedMethod: -> + return @method if @method.name or !@parent + @parent.namedMethod() + +Look up a variable name in lexical scope, and declare it if it does not +already exist. + + find: (name) -> + return yes if @check name + @add name, 'var' + no + +Reserve a variable name as originating from a function parameter for this +scope. No `var` required for internal references. + + parameter: (name) -> + return if @shared and @parent.check name, yes + @add name, 'param' + +Just check to see if a variable has already been declared, without reserving, +walks up to the root scope. + + check: (name) -> + !!(@type(name) or @parent?.check(name)) + +Generate a temporary variable name at the given index. + + temporary: (name, index) -> + if name.length > 1 + '_' + name + if index > 1 then index - 1 else '' + else + '_' + (index + parseInt name, 36).toString(36).replace /\d/g, 'a' + +Gets the type of a variable. + + type: (name) -> + return v.type for v in @variables when v.name is name + null + +If we need to store an intermediate result, find an available name for a +compiler-generated variable. `_var`, `_var2`, and so on... + + freeVariable: (name, reserve=true) -> + index = 0 + index++ while @check((temp = @temporary name, index)) + @add temp, 'var', yes if reserve + temp + +Ensure that an assignment is made at the top of this scope +(or at the top-level scope, if requested). + + assign: (name, value) -> + @add name, {value, assigned: yes}, yes + @hasAssignments = yes + +Does this scope have any declared variables? + + hasDeclarations: -> + !!@declaredVariables().length + +Return the list of variables first declared in this scope. + + declaredVariables: -> + realVars = [] + tempVars = [] + for v in @variables when v.type is 'var' + (if v.name.charAt(0) is '_' then tempVars else realVars).push v.name + realVars.sort().concat tempVars.sort() + +Return the list of assignments that are supposed to be made at the top +of this scope. + + assignedVariables: -> + "#{v.name} = #{v.type.value}" for v in @variables when v.type.assigned + diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index 1185ff15..66948f70 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -1060,13 +1060,14 @@ function! s:Commit(args, ...) abort else noautocmd silent execute '!'.command.' > '.outfile.' 2> '.errorfile endif + let error = v:shell_error finally execute cd.'`=dir`' endtry if !has('gui_running') redraw! endif - if !v:shell_error + if !error if filereadable(outfile) for line in readfile(outfile) echo line diff --git a/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md b/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md index 467b1287..e6b5f203 100644 --- a/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md +++ b/sources_non_forked/vim-go/.github/ISSUE_TEMPLATE.md @@ -4,10 +4,10 @@ Write here what's happening and what you're expecting instead of... ### Steps to reproduce: -Please create a reproducible case of your problem. If this step is +Please create a reproducible case of your problem. If this step is not provided, the issue will be **closed** -Re produce it with a minimal `vimrc` with all plugins disabled and +Re produce it with a minimal `vimrc` with all plugins disabled and only `vim-go` enabled: 1. @@ -20,7 +20,6 @@ Add here your current configuration and additional information that might be useful, such as: * `vimrc` you used to reproduce -* vim version: +* vim version: * vim-go version: -* go version: - +* go version: diff --git a/sources_non_forked/vim-go/.travis.yml b/sources_non_forked/vim-go/.travis.yml index a5ee1559..d05b23ea 100644 --- a/sources_non_forked/vim-go/.travis.yml +++ b/sources_non_forked/vim-go/.travis.yml @@ -19,4 +19,3 @@ install: | cd - script: ./scripts/test.sh - diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index b2f47f58..46662bc8 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -2,6 +2,7 @@ FEATURES: +* New `:GoAddTags` and `:GoRemoveTags` command based on the tool [gomodifytags](https://github.com/fatih/gomodifytags). This fixes many old bugs that were due prior regexp based implementation. For the usage please read the docs and checkout the demo at: https://github.com/fatih/vim-go/pull/1204 [gh-1204] * Add new `errl` snippet that expands to [gh-1185]: ``` @@ -14,6 +15,10 @@ IMPROVEMENTS: * Lowercase `<Leader>` in mappings examples for consisten documentation across the README [gh-1192] * All of files should be written in utf-8 if the file will be passed to external command. [gh-1184] +* `:GoAddTags` is now able to add options to existing tags with the syntax `:GoAddTags key,option`, i.e: `:GoAddTags json,omitempty` [gh-985] +* Document 'noshowmode' requirement for echo_go_info [gh-1197] +* Improve godoc view for vertical splits [gh-1195] +* Set GOPATH for both possible go guru execution paths (sync and async) [gh-1193] BUG FIXES: @@ -22,6 +27,15 @@ BUG FIXES: * Update statusline before and after `go#jobcontrol#Spawn` command is executed [gh-1176] * Correctly report the value of the 'g:go_guru_tags' variable [gh-1177] * Ensure no trailing `:` exist in GOPATH detection if initial GOPATH is not set [gh-1194] +* Fix `:GoAddTags` to allow modifying existing comments [gh-984] +* Fix `:GoAddTags` to work with nested structs [gh-990] +* Fix `:GoAddTags` adding tags twice for existing tags [gh-1064] +* Fix `:GoAddTags` not working for fiels of types `interface{}` [gh-1091] +* Fix `:GoAddTags` not working for fields with one line comments [gh-1181] +* Fix `:GoAddTags` not working if any field comment would contain `{}` [gh-1189] +* Respect go_fmt_options when running goimports [gh-1211] +* Set the filename in the location-list when there is an error with :GoFmt [gh-1199] + ## 1.11 - (January 9, 2017) @@ -80,7 +94,7 @@ FEATURES: you have at least Vim 8.0.0087. Backwards compatible with Vim 7.4.x. If you see any problems, please open an issue. -* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. +* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. * `:GoBuild`, `:GoTest`, `:GoTestCompile`, `:GoInstall` commands are now fully async. Async means it doesn't block your UI anymore. If the command finished it echoes the status. For a better experience use the statusline information @@ -95,7 +109,7 @@ FEATURES: `:GoMetaLinterAutoSaveToggle` (temporary) or add `let g:go_metalinter_autosave = 1` (persistent) to your virmc). -* All `guru` commands run asynchronously if Vim 8.0 is being used. Current +* All `guru` commands run asynchronously if Vim 8.0 is being used. Current Commands: * GoImplements * GoWhicherrs @@ -111,7 +125,7 @@ FEATURES: auto sameids mode. In this mode it constantly evaluates the identifier under the cursor whenever it's in hold position and then calls :GoSameIds. As a reminder, to enable auto info either call `:GoSameIdsAutoToggle`(temporary) - or add `let g:go_auto_sameids = 1` (persistent) to your vimrc. + or add `let g:go_auto_sameids = 1` (persistent) to your vimrc. * `:GoInfo` is now non blocking and works in async mode if `guru` is used in `g:go_info_mode`. This makes it useful especially for autoinfo mode. In this @@ -221,7 +235,7 @@ FEATURES: * The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Together with `:GoAddTags` it gives `vim-go` users flexible ways of populating a field tag. Checkout the demo to see it in action: https://twitter.com/fatih/status/754477622042689536 [gh-927] * New **`:GoSameIds`** command. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically (with `:GoSameIdsAutoToggle` or `g:go_auto_sameids`). Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [gh-936] * New **`:GoWhicherrs`** command. It shows all possible values of the selected error variable. [gh-948] -* Add new `errp` snippet to expand an `if err != nil { panic() }` clause [gh-926] +* Add new `errp` snippet to expand an `if err != nil { panic() }` clause [gh-926] * If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [gh-918] * Added new toggle commands to enable/disable feature that run for your automatic. For example if you have `let g:go_auto_type_info = 1` enabled, you @@ -371,4 +385,3 @@ BACKWARDS INCOMPATIBILITIES: ## Previous releases Previous changelogs can be found here: https://github.com/fatih/vim-go/releases - diff --git a/sources_non_forked/vim-go/LICENSE b/sources_non_forked/vim-go/LICENSE index fd538bde..d9493d4f 100644 --- a/sources_non_forked/vim-go/LICENSE +++ b/sources_non_forked/vim-go/LICENSE @@ -25,7 +25,7 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + This software includes some portions from Go. Go is used under the terms of the BSD like license. diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md index b5542fb5..9e881747 100644 --- a/sources_non_forked/vim-go/README.md +++ b/sources_non_forked/vim-go/README.md @@ -1,4 +1,4 @@ -# vim-go [![Build Status](http://img.shields.io/travis/fatih/vim-go.svg?style=flat-square)](https://travis-ci.org/fatih/vim-go) +# vim-go [![Build Status](http://img.shields.io/travis/fatih/vim-go.svg?style=flat-square)](https://travis-ci.org/fatih/vim-go) <p align="center"> <img style="float: right;" src="assets/vim-go.png" alt="Vim-go logo"/> @@ -235,9 +235,9 @@ let g:go_get_update = 0 ### Using with Neovim (beta) Note: Neovim currently is not a first class citizen for vim-go. You are free -to open bug, however I'm not using Neovim so it's hard for me to test it. -vim-go might not work well as good as in Vim. I'm happy to accept pull requests -or very detailed bug reports. If you're interested to improve the state of +to open bug, however I'm not using Neovim so it's hard for me to test it. +vim-go might not work well as good as in Vim. I'm happy to accept pull requests +or very detailed bug reports. If you're interested to improve the state of Neovim in vim-go you're always welcome! diff --git a/sources_non_forked/vim-go/autoload/ctrlp/decls.vim b/sources_non_forked/vim-go/autoload/ctrlp/decls.vim index e1465adb..e7426762 100644 --- a/sources_non_forked/vim-go/autoload/ctrlp/decls.vim +++ b/sources_non_forked/vim-go/autoload/ctrlp/decls.vim @@ -39,7 +39,7 @@ function! ctrlp#decls#accept(mode, str) abort let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|') " i.e: main.go - let filename = vals[1] + let filename = vals[1] let line = vals[2] let col = vals[3] @@ -119,7 +119,7 @@ function! ctrlp#decls#enter() abort let space .= " " endfor - call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s", + call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s", \ decl.ident . space, \ decl.keyword, \ fnamemodify(decl.filename, ":t"), @@ -135,7 +135,7 @@ function! s:enable_syntax() abort return endif - syntax match CtrlPIdent '\zs\h\+\ze\s' + syntax match CtrlPIdent '\zs\h\+\ze\s' syntax match CtrlPKeyword '\zs[^\t|]\+\ze|[^|]\+:\d\+:\d\+|' syntax match CtrlPFilename '|\zs[^|]\+:\d\+:\d\+\ze|' syntax match CtrlPSignature '\zs\t.*\ze$' contains=CtrlPKeyWord,CtrlPFilename diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index fbc62823..badca313 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -373,7 +373,7 @@ function! go#cmd#Generate(bang, ...) abort let errors = go#list#Get(l:listtype) call go#list#Window(l:listtype, len(errors)) - if !empty(errors) + if !empty(errors) if !a:bang call go#list#JumpToFirst(l:listtype) endif diff --git a/sources_non_forked/vim-go/autoload/go/complete.vim b/sources_non_forked/vim-go/autoload/go/complete.vim index 2bd4eae7..a5d0ec10 100644 --- a/sources_non_forked/vim-go/autoload/go/complete.vim +++ b/sources_non_forked/vim-go/autoload/go/complete.vim @@ -27,11 +27,11 @@ function! s:gocodeCommand(cmd, preargs, args) abort let $GOROOT = go#util#env("goroot") let socket_type = get(g:, 'go_gocode_socket_type', s:sock_type) - let cmd = printf('%s -sock %s %s %s %s', - \ go#util#Shellescape(bin_path), - \ socket_type, - \ join(a:preargs), - \ go#util#Shellescape(a:cmd), + let cmd = printf('%s -sock %s %s %s %s', + \ go#util#Shellescape(bin_path), + \ socket_type, + \ join(a:preargs), + \ go#util#Shellescape(a:cmd), \ join(a:args) \ ) @@ -55,7 +55,7 @@ endfunction let s:optionsEnabled = 0 function! s:gocodeEnableOptions() abort - if s:optionsEnabled + if s:optionsEnabled return endif diff --git a/sources_non_forked/vim-go/autoload/go/coverage.vim b/sources_non_forked/vim-go/autoload/go/coverage.vim index 56113b93..493d4205 100644 --- a/sources_non_forked/vim-go/autoload/go/coverage.vim +++ b/sources_non_forked/vim-go/autoload/go/coverage.vim @@ -34,7 +34,7 @@ function! go#coverage#Buffer(bang, ...) abort try execute cd . fnameescape(expand("%:p:h")) if empty(glob("*_test.go")) - call go#util#EchoError("no tests files available") + call go#util#EchoError("no test files available") return endif finally @@ -89,8 +89,8 @@ function! go#coverage#Clear() abort if exists("s:toggle") | let s:toggle = 0 | endif - " remove the autocmd we defined - if exists("#BufWinLeave#<buffer>") + " remove the autocmd we defined + if exists("#BufWinLeave#<buffer>") autocmd! BufWinLeave <buffer> endif endfunction @@ -160,8 +160,8 @@ function! go#coverage#genmatch(cov) abort " example: foo.go:92.2,92.65 1 0 if a:cov.startline == a:cov.endline call add(matches, { - \ 'group': color, - \ 'pos': [[a:cov.startline, a:cov.startcol, a:cov.endcol - a:cov.startcol]], + \ 'group': color, + \ 'pos': [[a:cov.startline, a:cov.startcol, a:cov.endcol - a:cov.startcol]], \ 'priority': 2, \ }) return matches @@ -171,8 +171,8 @@ function! go#coverage#genmatch(cov) abort " the line, we assume it is at maximum 200 bytes. I know this is hacky, " but that's only way of fixing the issue call add(matches, { - \ 'group': color, - \ 'pos': [[a:cov.startline, a:cov.startcol, 200]], + \ 'group': color, + \ 'pos': [[a:cov.startline, a:cov.startcol, 200]], \ 'priority': 2, \ }) @@ -181,16 +181,16 @@ function! go#coverage#genmatch(cov) abort while start_line < a:cov.endline let start_line += 1 call add(matches, { - \ 'group': color, - \ 'pos': [[start_line]], + \ 'group': color, + \ 'pos': [[start_line]], \ 'priority': 2, \ }) endwhile " finally end columns call add(matches, { - \ 'group': color, - \ 'pos': [[a:cov.endline, a:cov.endcol-1]], + \ 'group': color, + \ 'pos': [[a:cov.endline, a:cov.endcol-1]], \ 'priority': 2, \ }) diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim index cf7c5c4a..a3d5f84a 100644 --- a/sources_non_forked/vim-go/autoload/go/def.vim +++ b/sources_non_forked/vim-go/autoload/go/def.vim @@ -209,7 +209,7 @@ function! go#def#StackUI() abort let prefix = " " endif - call add(stackOut, printf("%s %d %s|%d col %d|%s", + call add(stackOut, printf("%s %d %s|%d col %d|%s", \ prefix, i+1, entry["file"], entry["line"], entry["col"], entry["ident"])) let i += 1 endwhile diff --git a/sources_non_forked/vim-go/autoload/go/doc.vim b/sources_non_forked/vim-go/autoload/go/doc.vim index 22ea8cc7..4ad28d82 100644 --- a/sources_non_forked/vim-go/autoload/go/doc.vim +++ b/sources_non_forked/vim-go/autoload/go/doc.vim @@ -32,10 +32,10 @@ function! go#doc#OpenBrowser(...) abort let import = out["import"] let name = out["name"] let decl = out["decl"] - + let godoc_url = "https://godoc.org/" . import if decl !~ "^package" - let godoc_url .= "#" . name + let godoc_url .= "#" . name endif echo godoc_url @@ -92,13 +92,20 @@ function! s:GodocView(newposition, position, content) abort execute bufwinnr(s:buf_nr) . 'wincmd w' endif - " cap buffer height to 20, but resize it for smaller contents - let max_height = 20 - let content_height = len(split(a:content, "\n")) - if content_height > max_height - exe 'resize ' . max_height + if a:position == "split" + " cap buffer height to 20, but resize it for smaller contents + let max_height = 20 + let content_height = len(split(a:content, "\n")) + if content_height > max_height + exe 'resize ' . max_height + else + exe 'resize ' . content_height + endif else - exe 'resize ' . content_height + " set a sane maximum width for vertical splits. In this case the minimum + " that fits the godoc for package http without extra linebreaks and line + " numbers on + exe 'vertical resize 84' endif setlocal filetype=godoc diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim index 8a327d3b..666421b2 100644 --- a/sources_non_forked/vim-go/autoload/go/fmt.vim +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim @@ -77,7 +77,7 @@ function! go#fmt#Format(withGoimport) abort if go#util#ShellError() == 0 call go#fmt#update_file(l:tmpname, expand('%')) elseif g:go_fmt_fail_silently == 0 - let errors = s:parse_errors(out) + let errors = s:parse_errors(expand('%'), out) call s:show_errors(errors) endif @@ -102,7 +102,7 @@ function! go#fmt#Format(withGoimport) abort endfunction " update_file updates the target file with the given formatted source -function! go#fmt#update_file(source, target) +function! go#fmt#update_file(source, target) " remove undo point caused via BufWritePre try | silent undojoin | catch | endtry @@ -133,8 +133,8 @@ endfunction " run runs the gofmt/goimport command for the given source file and returns " the the output of the executed command. Target is the real file to be -" formated. -function! go#fmt#run(bin_name, source, target) +" formated. +function! go#fmt#run(bin_name, source, target) let cmd = s:fmt_cmd(a:bin_name, a:source, a:target) if cmd[0] == "goimports" " change GOPATH too, so goimports can pick up the correct library @@ -168,10 +168,9 @@ function! s:fmt_cmd(bin_name, source, target) " start constructing the command let cmd = [bin_path] call add(cmd, "-w") + call extend(cmd, split(g:go_fmt_options, " ")) - if a:bin_name != "goimports" - call extend(cmd, split(g:go_fmt_options, " ")) - else + if a:bin_name == "goimports" " lazy check if goimports support `-srcdir`. We should eventually remove " this in the future if !exists('b:goimports_vendor_compatible') @@ -196,7 +195,7 @@ function! s:fmt_cmd(bin_name, source, target) endfunction " parse_errors parses the given errors and returns a list of parsed errors -function! s:parse_errors(content) abort +function! s:parse_errors(filename, content) abort let splitted = split(a:content, '\n') " list of errors to be put into location list @@ -205,6 +204,7 @@ function! s:parse_errors(content) abort let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') if !empty(tokens) call add(errors,{ + \"filename": a:filename, \"lnum": tokens[2], \"col": tokens[3], \"text": tokens[4], @@ -218,13 +218,13 @@ endfunction " show_errors opens a location list and shows the given errors. If the given " errors is empty, it closes the the location list function! s:show_errors(errors) abort - let l:listtype = "locationlist" + let l:listtype = "locationlist" if !empty(a:errors) call go#list#Populate(l:listtype, a:errors, 'Format') echohl Error | echomsg "Gofmt returned error" | echohl None endif - " this closes the window if there are no errors or it opens + " this closes the window if there are no errors or it opens " it if there is any call go#list#Window(l:listtype, len(a:errors)) endfunction diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim index 206ca87b..df31d1b3 100644 --- a/sources_non_forked/vim-go/autoload/go/guru.vim +++ b/sources_non_forked/vim-go/autoload/go/guru.vim @@ -25,7 +25,7 @@ function! s:guru_cmd(args) range abort endif "return with a warning if the binary doesn't exist - let bin_path = go#path#CheckBinPath("guru") + let bin_path = go#path#CheckBinPath("guru") if empty(bin_path) return {'err': "bin path not found"} endif @@ -41,7 +41,7 @@ function! s:guru_cmd(args) range abort endif " enable outputting in json format - if format == "json" + if format == "json" call add(cmd, "-json") endif @@ -120,8 +120,6 @@ function! s:sync_guru(args) abort endif endif - let old_gopath = $GOPATH - let $GOPATH = go#path#Detect() " run, forrest run!!! let command = join(result.cmd, " ") @@ -131,8 +129,6 @@ function! s:sync_guru(args) abort let out = go#util#System(command) endif - let $GOPATH = old_gopath - if has_key(a:args, 'custom_parse') call a:args.custom_parse(go#util#ShellError(), out) else @@ -217,11 +213,17 @@ endfunc " run_guru runs the given guru argument function! s:run_guru(args) abort + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() if go#util#has_job() - return s:async_guru(a:args) + let res = s:async_guru(a:args) + else + let res = s:sync_guru(a:args) endif - return s:sync_guru(a:args) + let $GOPATH = old_gopath + + return res endfunction " Show 'implements' relation for selected package @@ -270,7 +272,7 @@ endfunction function! go#guru#DescribeInfo() abort " json_encode() and friends are introduced with this patch (7.4.1304) " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ - " nvim: https://github.com/neovim/neovim/pull/4131 + " nvim: https://github.com/neovim/neovim/pull/4131 if !exists("*json_decode") call go#util#EchoError("requires 'json_decode'. Update your Vim/Neovim version.") return @@ -465,7 +467,7 @@ function! go#guru#SameIds() abort " json_encode() and friends are introduced with this patch (7.4.1304) " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ - " nvim: https://github.com/neovim/neovim/pull/4131 + " nvim: https://github.com/neovim/neovim/pull/4131 if !exists("*json_decode") call go#util#EchoError("GoSameIds requires 'json_decode'. Update your Vim/Neovim version.") return @@ -547,7 +549,7 @@ function! go#guru#ClearSameIds() abort endfunction function! go#guru#ToggleSameIds() abort - if len(getmatches()) != 0 + if len(getmatches()) != 0 call go#guru#ClearSameIds() else call go#guru#SameIds() diff --git a/sources_non_forked/vim-go/autoload/go/impl.vim b/sources_non_forked/vim-go/autoload/go/impl.vim index 139dba75..a4b696de 100644 --- a/sources_non_forked/vim-go/autoload/go/impl.vim +++ b/sources_non_forked/vim-go/autoload/go/impl.vim @@ -18,7 +18,7 @@ function! go#impl#Impl(...) abort return endif elseif a:0 == 1 - " we assume the user only passed the interface type, + " we assume the user only passed the interface type, " i.e: ':GoImpl io.Writer' let receiveType = expand("<cword>") let recv = printf("%s *%s", tolower(receiveType)[0], receiveType) @@ -44,7 +44,7 @@ function! go#impl#Impl(...) abort end let pos = getpos('.') - put ='' + put ='' put =result call setpos('.', pos) endfunction diff --git a/sources_non_forked/vim-go/autoload/go/lint.vim b/sources_non_forked/vim-go/autoload/go/lint.vim index c62f2520..84d8ba45 100644 --- a/sources_non_forked/vim-go/autoload/go/lint.vim +++ b/sources_non_forked/vim-go/autoload/go/lint.vim @@ -109,9 +109,9 @@ endfunction " Golint calls 'golint' on the current directory. Any warnings are populated in " the location list function! go#lint#Golint(...) abort - let bin_path = go#path#CheckBinPath(g:go_golint_bin) - if empty(bin_path) - return + let bin_path = go#path#CheckBinPath(g:go_golint_bin) + if empty(bin_path) + return endif if a:0 == 0 @@ -280,7 +280,7 @@ function s:lint_job(args) call go#statusline#Update(status_dir, status) let errors = go#list#Get(l:listtype) - if empty(errors) + if empty(errors) call go#list#Window(l:listtype, len(errors)) elseif has("patch-7.4.2200") if l:listtype == 'quickfix' diff --git a/sources_non_forked/vim-go/autoload/go/list.vim b/sources_non_forked/vim-go/autoload/go/list.vim index 56d6115d..dbd1e254 100644 --- a/sources_non_forked/vim-go/autoload/go/list.vim +++ b/sources_non_forked/vim-go/autoload/go/list.vim @@ -124,7 +124,7 @@ function! go#list#Type(listtype) abort if g:go_list_type == "locationlist" return "locationlist" elseif g:go_list_type == "quickfix" - return "quickfix" + return "quickfix" else return a:listtype endif diff --git a/sources_non_forked/vim-go/autoload/go/play.vim b/sources_non_forked/vim-go/autoload/go/play.vim index ac5bba42..4674d5b6 100644 --- a/sources_non_forked/vim-go/autoload/go/play.vim +++ b/sources_non_forked/vim-go/autoload/go/play.vim @@ -70,7 +70,7 @@ function! s:get_visual_selection() abort return join(lines, "\n") endfunction -" following two functions are from: https://github.com/mattn/gist-vim +" following two functions are from: https://github.com/mattn/gist-vim " thanks @mattn function! s:get_browser_command() abort let go_play_browser_command = get(g:, 'go_play_browser_command', '') diff --git a/sources_non_forked/vim-go/autoload/go/statusline.vim b/sources_non_forked/vim-go/autoload/go/statusline.vim index c832797c..ba63c6da 100644 --- a/sources_non_forked/vim-go/autoload/go/statusline.vim +++ b/sources_non_forked/vim-go/autoload/go/statusline.vim @@ -4,7 +4,7 @@ " s:statuses is a global reference to all statuses. It stores the statuses per " import paths (map[string]status), where each status is unique per its " type. Current status dict is in form: -" { +" { " 'desc' : 'Job description', " 'state' : 'Job state, such as success, failure, etc..', " 'type' : 'Job type, such as build, test, etc..' diff --git a/sources_non_forked/vim-go/autoload/go/tags.vim b/sources_non_forked/vim-go/autoload/go/tags.vim new file mode 100644 index 00000000..4ef7d282 --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/tags.vim @@ -0,0 +1,206 @@ +function! go#tags#Add(start, end, count, ...) abort + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + if &modified + " Write current unsaved buffer to a temp file and use the modified content + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + let fname = l:tmpname + endif + + let offset = 0 + if a:count == -1 + let offset = go#util#OffsetCursor() + endif + + let test_mode = 0 + call call("go#tags#run", [a:start, a:end, offset, "add", fname, test_mode] + a:000) + + " if exists, delete it as we don't need it anymore + if exists("l:tmpname") + call delete(l:tmpname) + endif +endfunction + +function! go#tags#Remove(start, end, count, ...) abort + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + if &modified + " Write current unsaved buffer to a temp file and use the modified content + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + let fname = l:tmpname + endif + + let offset = 0 + if a:count == -1 + let offset = go#util#OffsetCursor() + endif + + let test_mode = 0 + call call("go#tags#run", [a:start, a:end, offset, "remove", fname, test_mode] + a:000) + + " if exists, delete it as we don't need it anymore + if exists("l:tmpname") + call delete(l:tmpname) + endif +endfunction + +" run runs gomodifytag. This is an internal test so we can test it +function! go#tags#run(start, end, offset, mode, fname, test_mode, ...) abort + " do not split this into multiple lines, somehow tests fail in that case + let args = {'mode': a:mode,'start': a:start,'end': a:end,'offset': a:offset,'fname': a:fname,'cmd_args': a:000} + + let result = s:create_cmd(args) + if has_key(result, 'err') + call go#util#EchoError(result.err) + return -1 + endif + + let command = join(result.cmd, " ") + + call go#cmd#autowrite() + let out = go#util#System(command) + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + if a:test_mode + exe 'edit ' . a:fname + endif + + call s:write_out(out) + + if a:test_mode + exe 'write! ' . a:fname + endif +endfunc + + +" write_out writes back the given output to the current buffer +func s:write_out(out) abort + " not a json output + if a:out[0] !=# '{' + return + endif + + " nothing to do + if empty(a:out) || type(a:out) != type("") + return + endif + + let result = json_decode(a:out) + if type(result) != type({}) + call go#util#EchoError(printf("malformed output from gomodifytags: %s", a:out)) + return + endif + + let lines = result['lines'] + let start_line = result['start'] + let end_line = result['end'] + + let index = 0 + for line in range(start_line, end_line) + call setline(line, lines[index]) + let index += 1 + endfor +endfunc + + +" create_cmd returns a dict that contains the command to execute gomodifytags +func s:create_cmd(args) abort + if !exists("*json_decode") + return {'err': "requires 'json_decode'. Update your Vim/Neovim version."} + endif + + let bin_path = go#path#CheckBinPath('gomodifytags') + if empty(bin_path) + return {'err': "gomodifytags does not exist"} + endif + + let l:start = a:args.start + let l:end = a:args.end + let l:offset = a:args.offset + let l:mode = a:args.mode + let l:cmd_args = a:args.cmd_args + + " start constructing the command + let cmd = [bin_path] + call extend(cmd, ["-format", "json"]) + call extend(cmd, ["-file", a:args.fname]) + + if l:offset != 0 + call extend(cmd, ["-offset", l:offset]) + else + let range = printf("%d,%d", l:start, l:end) + call extend(cmd, ["-line", range]) + endif + + if l:mode == "add" + let l:tags = [] + let l:options = [] + + if !empty(l:cmd_args) + for item in l:cmd_args + let splitted = split(item, ",") + + " tag only + if len(splitted) == 1 + call add(l:tags, splitted[0]) + endif + + " options only + if len(splitted) == 2 + call add(l:tags, splitted[0]) + call add(l:options, printf("%s=%s", splitted[0], splitted[1])) + endif + endfor + endif + + " construct options + if !empty(l:options) + call extend(cmd, ["-add-options", join(l:options, ",")]) + else + " default value + if empty(l:tags) + let l:tags = ["json"] + endif + + " construct tags + call extend(cmd, ["-add-tags", join(l:tags, ",")]) + endif + elseif l:mode == "remove" + if empty(l:cmd_args) + call add(cmd, "-clear-tags") + else + let l:tags = [] + let l:options = [] + for item in l:cmd_args + let splitted = split(item, ",") + + " tag only + if len(splitted) == 1 + call add(l:tags, splitted[0]) + endif + + " options only + if len(splitted) == 2 + call add(l:options, printf("%s=%s", splitted[0], splitted[1])) + endif + endfor + + " construct tags + if !empty(l:tags) + call extend(cmd, ["-remove-tags", join(l:tags, ",")]) + endif + + " construct options + if !empty(l:options) + call extend(cmd, ["-remove-options", join(l:options, ",")]) + endif + endif + else + return {'err': printf("unknown mode: %s", l:mode)} + endif + + return {'cmd': cmd} +endfunc diff --git a/sources_non_forked/vim-go/autoload/go/tags_test.vim b/sources_non_forked/vim-go/autoload/go/tags_test.vim new file mode 100644 index 00000000..9d740c85 --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/tags_test.vim @@ -0,0 +1,28 @@ +func Test_add_tags() + let input_file = tempname() + call writefile(readfile("test-fixtures/tags/add_all_input.go"), input_file) + + let expected = join(readfile("test-fixtures/tags/add_all_golden.go"), "\n") + + " run for offset 40, which is inside the struct + call go#tags#run(0, 0, 40, "add", input_file, 1) + + let actual = join(readfile(input_file), "\n") + + call assert_equal(expected, actual) +endfunc + + +func Test_remove_tags() + let input_file = tempname() + call writefile(readfile("test-fixtures/tags/remove_all_input.go"), input_file) + + let expected = join(readfile("test-fixtures/tags/remove_all_golden.go"), "\n") + + " run for offset 40, which is inside the struct + call go#tags#run(0, 0, 40, "remove", input_file, 1) + + let actual = join(readfile(input_file), "\n") + + call assert_equal(expected, actual) +endfunc diff --git a/sources_non_forked/vim-go/autoload/go/textobj.vim b/sources_non_forked/vim-go/autoload/go/textobj.vim index da0bb7e2..21789dc4 100644 --- a/sources_non_forked/vim-go/autoload/go/textobj.vim +++ b/sources_non_forked/vim-go/autoload/go/textobj.vim @@ -67,7 +67,7 @@ function! go#textobj#Function(mode) abort normal! v call cursor(info.rbrace.line, info.rbrace.col) return - endif + endif " rest is inner mode, a:mode == 'i' diff --git a/sources_non_forked/vim-go/autoload/go/tool.vim b/sources_non_forked/vim-go/autoload/go/tool.vim index 7b7e1af2..99577f4e 100644 --- a/sources_non_forked/vim-go/autoload/go/tool.vim +++ b/sources_non_forked/vim-go/autoload/go/tool.vim @@ -164,7 +164,7 @@ function! go#tool#Exists(importpath) abort endfunction -" following two functions are from: https://github.com/mattn/gist-vim +" following two functions are from: https://github.com/mattn/gist-vim " thanks @mattn function! s:get_browser_command() abort let go_play_browser_command = get(g:, 'go_play_browser_command', '') diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim index 65cf2750..86d0726c 100644 --- a/sources_non_forked/vim-go/autoload/go/util.vim +++ b/sources_non_forked/vim-go/autoload/go/util.vim @@ -53,7 +53,7 @@ let s:env_cache = {} " env returns the go environment variable for the given key. Where key can be " GOARCH, GOOS, GOROOT, etc... It caches the result and returns the cached -" version. +" version. function! go#util#env(key) abort let l:key = tolower(a:key) if has_key(s:env_cache, l:key) diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 2d7a03b2..d37df28f 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -576,7 +576,7 @@ CTRL-t *:GoSameIdsToggle* :GoSameIdsToggle - Toggle between |:GoSameIds| and |:GoSameIdsClear|. + Toggle between |:GoSameIds| and |:GoSameIdsClear|. *:GoSameIdsAutoToggle* :GoSameIdsAutoToggle @@ -669,12 +669,13 @@ CTRL-t :GoImpl T io.ReadWriteCloser < *:GoAddTags* -:[range]GoAddTags [key] [key1] ... +:[range]GoAddTags [key],[option] [key1],[option] ... Adds field tags for the fields of a struct. If called inside a struct it automatically add field tags with the `json` key and the value automatically generated based on the field name. An error message is given - if it's called outside a struct definition. + if it's called outside a struct definition or if the file is not correctly + formatted. If [range] is given, only the selected fields will be changed. @@ -682,6 +683,37 @@ CTRL-t arguments. An example of adding `xml` and `db` would be: > :GoAddTags xml db +< + If [option] is passed it'll either add a new tag with an option or will + modify exising tags. An example of adding `omitempty` to all `json` fields + would be: +> + :GoAddTags json,omitempty +< + You can define a constant value instead of the default field based value. + For example the following command will add ``valid:"1"`` to all fields. +> + :GoAddTags valid=1 +< + *:GoRemoveTags* +:[range]GoRemoveTags [key],[option] [key1],[option1] ... + + Rmove field tags for the fields of a struct. If called inside a struct it + automatically remove all field tags. An error message is given if it's + called outside a struct definition or if the file is not correctly + formatted + + If [range] is given, only the selected fields will be changed. + + If [key] is given, it will only remove those keys. Example: +> + :GoRemoveTags json +< + If [option] is passed with a [key], it will only remove the options. + Example, this will only remove `omitempty` options from fields containing + `json`: +> + :GoRemoveTags json,omitempty < *:GoAutoTypeInfoToggle* :GoAutoTypeInfoToggle @@ -958,7 +990,7 @@ Shows the status of a job running asynchronously. Can be used to plug into the statusline. It works to show the status per package instead of per file. Assume you have three files open, all belonging to the same package, if the package build (`:GoBuild`) is successful, all statusline's will show -`success`, if you it fails all file's statusline will show `failed`. +`success`, if you it fails all file's statusline will show `failed`. To avoid always showing old status information, the status information is cleaned for each package after `60` seconds. This can be changed with the @@ -1488,6 +1520,8 @@ default it's enabled > let g:go_echo_go_info = 1 < +Please note that 'noshowmode' must be set for this feature to work correctly. + *'g:go_statusline_duration'* Specifices the duration of statusline information being showed per package. By diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim index d8bff665..6f108a67 100644 --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim @@ -14,14 +14,15 @@ command! -range=% GoChannelPeers call go#guru#ChannelPeers(<count>) command! -range=% GoReferrers call go#guru#Referrers(<count>) command! -nargs=? GoGuruTags call go#guru#Tags(<f-args>) - -command! -nargs=* -range GoAddTags call go#util#AddTags(<line1>, <line2>, <f-args>) - command! -range=0 GoSameIds call go#guru#SameIds() command! -range=0 GoSameIdsClear call go#guru#ClearSameIds() command! -range=0 GoSameIdsToggle call go#guru#ToggleSameIds() command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds() +" -- tags +command! -nargs=* -range GoAddTags call go#tags#Add(<line1>, <line2>, <count>, <f-args>) +command! -nargs=* -range GoRemoveTags call go#tags#Remove(<line1>, <line2>, <count>, <f-args>) + " -- tool command! -nargs=0 GoFiles echo go#tool#Files() command! -nargs=0 GoDeps echo go#tool#Deps() diff --git a/sources_non_forked/vim-go/ftplugin/go/tagbar.vim b/sources_non_forked/vim-go/ftplugin/go/tagbar.vim index efdc397b..2d22fd7c 100644 --- a/sources_non_forked/vim-go/ftplugin/go/tagbar.vim +++ b/sources_non_forked/vim-go/ftplugin/go/tagbar.vim @@ -15,9 +15,9 @@ endif function! s:SetTagbar() - let bin_path = go#path#CheckBinPath(g:go_gotags_bin) - if empty(bin_path) - return + let bin_path = go#path#CheckBinPath(g:go_gotags_bin) + if empty(bin_path) + return endif if !exists("g:tagbar_type_go") diff --git a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets index 4a5b87f8..9db78db1 100644 --- a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets +++ b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets @@ -175,7 +175,7 @@ if err != nil { ${0} endsnippet -# error test +# error test snippet errt "Error test fatal " !b if err != nil { t.Fatal(err) diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim index 26547310..8a381453 100644 --- a/sources_non_forked/vim-go/plugin/go.vim +++ b/sources_non_forked/vim-go/plugin/go.vim @@ -18,6 +18,7 @@ let s:packages = [ \ "github.com/jstemmer/gotags", \ "github.com/klauspost/asmfmt/cmd/asmfmt", \ "github.com/fatih/motion", + \ "github.com/fatih/gomodifytags", \ "github.com/zmb3/gogetdoc", \ "github.com/josharian/impl", \ ] diff --git a/sources_non_forked/vim-go/scripts/test.sh b/sources_non_forked/vim-go/scripts/test.sh index cda33504..b22fd7d7 100644 --- a/sources_non_forked/vim-go/scripts/test.sh +++ b/sources_non_forked/vim-go/scripts/test.sh @@ -4,6 +4,9 @@ set -e cd $(dirname $0) +# install dependencies +go get github.com/fatih/gomodifytags + # cleanup test.log if [ -f "test.log" ]; then rm test.log diff --git a/sources_non_forked/vim-pug/syntax/pug.vim b/sources_non_forked/vim-pug/syntax/pug.vim index 2d80f471..9e5ea3da 100644 --- a/sources_non_forked/vim-pug/syntax/pug.vim +++ b/sources_non_forked/vim-pug/syntax/pug.vim @@ -30,7 +30,7 @@ syn region pugJavascript matchgroup=pugJavascriptOutputChar start="[!&]\==\|\~" syn region pugJavascript matchgroup=pugJavascriptChar start="-" skip=",\s*$" end="$" contained contains=@htmlJavascript keepend syn cluster pugTop contains=pugBegin,pugComment,pugHtmlComment,pugJavascript syn match pugBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=pugTag,pugClassChar,pugIdChar,pugPlainChar,pugJavascript,pugScriptConditional,pugScriptStatement,pugPipedText -syn match pugTag "+\?\w\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@pugComponent +syn match pugTag "+\?[[:alnum:]_-]\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@pugComponent syn cluster pugComponent contains=pugAttributes,pugIdChar,pugBlockExpansionChar,pugClassChar,pugPlainChar,pugJavascript,pugTagBlockChar,pugTagInlineText syntax keyword pugCommentTodo contained TODO FIXME XXX TBD syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo diff --git a/sources_non_forked/vim-snippets/UltiSnips/all.snippets b/sources_non_forked/vim-snippets/UltiSnips/all.snippets index 49a9c80e..6d77cc59 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/all.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/all.snippets @@ -96,4 +96,8 @@ snippet datetime "YYYY-MM-DD hh:mm" w `!v strftime("%Y-%m-%d %H:%M")` endsnippet +snippet todo "TODO comment" bw +`!p snip.rv=get_comment_format()[0]` ${2:TODO}: $0${3: <${4:`!v strftime('%d-%m-%y')`}${5:, `!v g:snips_author`}>} `!p snip.rv=get_comment_format()[2]` +endsnippet + # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets b/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets index c83ec605..bb79a0e1 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets @@ -4,6 +4,28 @@ extends c # We want to overwrite everything in parent ft. priority -49 +########################################################################### +# Global functions # +########################################################################### + +global !p + +def write_docstring_args(arglist, snip): + args = str(arglist).split(',') + + if len(args) > 1: + c = 0 + for arg in args: + if c == 0: + snip.rv += arg + c = 1 + else: + snip += '* : %s' % arg.strip() + else: + snip.rv = args[0] + + +endglobal ########################################################################### # TextMate Snippets # @@ -70,4 +92,19 @@ public: #endif /* $2 */ endsnippet + + +snippet fnc "Basic c++ doxygen function template" b +/** +* @brief: ${4:brief} +* +* @param: `!p write_docstring_args(t[3],snip)` +* +* @return: `!p snip.rv = t[1]` +*/ +${1:ReturnType} ${2:FunctionName}(${3:param}) +{ + ${0:FunctionBody} +} +endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine-arrow.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine-arrow.snippets new file mode 100644 index 00000000..fa7f9364 --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine-arrow.snippets @@ -0,0 +1,234 @@ +priority -50 + +# JavaScript versions -- from the TextMate bundle + some additions +# for jasmine-jquery matchers +# + +snippet des "Describe (js)" b +describe('${1:description}', () => { + $0 +}); +endsnippet + +snippet it "it (js)" b +it('${1:description}', () => { + $0 +}); +endsnippet + +snippet bef "before each (js)" b +beforeEach(() => { + $0 +}); +endsnippet + +snippet aft "after each (js)" b +afterEach(() => { + $0 +}); +endsnippet + +snippet befa "before all (js)" b +beforeAll(() => { + $0 +}); +endsnippet + +snippet afta "after all (js)" b +afterAll(() => { + $0 +}); +endsnippet + +snippet any "any (js)" b +jasmine.any($1) +endsnippet + +snippet anyt "anything (js)" b +jasmine.anything() +endsnippet + +snippet objc "object containing (js)" b +jasmine.objectContaining({ + ${VISUAL}$0 +}); +endsnippet + +snippet arrc "array containing (js)" b +jasmine.arrayContaining([${1:value1}]); +endsnippet + +snippet strm "string matching (js)" b +jasmine.stringMatching("${1:matcher}") +endsnippet + +snippet ru "runs (js)" b +runs(() => { + $0 +}); +endsnippet + +snippet wa "waits (js)" b +waits($1); +endsnippet + +snippet ex "expect (js)" b +expect(${1:target})$0; +endsnippet + +snippet ee "expect to equal (js)" b +expect(${1:target}).toEqual(${2:value}); +endsnippet + +snippet el "expect to be less than (js)" b +expect(${1:target}).toBeLessThan(${2:value}); +endsnippet + +snippet eg "expect to be greater than (js)" b +expect(${1:target}).toBeGreaterThan(${2:value}); +endsnippet + +snippet eb "expect to be (js)" b +expect(${1:target}).toBe(${2:value}); +endsnippet + +snippet em "expect to match (js)" b +expect(${1:target}).toMatch(${2:pattern}); +endsnippet + +snippet eha "expect to have attribute (js)" b +expect(${1:target}).toHaveAttr('${2:attr}'${3:, '${4:value}'}); +endsnippet + +snippet et "expect to be truthy (js)" b +expect(${1:target}).toBeTruthy(); +endsnippet + +snippet ef "expect to be falsy (js)" b +expect(${1:target}).toBeFalsy(); +endsnippet + +snippet ed "expect to be defined (js)" b +expect(${1:target}).toBeDefined(); +endsnippet + +snippet eud "expect to be defined (js)" b +expect(${1:target}).toBeUndefined(); +endsnippet + +snippet en "expect to be null (js)" b +expect(${1:target}).toBeNull(); +endsnippet + +snippet ec "expect to contain (js)" b +expect(${1:target}).toContain(${2:value}); +endsnippet + +snippet ev "expect to be visible (js)" b +expect(${1:target}).toBeVisible(); +endsnippet + +snippet eh "expect to be hidden (js)" b +expect(${1:target}).toBeHidden(); +endsnippet + +snippet eth "expect to throw (js)" b +expect(${1:target}).toThrow(${2:value}); +endsnippet + +snippet ethe "expect to throw error (js)" b +expect(${1:target}).toThrowError(${2:value}); +endsnippet + +snippet notx "expect not (js)" b +expect(${1:target}).not$0; +endsnippet + +snippet note "expect not to equal (js)" b +expect(${1:target}).not.toEqual(${2:value}); +endsnippet + +snippet notl "expect to not be less than (js)" b +expect(${1:target}).not.toBeLessThan(${2:value}); +endsnippet + +snippet notg "expect to not be greater than (js)" b +expect(${1:target}).not.toBeGreaterThan(${2:value}); +endsnippet + +snippet notm "expect not to match (js)" b +expect(${1:target}).not.toMatch(${2:pattern}); +endsnippet + +snippet notha "expect to not have attribute (js)" b +expect(${1:target}).not.toHaveAttr('${2:attr}'${3:, '${4:value}'}); +endsnippet + +snippet nott "expect not to be truthy (js)" b +expect(${1:target}).not.toBeTruthy(); +endsnippet + +snippet notf "expect not to be falsy (js)" b +expect(${1:target}).not.toBeFalsy(); +endsnippet + +snippet notd "expect not to be defined (js)" b +expect(${1:target}).not.toBeDefined(); +endsnippet + +snippet notn "expect not to be null (js)" b +expect(${1:target}).not.toBeNull(); +endsnippet + +snippet notc "expect not to contain (js)" b +expect(${1:target}).not.toContain(${2:value}); +endsnippet + +snippet notv "expect not to be visible (js)" b +expect(${1:target}).not.toBeVisible(); +endsnippet + +snippet noth "expect not to be hidden (js)" b +expect(${1:target}).not.toBeHidden(); +endsnippet + +snippet notth "expect not to throw (js)" b +expect(${1:target}).not.toThrow(${2:value}); +endsnippet + +snippet notthe "expect not to throw error (js)" b +expect(${1:target}).not.toThrowError(${2:value}); +endsnippet + +snippet s "spy on (js)" b +spyOn(${1:object}, '${2:method}')$0; +endsnippet + +snippet sr "spy on and return (js)" b +spyOn(${1:object}, '${2:method}').and.returnValue(${3:arguments}); +endsnippet + +snippet st "spy on and throw (js)" b +spyOn(${1:object}, '${2:method}').and.throwError(${3:exception}); +endsnippet + +snippet sct "spy on and call through (js)" b +spyOn(${1:object}, '${2:method}').and.callThrough(); +endsnippet + +snippet scf "spy on and call fake (js)" b +spyOn(${1:object}, '${2:method}').and.callFake(${3:function}); +endsnippet + +snippet ethbc "expect to have been called (js)" b +expect(${1:target}).toHaveBeenCalled(); +endsnippet + +snippet nthbc "expect not to have been called (js)" b +expect(${1:target}).not.toHaveBeenCalled(); +endsnippet + +snippet ethbcw "expect to have been called with (js)" b +expect(${1:target}).toHaveBeenCalledWith(${2:arguments}); +endsnippet + diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine.snippets index 77aec773..2efbf266 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript-jasmine.snippets @@ -132,6 +132,14 @@ snippet eh "expect to be hidden (js)" b expect(${1:target}).toBeHidden(); endsnippet +snippet eth "expect to throw (js)" b +expect(${1:target}).toThrow(${2:value}); +endsnippet + +snippet ethe "expect to throw error (js)" b +expect(${1:target}).toThrowError(${2:value}); +endsnippet + snippet notx "expect not (js)" b expect(${1:target}).not$0; endsnippet @@ -145,7 +153,7 @@ expect(${1:target}).not.toBeLessThan(${2:value}); endsnippet snippet notg "expect to not be greater than (js)" b -expect(${1:target})..not.toBeGreaterThan(${2:value}); +expect(${1:target}).not.toBeGreaterThan(${2:value}); endsnippet snippet notm "expect not to match (js)" b @@ -184,6 +192,14 @@ snippet noth "expect not to be hidden (js)" b expect(${1:target}).not.toBeHidden(); endsnippet +snippet notth "expect not to throw (js)" b +expect(${1:target}).not.toThrow(${2:value}); +endsnippet + +snippet notthe "expect not to throw error (js)" b +expect(${1:target}).not.toThrowError(${2:value}); +endsnippet + snippet s "spy on (js)" b spyOn(${1:object}, '${2:method}')$0; endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets index 29bf9ed1..652dd707 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets @@ -1,5 +1,19 @@ priority -50 +############ +# COMMON # +############ + +# The smart snippets use a global options called +# "g:ultisnips_javascript.{option}" which can control the format +# of trailing semicolon, space before function paren, etc. + +global !p +from javascript_snippets import ( + semi, space_before_function_paren, keyword_spacing +) +endglobal + ########################################################################### # TextMate Snippets # ########################################################################### @@ -8,13 +22,13 @@ getElement${1/(T)|.*/(?1:s)/}By${1:T}${1/(T)|(I)|.*/(?1:agName)(?2:d)/}('$2') endsnippet snippet '':f "object method string" -'${1:${2:#thing}:${3:click}}': function(element) { +'${1:${2:#thing}:${3:click}}': function`!p snip.rv = space_before_function_paren(snip)`(element) { ${VISUAL}$0 }${10:,} endsnippet snippet :f "Object Method" -${1:method_name}: function(${3:attribute}) { +${1:method_name}: function`!p snip.rv = space_before_function_paren(snip)`(${3:attribute}) { ${VISUAL}$0 }${10:,} endsnippet @@ -28,48 +42,99 @@ ${1:key}: ${2:"${3:value}"}${4:, } endsnippet snippet proto "Prototype (proto)" -${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) { +${1:class_name}.prototype.${2:method_name} = function`!p snip.rv = space_before_function_paren(snip)`(${3:first_argument}) { ${VISUAL}$0 -}; +}`!p snip.rv = semi(snip)` endsnippet snippet fun "function (fun)" w -function ${1:function_name}(${2:argument}) { +function ${1:function_name}`!p snip.rv = space_before_function_paren(snip)`(${2:argument}) { ${VISUAL}$0 } endsnippet snippet vf "Function assigned to var" -${1:var }${2:function_name} = function $2($3) { +${1:var }${2:function_name} = function $2`!p snip.rv = space_before_function_paren(snip)`($3) { ${VISUAL}$0 -}; +}`!p snip.rv = semi(snip)` endsnippet snippet af "Anonymous Function" i -function($1) { +function`!p snip.rv = space_before_function_paren(snip)`($1) { ${VISUAL}$0 } endsnippet snippet iife "Immediately-Invoked Function Expression (iife)" -(function(${1:window}) { +(function`!p snip.rv = space_before_function_paren(snip)`(${1:window}) { ${VISUAL}$0 -}(${2:$1})); +}(${2:$1}))`!p snip.rv = semi(snip)` +endsnippet + +snippet ;fe "Minify safe iife" +;(function`!p snip.rv = space_before_function_paren(snip)`(${1}) { + ${VISUAL}$0 +}(${2})) endsnippet snippet timeout "setTimeout function" -setTimeout(function() { +setTimeout(function`!p snip.rv = space_before_function_paren(snip)`() { ${VISUAL}$0 -}${2:.bind(${3:this})}, ${1:10}); +}${2:.bind(${3:this})}, ${1:10})`!p snip.rv = semi(snip)` endsnippet snippet fi "for prop in obj using hasOwnProperty" b -for (${1:prop} in ${2:obj}){ - if ($2.hasOwnProperty($1)) { +for`!p snip.rv = keyword_spacing(snip)`(${1:prop} in ${2:obj}){ + if`!p snip.rv = keyword_spacing(snip)`($2.hasOwnProperty($1)) { ${VISUAL}$0 } } endsnippet +snippet if "if (condition) { ... }" +if`!p snip.rv = keyword_spacing(snip)`(${1:true}) { + ${VISUAL}$0 +} +endsnippet + +snippet ife "if (condition) { ... } else { ... }" +if`!p snip.rv = keyword_spacing(snip)`(${1:true}) { + ${VISUAL}$0 +}`!p snip.rv = keyword_spacing(snip)`else`!p snip.rv = keyword_spacing(snip)`{ + ${2} +} +endsnippet + +snippet switch +switch`!p snip.rv = keyword_spacing(snip)`(${VISUAL}${1:expression}) { + case '${VISUAL}${3:case}': + ${4} + break`!p snip.rv = semi(snip)` + ${0} + default: + ${2} +} +endsnippet + +snippet case "case 'xyz': ... break" +case`!p snip.rv = keyword_spacing(snip)`'${VISUAL}${1:case}': + ${VISUAL}$0 + break`!p snip.rv = semi(snip)` +endsnippet + +snippet do "do { ... } while (condition)" +do`!p snip.rv = keyword_spacing(snip)`{ + ${VISUAL}$0 +}`!p snip.rv = keyword_spacing(snip)`while`!p snip.rv = keyword_spacing(snip)`(${1:/* condition */})`!p snip.rv = semi(snip)` +endsnippet + +snippet ret "Return statement" +return ${VISUAL}$0`!p snip.rv = semi(snip)` +endsnippet + +snippet us +'use strict'`!p snip.rv = semi(snip)` +endsnippet + # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/matlab.snippets b/sources_non_forked/vim-snippets/UltiSnips/matlab.snippets new file mode 100644 index 00000000..4dc332bd --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/matlab.snippets @@ -0,0 +1,24 @@ +priority -50 + +snippet switch "switch ... otherwise" +switch ${1:n} + case ${2:0} + ${3}${4: + otherwise + ${5}} +end +endsnippet + +snippet clc "class with constructor" b +classdef ${1:`!p +snip.rv = snip.basename or "class_name"`} + properties + ${2} + end + methods + function obj = $1(${3}) + ${4} + end${0} + end +end +endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets b/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets index b7124f83..c61b2766 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets @@ -1,5 +1,26 @@ priority -50 +# +# Global functions +# + +global !p + +def write_instance_vars(arglist, snip): + args = str(arglist).split(',') + for arg in args: + name = arg.strip().replace(':', ' ').split(' ', 1)[0] + if name: + snip += ' @{} = {}'.format(name, name) + else: + snip += '' + +endglobal + +# +# Snippets +# + snippet "^#!" "#!/usr/bin/env ruby" r #!/usr/bin/env ruby $0 @@ -17,8 +38,7 @@ end endsnippet snippet defi "def initialize ..." -def initialize${1:(${2:*args})} - $0 +def initialize($1)`!p write_instance_vars(t[1],snip)`$0 end endsnippet @@ -212,32 +232,6 @@ except: end endsnippet -snippet "(\S+)\.Each_?w(ith)?_?i(ndex)?" ".each_with_index { |<element>,<i>| <block> }" r -`!p snip.rv=match.group(1)`.each_with_index { |${1:`!p -element_name = match.group(1).lstrip('$@') -ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name) -try: - wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1)) - snip.rv = wmatch.group(1).lower() -except: - snip.rv = 'element' -`},${2:i}| $0 } -endsnippet - -snippet "(\S+)\.each_?w(ith)?_?i(ndex)?" ".each_with_index do |<element>,<i>| <block> end" r -`!p snip.rv=match.group(1)`.each_with_index do |${1:`!p -element_name = match.group(1).lstrip('$@') -ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name) -try: - wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1)) - snip.rv = wmatch.group(1).lower() -except: - snip.rv = 'element' -`},${2:i}| - $0 -end -endsnippet - snippet "(\S+)\.Each_?p(air)?" ".each_pair { |<key>,<value>| <block> }" r `!p snip.rv=match.group(1)`.each_pair { |${1:key},${2:value}| $0 } endsnippet @@ -298,20 +292,6 @@ rescue end endsnippet -snippet begin "begin ... rescue ... else ... ensure ... end" -begin - ${1:# Raise exception} -rescue Exception => e - puts e.message - puts e.backtrace.inspect - ${2:# Rescue} -else - ${3:# other exception} -ensure - ${0:# always excute} -end -endsnippet - snippet rescue rescue Exception => e puts e.message @@ -326,10 +306,6 @@ $0 end endsnippet -snippet alias "alias :<new_name> :<old_name>" -alias :${1:new_name} :${2:old_name} -endsnippet - snippet class "class <class_name> def initialize ... end end" class ${1:class_name} def initialize(${2:*args}) diff --git a/sources_non_forked/vim-snippets/UltiSnips/snippets.snippets b/sources_non_forked/vim-snippets/UltiSnips/snippets.snippets index ee0c8c76..6fc26688 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/snippets.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/snippets.snippets @@ -2,15 +2,15 @@ priority -50 # We use a little hack so that the snippet is expanded # and parsed correctly -snippet snip "Snippet definition" b +snippet usnip "Ultisnips snippet definition" b `!p snip.rv = "snippet"` ${1:Tab_trigger} "${2:Description}" ${3:b} -$0 +${0:${VISUAL}} `!p snip.rv = "endsnippet"` endsnippet snippet global "Global snippet" b `!p snip.rv = "global"` !p -$0 +${0:${VISUAL}} `!p snip.rv = "endglobal"` endsnippet diff --git a/sources_non_forked/vim-snippets/pythonx/javascript_snippets.py b/sources_non_forked/vim-snippets/pythonx/javascript_snippets.py new file mode 100644 index 00000000..8757d49b --- /dev/null +++ b/sources_non_forked/vim-snippets/pythonx/javascript_snippets.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Helper utilities to format javascript snippets. +""" + +ALWAYS = 'always' +NEVER = 'never' + + +def get_option(snip, option, default=None): + return snip.opt('g:ultisnips_javascript["{}"]'.format(option), default) + + +def semi(snip): + option = get_option(snip, 'semi', ALWAYS) + + if option == NEVER: + ret = '' + elif option == ALWAYS: + ret = ';' + else: + ret = ';' + return ret + + +def space_before_function_paren(snip): + option = get_option(snip, 'space-before-function-paren', NEVER) + + if option == NEVER: + ret = '' + elif option == ALWAYS: + ret = ' ' + else: + ret = '' + return ret + + +def keyword_spacing(snip): + option = get_option(snip, 'keyword-spacing', ALWAYS) + + if option == NEVER: + ret = '' + elif option == ALWAYS: + ret = ' ' + else: + ret = '' + return ret diff --git a/sources_non_forked/vim-snippets/snippets/c.snippets b/sources_non_forked/vim-snippets/snippets/c.snippets index ea744d54..6e8fb0a5 100644 --- a/sources_non_forked/vim-snippets/snippets/c.snippets +++ b/sources_non_forked/vim-snippets/snippets/c.snippets @@ -130,6 +130,84 @@ snippet fun { ${4} } +# function definition with zero parameters +snippet fun0 + ${1:void} ${2:function_name}() + { + ${3} + } +# function definition with Doxygen documentation +snippet dfun0 + /*! \brief ${1:Brief function description here} + * + * ${2:Detailed description of the function} + * + * \return ${3:Return parameter description} + */ + ${4:void} ${5:function_name}() + { + ${6} + } +# function definition with one parameter +snippet fun1 + ${1:void} ${2:function_name}(${3:Type} ${4:Parameter}) + { + ${5} + } +# function definition with one parameter with Doxygen documentation +snippet dfun1 + /*! \brief ${1:Brief function description here} + * + * ${2:Detailed description of the function} + * + * \param $3 ${4:Parameter description} + * \return ${5:Return parameter description} + */ + ${6:void} ${7:function_name}(${8:Type} ${3:Parameter}) + { + ${9} + } +# function definition with two parameters +snippet fun2 + ${1:void} ${2:function_name}(${3:Type} ${4:Parameter}, ${5:Type} ${6:Parameter}) + { + ${7} + } +# function definition with two parameters with Doxygen documentation +snippet dfun2 + /*! \brief ${1:Brief function description here} + * + * ${2:Detailed description of the function} + * + * \param $3 ${4:Parameter description} + * \param $5 ${6:Parameter description} + * \return ${7:Return parameter description} + */ + ${8:void} ${9:function_name}(${10:Type} ${3:Parameter}, ${11:Type} ${5:Parameter}) + { + ${12} + } +# function definition with two parameters +snippet fun3 + ${1:void} ${2:function_name}(${3:Type} ${4:Parameter}, ${5:Type} ${6:Parameter}, ${7:Type} ${8:Parameter}) + { + ${9} + } +# function definition with two parameters with Doxygen documentation +snippet dfun3 + /*! \brief ${1:Brief function description here} + * + * ${2:Detailed description of the function} + * + * \param $3 ${4:Parameter description} + * \param $5 ${6:Parameter description} + * \param $7 ${8:Parameter description} + * \return ${9:Return parameter description} + */ + ${10:void} ${11:function_name}(${12:Type} ${3:Parameter}, ${13:Type} ${5:Parameter}, ${14:Type} ${7:Parameter}) + { + ${15} + } # function declaration snippet fund ${1:void} ${2:function_name}(${3}); @@ -140,21 +218,39 @@ snippet td typedef ${1:int} ${2:MyCustomType}; # struct snippet st + /*! \struct $1 + * \brief ${3:Brief struct description} + * + * ${4:Detailed description} + */ struct ${1:`vim_snippets#Filename('$1_t', 'name')`} { - ${2:/* data */} - }${3: /* optional variable list */}; + ${2:Data} /*!< ${4:Description} */ + }${5: /* optional variable list */}; # typedef struct snippet tds + /*! \struct $2 + * \brief ${5:Brief struct description} + * + * ${6:Detailed description} + */ typedef struct ${2:_$1 }{ - ${3:/* data */} + m_${3:Data} /*!< ${4:Description} */ } ${1:`vim_snippets#Filename('$1_t', 'name')`}; snippet enum + /*! \enum $1 + * + * ${2:Detailed description} + */ enum ${1:name} { ${0} }; # typedef enum snippet tde + /*! \enum $2 + * + * ${4:Detailed description} + */ typedef enum { - ${1:/* data */} + ${1:Data} /*!< ${3:Description} */ } ${2:foo}; ## ## Input/Output @@ -228,6 +324,11 @@ snippet getopt } } ## +# TODO section +snippet todo + /*! TODO: ${1:Todo description here} + * \todo $1 + */ ## Miscellaneous # This is kind of convenient snippet . diff --git a/sources_non_forked/vim-snippets/snippets/cpp.snippets b/sources_non_forked/vim-snippets/snippets/cpp.snippets index 42c37341..7a55b95e 100644 --- a/sources_non_forked/vim-snippets/snippets/cpp.snippets +++ b/sources_non_forked/vim-snippets/snippets/cpp.snippets @@ -78,20 +78,61 @@ snippet mu ## Class # class snippet cl + /*! \class $1 + * \brief ${3:Brief class description} + * + * ${4:Detailed description} + */ class ${1:`vim_snippets#Filename('$1', 'name')`} { public: $1(${2}); - ~$1(); + virtual ~$1(); - private: - ${0:/* data */} + protected: + m_${5}; /*!< ${6:Member description} */ }; # member function implementation snippet mfun ${4:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) { ${0} } +# member function implementation without parameters +snippet dmfun0 + /*! \brief ${4:Brief function description here} + * + * ${5:Detailed description} + * + * \return ${6:Return parameter description} + */ + ${3:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}() { + ${0} + } +# member function implementation with one parameter +snippet dmfun1 + /*! \brief ${6:Brief function description here} + * + * ${7:Detailed description} + * + * \param $4 ${8:Parameter description} + * \return ${9:Return parameter description} + */ + ${5:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}(${3:Type} ${4:Parameter}) { + ${0} + } +# member function implementation with two parameter +snippet dmfun2 + /*! \brief ${8:Brief function description here} + * + * ${9:Detailed description} + * + * \param $4 ${10:Parameter description} + * \param $6 ${11:Parameter description} + * \return ${12:Return parameter description} + */ + ${7:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}(${3:Type} ${4:Parameter},${5:Type} ${6:Parameter}) { + ${0} + } # namespace snippet ns namespace ${1:`vim_snippets#Filename('', 'my')`} { @@ -152,3 +193,13 @@ snippet lld [${1}](${2}){ ${3} }; +# snippets exception +snippet try + try { + + }catch(${1}) { + + } + + + diff --git a/sources_non_forked/vim-snippets/snippets/fortran.snippets b/sources_non_forked/vim-snippets/snippets/fortran.snippets index 8fecd330..e61d3fb5 100644 --- a/sources_non_forked/vim-snippets/snippets/fortran.snippets +++ b/sources_non_forked/vim-snippets/snippets/fortran.snippets @@ -28,9 +28,12 @@ snippet doc $0 snippet dox !> @brief ${1} + !! !> ${2} !> @author `g:snips_author` ${0} +snippet doxp + !> @param[${1}]${0} # Variables definitions # Boolean snippet bool diff --git a/sources_non_forked/vim-snippets/snippets/jinja.snippets b/sources_non_forked/vim-snippets/snippets/jinja.snippets index 7d14ca83..a6f274ab 100644 --- a/sources_non_forked/vim-snippets/snippets/jinja.snippets +++ b/sources_non_forked/vim-snippets/snippets/jinja.snippets @@ -78,7 +78,7 @@ snippet spaceless snippet ssi {% ssi ${0} %} snippet trans - {% trans "${0:string}" %} + {% trans %}${0}{% endtrans %} snippet url {% url ${1} as ${0} %} snippet widthratio diff --git a/sources_non_forked/vim-snippets/snippets/matlab.snippets b/sources_non_forked/vim-snippets/snippets/matlab.snippets new file mode 100644 index 00000000..19b6fe87 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/matlab.snippets @@ -0,0 +1,64 @@ +snippet if if + if ${1} + ${0} + end + +snippet ife if ... else + if ${1} + ${2} + else + ${0} + end + +snippet el else + else + ${0} + +snippet eif elsif + elseif ${1} + ${0} + +snippet wh while + while ${1} + ${0} + end + +snippet for for + for ${1:i} = ${2:1:n} + ${0} + end + +snippet parfor parfor + parfor ${1:i} = ${2:1:n} + ${0} + end + +snippet fun function + function [${3:out}] = ${1:`vim_snippets#Filename("$1", "fun_name")`}(${2}) + ${0} + +snippet try try ... catch + try + ${1} + catch ${2:err} + ${0} + end + +snippet switch switch + switch ${1:n} + case ${2:0} + ${0} + end + +snippet @ anonymous function + @(${1:x}) ${0:x*x} + +snippet cl class + classdef ${1:`vim_snippets#Filename("$1", "class_name")`} + properties + ${2} + end + methods + ${0} + end + end diff --git a/sources_non_forked/vim-snippets/snippets/php.snippets b/sources_non_forked/vim-snippets/snippets/php.snippets index 52572da9..fb313b84 100644 --- a/sources_non_forked/vim-snippets/snippets/php.snippets +++ b/sources_non_forked/vim-snippets/snippets/php.snippets @@ -94,9 +94,9 @@ snippet E $_ENV['${1:variable}'] snippet F $_FILES['${1:variable}'] -snippet G +snippet G "_GET array" $_GET['${1:variable}'] -snippet P +snippet P "_POST array" $_POST['${1:variable}'] snippet R $_REQUEST['${1:variable}'] diff --git a/sources_non_forked/vim-snippets/snippets/ruby.snippets b/sources_non_forked/vim-snippets/snippets/ruby.snippets index 9dc984fd..340391eb 100644 --- a/sources_non_forked/vim-snippets/snippets/ruby.snippets +++ b/sources_non_forked/vim-snippets/snippets/ruby.snippets @@ -142,21 +142,6 @@ snippet mod module .. end module ${1:`substitute(vim_snippets#Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} ${0} end -snippet mod module .. ClassMethods .. end - module ${1:`substitute(vim_snippets#Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} - module ClassMethods - ${0} - end - - module InstanceMethods - - end - - def self.included(receiver) - receiver.extend ClassMethods - receiver.send :include, InstanceMethods - end - end # attr_reader snippet r attr_reader :${0:attr_names} diff --git a/sources_non_forked/vim-snippets/snippets/rust.snippets b/sources_non_forked/vim-snippets/snippets/rust.snippets index 2a353e49..25effe6e 100644 --- a/sources_non_forked/vim-snippets/snippets/rust.snippets +++ b/sources_non_forked/vim-snippets/snippets/rust.snippets @@ -142,7 +142,7 @@ snippet stn "Struct with new constructor" } impl $1 { - pub fn new(${2}) -> $1 { + pub fn new(${2}) -> Self { $1 { ${3} } } } diff --git a/sources_non_forked/vim-snippets/snippets/snippets.snippets b/sources_non_forked/vim-snippets/snippets/snippets.snippets index dc8de42f..c2d932ae 100644 --- a/sources_non_forked/vim-snippets/snippets/snippets.snippets +++ b/sources_non_forked/vim-snippets/snippets/snippets.snippets @@ -1,10 +1,7 @@ # snippets for making snippets :) snippet snip - snippet ${1:trigger} - ${0} -snippet msnip - snippet ${1:trigger} ${2:description} - ${0} + snippet ${1:trigger} "${2:description}" + ${0:${VISUAL}} snippet v {VISUAL} snippet $ From a35351a21b1be5b5b791c30d3fae83497825b952 Mon Sep 17 00:00:00 2001 From: weiyang <weiyang.ones@gmail.com> Date: Sat, 11 Mar 2017 18:41:34 +0800 Subject: [PATCH 199/254] [tmux] set 'termguicolors' when running nvim Signed-off-by: weiyang <weiyang.ones@gmail.com> --- vimrcs/filetypes.vim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vimrcs/filetypes.vim b/vimrcs/filetypes.vim index 8c4eb9db..030cd497 100644 --- a/vimrcs/filetypes.vim +++ b/vimrcs/filetypes.vim @@ -63,5 +63,9 @@ au FileType gitcommit call setpos('.', [0, 1, 1, 0]) " => Shell section """""""""""""""""""""""""""""" if exists('$TMUX') - set term=screen-256color + if has('nvim') + set termguicolors + else + set term=screen-256color + endif endif From 6b606a73ac377b9936c80cccf56a89a002bafa7c Mon Sep 17 00:00:00 2001 From: Juil Yoon <juilyoon@users.noreply.github.com> Date: Sat, 11 Mar 2017 22:18:41 -0500 Subject: [PATCH 200/254] Update link to Source Code Pro by Adobe. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 489ec5f9..41695972 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The awesome version includes a lot of great plugins, configurations and color sc git clone https://github.com/amix/vimrc.git ~/.vim_runtime sh ~/.vim_runtime/install_awesome_vimrc.sh -I also recommend using [Source Code Pro font from Adobe](http://store1.adobe.com/cfusion/store/html/index.cfm?event=displayFontPackage&code=1960) (it's free and awesome font for writing and programming). The Awesome vimrc is already setup to try to use it +I also recommend using [Source Code Pro font from Adobe](https://typekit.com/fonts/source-code-pro) (it's free and awesome font for writing and programming). The Awesome vimrc is already setup to try to use it ## How to install the Basic version? The basic version is basically just one file and no plugins. You can check out [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim). From 395c077dcbe2b9e997a9e3de854ea2835e703489 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Tue, 14 Mar 2017 16:16:07 +0100 Subject: [PATCH 201/254] Updated plugins --- sources_non_forked/goyo.vim/autoload/goyo.vim | 2 +- .../vim-commentary/plugin/commentary.vim | 4 +- .../vim-go/.github/CONTRIBUTING.md | 2 +- sources_non_forked/vim-go/CHANGELOG.md | 27 +++++++-- sources_non_forked/vim-go/autoload/go/cmd.vim | 22 ++++++++ .../vim-go/autoload/go/guru.vim | 24 +------- .../vim-go/autoload/go/rename.vim | 6 ++ sources_non_forked/vim-go/doc/vim-go.txt | 27 ++++----- .../vim-go/ftplugin/go/commands.vim | 2 +- sources_non_forked/vim-pug/syntax/pug.vim | 10 ++-- .../vim-snipmate/autoload/snipMate.vim | 11 +++- .../vim-snipmate/autoload/snipmate/parse.vim | 20 ++++++- sources_non_forked/vim-snipmate/t/parser.vim | 10 ++++ .../vim-snippets/UltiSnips/cs.snippets | 56 +++++++++++++++++-- .../vim-snippets/snippets/cs.snippets | 14 ++--- 15 files changed, 170 insertions(+), 67 deletions(-) diff --git a/sources_non_forked/goyo.vim/autoload/goyo.vim b/sources_non_forked/goyo.vim/autoload/goyo.vim index 735c950a..94216d1a 100644 --- a/sources_non_forked/goyo.vim/autoload/goyo.vim +++ b/sources_non_forked/goyo.vim/autoload/goyo.vim @@ -33,7 +33,7 @@ function! s:get_color(group, attr) endfunction function! s:set_color(group, attr, color) - let gui = a:color =~ '^#' + let gui = has('gui_running') || has('termguicolors') && &termguicolors execute printf('hi %s %s%s=%s', a:group, gui ? 'gui' : 'cterm', a:attr, a:color) endfunction diff --git a/sources_non_forked/vim-commentary/plugin/commentary.vim b/sources_non_forked/vim-commentary/plugin/commentary.vim index 0bef7cc9..a7b0ced7 100644 --- a/sources_non_forked/vim-commentary/plugin/commentary.vim +++ b/sources_non_forked/vim-commentary/plugin/commentary.vim @@ -96,7 +96,9 @@ if !hasmapto('<Plug>Commentary') || maparg('gc','n') ==# '' nmap gc <Plug>Commentary omap gc <Plug>Commentary nmap gcc <Plug>CommentaryLine - nmap cgc <Plug>ChangeCommentary + if maparg('c','n') ==# '' + nmap cgc <Plug>ChangeCommentary + endif nmap gcu <Plug>Commentary<Plug>Commentary endif diff --git a/sources_non_forked/vim-go/.github/CONTRIBUTING.md b/sources_non_forked/vim-go/.github/CONTRIBUTING.md index 7266ccea..450f9598 100644 --- a/sources_non_forked/vim-go/.github/CONTRIBUTING.md +++ b/sources_non_forked/vim-go/.github/CONTRIBUTING.md @@ -4,6 +4,6 @@ Thanks for improving vim-go! Before you dive in please read the following: [FAQ](https://github.com/fatih/vim-go/wiki/FAQ-Troubleshooting), it might have answers for your problem 2. If you add a new feature please don't forget to update the documentation: - [doc/vim-go.txt](doc/vim-go.txt) + [doc/vim-go.txt](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt) 3. If it's a breaking change or exceed +100 lines please open an issue first and describe the changes you want to make. diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 46662bc8..9d245fc2 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -2,7 +2,11 @@ FEATURES: -* New `:GoAddTags` and `:GoRemoveTags` command based on the tool [gomodifytags](https://github.com/fatih/gomodifytags). This fixes many old bugs that were due prior regexp based implementation. For the usage please read the docs and checkout the demo at: https://github.com/fatih/vim-go/pull/1204 [gh-1204] +* New `:GoAddTags` and `:GoRemoveTags` command based on the tool + [gomodifytags](https://github.com/fatih/gomodifytags). This fixes many old + bugs that were due prior regexp based implementation. For the usage please + read the docs and checkout the demo at: + https://github.com/fatih/vim-go/pull/1204 [gh-1204] * Add new `errl` snippet that expands to [gh-1185]: ``` @@ -10,12 +14,16 @@ if err != nil { log.Fatal(err) } ``` +* New `:GoBuildTags` command to change build tags for tools such as `guru`, + `gorename`, etc ... There is also a new setting called `g:go_build_tags` + [gh-1232] IMPROVEMENTS: -* Lowercase `<Leader>` in mappings examples for consisten documentation across the README [gh-1192] +* Lowercase `<Leader>` in mappings examples for consistent documentation across the README [gh-1192] * All of files should be written in utf-8 if the file will be passed to external command. [gh-1184] -* `:GoAddTags` is now able to add options to existing tags with the syntax `:GoAddTags key,option`, i.e: `:GoAddTags json,omitempty` [gh-985] +* `:GoAddTags` is now able to add options to existing tags with the syntax + `:GoAddTags key,option`, i.e: `:GoAddTags json,omitempty` [gh-985] * Document 'noshowmode' requirement for echo_go_info [gh-1197] * Improve godoc view for vertical splits [gh-1195] * Set GOPATH for both possible go guru execution paths (sync and async) [gh-1193] @@ -23,7 +31,8 @@ IMPROVEMENTS: BUG FIXES: * Honor `g:go_echo_command_info` when dispatching builds in neovim [gh-1176] -* Fix `:GoBuild` error in neovim due to invalid jobcontrol handler function signatures (`s:on_stdout`, `s:on_stderr`)[gh-1176] +* Fix `:GoBuild` error in neovim due to invalid jobcontrol handler function + signatures (`s:on_stdout`, `s:on_stderr`)[gh-1176] * Update statusline before and after `go#jobcontrol#Spawn` command is executed [gh-1176] * Correctly report the value of the 'g:go_guru_tags' variable [gh-1177] * Ensure no trailing `:` exist in GOPATH detection if initial GOPATH is not set [gh-1194] @@ -36,12 +45,20 @@ BUG FIXES: * Respect go_fmt_options when running goimports [gh-1211] * Set the filename in the location-list when there is an error with :GoFmt [gh-1199] +BACKWARDS INCOMPATIBILITIES: + +* The command `:GoGuruTags` is removed in favour of the new command + `:GoBuildTags`. This command will be used now not just for `guru`, also for + all new commands such as `guru` [gh-1232] +* The setting `g:go_guru_tags` is removed in favour of the new setting + `g:go_build_tags` [gh-1232] + ## 1.11 - (January 9, 2017) FEATURES: -* Travis test integration has been added. Now any file that is added as `<name>_test.vim` will be automatically tested in for every Pull Request (just like how we add tests to Go with `_test.go`). Going forward this will tremendously increase the stability and decrease the maintaince burden of vim-go. [gh-1157] +* Travis test integration has been added. Now any file that is added as `<name>_test.vim` will be automatically tested in for every Pull Request (just like how we add tests to Go with `_test.go`). Going forward this will tremendously increase the stability and decrease the maintenance burden of vim-go. [gh-1157] * Add new `g:go_updatetime` setting to change the default updatetime (which was hardcoded previously) [gh-1055] * Add new `g:go_template_use_pkg` setting to enable to use cwd as package name instead of basic template file [gh-1124] diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index badca313..02e8e102 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -76,6 +76,28 @@ function! go#cmd#Build(bang, ...) abort endfunction +" BuildTags sets or shows the current build tags used for tools +function! go#cmd#BuildTags(bang, ...) abort + if a:0 + if a:0 == 1 && a:1 == '""' + unlet g:go_build_tags + call go#util#EchoSuccess("build tags are cleared") + else + let g:go_build_tags = a:1 + call go#util#EchoSuccess("build tags are changed to: ". a:1) + endif + + return + endif + + if !exists('g:go_build_tags') + call go#util#EchoSuccess("build tags are not set") + else + call go#util#EchoSuccess("current build tags: ". g:go_build_tags) + endif +endfunction + + " Run runs the current file (and their dependencies if any) in a new terminal. function! go#cmd#RunTerm(bang, mode, files) abort if empty(a:files) diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim index df31d1b3..7edd6716 100644 --- a/sources_non_forked/vim-go/autoload/go/guru.vim +++ b/sources_non_forked/vim-go/autoload/go/guru.vim @@ -46,8 +46,8 @@ function! s:guru_cmd(args) range abort endif " check for any tags - if exists('g:go_guru_tags') - let tags = get(g:, 'go_guru_tags') + if exists('g:go_build_tags') + let tags = get(g:, 'go_build_tags') call extend(cmd, ["-tags", tags]) let result.tags = tags endif @@ -619,24 +619,4 @@ function! go#guru#Scope(...) abort endif endfunction -function! go#guru#Tags(...) abort - if a:0 - if a:0 == 1 && a:1 == '""' - unlet g:go_guru_tags - call go#util#EchoSuccess("guru tags is cleared") - else - let g:go_guru_tags = a:1 - call go#util#EchoSuccess("guru tags changed to: ". a:1) - endif - - return - endif - - if !exists('g:go_guru_tags') - call go#util#EchoSuccess("guru tags is not set") - else - call go#util#EchoSuccess("current guru tags: ". g:go_guru_tags) - endif -endfunction - " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/rename.vim b/sources_non_forked/vim-go/autoload/go/rename.vim index 7d5579d2..ac2f0181 100644 --- a/sources_non_forked/vim-go/autoload/go/rename.vim +++ b/sources_non_forked/vim-go/autoload/go/rename.vim @@ -41,6 +41,12 @@ function! go#rename#Rename(bang, ...) abort let cmd = [bin_path, "-offset", offset, "-to", to_identifier] + " check for any tags + if exists('g:go_build_tags') + let tags = get(g:, 'go_build_tags') + call extend(cmd, ["-tags", tags]) + endif + if go#util#has_job() call go#util#EchoProgress(printf("renaming to '%s' ...", to_identifier)) call s:rename_job({ diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index d37df28f..29be99f5 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -598,15 +598,16 @@ CTRL-t use the variable |'g:go_metalinter_command'|. To override the maximum linters execution time use |'g:go_metalinter_deadline'| variable. - *:GoGuruTags* -:GoGuruTags [tags] + *:GoBuildTags* +:GoBuildTags [tags] - Changes the custom |'g:go_guru_tags'| setting and overrides it with the - given build tags. This command cooperate with GoReferrers command when - there exist mulitiple build tags in your project, then you can set one of - the build tags for GoReferrers to find more accurate. - The custom build tags is cleared (unset) if `""` is given. If no arguments - is given it prints the current custom build tags. + Changes the build tags for various commands. If you have any file that + uses a custom build tag, such as `//+build integration` , this command can + be used to pass it to all tools that accepts tags, such as guru, gorenate, + etc.. + + The build tags is cleared (unset) if `""` is given. If no arguments is + given it prints the current custom build tags. *:AsmFmt* :AsmFmt @@ -1208,15 +1209,15 @@ set, so the relevant commands defaults are being used. > let g:go_guru_scope = [] < - *'g:go_guru_tags'* + *'g:go_build_tags'* These options that will be automatically passed to the `-tags` option of -`go guru` when it's invoked with |:GoDef|. You can use |:GoGuruTags| to set -this. By default it's not set. +various tools, such as `guru`, `gorename`, etc... This is a permanatent +setting. A more useful way is to use |:GoBuildTags| to dynamically change or +remove build tags. By default it's not set. > - let g:go_guru_tags = '' + let g:go_build_tags = '' < - *'g:go_highlight_array_whitespace_error'* Highlights white space after "[]". > diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim index 6f108a67..f5357d2a 100644 --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim @@ -12,7 +12,6 @@ command! -range=% GoCallstack call go#guru#Callstack(<count>) command! -range=% GoFreevars call go#guru#Freevars(<count>) command! -range=% GoChannelPeers call go#guru#ChannelPeers(<count>) command! -range=% GoReferrers call go#guru#Referrers(<count>) -command! -nargs=? GoGuruTags call go#guru#Tags(<f-args>) command! -range=0 GoSameIds call go#guru#SameIds() command! -range=0 GoSameIdsClear call go#guru#ClearSameIds() @@ -31,6 +30,7 @@ command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo() " -- cmd command! -nargs=* -bang GoBuild call go#cmd#Build(<bang>0,<f-args>) +command! -nargs=? -bang GoBuildTags call go#cmd#BuildTags(<bang>0, <f-args>) command! -nargs=* -bang GoGenerate call go#cmd#Generate(<bang>0,<f-args>) command! -nargs=* -bang -complete=file GoRun call go#cmd#Run(<bang>0,<f-args>) command! -nargs=* -bang GoInstall call go#cmd#Install(<bang>0, <f-args>) diff --git a/sources_non_forked/vim-pug/syntax/pug.vim b/sources_non_forked/vim-pug/syntax/pug.vim index 9e5ea3da..0fb146d8 100644 --- a/sources_non_forked/vim-pug/syntax/pug.vim +++ b/sources_non_forked/vim-pug/syntax/pug.vim @@ -33,9 +33,9 @@ syn match pugBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=pugTag,pugClassChar,p syn match pugTag "+\?[[:alnum:]_-]\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@pugComponent syn cluster pugComponent contains=pugAttributes,pugIdChar,pugBlockExpansionChar,pugClassChar,pugPlainChar,pugJavascript,pugTagBlockChar,pugTagInlineText syntax keyword pugCommentTodo contained TODO FIXME XXX TBD -syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo -syn region pugCommentBlock start="\z(\s\+\|^\)\/\/.*$" end="^\%(\z1\s\|\s*$\)\@!" contains=pugCommentTodo keepend -syn region pugHtmlConditionalComment start="<!--\%(.*\)>" end="<!\%(.*\)-->" contains=pugCommentTodo +syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo,@Spell +syn region pugCommentBlock start="\z(\s\+\|^\)\/\/.*$" end="^\%(\z1\s\|\s*$\)\@!" contains=pugCommentTodo,@Spell keepend +syn region pugHtmlConditionalComment start="<!--\%(.*\)>" end="<!\%(.*\)-->" contains=pugCommentTodo,@Spell syn region pugAngular2 start="(" end=")" contains=htmlEvent syn region pugAttributes matchgroup=pugAttributesDelimiter start="(" end=")" contained contains=@htmlJavascript,pugHtmlArg,pugAngular2,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@pugComponent syn match pugClassChar "\." containedin=htmlTagName nextgroup=pugClass @@ -52,10 +52,10 @@ syn keyword pugHtmlArg contained href title syn match pugPlainChar "\\" contained syn region pugInterpolation matchgroup=pugInterpolationDelimiter start="[#!]{" end="}" contains=@htmlJavascript syn match pugInterpolationEscape "\\\@<!\%(\\\\\)*\\\%(\\\ze#{\|#\ze{\)" -syn match pugTagInlineText "\s.*$" contained contains=pugInterpolation,pugTextInlinePug +syn match pugTagInlineText "\s.*$" contained contains=pugInterpolation,pugTextInlinePug,@Spell syn region pugPipedText matchgroup=pugPipeChar start="|" end="$" contained contains=pugInterpolation,pugTextInlinePug nextgroup=pugPipedText skipnl syn match pugTagBlockChar "\.$" contained nextgroup=pugTagBlockText,pugTagBlockEnd skipnl -syn region pugTagBlockText start="\%(\s*\)\S" end="\ze\n" contained contains=pugInterpolation,pugTextInlinePug nextgroup=pugTagBlockText,pugTagBlockEnd skipnl +syn region pugTagBlockText start="\%(\s*\)\S" end="\ze\n" contained contains=pugInterpolation,pugTextInlinePug,@Spell nextgroup=pugTagBlockText,pugTagBlockEnd skipnl syn region pugTagBlockEnd start="\s*\S" end="$" contained contains=pugInterpolation,pugTextInlinePug nextgroup=pugBegin skipnl syn region pugTextInlinePug matchgroup=pugInlineDelimiter start="#\[" end="]" contains=pugTag keepend diff --git a/sources_non_forked/vim-snipmate/autoload/snipMate.vim b/sources_non_forked/vim-snipmate/autoload/snipMate.vim index e3b4ca6d..407ee869 100644 --- a/sources_non_forked/vim-snipmate/autoload/snipMate.vim +++ b/sources_non_forked/vim-snipmate/autoload/snipMate.vim @@ -6,7 +6,7 @@ endif try call tlib#input#List('mi', '', []) catch /.*/ - echoe "you're missing tlib. See install instructions at ".expand('<sfile>:h:h').'/README.md' + echoe "tlib is missing. See install instructions at ".expand('<sfile>:h:h').'/README.md' endtry fun! Filename(...) abort @@ -117,7 +117,14 @@ function! snipMate#sniplist_str(snippet, stops) abort if type(item) == type('') let str .= item elseif type(item) == type([]) - let str .= snipMate#placeholder_str(item[0], a:stops) + let placeholder = snipMate#placeholder_str(item[0], a:stops) + if len(item) > 1 && type(item[1]) == type({}) + let placeholder = substitute(placeholder, + \ get(item[1], 'pat', ''), + \ get(item[1], 'sub', ''), + \ get(item[1], 'flags', '')) + endif + let str .= placeholder endif let pos += 1 diff --git a/sources_non_forked/vim-snipmate/autoload/snipmate/parse.vim b/sources_non_forked/vim-snipmate/autoload/snipmate/parse.vim index dd495e95..5f842609 100644 --- a/sources_non_forked/vim-snipmate/autoload/snipmate/parse.vim +++ b/sources_non_forked/vim-snipmate/autoload/snipmate/parse.vim @@ -171,6 +171,7 @@ endfunction function! s:parser_text(till) dict abort let ret = [] + let target = ret while self.pos < self.len let lines = [] @@ -180,8 +181,12 @@ function! s:parser_text(till) dict abort if !empty(var) if var[0] is# 'VISUAL' let lines = s:visual_placeholder(var, self.indent) + " Remove trailing newline. See #245 + if lines[-1] == '' && self.next == "\n" + call remove(lines, -1) + endif elseif var[0] >= 0 - call add(ret, var) + call add(target, var) call self.add_var(var) endif endif @@ -192,8 +197,12 @@ function! s:parser_text(till) dict abort endif if !empty(lines) - call add(ret, lines[0]) - call extend(self.stored_lines, lines[1:]) + call add(target, lines[0]) + call extend(self.stored_lines, lines[1:-2]) + " Don't change targets if there's only one line + if exists("lines[1]") + let target = [lines[-1]] + endif endif " Empty lines are ignored if this is tested at the start of an iteration @@ -203,6 +212,11 @@ function! s:parser_text(till) dict abort endwhile call s:join_consecutive_strings(ret) + if target isnot ret + call s:join_consecutive_strings(target) + call extend(self.stored_lines, target) + endif + return ret endfunction diff --git a/sources_non_forked/vim-snipmate/t/parser.vim b/sources_non_forked/vim-snipmate/t/parser.vim index c5cf8739..3c2aa6e5 100644 --- a/sources_non_forked/vim-snipmate/t/parser.vim +++ b/sources_non_forked/vim-snipmate/t/parser.vim @@ -118,6 +118,16 @@ describe 'snippet parser' \ ["\t baz"], ["x"]] end + it 'removes newlines from the end of VISUALs if before an end of line' + let b:snipmate_visual = "1\n2\n" + Expect Parse("x\n$VISUAL\nx") == [['x'], ['1'], ['2'], ['x']] + end + + it 'splits the before and after a $VISUAL if it is multiline' + let b:snipmate_visual = "1\n2\n3" + Expect Parse("foo $VISUAL bar") == [['foo 1'], ['2'], ['3 bar']] + end + it 'determines which var with an id is the stop' let [snip, stops] = Parse("$1$1$1", 0, 1) Expect snip == [[[1, "", stops[1]], [1, {}], [1, {}]]] diff --git a/sources_non_forked/vim-snippets/UltiSnips/cs.snippets b/sources_non_forked/vim-snippets/UltiSnips/cs.snippets index 89b61ca0..298eefd2 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/cs.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/cs.snippets @@ -16,7 +16,7 @@ namespace ${1:MyNamespace} endsnippet snippet class "class" w -class ${1:MyClass} +${1:public} class ${2:MyClass} { $0 } @@ -288,6 +288,10 @@ snippet cw "Console.WriteLine" b Console.WriteLine("$1"); endsnippet +snippet cr "Console.ReadLine" b +Console.ReadLine(); +endsnippet + # as you first type comma-separated parameters on the right, {n} values appear in the format string snippet cwp "Console.WriteLine with parameters" b Console.WriteLine("${2:`!p @@ -300,9 +304,9 @@ MessageBox.Show("${1:message}"); endsnippet -################## -# full methods # -################## +############# +# methods # +############# snippet equals "Equals method" b public override bool Equals(object obj) @@ -316,13 +320,53 @@ public override bool Equals(object obj) } endsnippet +snippet mth "Method" b +${1:public} ${2:void} ${3:MyMethod}(${4}) +{ + $0 +} +endsnippet + +snippet mths "Static method" b +${1:public} static ${2:void} ${3:MyMethod}(${4}) +{ + $0 +} +endsnippet + +############### +# constructor # +############### + +snippet ctor "Constructor" b +${1:public} ${2:`!p snip.rv = snip.basename or "untitled"`}(${3}) +{ + $0 +} +endsnippet ############## # comments # ############## -snippet /// "XML comment" b +snippet /// "XML summary comment" b /// <summary> -/// $1 +/// $0 /// </summary> endsnippet + +snippet <p "XML pramameter comment" b +<param name="${1}">${2}</param> +endsnippet + +snippet <ex "XML exception comment" b +<exception cref="${1:System.Exception}">${2}</exception> +endsnippet + +snippet <r "XML returns comment" b +<returns>$0</returns> +endsnippet + +snippet <c "XML code comment" b +<code>$0</code> +endsnippet diff --git a/sources_non_forked/vim-snippets/snippets/cs.snippets b/sources_non_forked/vim-snippets/snippets/cs.snippets index 391984bb..decf79af 100644 --- a/sources_non_forked/vim-snippets/snippets/cs.snippets +++ b/sources_non_forked/vim-snippets/snippets/cs.snippets @@ -56,7 +56,7 @@ # # Feedback is welcome! # -# Main +# Main snippet sim ${1:public }static int Main(string[] args) { ${0} @@ -358,7 +358,7 @@ snippet enum enum ${1} { ${0} } - + snippet enum+ public enum ${1} { ${0} @@ -378,7 +378,7 @@ snippet <p snippet <ex <exception cref="${1:System.Exception}">${2}</exception> snippet <r - <returns>${1}</returns>{ + <returns>${1}</returns> snippet <s <see cref="${1}"/> snippet <rem @@ -398,7 +398,7 @@ snippet eq ${0:throw new NotImplementedException();} return base.Equals(obj); } -# exception +# exception snippet exc public class ${1:MyException} : ${2:Exception} { public $1() { } @@ -409,13 +409,13 @@ snippet exc System.Runtime.Serialization.StreamingContext context) : base(info, context) { } } -# indexer +# indexer snippet index public ${1:object} this[${2:int} index] { get { ${0} } set { ${0} } } -# eventhandler +# eventhandler snippet inv EventHandler temp = ${1:MyEvent}; if (${2:temp} != null) { @@ -442,7 +442,7 @@ snippet propf } snippet propg public ${1:int} ${2:MyProperty} { get; private set; } -# switch +# switch snippet switch switch (${1:switch_on}) { ${0} From 248333fc64e1150f4e1f13dfe2bc95ac7f092bca Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Tue, 14 Mar 2017 16:18:11 +0100 Subject: [PATCH 202/254] . --- sources_non_forked/vim-gitgutter/LICENCE | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 sources_non_forked/vim-gitgutter/LICENCE diff --git a/sources_non_forked/vim-gitgutter/LICENCE b/sources_non_forked/vim-gitgutter/LICENCE new file mode 100644 index 00000000..38e2dc2d --- /dev/null +++ b/sources_non_forked/vim-gitgutter/LICENCE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) Andrew Stewart + +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. + From 1886475fd2c3c5814e242d3324b358804bcafa1b Mon Sep 17 00:00:00 2001 From: Martin Lavoie <broemartino@gmail.com> Date: Mon, 27 Mar 2017 15:27:30 -0400 Subject: [PATCH 203/254] Make plugins_config use relative path --- vimrcs/plugins_config.vim | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index 53d0539e..e67e5a07 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -8,8 +8,9 @@ """""""""""""""""""""""""""""" " => Load pathogen paths """""""""""""""""""""""""""""" -call pathogen#infect('~/.vim_runtime/sources_forked/{}') -call pathogen#infect('~/.vim_runtime/sources_non_forked/{}') +let s:vim_runtime = expand('<sfile>:p:h')."/.." +call pathogen#infect(s:vim_runtime.'/sources_forked/{}') +call pathogen#infect(s:vim_runtime.'/sources_non_forked/{}') call pathogen#helptags() """""""""""""""""""""""""""""" From 0ce60b6ed7cfb1533e55822e7e016f9ff59b5c02 Mon Sep 17 00:00:00 2001 From: Amir Salihefendic <amix@doist.com> Date: Sat, 1 Apr 2017 12:52:19 +0200 Subject: [PATCH 204/254] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 541f0d07..0fb0b7c4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # The Ultimate vimrc -Over the last 8 years I have used and tweaked Vim. This is my Ultimate vimrc. +Over the last 10 years I have used and tweaked Vim. This is the ultimate vimrc (or at least my version of it). There are two versions: @@ -73,8 +73,8 @@ I recommend reading the docs of these plugins to understand them better. Each of * [NERD Tree](https://github.com/scrooloose/nerdtree): A tree explorer plugin for vim * [ack.vim](https://github.com/mileszs/ack.vim): Vim plugin for the Perl module / CLI script 'ack' * [ag.vim](https://github.com/rking/ag.vim): A much faster Ack -* [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim): Fuzzy file, buffer, mru and tag finder. In my config it's mapped to `<Ctrl+F>`, because `<Ctrl+P>` is used by YankRing -* [mru.vim](https://github.com/vim-scripts/mru.vim): Plugin to manage Most Recently Used (MRU) files. Includes my own fork which adds syntax highlighting to MRU. This plugin can be opened with `<leader+f>` +* [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim): Fuzzy file, buffer, mru and tag finder. It's mapped to `<Ctrl+F>`, because `<Ctrl+P>` is used by YankRing +* [mru.vim](https://github.com/vim-scripts/mru.vim): Plugin to manage Most Recently Used (MRU) files. This plugin can be opened with `<leader+f>` * [open_file_under_cursor.vim](https://github.com/amix/open_file_under_cursor.vim): Open file under cursor when pressing `gf` * [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts * [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors): Sublime Text style multiple selections for Vim, CTRL+N is remapped to CTRL+S (due to YankRing) @@ -90,7 +90,7 @@ Remove all clutter and focus only on the essential. Similar to iA Writer or Writ ## Included color schemes -* [peaksea](https://github.com/vim-scripts/peaksea): My favorite! +* [peaksea](https://github.com/vim-scripts/peaksea): The default * [vim-colors-solarized](https://github.com/altercation/vim-colors-solarized) * [vim-irblack](https://github.com/wgibbs/vim-irblack) * [mayansmoke](https://github.com/vim-scripts/mayansmoke) @@ -314,3 +314,4 @@ Do following: * Remove `~/.vim_runtime` * Remove any lines that reference `.vim_runtime` in your `~/.vimrc` + From 068316713be18cb9c8104c4b2fd9658f49ac96c9 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 13:19:29 +0200 Subject: [PATCH 205/254] Updated to the readme file --- README.md | 59 +++++++++++++++++++++++-------------------------------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 0fb0b7c4..76f53e91 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,21 @@ Over the last 10 years I have used and tweaked Vim. This is the ultimate vimrc ( There are two versions: -* **Basic**: If you want something small just copy [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim) into your ~/.vimrc and you will have a great basic setup -* **Awesome**: This includes a ton of useful plugins, color schemes and configurations +* **The Basic**: If you want something small just copy [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim) into your ~/.vimrc and you will have a good basic setup +* **The Awesome**: Includes a ton of useful plugins, color schemes and configurations -I would of course recommend using the awesome version.c +I would of course recommend using the awesome version. ## How to install the Awesome version? -The awesome version includes a lot of great plugins, configurations and color schemes that make Vim a lot better. To install it simply do following: +The awesome version includes a lot of great plugins, configurations and color schemes that make Vim a lot better. To install it simply do following from your terminal: git clone https://github.com/amix/vimrc.git ~/.vim_runtime sh ~/.vim_runtime/install_awesome_vimrc.sh -I also recommend using [Source Code Pro font from Adobe](https://typekit.com/fonts/source-code-pro) (it's free and awesome font for writing and programming). The Awesome vimrc is already setup to try to use it +I also recommend using [the Hack font](http://sourcefoundry.org/hack/) (it's free and awesome font designed for source code). The Awesome vimrc is already setup to try to use it. ## How to install the Basic version? -The basic version is basically just one file and no plugins. You can check out [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim). +The basic version is basically just one file and no plugins. Simply copy [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim) and paste it into your vimrc. This is useful to install on remote servers where you don't need many plugins and you don't do many edits. @@ -67,25 +67,24 @@ Distraction free mode using [goyo.vim](https://github.com/junegunn/goyo.vim) and I recommend reading the docs of these plugins to understand them better. Each of them provide a much better Vim experience! -* [pathogen.vim](https://github.com/tpope/vim-pathogen): Manages the runtime path of the plugins -* [snipMate.vim](https://github.com/garbas/vim-snipmate): snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim -* [bufexplorer.zip](https://github.com/vim-scripts/bufexplorer.zip): Buffer Explorer / Browser. This plugin can be opened with `<leader+o>` +* [ag.vim](https://github.com/rking/ag.vim): Vim plugin for `the_silver_searcher` (ag) -- a wicked fast grep +* [bufexplorer.zip](https://github.com/vim-scripts/bufexplorer.zip): Quickly and easily switch between buffers. This plugin can be opened with `<leader+o>` +* [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim): Fuzzy file, buffer, mru and tag finder. It's mapped to `<Ctrl+F>` +* [goyo.vim](https://github.com/junegunn/goyo.vim) and [vim-zenroom2](https://github.com/amix/vim-zenroom2): +* [lightline.vim](https://github.com/itchyny/lightline.vim): A light and configurable statusline/tabline for Vim * [NERD Tree](https://github.com/scrooloose/nerdtree): A tree explorer plugin for vim -* [ack.vim](https://github.com/mileszs/ack.vim): Vim plugin for the Perl module / CLI script 'ack' -* [ag.vim](https://github.com/rking/ag.vim): A much faster Ack -* [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim): Fuzzy file, buffer, mru and tag finder. It's mapped to `<Ctrl+F>`, because `<Ctrl+P>` is used by YankRing * [mru.vim](https://github.com/vim-scripts/mru.vim): Plugin to manage Most Recently Used (MRU) files. This plugin can be opened with `<leader+f>` * [open_file_under_cursor.vim](https://github.com/amix/open_file_under_cursor.vim): Open file under cursor when pressing `gf` +* [pathogen.vim](https://github.com/tpope/vim-pathogen): Manage your vim runtimepath +* [snipmate.vim](https://github.com/garbas/vim-snipmate): snipmate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim +* [syntastic](https://github.com/scrooloose/syntastic): Syntax checking hacks for vim +* [vim-commentary](https://github.com/tpope/vim-commentary): Comment stuff out. Use `gcc` to comment out a line (takes a count), `gc` to comment out the target of a motion. `gcu` uncomments a set of adjacent commented lines. +* [vim-expand-region](https://github.com/terryma/vim-expand-region): Allows you to visually select increasingly larger regions of text using the same key combination +* [vim-fugitive](https://github.com/tpope/vim-fugitive): A Git wrapper so awesome, it should be illegal * [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts * [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors): Sublime Text style multiple selections for Vim, CTRL+N is remapped to CTRL+S (due to YankRing) -* [vim-expand-region](https://github.com/terryma/vim-expand-region): Allows you to visually select increasingly larger regions of text using the same key combination. -* [vim-fugitive](https://github.com/tpope/vim-fugitive): A Git wrapper so awesome, it should be illegal -* [goyo.vim](https://github.com/junegunn/goyo.vim) and [vim-zenroom2](https://github.com/amix/vim-zenroom2): -Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room [Read more here](http://amix.dk/blog/post/19744) -* [vim-commentary](https://github.com/tpope/vim-commentary): Comment stuff out. Use `gcc` to comment out a line (takes a count), `gc` to comment out the target of a motion. `gcu` uncomments a set of adjacent commented lines. -* [syntastic](https://github.com/scrooloose/syntastic): Syntax checking hacks for vim * [vim-yankstack](https://github.com/maxbrunsfeld/vim-yankstack): Maintains a history of previous yanks, changes and deletes -* [lightline.vim](https://github.com/itchyny/lightline.vim): A light and configurable statusline/tabline for Vim +Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room [Read more here](http://amix.dk/blog/post/19744) ## Included color schemes @@ -115,13 +114,11 @@ After you have installed the setup you can create **~/.vim_runtime/my_configs.vi map <leader>ct :cd ~/Desktop/Todoist/todoist<cr> map <leader>cw :cd ~/Desktop/Wedoist/wedoist<cr> -You can also install your own plugins, for instance, via pathogen we can install [vim-rails](https://github.com/tpope/vim-rails): +You can also install your own plugins, for instance, via pathogen you can install [vim-rails](https://github.com/tpope/vim-rails): cd ~/.vim_runtime git clone git://github.com/tpope/vim-rails.git sources_non_forked/vim-rails -Now you have vim-rails installed ;-) - ## Key Mappings @@ -195,13 +192,9 @@ Switch CWD to the directory of the open buffer: map <leader>cd :cd %:p:h<cr>:pwd<cr> -Open vimgrep and put the cursor in the right position: +Open `ag.vim` and put the cursor in the right position: - map <leader>g :vimgrep // **/*.<left><left><left><left><left><left><left> - -Vimgreps in the current file: - - map <leader><space> :vimgrep // <C-R>%<C-A><right><right><right><right><right><right><right><right><right> + map <leader>g :Ag Remove the Windows ^M - when the encodings gets messed up: @@ -240,9 +233,9 @@ Visual mode pressing `*` or `#` searches for the current selection: vnoremap <silent> * :call VisualSelection('f')<CR> vnoremap <silent> # :call VisualSelection('b')<CR> -When you press gv you vimgrep after the selected text: +When you press gv you `ag.vim` after the selected text: - vnoremap <silent> gv :call VisualSelection('gv')<CR> + vnoremap <silent> gv :call VisualSelection('gv', '')<CR> When you press `<leader>r` you can search and replace the selected text: @@ -273,7 +266,7 @@ Bash like keys for the command line: cnoremap <C-P> <Up> cnoremap <C-N> <Down> -Write the file as sudo (only on Unix). Super useful when you open a file and you don't have permissions to save your changes. [Vim tip](http://vim.wikia.com/wiki/Su-write): +Write the file as sudo (works only on Unix). Super useful when you open a file and you don't have permissions to save your changes. [Vim tip](http://vim.wikia.com/wiki/Su-write): :W @@ -293,7 +286,7 @@ Shortcuts using `<leader>` instead of special chars ### Cope Do :help cope if you are unsure what cope is. It's super useful! -When you search with vimgrep, display your results in cope by doing: +When you search with `ag.vim`, display your results in cope by doing: `<leader>cc` To go to the next search result do: @@ -313,5 +306,3 @@ Vimscript mappings: Do following: * Remove `~/.vim_runtime` * Remove any lines that reference `.vim_runtime` in your `~/.vimrc` - - From 50ae0a55f681bf46eeb3ec0da9cbf92f49bcc3dc Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 13:19:43 +0200 Subject: [PATCH 206/254] Removed ack.vim --- sources_non_forked/ack.vim/.gitignore | 1 - sources_non_forked/ack.vim/LICENSE | 89 ----- sources_non_forked/ack.vim/README.md | 161 --------- sources_non_forked/ack.vim/autoload/ack.vim | 246 -------------- sources_non_forked/ack.vim/doc/ack.txt | 315 ------------------ .../ack.vim/doc/ack_quick_help.txt | 15 - sources_non_forked/ack.vim/ftplugin/qf.vim | 9 - sources_non_forked/ack.vim/plugin/ack.vim | 83 ----- update_plugins.py | 1 - 9 files changed, 920 deletions(-) delete mode 100644 sources_non_forked/ack.vim/.gitignore delete mode 100644 sources_non_forked/ack.vim/LICENSE delete mode 100644 sources_non_forked/ack.vim/README.md delete mode 100644 sources_non_forked/ack.vim/autoload/ack.vim delete mode 100644 sources_non_forked/ack.vim/doc/ack.txt delete mode 100644 sources_non_forked/ack.vim/doc/ack_quick_help.txt delete mode 100644 sources_non_forked/ack.vim/ftplugin/qf.vim delete mode 100644 sources_non_forked/ack.vim/plugin/ack.vim diff --git a/sources_non_forked/ack.vim/.gitignore b/sources_non_forked/ack.vim/.gitignore deleted file mode 100644 index 6e92f57d..00000000 --- a/sources_non_forked/ack.vim/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tags diff --git a/sources_non_forked/ack.vim/LICENSE b/sources_non_forked/ack.vim/LICENSE deleted file mode 100644 index 056ea36c..00000000 --- a/sources_non_forked/ack.vim/LICENSE +++ /dev/null @@ -1,89 +0,0 @@ -ack.vim is distributed under the same license terms as Vim itself, which you -can find in full with `:help license` within Vim, or copied in full herein. - -Copyright (c) 2007-2015 Antoine Imbert <antoine.imbert+ackvim@gmail.com> - and contributors. - -Maintainers may be contacted via GitHub Issues at: - - https://github.com/mileszs/ack.vim/issues - - -VIM LICENSE - -I) There are no restrictions on distributing unmodified copies of Vim except - that they must include this license text. You can also distribute - unmodified parts of Vim, likewise unrestricted except that they must - include this license text. You are also allowed to include executables - that you made from the unmodified Vim sources, plus your own usage - examples and Vim scripts. - -II) It is allowed to distribute a modified (or extended) version of Vim, - including executables and/or source code, when the following four - conditions are met: - 1) This license text must be included unmodified. - 2) The modified Vim must be distributed in one of the following five ways: - a) If you make changes to Vim yourself, you must clearly describe in - the distribution how to contact you. When the maintainer asks you - (in any way) for a copy of the modified Vim you distributed, you - must make your changes, including source code, available to the - maintainer without fee. The maintainer reserves the right to - include your changes in the official version of Vim. What the - maintainer will do with your changes and under what license they - will be distributed is negotiable. If there has been no negotiation - then this license, or a later version, also applies to your changes. - The current maintainer is Bram Moolenaar <Bram@vim.org>. If this - changes it will be announced in appropriate places (most likely - vim.sf.net, www.vim.org and/or comp.editors). When it is completely - impossible to contact the maintainer, the obligation to send him - your changes ceases. Once the maintainer has confirmed that he has - received your changes they will not have to be sent again. - b) If you have received a modified Vim that was distributed as - mentioned under a) you are allowed to further distribute it - unmodified, as mentioned at I). If you make additional changes the - text under a) applies to those changes. - c) Provide all the changes, including source code, with every copy of - the modified Vim you distribute. This may be done in the form of a - context diff. You can choose what license to use for new code you - add. The changes and their license must not restrict others from - making their own changes to the official version of Vim. - d) When you have a modified Vim which includes changes as mentioned - under c), you can distribute it without the source code for the - changes if the following three conditions are met: - - The license that applies to the changes permits you to distribute - the changes to the Vim maintainer without fee or restriction, and - permits the Vim maintainer to include the changes in the official - version of Vim without fee or restriction. - - You keep the changes for at least three years after last - distributing the corresponding modified Vim. When the maintainer - or someone who you distributed the modified Vim to asks you (in - any way) for the changes within this period, you must make them - available to him. - - You clearly describe in the distribution how to contact you. This - contact information must remain valid for at least three years - after last distributing the corresponding modified Vim, or as long - as possible. - e) When the GNU General Public License (GPL) applies to the changes, - you can distribute the modified Vim under the GNU GPL version 2 or - any later version. - 3) A message must be added, at least in the output of the ":version" - command and in the intro screen, such that the user of the modified Vim - is able to see that it was modified. When distributing as mentioned - under 2)e) adding the message is only required for as far as this does - not conflict with the license used for the changes. - 4) The contact information as required under 2)a) and 2)d) must not be - removed or changed, except that the person himself can make - corrections. - -III) If you distribute a modified version of Vim, you are encouraged to use - the Vim license for your changes and make them available to the - maintainer, including the source code. The preferred way to do this is - by e-mail or by uploading the files to a server and e-mailing the URL. - If the number of changes is small (e.g., a modified Makefile) e-mailing a - context diff will do. The e-mail address to be used is - <maintainer@vim.org> - -IV) It is not allowed to remove this license from the distribution of the Vim - sources, parts of it or from a modified version. You may use this - license for previous Vim releases instead of the license that they came - with, at your option. diff --git a/sources_non_forked/ack.vim/README.md b/sources_non_forked/ack.vim/README.md deleted file mode 100644 index af8f522d..00000000 --- a/sources_non_forked/ack.vim/README.md +++ /dev/null @@ -1,161 +0,0 @@ -# ack.vim - -Run your favorite search tool from Vim, with an enhanced results list. - -This plugin was designed as a Vim frontend for the Perl module [App::Ack]. Ack -can be used as a replacement for 99% of the uses of _grep_. The plugin allows -you to run ack from Vim, and shows the results in a split window. - -But here's a little secret for the Vim-seasoned: it's just a light wrapper for -Vim's [grepprg] and the [quickfix] window for match results. This makes it easy -to integrate with your own Vim configuration and use existing knowledge of core -features. It also means the plugin is flexible to use with other search tools. - -[App::Ack]: http://search.cpan.org/~petdance/ack/ack -[grepprg]: http://vimdoc.sourceforge.net/htmldoc/options.html#'grepprg' -[quickfix]: http://vimdoc.sourceforge.net/htmldoc/quickfix.html#quickfix - -## Installation - -### Ack - -You will need ack (>= 2.0), of course. To install it follow the -[manual](http://beyondgrep.com/install/). - -### The Plugin - -It is recommended to use one of the popular plugin managers for Vim. There are -many and you probably already have a preferred one, but a few examples for your -copy-and-paste convenience: - -#### Pathogen - - $ git clone https://github.com/mileszs/ack.vim.git ~/.vim/bundle/ack.vim - -#### Vundle - -```vim -Plugin 'mileszs/ack.vim' -``` - -#### NeoBundle - -```vim -NeoBundle 'mileszs/ack.vim' -``` - -#### Manual (not recommended) - -[Download][releases] the plugin and extract it in `~/.vim/` (or -`%PROGRAMFILES%/Vim/vimfiles` on Windows). - -[zipball]: https://github.com/mileszs/ack.vim/archive/master.zip - -## Usage - - :Ack [options] {pattern} [{directories}] - -Search recursively in `{directories}` (which defaults to the current directory) -for the `{pattern}`. - -Files containing the search term will be listed in the quickfix window, along -with the line number of the occurrence, once for each occurrence. `<Enter>` on -a line in this window will open the file, and place the cursor on the matching -line. - -Just like where you use `:grep`, `:grepadd`, `:lgrep`, and :`lgrepadd`, you can -use `:Ack`, `:AckAdd`, `:LAck`, and `:LAckAdd` respectively. (See `:help Ack` -after installing, or [`doc/ack.txt`][doc] in the repo, for more information.) - -For more ack help see [ack documentation](http://beyondgrep.com/documentation/). - -[doc]: https://github.com/mileszs/ack.vim/blob/master/doc/ack.txt - -### Keyboard Shortcuts - -The quickfix results window is augmented with these convenience mappings: - - ? a quick summary of these keys, repeat to close - o to open (same as Enter) - O to open and close the quickfix window - go to preview file, open but maintain focus on ack.vim results - t to open in new tab - T to open in new tab without moving to it - h to open in horizontal split - H to open in horizontal split, keeping focus on the results - v to open in vertical split - gv to open in vertical split, keeping focus on the results - q to close the quickfix window - -### Gotchas - -Some characters have special meaning, and need to be escaped in your search -pattern. For instance, `#`. You need to escape it with `:Ack '\\\#define -foo'` to search for '#define foo'. See [issue #5]. - -[issue #5]: https://github.com/mileszs/ack.vim/issues/5 - -## Possibly FAQ - -#### Can I use `ag` ([The Silver Searcher]) with this? - -Absolutely, and probably other tools if their output is similar or you can -write a pattern match for it--just set `g:ackprg`. If you like, you can fall -back to Ack in case you use your vimrc on a system without Ag available: - -```vim -if executable('ag') - let g:ackprg = 'ag --vimgrep' -endif -``` - -Since Ack is quite portable you might check a copy of it into your dotfiles -repository in `~/bin` so you'll nearly always have it available. - -#### What's the difference from ag.vim? - -Well... not a lot really. - -Present maintainer, yours truly, [kind of wishes they never forked][sadface], -contributes to both, and wouldn't mind seeing them merged again. ag.vim got a -nice code clean-up (which ack.vim is now hopefully getting), and ack.vim picked -up a few features that haven't made their way to ag.vim, like `:AckWindow`, -optional background search execution with [vim-dispatch], and auto-previewing. - -#### I don't want to jump to the first result automatically. #### - -Use `:Ack!`, with bang. If you want this behavior most of the time, you might -like an abbreviation or mapping in your personal config, something like these: - -```vim -cnoreabbrev Ack Ack! -nnoremap <Leader>a :Ack!<Space> -``` - -Most of the `:[L]Ack*` commands support this. Note that this behavior follows -the convention of Vim's built-in `:grep` and `:make` commands. - -[The Silver Searcher]: https://github.com/ggreer/the_silver_searcher -[sadface]: https://github.com/mileszs/ack.vim/commit/d97090fb502d40229e6976dfec0e06636ba227d5#commitcomment-5771145 - -## Changelog - -Please see [the Github releases page][releases]. - -## Credits - -This plugin is derived from Antoine Imbert's blog post [Ack and Vim -Integration][] (in particular, the function in the update to the post). [Miles -Sterrett][mileszs] packaged it up as a plugin and documented it in Vim's help -format, and since then [many contributors][contributors] have submitted -enhancements and fixes. - -And of course, where would we be without [Ack]. And, you know, Vim. - -[Ack and Vim Integration]: http://blog.ant0ine.com/typepad/2007/03/ack-and-vim-integration.html -[mileszs]: https://github.com/mileszs -[contributors]: https://github.com/mileszs/ack.vim/graphs/contributors -[Ack]: http://beyondgrep.com/ - -[vim-dispatch]: https://github.com/tpope/vim-dispatch -[releases]: https://github.com/mileszs/ack.vim/releases diff --git a/sources_non_forked/ack.vim/autoload/ack.vim b/sources_non_forked/ack.vim/autoload/ack.vim deleted file mode 100644 index dbf84572..00000000 --- a/sources_non_forked/ack.vim/autoload/ack.vim +++ /dev/null @@ -1,246 +0,0 @@ -if exists('g:autoloaded_ack') || &cp - finish -endif - -if exists('g:ack_use_dispatch') - if g:ack_use_dispatch && !exists(':Dispatch') - call s:Warn('Dispatch not loaded! Falling back to g:ack_use_dispatch = 0.') - let g:ack_use_dispatch = 0 - endif -else - let g:ack_use_dispatch = 0 -endif - -"----------------------------------------------------------------------------- -" Public API -"----------------------------------------------------------------------------- - -function! ack#Ack(cmd, args) "{{{ - call s:Init(a:cmd) - redraw - - " Local values that we'll temporarily set as options when searching - let l:grepprg = g:ackprg - let l:grepformat = '%f:%l:%c:%m,%f:%l:%m' " Include column number - - " Strip some options that are meaningless for path search and set match - " format accordingly. - if s:SearchingFilepaths() - let l:grepprg = substitute(l:grepprg, '-H\|--column', '', 'g') - let l:grepformat = '%f' - endif - - " Check user policy for blank searches - if empty(a:args) - if !g:ack_use_cword_for_empty_search - echo "No regular expression found." - return - endif - endif - - " If no pattern is provided, search for the word under the cursor - let l:grepargs = empty(a:args) ? expand("<cword>") : a:args . join(a:000, ' ') - - "Bypass search if cursor is on blank string - if l:grepargs == "" - echo "No regular expression found." - return - endif - - " NOTE: we escape special chars, but not everything using shellescape to - " allow for passing arguments etc - let l:escaped_args = escape(l:grepargs, '|#%') - - echo "Searching ..." - - if g:ack_use_dispatch - call s:SearchWithDispatch(l:grepprg, l:escaped_args, l:grepformat) - else - call s:SearchWithGrep(a:cmd, l:grepprg, l:escaped_args, l:grepformat) - endif - - " Dispatch has no callback mechanism currently, we just have to display the - " list window early and wait for it to populate :-/ - call ack#ShowResults() - call s:Highlight(l:grepargs) -endfunction "}}} - -function! ack#AckFromSearch(cmd, args) "{{{ - let search = getreg('/') - " translate vim regular expression to perl regular expression. - let search = substitute(search, '\(\\<\|\\>\)', '\\b', 'g') - call ack#Ack(a:cmd, '"' . search . '" ' . a:args) -endfunction "}}} - -function! ack#AckHelp(cmd, args) "{{{ - let args = a:args . ' ' . s:GetDocLocations() - call ack#Ack(a:cmd, args) -endfunction "}}} - -function! ack#AckWindow(cmd, args) "{{{ - let files = tabpagebuflist() - - " remove duplicated filenames (files appearing in more than one window) - let files = filter(copy(sort(files)), 'index(files,v:val,v:key+1)==-1') - call map(files, "bufname(v:val)") - - " remove unnamed buffers as quickfix (empty strings before shellescape) - call filter(files, 'v:val != ""') - - " expand to full path (avoid problems with cd/lcd in au QuickFixCmdPre) - let files = map(files, "shellescape(fnamemodify(v:val, ':p'))") - let args = a:args . ' ' . join(files) - - call ack#Ack(a:cmd, args) -endfunction "}}} - -function! ack#ShowResults() "{{{ - let l:handler = s:UsingLocList() ? g:ack_lhandler : g:ack_qhandler - execute l:handler - call s:ApplyMappings() - redraw! -endfunction "}}} - -"----------------------------------------------------------------------------- -" Private API -"----------------------------------------------------------------------------- - -function! s:ApplyMappings() "{{{ - if !s:UsingListMappings() || &filetype != 'qf' - return - endif - - let l:wintype = s:UsingLocList() ? 'l' : 'c' - let l:closemap = ':' . l:wintype . 'close<CR>' - let g:ack_mappings.q = l:closemap - - nnoremap <buffer> <silent> ? :call <SID>QuickHelp()<CR> - - if g:ack_autoclose - " We just map the 'go' and 'gv' mappings to close on autoclose, wtf? - for key_map in items(g:ack_mappings) - execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1) . l:closemap) - endfor - - execute "nnoremap <buffer> <silent> <CR> <CR>" . l:closemap - else - for key_map in items(g:ack_mappings) - execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1)) - endfor - endif - - if exists("g:ackpreview") " if auto preview in on, remap j and k keys - nnoremap <buffer> <silent> j j<CR><C-W><C-W> - nnoremap <buffer> <silent> k k<CR><C-W><C-W> - nmap <buffer> <silent> <Down> j - nmap <buffer> <silent> <Up> k - endif -endfunction "}}} - -function! s:GetDocLocations() "{{{ - let dp = '' - for p in split(&rtp, ',') - let p = p . '/doc/' - if isdirectory(p) - let dp = p . '*.txt ' . dp - endif - endfor - - return dp -endfunction "}}} - -function! s:Highlight(args) "{{{ - if !g:ackhighlight - return - endif - - let @/ = matchstr(a:args, "\\v(-)\@<!(\<)\@<=\\w+|['\"]\\zs.{-}\\ze['\"]") - call feedkeys(":let &hlsearch=1 \| echo \<CR>", "n") -endfunction "}}} - -" Initialize state for an :Ack* or :LAck* search -function! s:Init(cmd) "{{{ - let s:searching_filepaths = (a:cmd =~# '-g$') ? 1 : 0 - let s:using_loclist = (a:cmd =~# '^l') ? 1 : 0 - - if g:ack_use_dispatch && s:using_loclist - call s:Warn('Dispatch does not support location lists! Proceeding with quickfix...') - let s:using_loclist = 0 - endif -endfunction "}}} - -function! s:QuickHelp() "{{{ - execute 'edit' globpath(&rtp, 'doc/ack_quick_help.txt') - - silent normal gg - setlocal buftype=nofile bufhidden=hide nobuflisted - setlocal nomodifiable noswapfile - setlocal filetype=help - setlocal nonumber norelativenumber nowrap - setlocal foldmethod=diff foldlevel=20 - - nnoremap <buffer> <silent> ? :q!<CR>:call ack#ShowResults()<CR> -endfunction "}}} - -function! s:SearchWithDispatch(grepprg, grepargs, grepformat) "{{{ - let l:makeprg_bak = &l:makeprg - let l:errorformat_bak = &l:errorformat - - " We don't execute a :grep command for Dispatch, so add -g here instead - if s:SearchingFilepaths() - let l:grepprg = a:grepprg . ' -g' - else - let l:grepprg = a:grepprg - endif - - try - let &l:makeprg = l:grepprg . ' ' . a:grepargs - let &l:errorformat = a:grepformat - - Make - finally - let &l:makeprg = l:makeprg_bak - let &l:errorformat = l:errorformat_bak - endtry -endfunction "}}} - -function! s:SearchWithGrep(grepcmd, grepprg, grepargs, grepformat) "{{{ - let l:grepprg_bak = &l:grepprg - let l:grepformat_bak = &grepformat - - try - let &l:grepprg = a:grepprg - let &grepformat = a:grepformat - - silent execute a:grepcmd a:grepargs - finally - let &l:grepprg = l:grepprg_bak - let &grepformat = l:grepformat_bak - endtry -endfunction "}}} - -" Are we finding matching files, not lines? (the -g option -- :AckFile) -function! s:SearchingFilepaths() "{{{ - return get(s:, 'searching_filepaths', 0) -endfunction "}}} - -" Predicate for whether mappings are enabled for list type of current search. -function! s:UsingListMappings() "{{{ - if s:UsingLocList() - return g:ack_apply_lmappings - else - return g:ack_apply_qmappings - endif -endfunction "}}} - -" Were we invoked with a :LAck command? -function! s:UsingLocList() "{{{ - return get(s:, 'using_loclist', 0) -endfunction "}}} - -function! s:Warn(msg) "{{{ - echohl WarningMsg | echomsg 'Ack: ' . a:msg | echohl None -endf "}}} - -let g:autoloaded_ack = 1 -" vim:set et sw=2 ts=2 tw=78 fdm=marker diff --git a/sources_non_forked/ack.vim/doc/ack.txt b/sources_non_forked/ack.vim/doc/ack.txt deleted file mode 100644 index 22e884bc..00000000 --- a/sources_non_forked/ack.vim/doc/ack.txt +++ /dev/null @@ -1,315 +0,0 @@ -*ack.txt* Plugin that integrates ack with Vim - -============================================================================== -Author: Antoine Imbert <antoine.imbert+ackvim@gmail.com> *ack-author* -License: Same terms as Vim itself (see |license|) - -This plugin is only available if 'compatible' is not set. - -{Vi does not have any of this} - -============================================================================== -INTRODUCTION *ack* - -This plugin is a front for the Perl module App::Ack. Ack can be used as a -replacement for grep. This plugin will allow you to run ack from vim, and -shows the results in a split window. - -:Ack[!] [options] {pattern} [{directory}] *:Ack* - - Search recursively in {directory} (which defaults to the current - directory) for the {pattern}. Behaves just like the |:grep| command, but - will open the |Quickfix| window for you. If [!] is not given the first - occurrence is jumped to. - -:AckAdd [options] {pattern} [{directory}] *:AckAdd* - - Just like |:Ack|, but instead of making a new list, the matches are - appended to the current |quickfix| list. - -:AckFromSearch [{directory}] *:AckFromSearch* - - Just like |:Ack| but the pattern is from previous search. - -:LAck [options] {pattern} [{directory}] *:LAck* - - Just like |:Ack| but instead of the |quickfix| list, matches are placed in - the current |location-list|. - -:LAckAdd [options] {pattern} [{directory}] *:LAckAdd* - - Just like |:AckAdd| but instead of the |quickfix| list, matches are added - to the current |location-list| - -:AckFile [options] {pattern} [{directory}] *:AckFile* - - Search recursively in {directory} (which defaults to the current - directory) for filenames matching the {pattern}. Behaves just like the - |:grep| command, but will open the |Quickfix| window for you. - -:AckHelp[!] [options] {pattern} *:AckHelp* - - Search vim documentation files for the {pattern}. Behaves just like the - |:Ack| command, but searches only vim documentation .txt files - -:LAckHelp [options] {pattern} *:LAckHelp* - - Just like |:AckHelp| but instead of the |quickfix| list, matches are placed - in the current |location-list|. - -:AckWindow[!] [options] {pattern} *:AckWindow* - - Search all buffers visible in the screen (current tab page only) files for - the {pattern}. - -:LAckWindow [options] {pattern} *:LAckWindow* - - Just like |:AckWindow| but instead of the |quickfix| list, matches are - placed in the current |location-list|. - -Files containing the search term will be listed in the split window, along -with the line number of the occurrence, once for each occurrence. <Enter> on -a line in this window will open the file, and place the cursor on the matching -line. - -Note that if you are using Dispatch.vim with |g:ack_use_dispatch|, location -lists are not supported, because Dispatch does not support them at this time. -`:LAck` versions of commands above will give a warning and proceed to use the -quickfix list instead. - -See http://beyondgrep.com/ for more information on searching with ack. - - -============================================================================== -CONFIGURATION *ack-configuration* - - *g:ackprg* -g:ackprg -Default for ubuntu: "ack-grep" -Default for other systems: "ack" - -Use this option to specify the search command and its default arguments. - -Example: -> - let g:ackprg = "ag --vimgrep" -< - *g:ack_default_options* -g:ack_default_options -Default: " -s -H --nocolor --nogroup --column" - -Use this option to specify the default arguments given to `ack`. This is only -used if |g:ackprg| has not been customized from the default--if you are using -a custom search program instead of Ack, set your preferred options in -|g:ackprg|. - -NOTE: This option may be deprecated in the future. ~ - -Example: -> - let g:ack_default_options = - \ " -s -H --nocolor --nogroup --column --smart-case --follow" -< - *g:ack_apply_qmappings* -g:ack_apply_qmappings -Default: 1 - -This option enables mappings on the |quickfix| window. - - *g:ack_apply_lmappings* -g:ack_apply_lmappings -Default: 1 - -This option enables mappings on |location-list| windows. - - *g:ack_mappings* -g:ack_mappings -Default: { - \ "t": "<C-W><CR><C-W>T", - \ "T": "<C-W><CR><C-W>TgT<C-W>j", - \ "o": "<CR>", - \ "O": "<CR><C-W><C-W>:ccl<CR>", - \ "go": "<CR><C-W>j", - \ "h": "<C-W><CR><C-W>K", - \ "H": "<C-W><CR><C-W>K<C-W>b", - \ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t", - \ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" } - -This option list all maps create on quickfix/Location list window. - -Example, if you want to open the result in the middle of the screen: -> - let g:ack_mappings = { "o": "<CR>zz" } -< - *g:ack_qhandler* -g:ack_qhandler -Default: "botright copen" - -Command to open the quickview window. - -If you want to open a quickview window with 30 lines you can do: -> - let g:ack_qhandler = "botright copen 30" -< - *g:ack_lhandler* -g:ack_lhandler -Default: "botright lopen" - -Command to open the Location list window. - -If you want to open a Location list window with 30 lines you can do: -> - let g:ack_lhandler = "botright lopen 30" -< - *g:ackhighlight* -g:ackhighlight -Default: 0 - -Use this option to highlight the searched term. - -Example: -> - let g:ackhighlight = 1 -< - *g:ack_autoclose* -g:ack_autoclose -Default: 0 - -Use this option to specify whether to close the quickfix window after -using any of the shortcuts. - -Example: -> - let g:ack_autoclose = 1 -< - *g:ack_autofold_results* -g:ack_autofold_results -Default: 0 - -Use this option to fold the results in quickfix by file name. Only the current -fold will be open by default and while you press 'j' and 'k' to move between the -results if you hit other fold the last one will be closed and the current will -be open. - -Example: -> - let g:ack_autofold_results = 1 -< - *g:ackpreview* -g:ackpreview -Default: 0 - -Use this option to automagically open the file with 'j' or 'k'. - -Example: -> - let g:ackpreview = 1 -< - *g:ack_use_dispatch* -g:ack_use_dispatch -Default: 0 - -Use this option to use vim-dispatch to run searches in the background, with a -variety of execution backends for different systems. - -Due to limitations in Dispatch at this time, location lists are unsupported -and result windows will appear before results are ready. Still, these may be -acceptable tradeoffs for very large projects where searches are slow. - -Example: -> - let g:ack_use_dispatch = 1 -< - *g:ack_use_cword_for_empty_search* -g:ack_use_cword_for_empty_search -Default: 1 - -Use this option to enable blank searches to run against the word under the -cursor. When this option is not set, blank searches will only output an error -message. - -Example: -> - let g:ack_use_cword_for_empty_search = 0 -< -============================================================================== -MAPPINGS *ack-mappings* - -The following keyboard shortcuts are available in the |quickfix| and -|location-list| windows: - -? display a quick summary of these mappings. - -o open file (same as Enter). - -O open file and close the quickfix window. - -go preview file (open but maintain focus on ack.vim results). - -t open in a new tab. - -T open in new tab without moving to it. - -h open in horizontal split. - -H open in horizontal split, keeping focus on the results. - -v open in vertical split. - -gv open in vertical split, keeping focus on the results. - -q close the quickfix window. - -To adjust these, see |g:ack_mappings|. - -============================================================================== -Ignoring files *ack-ignore* - -If you're using this plugin with ag, The Silver Searcher, bear in mind that: - - - It ignores file patterns from your .gitignore and .hgignore. - - - If there are other files in your source repository you don't wish to - search, you can add their patterns to an .agignore file. - -============================================================================== -ISSUES AND FAQ *ack-issues-and-faq* - -I don't want to jump to the first result automatically.~ - - Use `:Ack!`, with bang. If you want this behavior most of the time, you - might like an abbreviation or mapping in your personal config, something - like these: -> - cnoreabbrev Ack Ack! - nnoremap <Leader>a :Ack!<Space> -< - Most of the `:[L]Ack*` commands support this. Note that this behavior - follows the convention of Vim's built-in |:grep| and |:make| commands. - -I use NERDTree and opening ack.vim results in a vertical split displacing it.~ - - You are probably using NERDTree with its default alignment at the left - side of the window. Set these custom mappings in your vimrc to work around - this: -> - let g:ack_mappings = { - \ 'v': '<C-W><CR><C-W>L<C-W>p<C-W>J<C-W>p', - \ 'gv': '<C-W><CR><C-W>L<C-W>p<C-W>J' } -< - This solution will be improved in the future. - -Results show a mix of relative and absolute paths, making them hard to read.~ - - This is a quirk of Vim that can happen with plain |:vimgrep| too. You can - try this in your vimrc to work around it: -> - autocmd BufAdd * exe "cd" fnameescape(getcwd()) -< - but for some users this may be disruptive to their Vim workflow. For more - details, see: - - http://vi.stackexchange.com/a/4816/7174 - https://github.com/mileszs/ack.vim/issues/143 - -vim:set et sw=4 ts=4 tw=78: diff --git a/sources_non_forked/ack.vim/doc/ack_quick_help.txt b/sources_non_forked/ack.vim/doc/ack_quick_help.txt deleted file mode 100644 index 94306a0e..00000000 --- a/sources_non_forked/ack.vim/doc/ack_quick_help.txt +++ /dev/null @@ -1,15 +0,0 @@ -==== ack.vim quick help =============== - - *?:* a quick summary of these keys, repeat to close - *o:* to open (same as Enter) - *O:* to open and close the quickfix window - *go:* to preview file, open but maintain focus on ack.vim results - *t:* to open in new tab - *T:* to open in new tab without moving to it - *h:* to open in horizontal split - *H:* to open in horizontal split, keeping focus on the results - *v:* to open in vertical split - *gv:* to open in vertical split, keeping focus on the results - *q:* to close the quickfix window - -======================================== diff --git a/sources_non_forked/ack.vim/ftplugin/qf.vim b/sources_non_forked/ack.vim/ftplugin/qf.vim deleted file mode 100644 index 27564fa7..00000000 --- a/sources_non_forked/ack.vim/ftplugin/qf.vim +++ /dev/null @@ -1,9 +0,0 @@ -if exists("g:ack_autofold_results") && g:ack_autofold_results - setlocal foldlevel=0 - setlocal foldmethod=expr - setlocal foldexpr=matchstr(getline(v:lnum),'^[^\|]\\+')==#matchstr(getline(v:lnum+1),'^[^\|]\\+')?1:'<1' - setlocal foldenable - setlocal foldclose=all - setlocal foldopen=all - nnoremap <buffer> j jzz -endif diff --git a/sources_non_forked/ack.vim/plugin/ack.vim b/sources_non_forked/ack.vim/plugin/ack.vim deleted file mode 100644 index 202ae2ea..00000000 --- a/sources_non_forked/ack.vim/plugin/ack.vim +++ /dev/null @@ -1,83 +0,0 @@ -if exists('g:loaded_ack') || &cp - finish -endif - -if !exists("g:ack_default_options") - let g:ack_default_options = " -s -H --nopager --nocolor --nogroup --column" -endif - -" Location of the ack utility -if !exists("g:ackprg") - if executable('ack-grep') - let g:ackprg = "ack-grep" - elseif executable('ack') - let g:ackprg = "ack" - else - finish - endif - let g:ackprg .= g:ack_default_options -endif - -if !exists("g:ack_apply_qmappings") - let g:ack_apply_qmappings = !exists("g:ack_qhandler") -endif - -if !exists("g:ack_apply_lmappings") - let g:ack_apply_lmappings = !exists("g:ack_lhandler") -endif - -let s:ack_mappings = { - \ "t": "<C-W><CR><C-W>T", - \ "T": "<C-W><CR><C-W>TgT<C-W>j", - \ "o": "<CR>", - \ "O": "<CR><C-W>p<C-W>c", - \ "go": "<CR><C-W>p", - \ "h": "<C-W><CR><C-W>K", - \ "H": "<C-W><CR><C-W>K<C-W>b", - \ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t", - \ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" } - -if exists("g:ack_mappings") - let g:ack_mappings = extend(s:ack_mappings, g:ack_mappings) -else - let g:ack_mappings = s:ack_mappings -endif - -if !exists("g:ack_qhandler") - let g:ack_qhandler = "botright copen" -endif - -if !exists("g:ack_lhandler") - let g:ack_lhandler = "botright lopen" -endif - -if !exists("g:ackhighlight") - let g:ackhighlight = 0 -endif - -if !exists("g:ack_autoclose") - let g:ack_autoclose = 0 -endif - -if !exists("g:ack_autofold_results") - let g:ack_autofold_results = 0 -endif - -if !exists("g:ack_use_cword_for_empty_search") - let g:ack_use_cword_for_empty_search = 1 -endif - -command! -bang -nargs=* -complete=file Ack call ack#Ack('grep<bang>', <q-args>) -command! -bang -nargs=* -complete=file AckAdd call ack#Ack('grepadd<bang>', <q-args>) -command! -bang -nargs=* -complete=file AckFromSearch call ack#AckFromSearch('grep<bang>', <q-args>) -command! -bang -nargs=* -complete=file LAck call ack#Ack('lgrep<bang>', <q-args>) -command! -bang -nargs=* -complete=file LAckAdd call ack#Ack('lgrepadd<bang>', <q-args>) -command! -bang -nargs=* -complete=file AckFile call ack#Ack('grep<bang> -g', <q-args>) -command! -bang -nargs=* -complete=help AckHelp call ack#AckHelp('grep<bang>', <q-args>) -command! -bang -nargs=* -complete=help LAckHelp call ack#AckHelp('lgrep<bang>', <q-args>) -command! -bang -nargs=* AckWindow call ack#AckWindow('grep<bang>', <q-args>) -command! -bang -nargs=* LAckWindow call ack#AckWindow('lgrep<bang>', <q-args>) - -let g:loaded_ack = 1 - -" vim:set et sw=2 ts=2 tw=78 fdm=marker diff --git a/update_plugins.py b/update_plugins.py index 07116c96..9b364de9 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -16,7 +16,6 @@ from os import path #--- Globals ---------------------------------------------- PLUGINS = """ -ack.vim https://github.com/mileszs/ack.vim ag.vim https://github.com/rking/ag.vim bufexplorer https://github.com/corntrace/bufexplorer ctrlp.vim https://github.com/ctrlpvim/ctrlp.vim From 75beb5f4ba85c08f1179c1eeb97fcc01b5abf3c2 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 13:22:06 +0200 Subject: [PATCH 207/254] Updated vim plugins --- .../ctrlp.vim/autoload/ctrlp.vim | 3 +- sources_non_forked/ctrlp.vim/doc/ctrlp.txt | 2 +- sources_non_forked/goyo.vim/doc/goyo.txt | 170 ++++++++++++++++++ .../nerdtree/.github/ISSUE_TEMPLATE.md | 37 ++++ sources_non_forked/nerdtree/README.markdown | 4 +- .../autoload/syntastic/preprocess.vim | 29 +++ .../syntastic/doc/syntastic-checkers.txt | 112 ++++++------ .../syntastic/plugin/syntastic.vim | 2 +- .../syntastic/syntax_checkers/d/dscanner.vim | 48 +++++ .../syntax_checkers/dockerfile/hadolint.vim | 41 +++++ .../syntax_checkers/solidity/solium.vim | 43 +++++ sources_non_forked/vim-gitgutter/README.mkd | 52 ++++++ .../vim-gitgutter/autoload/gitgutter.vim | 14 +- .../autoload/gitgutter/async.vim | 8 +- .../vim-gitgutter/autoload/gitgutter/diff.vim | 4 +- .../vim-gitgutter/autoload/gitgutter/hunk.vim | 38 ++-- .../vim-gitgutter/autoload/gitgutter/sign.vim | 28 +-- .../autoload/gitgutter/utility.vim | 37 ++-- .../vim-gitgutter/doc/gitgutter.txt | 1 + sources_non_forked/vim-go/CHANGELOG.md | 8 +- sources_non_forked/vim-go/autoload/go/cmd.vim | 6 +- sources_non_forked/vim-go/autoload/go/fmt.vim | 8 +- .../vim-go/autoload/go/path.vim | 125 +++++++------ sources_non_forked/vim-go/doc/vim-go.txt | 9 +- sources_non_forked/vim-go/plugin/go.vim | 12 +- .../vim-go/syntax/gotexttmpl.vim | 4 +- .../vim-indent-object/doc/indent-object.txt | 16 +- .../vim-snippets/UltiSnips/cs.snippets | 8 +- .../vim-snippets/UltiSnips/vue.snippets | 1 + .../vim-snippets/snippets/c.snippets | 28 +-- .../vim-snippets/snippets/cpp.snippets | 14 +- .../vim-snippets/snippets/erlang.snippets | 30 ++-- 32 files changed, 704 insertions(+), 238 deletions(-) create mode 100644 sources_non_forked/goyo.vim/doc/goyo.txt create mode 100644 sources_non_forked/nerdtree/.github/ISSUE_TEMPLATE.md create mode 100644 sources_non_forked/syntastic/syntax_checkers/d/dscanner.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/dockerfile/hadolint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/solidity/solium.vim create mode 100644 sources_non_forked/vim-snippets/UltiSnips/vue.snippets diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index 65589393..7b2d660a 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -1763,6 +1763,7 @@ fu! ctrlp#setpathmode(pmode, ...) let spath = a:0 ? a:1 : s:crfpath let markers = ['.git', '.hg', '.svn', '.bzr', '_darcs'] if type(s:rmarkers) == 3 && !empty(s:rmarkers) + if s:findroot(spath, s:rmarkers, 0, 0) != [] | retu 1 | en cal filter(markers, 'index(s:rmarkers, v:val) < 0') let markers = s:rmarkers + markers en @@ -2384,7 +2385,7 @@ endf fu! s:matchbuf(item, pat) let bufnr = s:bufnrfilpath(a:item)[0] let parts = s:bufparts(bufnr) - let item = bufnr.parts[0].parts[2].s:lash().parts[3] + let item = s:byfname ? parts[2] : bufnr.parts[0].parts[2].s:lash().parts[3] retu match(item, a:pat) endf diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt index f703ba4f..455e368c 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt @@ -848,7 +848,7 @@ Example: > When this is set to 1, the <bs> on empty prompt exit CtrlP. *ctrlp-default-value* -Otherwize, you can use below to change default value. +Otherwise, you can use below to change default value. Example: > let g:ctrlp_path_nolim = 1 diff --git a/sources_non_forked/goyo.vim/doc/goyo.txt b/sources_non_forked/goyo.vim/doc/goyo.txt new file mode 100644 index 00000000..cdc129f8 --- /dev/null +++ b/sources_non_forked/goyo.vim/doc/goyo.txt @@ -0,0 +1,170 @@ +goyo.txt goyo Last change: April 1 2017 +GOYO - TABLE OF CONTENTS *goyo* *goyo-toc* +============================================================================== + + goyo.vim (ê³ ìš”) + Installation + Usage + Dimension expression + Configuration + Callbacks + Inspiration + Pros. + License + +GOYO.VIM (ê³ ìš”) *goyo* +============================================================================== + +Distraction-free writing in Vim. + +https://raw.github.com/junegunn/i/master/goyo.png + +(Color scheme: {seoul256}{1}) + +Best served with {limelight.vim}{2}. + + {1} https://github.com/junegunn/seoul256.vim + {2} https://github.com/junegunn/limelight.vim + + +INSTALLATION *goyo-installation* +============================================================================== + +Use your favorite plugin manager. + + *:PlugInstall* + + - {vim-plug}{3} + 1. Add `Plug 'junegunn/goyo.vim'` to .vimrc + 2. Run `:PlugInstall` + + {3} https://github.com/junegunn/vim-plug + + +USAGE *goyo-usage* +============================================================================== + + *:Goyo* + + - `:Goyo` + - Toggle Goyo + - `:Goyo [dimension]` + - Turn on or resize Goyo + - `:Goyo!` + - Turn Goyo off + +The window can be resized with the usual count]<CTRL-W + `>`, `<`, `+`, `-` +keys. + + +< Dimension expression >______________________________________________________~ + *goyo-dimension-expression* + +The expected format of a dimension expression is +`[WIDTH][XOFFSET][x[HEIGHT][YOFFSET]]`. `XOFFSET` and `YOFFSET` should be +prefixed by `+` or `-`. Each component can be given in percentage. +> + " Width + Goyo 120 + + " Height + Goyo x30 + + " Both + Goyo 120x30 + + " In percentage + Goyo 120x50% + + " With offsets + Goyo 50%+25%x50%-25% +< + +CONFIGURATION *goyo-configuration* +============================================================================== + + *g:goyo_width* *g:goyo_height* *g:goyo_linenr* + + - `g:goyo_width` (default: 80) + - `g:goyo_height` (default: 85%) + - `g:goyo_linenr` (default: 0) + + +< Callbacks >_________________________________________________________________~ + *goyo-callbacks* + +By default, {vim-airline}{4}, {vim-powerline}{5}, {powerline}{6}, +{lightline.vim}{7}, {vim-signify}{8}, and {vim-gitgutter}{9} are temporarily +disabled while in Goyo mode. + +If you have other plugins that you want to disable/enable, or if you want to +change the default settings of Goyo window, you can set up custom routines to +be triggered on `GoyoEnter` and `GoyoLeave` events. +> + function! s:goyo_enter() + silent !tmux set status off + silent !tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z + set noshowmode + set noshowcmd + set scrolloff=999 + Limelight + " ... + endfunction + + function! s:goyo_leave() + silent !tmux set status on + silent !tmux list-panes -F '\#F' | grep -q Z && tmux resize-pane -Z + set showmode + set showcmd + set scrolloff=5 + Limelight! + " ... + endfunction + + autocmd! User GoyoEnter nested call <SID>goyo_enter() + autocmd! User GoyoLeave nested call <SID>goyo_leave() +< +More examples can be found here: {Customization}{10} + + {4} https://github.com/bling/vim-airline + {5} https://github.com/Lokaltog/vim-powerline + {6} https://github.com/Lokaltog/powerline + {7} https://github.com/itchyny/lightline.vim + {8} https://github.com/mhinz/vim-signify + {9} https://github.com/airblade/vim-gitgutter + {10} https://github.com/junegunn/goyo.vim/wiki/Customization + + +INSPIRATION *goyo-inspiration* +============================================================================== + + - {LiteDFM}{11} + - {VimRoom}{12} + + {11} https://github.com/bilalq/lite-dfm + {12} http://projects.mikewest.org/vimroom/ + + +PROS. *goyo-pros* +============================================================================== + + 1. Works well with splits. Doesn't mess up with the current window arrangement + 2. Works well with popular statusline plugins + 3. Prevents accessing the empty windows around the central buffer + 4. Can be closed with any of `:q[uit]`, `:clo[se]`, `:tabc[lose]`, or `:Goyo` + 5. Can dynamically change the width of the window + 6. Adjusts its colors when color scheme is changed + 7. Realigns the window when the terminal (or window) is resized or when the size + of the font is changed + 8. Correctly hides colorcolumns and Emojis in statusline + 9. Highly customizable with callbacks + + +LICENSE *goyo-license* +============================================================================== + +MIT + + +============================================================================== +vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap: diff --git a/sources_non_forked/nerdtree/.github/ISSUE_TEMPLATE.md b/sources_non_forked/nerdtree/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..69aa7d9b --- /dev/null +++ b/sources_non_forked/nerdtree/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,37 @@ +_To assist in resolving your issue, provide as much information as possible, in place of the ellipses (`…`) below._ + +--- +**Environment:** _Describe your Vim/NERDTree setup._ + +>* Operating System: … +>* Vim version `:version`: … +>* NERDTree version `git rev-parse --short HEAD`: … +>* NERDTree settings applied in your vimrc, if any: +> +> ``` +> … +> ``` + +**Process:** _List the steps that will recreate the issue._ + +>1. … + +**Current Result:** _Describe what you you currently experience from this process._ + +>… + +**Expected Result:** _Describe what you would expect to have resulted from this process._ + +>… + +--- +**Optional** + +**Screenshot(s):** + +>… + +**Possible Fix:** _(Have you poked around in the code?)_ + +>… + diff --git a/sources_non_forked/nerdtree/README.markdown b/sources_non_forked/nerdtree/README.markdown index 4f5133a2..19b841bc 100644 --- a/sources_non_forked/nerdtree/README.markdown +++ b/sources_non_forked/nerdtree/README.markdown @@ -55,14 +55,14 @@ The following features and functionality are provided by the NERD tree: Installation ------------ -####[pathogen.vim](https://github.com/tpope/vim-pathogen) +#### [pathogen.vim](https://github.com/tpope/vim-pathogen) git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree Then reload vim, run `:helptags ~/.vim/bundle/nerdtree/doc/`, and check out `:help NERD_tree.txt`. -####[apt-vim](https://github.com/egalpin/apt-vim) +#### [apt-vim](https://github.com/egalpin/apt-vim) apt-vim install -y https://github.com/scrooloose/nerdtree.git diff --git a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim index 9d25b849..451d308c 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim @@ -98,6 +98,35 @@ function! syntastic#preprocess#dockerfile_lint(errors) abort " {{{2 return out endfunction " }}}2 +function! syntastic#preprocess#dscanner(errors) abort " {{{2 + let idx = 0 + while idx < len(a:errors) && a:errors[idx][0] !=# '{' + let idx += 1 + endwhile + let errs = s:_decode_JSON(join(a:errors[idx :], '')) + + let out = [] + if type(errs) == type({}) && has_key(errs, 'issues') && type(errs['issues']) == type([]) + for issue in errs['issues'] + try + call add(out, + \ issue['fileName'] . ':' . + \ issue['line'] . ':' . + \ issue['column'] . ':' . + \ issue['message'] . ' [' . issue['key'] . ']') + catch /\m^Vim\%((\a\+)\)\=:E716/ + call syntastic#log#warn('checker d/dscanner: unrecognized error item ' . string(issue)) + let out = [] + break + endtry + endfor + else + call syntastic#log#warn('checker d/dscanner: unrecognized error format (crashed checker?)') + endif + + return out +endfunction " }}}2 + function! syntastic#preprocess#flow(errors) abort " {{{2 let idx = 0 while idx < len(a:errors) && a:errors[idx][0] !=# '{' diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index 48536491..7c902f9a 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -1755,6 +1755,7 @@ SYNTAX CHECKERS FOR D *syntastic-checkers-d* The following checkers are available for D (filetype "d"): 1. DMD......................|syntastic-d-dmd| + 2. D-Scanner................|syntastic-d-dscanner| ------------------------------------------------------------------------------ 1. DMD *syntastic-d-dmd* @@ -1834,6 +1835,22 @@ the usual 'g:syntastic_d_dmd_<option>' variables. The only exception is 'g:syntastic_d_dmd_exec', which can still be used to override the checker's executable. +------------------------------------------------------------------------------ +2. D-Scanner *syntastic-d-dscanner* + +Name: dscanner +Maintainer: ANtlord + +"D-Scanner" is a tool for analyzing D source code (https://dlang.org/). See +the project's page at GitHub for more information: + + https://github.com/Hackerpilot/Dscanner + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + ============================================================================== SYNTAX CHECKERS FOR DART *syntastic-checkers-dart* @@ -1934,6 +1951,7 @@ SYNTAX CHECKERS FOR DOCKERFILE *syntastic-checkers-dockerfile* The following checkers are available for Dockerfile (filetype "dockerfile"): 1. dockerfile-lint..........|syntastic-dockerfile-dockerfile_lint| + 2. Hadolint.................|syntastic-dockerfile-hadolint| ------------------------------------------------------------------------------ 1. dockerfile-lint *syntastic-dockerfile-dockerfile_lint* @@ -1957,6 +1975,22 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +------------------------------------------------------------------------------ +2. Hadolint *syntastic-dockerfile-hadolint* + +Name: hadolint +Maintainer: Jesper B. Rosenkilde <jbr@humppa.dk> + +"Hadolint" is a dockerfile linter written in Haskell. See the project's page +at GitHub for details: + + https://github.com/lukasmartinelli/hadolint + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + ============================================================================== SYNTAX CHECKERS FOR DUST *syntastic-checkers-dustjs* @@ -4884,59 +4918,11 @@ SYNTAX CHECKERS FOR R *syntastic-checkers-r* The following checkers are available for R (filetype "r"): - 1. lint.....................|syntastic-r-lint| - 2. lintr....................|syntastic-r-lintr| - 3. svtools..................|syntastic-r-svtools| + 1. lintr....................|syntastic-r-lintr| + 2. svtools..................|syntastic-r-svtools| ------------------------------------------------------------------------------ -1. lint *syntastic-r-lint* - -Name: lint -Maintainer: LCD 47 <lcd047@gmail.com> - -This is a style checker for R files, using the R package "lint": - - http://cran.r-project.org/web/packages/lint/ - -Checker option~ - - *'g:syntastic_r_lint_styles'* -Type: string -Default: "lint.style" -R list of style tests to apply. - -Set 'g:syntastic_r_lint_styles' to something like this: > - let g:syntastic_r_lint_styles = - \ 'list(spacing.indentation.notabs, spacing.indentation.evenindent)' -< -See "lint"'s manual for possible values: - - http://cran.r-project.org/web/packages/lint/lint.pdf - -Note~ - -This checker doesn't call the "makeprgBuild()" function, and thus it ignores -the usual 'g:syntastic_r_lint_<option>' variables. The only exception is -'g:syntastic_r_lint_exec', which can still be used to override the "R" -executable. - -Limitations~ - -The checker uses column numbers only when running into syntax errors. If -you're checking files containing tab characters, then Vim's 'tabstop' must -match R's idea of tabstop, otherwise column numbers will be shifted. At the -time of this writing R's tabstop is hardcoded to 8, so you should probably -add something like this to your vimrc: > - set tabstop=8 -< -The "lint" package will only show at most 5 messages of a kind. At the time of -this writing this is not configurable. - -Beware also that the checker is pretty slow when using the default style -setting of "lint.style". - ------------------------------------------------------------------------------- -2. lintr *syntastic-r-lintr* +1. lintr *syntastic-r-lintr* Name: lintr Maintainer: Jim Hester <james.f.hester@gmail.com> @@ -4984,7 +4970,7 @@ executable. See also: |syntastic-rmd-lintr|. ------------------------------------------------------------------------------ -3. svtools *syntastic-r-svtools* +2. svtools *syntastic-r-svtools* Name: svtools Maintainer: LCD 47 <lcd047@gmail.com> @@ -5953,6 +5939,7 @@ SYNTAX CHECKERS FOR SOLIDITY *syntastic-checkers-solidity* The following checkers are available for Solidity (filetype "solidity"): 1. solc.....................|syntastic-solidity-solc| + 2. Solium...................|syntastic-solidity-solium| ------------------------------------------------------------------------------ 1. solc *syntastic-solidity-solc* @@ -5977,6 +5964,27 @@ You probably also need a plugin to set |filetype| for Solidity files, such as https://github.com/tomlion/vim-solidity +------------------------------------------------------------------------------ +2. Solium *syntastic-solidity-solium* + +Name: solium +Maintainer: Matthijs van den Bos <matthijs@vandenbos.org> + +"Solium" is a linter for "Solidity" files. See the project's page for details: + + https://github.com/duaraghav8/Solium + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +Note~ + +You probably also need a plugin to set |filetype| for Solidity files, such as +"vim-solidity": + + https://github.com/tomlion/vim-solidity ============================================================================== SYNTAX CHECKERS FOR SQL *syntastic-checkers-sql* diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 47f16cf0..a26917a3 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-26' +let g:_SYNTASTIC_VERSION = '3.8.0-35' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/sources_non_forked/syntastic/syntax_checkers/d/dscanner.vim b/sources_non_forked/syntastic/syntax_checkers/d/dscanner.vim new file mode 100644 index 00000000..5f64e3a1 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/d/dscanner.vim @@ -0,0 +1,48 @@ +"============================================================================ +"File: dscanner.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: ANtlord +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_d_dscanner_checker') + finish +endif +let g:loaded_syntastic_d_dscanner_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_d_dscanner_GetHighlightRegex(i) + let term = matchstr(a:i['text'], '\m^.\{-}''\zs\S\+\ze''') + return term !=# '' ? '\V\<' . escape(term, '\') . '\>' : '' +endfunction + +function! SyntaxCheckers_d_dscanner_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'args_after': '--report', + \ 'tail': '2>' . syntastic#util#DevNull() }) + + let errorformat = '%f:%l:%c:%m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'preprocess': 'dscanner', + \ 'subtype': 'Style', + \ 'returns': [0] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'd', + \ 'name': 'dscanner' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/dockerfile/hadolint.vim b/sources_non_forked/syntastic/syntax_checkers/dockerfile/hadolint.vim new file mode 100644 index 00000000..4fd45b3e --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/dockerfile/hadolint.vim @@ -0,0 +1,41 @@ +"============================================================================ +"File: hadolint.vim +"Description: Dockerfile linter written in Haskell +" (http://hadolint.lukasmartinelli.ch/). +"Maintainer: Jesper B. Rosenkilde <jbr at humppa dot dk> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_dockerfile_hadolint_checker') + finish +endif +let g:loaded_syntastic_dockerfile_hadolint_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_dockerfile_hadolint_GetLocList() dict + let makeprg = self.makeprgBuild({}) + + let errorformat = '%W%f:%l %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'subtype': 'Style', + \ 'returns': [0, 1] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'dockerfile', + \ 'name': 'hadolint'}) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/solidity/solium.vim b/sources_non_forked/syntastic/syntax_checkers/solidity/solium.vim new file mode 100644 index 00000000..327b7b72 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/solidity/solium.vim @@ -0,0 +1,43 @@ +"============================================================================ +"File: solium.vim +"Description: Solidity syntax checker - using solium +"Maintainer: Matthijs van den Bos <matthijs@vandenbos.org> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_solidity_solium_checker') + finish +endif +let g:loaded_syntastic_solidity_solium_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_solidity_solium_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'args_after': '-R gcc', + \ 'fname_before': '--file'}) + + let errorformat = + \ '%f:%l:%c: %trror: %m,' . + \ '%f:%l:%c: %tarning: %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'returns': [0, 1] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'solidity', + \ 'name': 'solium'}) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/vim-gitgutter/README.mkd b/sources_non_forked/vim-gitgutter/README.mkd index 19ed3876..25cab5c9 100644 --- a/sources_non_forked/vim-gitgutter/README.mkd +++ b/sources_non_forked/vim-gitgutter/README.mkd @@ -427,6 +427,58 @@ Let's say, for example, you want to remove trailing whitespace from all changed ``` +#### Cycle through hunks in all buffers + +`]c` and `[c` jump from one hunk to the next in the current buffer. You can use this code to jump to the next hunk no matter which buffer it's in. + +```viml +function! NextHunkAllBuffers() + let line = line('.') + GitGutterNextHunk + if line('.') != line + return + endif + + let bufnr = bufnr('') + while 1 + bnext + if bufnr('') == bufnr + return + endif + if !empty(GitGutterGetHunks()) + normal! 1G + GitGutterNextHunk + return + endif + endwhile +endfunction + +function! PrevHunkAllBuffers() + let line = line('.') + GitGutterPrevHunk + if line('.') != line + return + endif + + let bufnr = bufnr('') + while 1 + bprevious + if bufnr('') == bufnr + return + endif + if !empty(GitGutterGetHunks()) + normal! G + GitGutterPrevHunk + return + endif + endwhile +endfunction + +nmap <silent> ]c :call NextHunkAllBuffers()<CR> +nmap <silent> [c :call PrevHunkAllBuffers()<CR> +``` + + ### FAQ > Why can't I unstage staged changes? diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim index e5431597..6e8ca57d 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim @@ -44,7 +44,7 @@ endfunction function! gitgutter#handle_diff(diff) abort call gitgutter#debug#log(a:diff) - call setbufvar(gitgutter#utility#bufnr(), 'gitgutter_tracked', 1) + call gitgutter#utility#setbufvar(gitgutter#utility#bufnr(), 'tracked', 1) call gitgutter#hunk#set_hunks(gitgutter#diff#parse_diff(a:diff)) let modified_lines = gitgutter#diff#process_hunks(gitgutter#hunk#hunks()) @@ -209,10 +209,16 @@ function! gitgutter#undo_hunk() abort call gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' apply --reverse --unidiff-zero - '), diff_for_hunk) " reload file preserving screen line position - let wl = winline() + " CTRL-Y and CTRL-E treat negative counts as positive counts. + let x = line('w0') silent edit - let offset = wl - winline() - execute "normal! ".offset."\<C-Y>" + let y = line('w0') + let z = x - y + if z > 0 + execute "normal! ".z."\<C-E>" + else + execute "normal! ".z."\<C-Y>" + endif endif silent! call repeat#set("\<Plug>GitGutterUndoHunk", -1)<CR> diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim index 0ce70b82..5b2428bb 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim @@ -59,11 +59,7 @@ function! gitgutter#async#execute(cmd) abort if has('unix') let command = ["sh", "-c", a:cmd] elseif has('win32') - " Help docs recommend {command} be a string on Windows. But I think - " they also say that will run the command directly, which I believe would - " mean the redirection and pipe stuff wouldn't work. - " let command = "cmd.exe /c ".a:cmd - let command = ["cmd.exe", "/c", a:cmd] + let command = "cmd.exe /c ".a:cmd else throw 'unknown os' endif @@ -79,7 +75,7 @@ function! gitgutter#async#execute(cmd) abort endfunction -function! gitgutter#async#handle_diff_job_nvim(job_id, data, event) abort +function! gitgutter#async#handle_diff_job_nvim(job_id, data, event) dict abort call gitgutter#debug#log('job_id: '.a:job_id.', event: '.a:event.', buffer: '.self.buffer) let job_bufnr = self.buffer diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim index 170193bf..c321aa98 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim @@ -56,7 +56,7 @@ function! gitgutter#diff#run_diff(realtime, preserve_full_diff) abort let cmd = '(' let bufnr = gitgutter#utility#bufnr() - let tracked = getbufvar(bufnr, 'gitgutter_tracked') " i.e. tracked by git + let tracked = gitgutter#utility#getbufvar(bufnr, 'tracked', 0) " i.e. tracked by git if !tracked " Don't bother trying to realtime-diff an untracked file. " NOTE: perhaps we should pull this guard up to the caller? @@ -95,6 +95,7 @@ function! gitgutter#diff#run_diff(realtime, preserve_full_diff) abort let cmd .= g:gitgutter_git_executable if s:c_flag let cmd .= ' -c "diff.autorefreshindex=0"' + let cmd .= ' -c "diff.noprefix=false"' endif let cmd .= ' diff --no-ext-diff --no-color -U0 '.g:gitgutter_diff_args.' ' @@ -165,7 +166,6 @@ function! gitgutter#diff#parse_hunk(line) abort endfunction function! gitgutter#diff#process_hunks(hunks) abort - call gitgutter#hunk#reset() let modified_lines = [] for hunk in a:hunks call extend(modified_lines, gitgutter#diff#process_hunk(hunk)) diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim index 0fd02468..fefd91c0 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim @@ -1,47 +1,53 @@ -let s:hunks = [] - function! gitgutter#hunk#set_hunks(hunks) abort - let s:hunks = a:hunks + call gitgutter#utility#setbufvar(gitgutter#utility#bufnr(), 'hunks', a:hunks) + call s:reset_summary() endfunction function! gitgutter#hunk#hunks() abort - return s:hunks -endfunction - -function! gitgutter#hunk#summary(bufnr) abort - return get(getbufvar(a:bufnr,''), 'gitgutter_summary', [0,0,0]) + return gitgutter#utility#getbufvar(gitgutter#utility#bufnr(), 'hunks', []) endfunction function! gitgutter#hunk#reset() abort - call setbufvar(gitgutter#utility#bufnr(), 'gitgutter_summary', [0,0,0]) + call gitgutter#utility#setbufvar(gitgutter#utility#bufnr(), 'hunks', []) + call s:reset_summary() +endfunction + + +function! gitgutter#hunk#summary(bufnr) abort + return gitgutter#utility#getbufvar(a:bufnr, 'summary', [0,0,0]) +endfunction + +function! s:reset_summary() abort + call gitgutter#utility#setbufvar(gitgutter#utility#bufnr(), 'summary', [0,0,0]) endfunction function! gitgutter#hunk#increment_lines_added(count) abort let bufnr = gitgutter#utility#bufnr() let summary = gitgutter#hunk#summary(bufnr) let summary[0] += a:count - call setbufvar(bufnr, 'gitgutter_summary', summary) + call gitgutter#utility#setbufvar(bufnr, 'summary', summary) endfunction function! gitgutter#hunk#increment_lines_modified(count) abort let bufnr = gitgutter#utility#bufnr() let summary = gitgutter#hunk#summary(bufnr) let summary[1] += a:count - call setbufvar(bufnr, 'gitgutter_summary', summary) + call gitgutter#utility#setbufvar(bufnr, 'summary', summary) endfunction function! gitgutter#hunk#increment_lines_removed(count) abort let bufnr = gitgutter#utility#bufnr() let summary = gitgutter#hunk#summary(bufnr) let summary[2] += a:count - call setbufvar(bufnr, 'gitgutter_summary', summary) + call gitgutter#utility#setbufvar(bufnr, 'summary', summary) endfunction + function! gitgutter#hunk#next_hunk(count) abort if gitgutter#utility#is_active() let current_line = line('.') let hunk_count = 0 - for hunk in s:hunks + for hunk in gitgutter#hunk#hunks() if hunk[2] > current_line let hunk_count += 1 if hunk_count == a:count @@ -58,7 +64,7 @@ function! gitgutter#hunk#prev_hunk(count) abort if gitgutter#utility#is_active() let current_line = line('.') let hunk_count = 0 - for hunk in reverse(copy(s:hunks)) + for hunk in reverse(copy(gitgutter#hunk#hunks())) if hunk[2] < current_line let hunk_count += 1 if hunk_count == a:count @@ -77,7 +83,7 @@ endfunction function! gitgutter#hunk#current_hunk() abort let current_hunk = [] - for hunk in s:hunks + for hunk in gitgutter#hunk#hunks() if gitgutter#hunk#cursor_in_hunk(hunk) let current_hunk = hunk break @@ -105,7 +111,7 @@ endfunction " be if any changes above it in the file didn't exist. function! gitgutter#hunk#line_adjustment_for_current_hunk() abort let adj = 0 - for hunk in s:hunks + for hunk in gitgutter#hunk#hunks() if gitgutter#hunk#cursor_in_hunk(hunk) break else diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim index 7e1218d4..cab3d65b 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim @@ -15,9 +15,9 @@ function! gitgutter#sign#clear_signs() abort let bufnr = gitgutter#utility#bufnr() call gitgutter#sign#find_current_signs() - let sign_ids = map(values(getbufvar(bufnr, 'gitgutter_gitgutter_signs')), 'v:val.id') + let sign_ids = map(values(gitgutter#utility#getbufvar(bufnr, 'gitgutter_signs')), 'v:val.id') call gitgutter#sign#remove_signs(sign_ids, 1) - call setbufvar(bufnr, 'gitgutter_gitgutter_signs', {}) + call gitgutter#utility#setbufvar(bufnr, 'gitgutter_signs', {}) endfunction @@ -47,17 +47,17 @@ endfunction function! gitgutter#sign#add_dummy_sign() abort let bufnr = gitgutter#utility#bufnr() - if !getbufvar(bufnr, 'gitgutter_dummy_sign') + if !gitgutter#utility#getbufvar(bufnr, 'dummy_sign') execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy buffer=" . bufnr - call setbufvar(bufnr, 'gitgutter_dummy_sign', 1) + call gitgutter#utility#setbufvar(bufnr, 'dummy_sign', 1) endif endfunction function! gitgutter#sign#remove_dummy_sign(force) abort let bufnr = gitgutter#utility#bufnr() - if getbufvar(bufnr, 'gitgutter_dummy_sign') && (a:force || !g:gitgutter_sign_column_always) + if gitgutter#utility#getbufvar(bufnr, 'dummy_sign') && (a:force || !g:gitgutter_sign_column_always) execute "sign unplace" s:dummy_sign_id "buffer=" . bufnr - call setbufvar(bufnr, 'gitgutter_dummy_sign', 0) + call gitgutter#utility#setbufvar(bufnr, 'dummy_sign', 0) endif endfunction @@ -101,9 +101,9 @@ function! gitgutter#sign#find_current_signs() abort end endfor - call setbufvar(bufnr, 'gitgutter_dummy_sign', dummy_sign_placed) - call setbufvar(bufnr, 'gitgutter_gitgutter_signs', gitgutter_signs) - call setbufvar(bufnr, 'gitgutter_other_signs', other_signs) + call gitgutter#utility#setbufvar(bufnr, 'dummy_sign', dummy_sign_placed) + call gitgutter#utility#setbufvar(bufnr, 'gitgutter_signs', gitgutter_signs) + call gitgutter#utility#setbufvar(bufnr, 'other_signs', other_signs) endfunction @@ -113,7 +113,7 @@ function! gitgutter#sign#obsolete_gitgutter_signs_to_remove(new_gitgutter_signs_ let bufnr = gitgutter#utility#bufnr() let signs_to_remove = [] " list of [<id (number)>, ...] let remove_all_signs = 1 - let old_gitgutter_signs = getbufvar(bufnr, 'gitgutter_gitgutter_signs') + let old_gitgutter_signs = gitgutter#utility#getbufvar(bufnr, 'gitgutter_signs') for line_number in keys(old_gitgutter_signs) if index(a:new_gitgutter_signs_line_numbers, str2nr(line_number)) == -1 call add(signs_to_remove, old_gitgutter_signs[line_number].id) @@ -128,8 +128,8 @@ endfunction function! gitgutter#sign#remove_signs(sign_ids, all_signs) abort let bufnr = gitgutter#utility#bufnr() - if a:all_signs && s:supports_star && empty(getbufvar(bufnr, 'gitgutter_other_signs')) - let dummy_sign_present = getbufvar(bufnr, 'gitgutter_dummy_sign') + if a:all_signs && s:supports_star && empty(gitgutter#utility#getbufvar(bufnr, 'other_signs')) + let dummy_sign_present = gitgutter#utility#getbufvar(bufnr, 'dummy_sign') execute "sign unplace * buffer=" . bufnr if dummy_sign_present execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy buffer=" . bufnr @@ -144,8 +144,8 @@ endfunction function! gitgutter#sign#upsert_new_gitgutter_signs(modified_lines) abort let bufnr = gitgutter#utility#bufnr() - let other_signs = getbufvar(bufnr, 'gitgutter_other_signs') - let old_gitgutter_signs = getbufvar(bufnr, 'gitgutter_gitgutter_signs') + let other_signs = gitgutter#utility#getbufvar(bufnr, 'other_signs') + let old_gitgutter_signs = gitgutter#utility#getbufvar(bufnr, 'gitgutter_signs') for line in a:modified_lines let line_number = line[0] " <number> diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim index 77ad2dc2..e4bc774d 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim @@ -2,6 +2,23 @@ let s:file = '' let s:using_xolox_shell = -1 let s:exit_code = 0 +function! gitgutter#utility#setbufvar(buffer, varname, val) + let dict = get(getbufvar(a:buffer, ''), 'gitgutter', {}) + let dict[a:varname] = a:val + call setbufvar(a:buffer, 'gitgutter', dict) +endfunction + +function! gitgutter#utility#getbufvar(buffer, varname, ...) + let dict = get(getbufvar(a:buffer, ''), 'gitgutter', {}) + if has_key(dict, a:varname) + return dict[a:varname] + else + if a:0 + return a:1 + endif + endif +endfunction + function! gitgutter#utility#warn(message) abort echohl WarningMsg echo 'vim-gitgutter: ' . a:message @@ -10,8 +27,8 @@ function! gitgutter#utility#warn(message) abort endfunction function! gitgutter#utility#warn_once(message, key) abort - if empty(getbufvar(s:bufnr, a:key)) - call setbufvar(s:bufnr, a:key, '1') + if empty(gitgutter#utility#getbufvar(s:bufnr, a:key)) + call gitgutter#utility#setbufvar(s:bufnr, a:key, '1') echohl WarningMsg redraw | echo 'vim-gitgutter: ' . a:message echohl None @@ -92,11 +109,11 @@ function! gitgutter#utility#has_unsaved_changes() abort endfunction function! gitgutter#utility#has_fresh_changes() abort - return getbufvar(s:bufnr, 'changedtick') != getbufvar(s:bufnr, 'gitgutter_last_tick') + return getbufvar(s:bufnr, 'changedtick') != gitgutter#utility#getbufvar(s:bufnr, 'last_tick') endfunction function! gitgutter#utility#save_last_seen_change() abort - call setbufvar(s:bufnr, 'gitgutter_last_tick', getbufvar(s:bufnr, 'changedtick')) + call gitgutter#utility#setbufvar(s:bufnr, 'last_tick', getbufvar(s:bufnr, 'changedtick')) endfunction function! gitgutter#utility#shell_error() abort @@ -136,12 +153,12 @@ function! gitgutter#utility#system(cmd, ...) abort endfunction function! gitgutter#utility#file_relative_to_repo_root() abort - let file_path_relative_to_repo_root = getbufvar(s:bufnr, 'gitgutter_repo_relative_path') + let file_path_relative_to_repo_root = gitgutter#utility#getbufvar(s:bufnr, 'repo_relative_path') if empty(file_path_relative_to_repo_root) let dir_path_relative_to_repo_root = gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' rev-parse --show-prefix')) let dir_path_relative_to_repo_root = gitgutter#utility#strip_trailing_new_line(dir_path_relative_to_repo_root) let file_path_relative_to_repo_root = dir_path_relative_to_repo_root . gitgutter#utility#filename() - call setbufvar(s:bufnr, 'gitgutter_repo_relative_path', file_path_relative_to_repo_root) + call gitgutter#utility#setbufvar(s:bufnr, 'repo_relative_path', file_path_relative_to_repo_root) endif return file_path_relative_to_repo_root endfunction @@ -174,14 +191,10 @@ function! gitgutter#utility#strip_trailing_new_line(line) abort return substitute(a:line, '\n$', '', '') endfunction -function! gitgutter#utility#git_version() abort - return matchstr(system(g:gitgutter_git_executable.' --version'), '[0-9.]\+') -endfunction - " True for git v1.7.2+. function! gitgutter#utility#git_supports_command_line_config_override() abort - let [major, minor, patch; _] = split(gitgutter#utility#git_version(), '\.') - return major > 1 || (major == 1 && minor > 7) || (minor == 7 && patch > 1) + call system(g:gitgutter_git_executable.' -c foo.bar=baz --version') + return !v:shell_error endfunction function! gitgutter#utility#stringify(list) abort diff --git a/sources_non_forked/vim-gitgutter/doc/gitgutter.txt b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt index d4bb7747..6524564e 100644 --- a/sources_non_forked/vim-gitgutter/doc/gitgutter.txt +++ b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt @@ -138,6 +138,7 @@ Commands for staging or undoing individual hunks: :GitGutterPreviewHunk *:GitGutterPreviewHunk* Preview the hunk the cursor is in. + Use |:pclose| or |CTRL-W_CTRL-Z| to close the preview window. =============================================================================== 5. AUTOCOMMAND *GitGutterAutocmd* diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 9d245fc2..2333ecae 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -1,5 +1,7 @@ ## unplanned +## 1.12 - (March 29, 2017) + FEATURES: * New `:GoAddTags` and `:GoRemoveTags` command based on the tool @@ -20,6 +22,7 @@ if err != nil { IMPROVEMENTS: +* vim-go works now even if GOPATH is not set (starting with Go 1.8) [gh-1248] * Lowercase `<Leader>` in mappings examples for consistent documentation across the README [gh-1192] * All of files should be written in utf-8 if the file will be passed to external command. [gh-1184] * `:GoAddTags` is now able to add options to existing tags with the syntax @@ -27,6 +30,8 @@ IMPROVEMENTS: * Document 'noshowmode' requirement for echo_go_info [gh-1197] * Improve godoc view for vertical splits [gh-1195] * Set GOPATH for both possible go guru execution paths (sync and async) [gh-1193] +* Improve docs for :GoDef usage [gh-1242] +* Highlight trimming syntax for Go templates [gh-1235] BUG FIXES: @@ -44,12 +49,13 @@ BUG FIXES: * Fix `:GoAddTags` not working if any field comment would contain `{}` [gh-1189] * Respect go_fmt_options when running goimports [gh-1211] * Set the filename in the location-list when there is an error with :GoFmt [gh-1199] +* Fix `:GoInstall` to accept additional arguments if async mode was enabled [gh-1246] BACKWARDS INCOMPATIBILITIES: * The command `:GoGuruTags` is removed in favour of the new command `:GoBuildTags`. This command will be used now not just for `guru`, also for - all new commands such as `guru` [gh-1232] + all new commands such as `gorename` [gh-1232] * The setting `g:go_guru_tags` is removed in favour of the new setting `g:go_build_tags` [gh-1232] diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index 02e8e102..3702d168 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -177,9 +177,6 @@ function! go#cmd#Install(bang, ...) abort " expand all wildcards(i.e: '%' to the current file name) let goargs = map(copy(a:000), "expand(v:val)") - " escape all shell arguments before we pass it to make - let goargs = go#util#Shelllist(goargs, 1) - if get(g:, 'go_echo_command_info', 1) call go#util#EchoProgress("installing dispatched ...") endif @@ -221,7 +218,7 @@ function! go#cmd#Install(bang, ...) abort if !empty(errors) && !a:bang call go#list#JumpToFirst(l:listtype) else - call go#util#EchoSuccess("installed to ". $GOPATH) + call go#util#EchoSuccess("installed to ". go#path#Detect()) endif let $GOPATH = old_gopath @@ -407,7 +404,6 @@ function! go#cmd#Generate(bang, ...) abort let $GOPATH = old_gopath endfunction - " --------------------- " | Vim job callbacks | " --------------------- diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim index 666421b2..edddb4b3 100644 --- a/sources_non_forked/vim-go/autoload/go/fmt.vim +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim @@ -136,6 +136,10 @@ endfunction " formated. function! go#fmt#run(bin_name, source, target) let cmd = s:fmt_cmd(a:bin_name, a:source, a:target) + if empty(cmd) + return + endif + if cmd[0] == "goimports" " change GOPATH too, so goimports can pick up the correct library let old_gopath = $GOPATH @@ -162,7 +166,7 @@ function! s:fmt_cmd(bin_name, source, target) " if not the user get's a warning via go#path#CheckBinPath() let bin_path = go#path#CheckBinPath(a:bin_name) if empty(bin_path) - return + return [] endif " start constructing the command @@ -176,7 +180,7 @@ function! s:fmt_cmd(bin_name, source, target) if !exists('b:goimports_vendor_compatible') let out = go#util#System(bin_path . " --help") if out !~ "-srcdir" - call go#util#EchoWarning(printf("vim-go: goimports (%s) does not support srcdir. Update with: :GoUpdateBinaries", bin_path)) + call go#util#EchoWarning(printf("vim-go: goimports (%s) does not support srcdir. Update with: :GoUpdateBinaries", , bin_path)) else let b:goimports_vendor_compatible = 1 endif diff --git a/sources_non_forked/vim-go/autoload/go/path.vim b/sources_non_forked/vim-go/autoload/go/path.vim index 740a2681..5c1acd91 100644 --- a/sources_non_forked/vim-go/autoload/go/path.vim +++ b/sources_non_forked/vim-go/autoload/go/path.vim @@ -9,35 +9,41 @@ let s:initial_go_path = "" " GOPATH with it. If two double quotes are passed (the empty string in go), " it'll clear the GOPATH and will restore to the initial GOPATH. function! go#path#GoPath(...) abort - " we have an argument, replace GOPATH - if len(a:000) - " clears the current manually set GOPATH and restores it to the - " initial GOPATH, which was set when Vim was started. - if len(a:000) == 1 && a:1 == '""' - if !empty(s:initial_go_path) - let $GOPATH = s:initial_go_path - let s:initial_go_path = "" - endif - - echon "vim-go: " | echohl Function | echon "GOPATH restored to ". $GOPATH | echohl None - return - endif - - echon "vim-go: " | echohl Function | echon "GOPATH changed to ". a:1 | echohl None - let s:initial_go_path = $GOPATH - let $GOPATH = a:1 + " no argument, show GOPATH + if len(a:000) == 0 + echo go#path#Detect() return endif - echo go#path#Detect() + " we have an argument, replace GOPATH + " clears the current manually set GOPATH and restores it to the + " initial GOPATH, which was set when Vim was started. + if len(a:000) == 1 && a:1 == '""' + if !empty(s:initial_go_path) + let $GOPATH = s:initial_go_path + let s:initial_go_path = "" + endif + + echon "vim-go: " | echohl Function | echon "GOPATH restored to ". $GOPATH | echohl None + return + endif + + echon "vim-go: " | echohl Function | echon "GOPATH changed to ". a:1 | echohl None + let s:initial_go_path = $GOPATH + let $GOPATH = a:1 endfunction " Default returns the default GOPATH. If there is a single GOPATH it returns " it. For multiple GOPATHS separated with a the OS specific separator, only -" the first one is returned +" the first one is returned. If GOPATH is not set, it uses the default GOPATH +" set starting with GO 1.8. This GOPATH can be retrieved via 'go env GOPATH' function! go#path#Default() abort - let go_paths = split($GOPATH, go#util#PathListSep()) + if $GOPATH == "" + " use default GOPATH via go env + return go#util#gopath() + endif + let go_paths = split($GOPATH, go#util#PathListSep()) if len(go_paths) == 1 return $GOPATH endif @@ -48,7 +54,7 @@ endfunction " HasPath checks whether the given path exists in GOPATH environment variable " or not function! go#path#HasPath(path) abort - let go_paths = split($GOPATH, go#util#PathListSep()) + let go_paths = split(go#path#Default(), go#util#PathListSep()) let last_char = strlen(a:path) - 1 " check cases of '/foo/bar/' and '/foo/bar' @@ -70,7 +76,7 @@ endfunction " over the current GOPATH. It also detects diretories whose are outside " GOPATH. function! go#path#Detect() abort - let gopath = $GOPATH + let gopath = go#path#Default() " don't lookup for godeps if autodetect is disabled. if !get(g:, "go_autodetect_gopath", 1) @@ -122,57 +128,58 @@ function! go#path#BinPath() abort let bin_path = "" " check if our global custom path is set, if not check if $GOBIN is set so - " we can use it, otherwise use $GOPATH + '/bin' + " we can use it, otherwise use default GOPATH if exists("g:go_bin_path") let bin_path = g:go_bin_path elseif $GOBIN != "" let bin_path = $GOBIN - elseif $GOPATH != "" - let bin_path = expand(go#path#Default() . "/bin/") - else - " could not find anything - endif + else + " GOPATH (user set or default GO) + let bin_path = expand(go#path#Default() . "/bin/") + endif - return bin_path + return bin_path endfunction " CheckBinPath checks whether the given binary exists or not and returns the " path of the binary. It returns an empty string doesn't exists. function! go#path#CheckBinPath(binpath) abort - " remove whitespaces if user applied something like 'goimports ' - let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '') - " save off original path - let old_path = $PATH + " remove whitespaces if user applied something like 'goimports ' + let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '') + " save off original path + let old_path = $PATH - " check if we have an appropriate bin_path - let go_bin_path = go#path#BinPath() - if !empty(go_bin_path) - " append our GOBIN and GOPATH paths and be sure they can be found there... - " let us search in our GOBIN and GOPATH paths - let $PATH = go_bin_path . go#util#PathListSep() . $PATH + " check if we have an appropriate bin_path + let go_bin_path = go#path#BinPath() + if !empty(go_bin_path) + " append our GOBIN and GOPATH paths and be sure they can be found there... + " let us search in our GOBIN and GOPATH paths + let $PATH = go_bin_path . go#util#PathListSep() . $PATH + endif + + " if it's in PATH just return it + if executable(binpath) + if exists('*exepath') + let binpath = exepath(binpath) endif - - " if it's in PATH just return it - if executable(binpath) - if exists('*exepath') - let binpath = exepath(binpath) - endif - let $PATH = old_path - return binpath - endif - - " just get the basename - let basename = fnamemodify(binpath, ":t") - if !executable(basename) - echom "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it." - " restore back! - let $PATH = old_path - return "" - endif - let $PATH = old_path + return binpath + endif - return go_bin_path . go#util#PathSep() . basename + " just get the basename + let basename = fnamemodify(binpath, ":t") + if !executable(basename) + + call go#util#EchoError(printf("could not find '%s'. Run :GoInstallBinaries to fix it", basename)) + + " restore back! + let $PATH = old_path + return "" + endif + + let $PATH = old_path + + return go_bin_path . go#util#PathSep() . basename endfunction " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 29be99f5..2c3de9cc 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -217,15 +217,14 @@ COMMANDS *go-commands* If [!] is not given the first error is jumped to. *:GoDef* -:GoDef [identifier] +:GoDef gd CTRL-] - Goto declaration/definition for the given [identifier]. If no argument is - given, it will jump to the declaration under the cursor. By default the - CTRL-] key and the mapping `gd` are enabled to invoke :GoDef for the + Goto declaration/definition for the declaration under the cursor. By default + the CTRL-] key and the mapping `gd` are enabled to invoke :GoDef for the identifier under the cursor. See |'g:go_def_mapping_enabled'| to disable - them. + them. No explicit arguments are supported. vim-go also keeps a per-window location stack, roughly analogous to how Vim's internal |tags| functionality works. This is pushed to every time a diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim index 8a381453..577c72a9 100644 --- a/sources_non_forked/vim-go/plugin/go.vim +++ b/sources_non_forked/vim-go/plugin/go.vim @@ -33,15 +33,15 @@ command! -nargs=? -complete=dir GoPath call go#path#GoPath(<f-args>) " target install directory. GoInstallBinaries doesn't install binaries if they " exist, to update current binaries pass 1 to the argument. function! s:GoInstallBinaries(updateBinaries) - if $GOPATH == "" && go#util#gopath() == "" - echohl Error - echomsg "vim.go: $GOPATH is not set" - echohl None + let err = s:CheckBinaries() + if err != 0 return endif - let err = s:CheckBinaries() - if err != 0 + if go#path#Default() == "" + echohl Error + echomsg "vim.go: $GOPATH is not set and 'go env GOPATH' returns empty" + echohl None return endif diff --git a/sources_non_forked/vim-go/syntax/gotexttmpl.vim b/sources_non_forked/vim-go/syntax/gotexttmpl.vim index de21d7fc..ab8b1b6d 100644 --- a/sources_non_forked/vim-go/syntax/gotexttmpl.vim +++ b/sources_non_forked/vim-go/syntax/gotexttmpl.vim @@ -74,8 +74,8 @@ hi def link goTplVariable Special syn region gotplAction start="{{" end="}}" contains=@gotplLiteral,gotplControl,gotplFunctions,gotplVariable,goTplIdentifier display syn region gotplAction start="\[\[" end="\]\]" contains=@gotplLiteral,gotplControl,gotplFunctions,gotplVariable display -syn region goTplComment start="{{/\*" end="\*/}}" display -syn region goTplComment start="\[\[/\*" end="\*/\]\]" display +syn region goTplComment start="{{\(- \)\?/\*" end="\*/\( -\)\?}}" display +syn region goTplComment start="\[\[\(- \)\?/\*" end="\*/\( -\)\?\]\]" display hi def link gotplAction PreProc hi def link goTplComment Comment diff --git a/sources_non_forked/vim-indent-object/doc/indent-object.txt b/sources_non_forked/vim-indent-object/doc/indent-object.txt index b22c9865..be99f313 100644 --- a/sources_non_forked/vim-indent-object/doc/indent-object.txt +++ b/sources_non_forked/vim-indent-object/doc/indent-object.txt @@ -4,14 +4,14 @@ Indent Text Objects -INTRODUCTION |idntobj-introduction| -TEXT OBJECTS |idntobj-objects| -BLANK LINES |idntobj-blanklines| -ABOUT |idntobj-about| +INTRODUCTION |indtobj-introduction| +TEXT OBJECTS |indtobj-objects| +BLANK LINES |indtobj-blanklines| +ABOUT |indtobj-about| ============================================================================== -INTRODUCTION *idntobj-introduction* +INTRODUCTION *indtobj-introduction* Vim text objects provide a convenient way to select and operate on various types of objects. These objects include regions surrounded by various types of @@ -24,7 +24,7 @@ structure can be quickly selected, for example. ============================================================================== -TEXT OBJECTS *ai* *ii* *aI* *iI* *idntobj-objects* +TEXT OBJECTS *ai* *ii* *aI* *iI* *indtobj-objects* This plugin defines two new text objects. These are very similar - they differ only in whether they include the line below the block or not. @@ -78,7 +78,7 @@ structure. ============================================================================== -BLANK LINES *idntobj-blanklines* +BLANK LINES *indtobj-blanklines* When scanning code blocks, the plugin usually ignores blank lines. There is an exception to this, however, when the block being selected is not indented. In @@ -94,7 +94,7 @@ This exceptional behaviour can be disabled by executing the following line ============================================================================== -ABOUT *idntobj-about* +ABOUT *indtobj-about* vim-indent-object was written by Michael Smith <msmith@msmith.id.au>. The project repository is kept at: diff --git a/sources_non_forked/vim-snippets/UltiSnips/cs.snippets b/sources_non_forked/vim-snippets/UltiSnips/cs.snippets index 298eefd2..13d3c971 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/cs.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/cs.snippets @@ -355,18 +355,18 @@ snippet /// "XML summary comment" b /// </summary> endsnippet -snippet <p "XML pramameter comment" b +snippet <p "XML pramameter comment" w <param name="${1}">${2}</param> endsnippet -snippet <ex "XML exception comment" b +snippet <ex "XML exception comment" w <exception cref="${1:System.Exception}">${2}</exception> endsnippet -snippet <r "XML returns comment" b +snippet <r "XML returns comment" w <returns>$0</returns> endsnippet -snippet <c "XML code comment" b +snippet <c "XML code comment" w <code>$0</code> endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/vue.snippets b/sources_non_forked/vim-snippets/UltiSnips/vue.snippets new file mode 100644 index 00000000..4e09d0cc --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/vue.snippets @@ -0,0 +1 @@ +extends html, javascript, css diff --git a/sources_non_forked/vim-snippets/snippets/c.snippets b/sources_non_forked/vim-snippets/snippets/c.snippets index 6e8fb0a5..0336a147 100644 --- a/sources_non_forked/vim-snippets/snippets/c.snippets +++ b/sources_non_forked/vim-snippets/snippets/c.snippets @@ -141,7 +141,7 @@ snippet dfun0 /*! \brief ${1:Brief function description here} * * ${2:Detailed description of the function} - * + * * \return ${3:Return parameter description} */ ${4:void} ${5:function_name}() @@ -159,7 +159,7 @@ snippet dfun1 /*! \brief ${1:Brief function description here} * * ${2:Detailed description of the function} - * + * * \param $3 ${4:Parameter description} * \return ${5:Return parameter description} */ @@ -178,7 +178,7 @@ snippet dfun2 /*! \brief ${1:Brief function description here} * * ${2:Detailed description of the function} - * + * * \param $3 ${4:Parameter description} * \param $5 ${6:Parameter description} * \return ${7:Return parameter description} @@ -198,7 +198,7 @@ snippet dfun3 /*! \brief ${1:Brief function description here} * * ${2:Detailed description of the function} - * + * * \param $3 ${4:Parameter description} * \param $5 ${6:Parameter description} * \param $7 ${8:Parameter description} @@ -218,20 +218,20 @@ snippet td typedef ${1:int} ${2:MyCustomType}; # struct snippet st - /*! \struct $1 + /*! \struct $1 * \brief ${3:Brief struct description} - * - * ${4:Detailed description} + * + * ${4:Detailed description} */ struct ${1:`vim_snippets#Filename('$1_t', 'name')`} { ${2:Data} /*!< ${4:Description} */ }${5: /* optional variable list */}; # typedef struct snippet tds - /*! \struct $2 + /*! \struct $2 * \brief ${5:Brief struct description} - * - * ${6:Detailed description} + * + * ${6:Detailed description} */ typedef struct ${2:_$1 }{ m_${3:Data} /*!< ${4:Description} */ @@ -239,15 +239,15 @@ snippet tds snippet enum /*! \enum $1 - * - * ${2:Detailed description} + * + * ${2:Detailed description} */ enum ${1:name} { ${0} }; # typedef enum snippet tde /*! \enum $2 - * - * ${4:Detailed description} + * + * ${4:Detailed description} */ typedef enum { ${1:Data} /*!< ${3:Description} */ diff --git a/sources_non_forked/vim-snippets/snippets/cpp.snippets b/sources_non_forked/vim-snippets/snippets/cpp.snippets index 7a55b95e..4c02a47f 100644 --- a/sources_non_forked/vim-snippets/snippets/cpp.snippets +++ b/sources_non_forked/vim-snippets/snippets/cpp.snippets @@ -78,10 +78,10 @@ snippet mu ## Class # class snippet cl - /*! \class $1 + /*! \class $1 * \brief ${3:Brief class description} - * - * ${4:Detailed description} + * + * ${4:Detailed description} */ class ${1:`vim_snippets#Filename('$1', 'name')`} { @@ -102,7 +102,7 @@ snippet dmfun0 /*! \brief ${4:Brief function description here} * * ${5:Detailed description} - * + * * \return ${6:Return parameter description} */ ${3:void} ${1:`vim_snippets#Filename('$1', 'ClassName')`}::${2:memberFunction}() { @@ -113,7 +113,7 @@ snippet dmfun1 /*! \brief ${6:Brief function description here} * * ${7:Detailed description} - * + * * \param $4 ${8:Parameter description} * \return ${9:Return parameter description} */ @@ -125,7 +125,7 @@ snippet dmfun2 /*! \brief ${8:Brief function description here} * * ${9:Detailed description} - * + * * \param $4 ${10:Parameter description} * \param $6 ${11:Parameter description} * \return ${12:Return parameter description} @@ -193,7 +193,7 @@ snippet lld [${1}](${2}){ ${3} }; -# snippets exception +# snippets exception snippet try try { diff --git a/sources_non_forked/vim-snippets/snippets/erlang.snippets b/sources_non_forked/vim-snippets/snippets/erlang.snippets index bd379f3d..960c8e76 100644 --- a/sources_non_forked/vim-snippets/snippets/erlang.snippets +++ b/sources_non_forked/vim-snippets/snippets/erlang.snippets @@ -1,14 +1,16 @@ -# module and export all +# module snippet mod - -module(${1:`vim_snippets#Filename('', 'my')`}). - + -module(${1:`vim_snippets#Filename()`}). +# module and export all +snippet modall + -module(${1:`vim_snippets#Filename()`}). -compile([export_all]). - + start() -> - ${0} - + ${0} + stop() -> - ok. + ok. # define directive snippet def -define(${1:macro}, ${2:body}). @@ -73,7 +75,7 @@ snippet %p %% @private # OTP application snippet application - -module(${1:`vim_snippets#Filename('', 'my')`}). + -module(${1:`vim_snippets#Filename()`}). -behaviour(application). @@ -91,7 +93,7 @@ snippet application ok. # OTP supervisor snippet supervisor - -module(${1:`vim_snippets#Filename('', 'my')`}). + -module(${1:`vim_snippets#Filename()`}). -behaviour(supervisor). @@ -114,7 +116,7 @@ snippet supervisor {ok, {RestartStrategy, Children}}. # OTP gen_server snippet gen_server - -module(${0:`vim_snippets#Filename('', 'my')`}). + -module(${0:`vim_snippets#Filename()`}). -behaviour(gen_server). @@ -170,7 +172,7 @@ snippet gen_server %%%=================================================================== # OTP gen_fsm snippet gen_fsm - -module(${0:`vim_snippets#Filename('', 'my')`}). + -module(${0:`vim_snippets#Filename()`}). -behaviour(gen_fsm). @@ -348,7 +350,7 @@ snippet gen_fsm %%%=================================================================== # OTP gen_event snippet gen_event - -module(${0:`vim_snippets#Filename('', 'my')`}). + -module(${0:`vim_snippets#Filename()`}). -behaviour(gen_event). @@ -484,7 +486,7 @@ snippet gen_event %%%=================================================================== # EUnit snippets snippet eunit - -module(${1:`vim_snippets#Filename('', 'my')`}). + -module(${1:`vim_snippets#Filename()`}). -include_lib("eunit/include/eunit.hrl"). ${0} @@ -515,7 +517,7 @@ snippet asexc ?assertException(${1:Class}, ${2:Pattern}, ${0:Expression}) # common_test test_SUITE snippet testsuite - -module(${0:`vim_snippets#Filename('', 'my')`}). + -module(${0:`vim_snippets#Filename()`}). -include_lib("common_test/include/ct.hrl"). From 1a082031d905c7434d72774c5c1aa0d435f37714 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 13:36:01 +0200 Subject: [PATCH 208/254] Fixed https://github.com/amix/vimrc/issues/279 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 76f53e91..58f09563 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,8 @@ You can also install your own plugins, for instance, via pathogen you can instal ## Key Mappings +The [leader](http://learnvimscriptthehardway.stevelosh.com/chapters/06.html#leader) is `,`, so whenever you see `<leader>` it means `,`. + ### Plugin related mappings Open [bufexplorer](https://github.com/vim-scripts/bufexplorer.zip) and see and manage the current buffers (`<leader>o`): From e4af7256247bc1c365c9e093492ab31f5f4eab19 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 13:38:55 +0200 Subject: [PATCH 209/254] Fixed https://github.com/amix/vimrc/issues/278 --- install_awesome_vimrc.sh | 3 +++ install_basic_vimrc.sh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/install_awesome_vimrc.sh b/install_awesome_vimrc.sh index e8330afc..6b94e519 100644 --- a/install_awesome_vimrc.sh +++ b/install_awesome_vimrc.sh @@ -1,3 +1,6 @@ +#!/bin/sh +set -e + cd ~/.vim_runtime echo 'set runtimepath+=~/.vim_runtime diff --git a/install_basic_vimrc.sh b/install_basic_vimrc.sh index 3478144d..6b3142d1 100644 --- a/install_basic_vimrc.sh +++ b/install_basic_vimrc.sh @@ -1,3 +1,6 @@ +#!/bin/sh +set -e + cd ~/.vim_runtime cat ~/.vim_runtime/vimrcs/basic.vim > ~/.vimrc echo "Installed the Basic Vim configuration successfully! Enjoy :-)" From c5165627483a5071539aa90eca2511cbca946521 Mon Sep 17 00:00:00 2001 From: Amir Salihefendic <amix@doist.com> Date: Sat, 1 Apr 2017 13:48:28 +0200 Subject: [PATCH 210/254] Updated the logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58f09563..843ef6b9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![VIM](https://camo.githubusercontent.com/bec48ea0e886e5489a8819486bf74075fe626067/68747470733a2f2f7261772e6769746875622e636f6d2f656c6d636173742f656c6d2d76696d2f6d61737465722f73637265656e73686f74732f6c6f676f2e706e67) +![VIM](https://dnp4pehkvoo6n.cloudfront.net/43c5af597bd5c1a64eb1829f011c208f/as/Ultimate%20Vimrc.svg) # The Ultimate vimrc From 23ad247835c9fa0ba23f590a8babe2b79038a0b6 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 13:58:59 +0200 Subject: [PATCH 211/254] Updated the readme (a cleanup) --- README.md | 98 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 58f09563..7c29072d 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ # The Ultimate vimrc -Over the last 10 years I have used and tweaked Vim. This is the ultimate vimrc (or at least my version of it). +Over the last 10 years, I have used and tweaked Vim. This configuration is the ultimate vimrc (or at least my version of it). There are two versions: * **The Basic**: If you want something small just copy [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim) into your ~/.vimrc and you will have a good basic setup -* **The Awesome**: Includes a ton of useful plugins, color schemes and configurations +* **The Awesome**: Includes a ton of useful plugins, color schemes, and configurations -I would of course recommend using the awesome version. +I would, of course, recommend using the awesome version. ## How to install the Awesome version? The awesome version includes a lot of great plugins, configurations and color schemes that make Vim a lot better. To install it simply do following from your terminal: @@ -17,12 +17,12 @@ The awesome version includes a lot of great plugins, configurations and color sc git clone https://github.com/amix/vimrc.git ~/.vim_runtime sh ~/.vim_runtime/install_awesome_vimrc.sh -I also recommend using [the Hack font](http://sourcefoundry.org/hack/) (it's free and awesome font designed for source code). The Awesome vimrc is already setup to try to use it. +I also recommend using [the Hack font](http://sourcefoundry.org/hack/) (it's a free and awesome font designed for source code). The Awesome vimrc is already setup to try to use it. ## How to install the Basic version? -The basic version is basically just one file and no plugins. Simply copy [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim) and paste it into your vimrc. +The basic version is just one file and no plugins. Just copy [basic.vim](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim) and paste it into your vimrc. -This is useful to install on remote servers where you don't need many plugins and you don't do many edits. +The basic version is useful to install on remote servers where you don't need many plugins, and you don't do many edits. git clone git://github.com/amix/vimrc.git ~/.vim_runtime sh ~/.vim_runtime/install_basic_vimrc.sh @@ -39,7 +39,7 @@ If you have vim aliased as `vi` instead of `vim`, make sure to either alias it: ## How to update to latest version? -Simply just do a git rebase! +Just do a git rebase! cd ~/.vim_runtime git pull --rebase @@ -48,9 +48,11 @@ Simply just do a git rebase! ## Some screenshots Colors when editing a Python file: + ![Screenshot 1](http://files1.wedoist.com/e952fdb343b1e617b90d256e474d0370/as/screenshot_1.png) -Opening recently opened files [mru.vim](https://github.com/vim-scripts/mru.vim): +Opening recently opened files with the [mru.vim](https://github.com/vim-scripts/mru.vim) plugin: + ![Screenshot 2](http://files1.wedoist.com/1967b0e48af40e513d1a464e08196990/as/screenshot_2.png) [NERD Tree](https://github.com/scrooloose/nerdtree) plugin in a terminal window: @@ -65,7 +67,7 @@ Distraction free mode using [goyo.vim](https://github.com/junegunn/goyo.vim) and ## Included Plugins -I recommend reading the docs of these plugins to understand them better. Each of them provide a much better Vim experience! +I recommend reading the docs of these plugins to understand them better. Each plugin provides a much better Vim experience! * [ag.vim](https://github.com/rking/ag.vim): Vim plugin for `the_silver_searcher` (ag) -- a wicked fast grep * [bufexplorer.zip](https://github.com/vim-scripts/bufexplorer.zip): Quickly and easily switch between buffers. This plugin can be opened with `<leader+o>` @@ -108,37 +110,38 @@ Remove all clutter and focus only on the essential. Similar to iA Writer or Writ ## How to include your own stuff? -After you have installed the setup you can create **~/.vim_runtime/my_configs.vim** to fill in any configurations that are important for you. For instance, my **my_configs.vim** looks like this: +After you have installed the setup, you can create **~/.vim_runtime/my_configs.vim** to fill in any configurations that are important for you. For instance, my **my_configs.vim** looks like this: ~/.vim_runtime (master)> cat my_configs.vim map <leader>ct :cd ~/Desktop/Todoist/todoist<cr> map <leader>cw :cd ~/Desktop/Wedoist/wedoist<cr> -You can also install your own plugins, for instance, via pathogen you can install [vim-rails](https://github.com/tpope/vim-rails): +You can also install your plugins, for instance, via pathogen you can install [vim-rails](https://github.com/tpope/vim-rails): cd ~/.vim_runtime git clone git://github.com/tpope/vim-rails.git sources_non_forked/vim-rails - + ## Key Mappings The [leader](http://learnvimscriptthehardway.stevelosh.com/chapters/06.html#leader) is `,`, so whenever you see `<leader>` it means `,`. + ### Plugin related mappings -Open [bufexplorer](https://github.com/vim-scripts/bufexplorer.zip) and see and manage the current buffers (`<leader>o`): +Open [bufexplorer](https://github.com/vim-scripts/bufexplorer.zip) to see and manage the current buffers (`<leader>o`): map <leader>o :BufExplorer<cr> -Open [MRU.vim](https://github.com/vim-scripts/mru.vim) and see the recently open files (`<leader>f`): +Open [MRU.vim](https://github.com/vim-scripts/mru.vim) to see the recently open files (`<leader>f`): map <leader>f :MRU<CR> -Open [ctrlp.vim](https://github.com/kien/ctrlp.vim) plugin (`<leader>j` or `<ctrl>f`): +Open [ctrlp.vim](https://github.com/kien/ctrlp.vim) plugin to quickly find a file or a buffer (`<leader>j` or `<ctrl>f`): let g:ctrlp_map = '<c-f>' -Managing the [NERD Tree](https://github.com/scrooloose/nerdtree) plugin: +[NERD Tree](https://github.com/scrooloose/nerdtree) mappings: map <leader>nn :NERDTreeToggle<cr> map <leader>nb :NERDTreeFromBookmark @@ -148,6 +151,7 @@ Managing the [NERD Tree](https://github.com/scrooloose/nerdtree) plugin: map <leader>z :Goyo<cr> + ### Normal mode mappings Fast saving of a buffer (`<leader>w`): @@ -160,7 +164,7 @@ Map `<Space>` to `/` (search) and `<Ctrl>+<Space>` to `?` (backwards search): map <c-space> ? map <silent> <leader><cr> :noh<cr> -Disable highlight when `<leader><cr>` is pressed: +Disable highlights when you press `<leader><cr>`: map <silent> <leader><cr> :noh<cr> @@ -171,7 +175,7 @@ Smart way to move between windows (`<ctrl>j` etc.): map <C-h> <C-W>h map <C-l> <C-W>l -Closing of current buffer(s) (`<leader>bd` and (`<leader>ba`)): +Closing of the current buffer(s) (`<leader>bd` and (`<leader>ba`)): " Close current buffer map <leader>bd :Bclose<cr> @@ -190,18 +194,14 @@ Useful mappings for managing tabs: " Super useful when editing files in the same directory map <leader>te :tabedit <c-r>=expand("%:p:h")<cr>/ -Switch CWD to the directory of the open buffer: +Switch [CWD](http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file) to the directory of the open buffer: map <leader>cd :cd %:p:h<cr>:pwd<cr> -Open `ag.vim` and put the cursor in the right position: +Open `ag.vim` for fast search: map <leader>g :Ag -Remove the Windows ^M - when the encodings gets messed up: - - noremap <leader>m mmHmt:%s/<C-V><cr>//ge<cr>'tzt'm - Quickly open a buffer for scripbble: map <leader>q :e ~/buffer<cr> @@ -211,23 +211,6 @@ Toggle paste mode on and off: map <leader>pp :setlocal paste!<cr> -### Insert mode mappings - -Quickly insert parenthesis/brackets/etc.: - - inoremap $1 ()<esc>i - inoremap $2 []<esc>i - inoremap $3 {}<esc>i - inoremap $4 {<esc>o}<esc>O - inoremap $q ''<esc>i - inoremap $e ""<esc>i - inoremap $t <><esc>i - -Insert the current date and time (useful for timestamps): - - iab xdate <c-r>=strftime("%d/%m/%y %H:%M:%S")<cr> - - ### Visual mode mappings Visual mode pressing `*` or `#` searches for the current selection: @@ -251,7 +234,24 @@ Surround the visual selection in parenthesis/brackets/etc.: vnoremap $$ <esc>`>a"<esc>`<i"<esc> vnoremap $q <esc>`>a'<esc>`<i'<esc> vnoremap $e <esc>`>a"<esc>`<i"<esc> - + + +### Insert mode mappings + +Quickly insert parenthesis/brackets/etc.: + + inoremap $1 ()<esc>i + inoremap $2 []<esc>i + inoremap $3 {}<esc>i + inoremap $4 {<esc>o}<esc>O + inoremap $q ''<esc>i + inoremap $e ""<esc>i + inoremap $t <><esc>i + +Insert the current date and time (useful for timestamps): + + iab xdate <c-r>=strftime("%d/%m/%y %H:%M:%S")<cr> + ### Command line mappings @@ -274,19 +274,20 @@ Write the file as sudo (works only on Unix). Super useful when you open a file a ### Spell checking -Pressing `<leader>ss` will toggle and untoggle spell checking +Pressing `<leader>ss` will toggle spell checking: map <leader>ss :setlocal spell!<cr> -Shortcuts using `<leader>` instead of special chars +Shortcuts using `<leader>` instead of special characters: map <leader>sn ]s map <leader>sp [s map <leader>sa zg map <leader>s? z= -### Cope -Do :help cope if you are unsure what cope is. It's super useful! + +### Cope +Query `:help cope` if you are unsure what cope is. It's super useful! When you search with `ag.vim`, display your results in cope by doing: `<leader>cc` @@ -297,14 +298,15 @@ To go to the next search result do: To go to the previous search results do: `<leader>p` -Vimscript mappings: +Cope mappings: map <leader>cc :botright cope<cr> map <leader>co ggVGy:tabnew<cr>:set syntax=qf<cr>pgg map <leader>n :cn<cr> map <leader>p :cp<cr> + ## How to uninstall -Do following: +Just do following: * Remove `~/.vim_runtime` * Remove any lines that reference `.vim_runtime` in your `~/.vimrc` From 89ed4f435b54ea25ca5d55294d02b5b2958b6e6f Mon Sep 17 00:00:00 2001 From: Amir Salihefendic <amix@doist.com> Date: Sat, 1 Apr 2017 14:05:50 +0200 Subject: [PATCH 212/254] Updated screenshots --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bea55747..638a5f4e 100644 --- a/README.md +++ b/README.md @@ -49,20 +49,17 @@ Just do a git rebase! Colors when editing a Python file: -![Screenshot 1](http://files1.wedoist.com/e952fdb343b1e617b90d256e474d0370/as/screenshot_1.png) +![Screenshot 1](https://dnp4pehkvoo6n.cloudfront.net/07583008e4da885801657e8781777844/as/Python%20editing.png) Opening recently opened files with the [mru.vim](https://github.com/vim-scripts/mru.vim) plugin: -![Screenshot 2](http://files1.wedoist.com/1967b0e48af40e513d1a464e08196990/as/screenshot_2.png) +![Screenshot 2](https://dnp4pehkvoo6n.cloudfront.net/1d49a88f9bd5d013c025bb1e1272a7d8/as/MRU%20plugin.png) [NERD Tree](https://github.com/scrooloose/nerdtree) plugin in a terminal window: -![Screenshot 3](http://files1.wedoist.com/b1509d7ed9e9f357e8d04797f9fad67b/as/screenshot3.png) - -This vimrc even works on Windows! -![Screenshot 4](http://files1.wedoist.com/4e85163d97b81422240c822c82022f2f/as/screenshot_4.png) +![Screenshot 3](https://dnp4pehkvoo6n.cloudfront.net/ae719203166585d64728f28398f4b1b7/as/Terminal%20usage.png) Distraction free mode using [goyo.vim](https://github.com/junegunn/goyo.vim) and [vim-zenroom2](https://github.com/amix/vim-zenroom2): -![Screenshot 5](https://d2dq6e731uoz0t.cloudfront.net/a5182977c3d6c2a6cd3f9e97398ca8ca/as/zen_mode.jpg) +![Screenshot 4](https://dnp4pehkvoo6n.cloudfront.net/f0dcc4c9739148c56cbf8285a910ac41/as/Zen%20mode.png) ## Included Plugins From 04ce579f61fc60e8cba9fb92d05e4cb15aa7fbca Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 14:12:35 +0200 Subject: [PATCH 213/254] Fixed https://github.com/amix/vimrc/issues/263 --- vimrcs/basic.vim | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index 6c1d423c..b783aef3 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -299,14 +299,18 @@ if has("mac") || has("macunix") vmap <D-k> <M-k> endif -" Delete trailing white space on save, useful for Python and CoffeeScript ;) -func! DeleteTrailingWS() - exe "normal mz" - %s/\s\+$//ge - exe "normal `z" -endfunc -autocmd BufWrite *.py :call DeleteTrailingWS() -autocmd BufWrite *.coffee :call DeleteTrailingWS() +" Delete trailing white space on save, useful for some filetypes ;) +fun! CleanExtraSpaces() + let save_cursor = getpos(".") + let old_query = getreg('/') + silent! %s/\s\+$//e + call setpos('.', save_cursor) + call setreg('/', old_query) +endfun + +if has("autocmd") + autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces() +endif """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" From c4fbfe8aa877c8b595bc515ec241217c3744a589 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Sat, 1 Apr 2017 14:29:02 +0200 Subject: [PATCH 214/254] Fixed https://github.com/amix/vimrc/issues/246 --- README.md | 10 +- sources_non_forked/ack.vim/.gitignore | 1 + sources_non_forked/ack.vim/LICENSE | 89 +++++ sources_non_forked/ack.vim/README.md | 161 +++++++++ sources_non_forked/ack.vim/autoload/ack.vim | 246 ++++++++++++++ sources_non_forked/ack.vim/doc/ack.txt | 315 ++++++++++++++++++ .../ack.vim/doc/ack_quick_help.txt | 15 + sources_non_forked/ack.vim/ftplugin/qf.vim | 9 + sources_non_forked/ack.vim/plugin/ack.vim | 83 +++++ sources_non_forked/ag.vim/.gitignore | 2 - sources_non_forked/ag.vim/README.md | 81 ----- sources_non_forked/ag.vim/Rakefile | 3 - sources_non_forked/ag.vim/autoload/ag.vim | 234 ------------- sources_non_forked/ag.vim/doc/ag.txt | 174 ---------- sources_non_forked/ag.vim/plugin/ag.vim | 11 - .../vim-snipmate/autoload/snipMate.vim | 8 +- .../vim-snipmate/plugin/snipMate.vim | 3 +- update_plugins.py | 2 +- vimrcs/basic.vim | 63 +--- vimrcs/extended.vim | 60 ++++ 20 files changed, 993 insertions(+), 577 deletions(-) create mode 100644 sources_non_forked/ack.vim/.gitignore create mode 100644 sources_non_forked/ack.vim/LICENSE create mode 100644 sources_non_forked/ack.vim/README.md create mode 100644 sources_non_forked/ack.vim/autoload/ack.vim create mode 100644 sources_non_forked/ack.vim/doc/ack.txt create mode 100644 sources_non_forked/ack.vim/doc/ack_quick_help.txt create mode 100644 sources_non_forked/ack.vim/ftplugin/qf.vim create mode 100644 sources_non_forked/ack.vim/plugin/ack.vim delete mode 100644 sources_non_forked/ag.vim/.gitignore delete mode 100644 sources_non_forked/ag.vim/README.md delete mode 100644 sources_non_forked/ag.vim/Rakefile delete mode 100644 sources_non_forked/ag.vim/autoload/ag.vim delete mode 100644 sources_non_forked/ag.vim/doc/ag.txt delete mode 100644 sources_non_forked/ag.vim/plugin/ag.vim diff --git a/README.md b/README.md index 638a5f4e..52efaaaa 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Distraction free mode using [goyo.vim](https://github.com/junegunn/goyo.vim) and I recommend reading the docs of these plugins to understand them better. Each plugin provides a much better Vim experience! -* [ag.vim](https://github.com/rking/ag.vim): Vim plugin for `the_silver_searcher` (ag) -- a wicked fast grep +* [ack.vim](https://github.com/mileszs/ack.vim): Vim plugin for `the_silver_searcher` (ag) or ack -- a wicked fast grep * [bufexplorer.zip](https://github.com/vim-scripts/bufexplorer.zip): Quickly and easily switch between buffers. This plugin can be opened with `<leader+o>` * [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim): Fuzzy file, buffer, mru and tag finder. It's mapped to `<Ctrl+F>` * [goyo.vim](https://github.com/junegunn/goyo.vim) and [vim-zenroom2](https://github.com/amix/vim-zenroom2): @@ -195,9 +195,9 @@ Switch [CWD](http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file map <leader>cd :cd %:p:h<cr>:pwd<cr> -Open `ag.vim` for fast search: +Open `ack.vim` for fast search: - map <leader>g :Ag + map <leader>g :Ack Quickly open a buffer for scripbble: @@ -215,7 +215,7 @@ Visual mode pressing `*` or `#` searches for the current selection: vnoremap <silent> * :call VisualSelection('f')<CR> vnoremap <silent> # :call VisualSelection('b')<CR> -When you press gv you `ag.vim` after the selected text: +When you press gv you `Ack.vim` after the selected text: vnoremap <silent> gv :call VisualSelection('gv', '')<CR> @@ -286,7 +286,7 @@ Shortcuts using `<leader>` instead of special characters: ### Cope Query `:help cope` if you are unsure what cope is. It's super useful! -When you search with `ag.vim`, display your results in cope by doing: +When you search with `Ack.vim`, display your results in cope by doing: `<leader>cc` To go to the next search result do: diff --git a/sources_non_forked/ack.vim/.gitignore b/sources_non_forked/ack.vim/.gitignore new file mode 100644 index 00000000..6e92f57d --- /dev/null +++ b/sources_non_forked/ack.vim/.gitignore @@ -0,0 +1 @@ +tags diff --git a/sources_non_forked/ack.vim/LICENSE b/sources_non_forked/ack.vim/LICENSE new file mode 100644 index 00000000..056ea36c --- /dev/null +++ b/sources_non_forked/ack.vim/LICENSE @@ -0,0 +1,89 @@ +ack.vim is distributed under the same license terms as Vim itself, which you +can find in full with `:help license` within Vim, or copied in full herein. + +Copyright (c) 2007-2015 Antoine Imbert <antoine.imbert+ackvim@gmail.com> + and contributors. + +Maintainers may be contacted via GitHub Issues at: + + https://github.com/mileszs/ack.vim/issues + + +VIM LICENSE + +I) There are no restrictions on distributing unmodified copies of Vim except + that they must include this license text. You can also distribute + unmodified parts of Vim, likewise unrestricted except that they must + include this license text. You are also allowed to include executables + that you made from the unmodified Vim sources, plus your own usage + examples and Vim scripts. + +II) It is allowed to distribute a modified (or extended) version of Vim, + including executables and/or source code, when the following four + conditions are met: + 1) This license text must be included unmodified. + 2) The modified Vim must be distributed in one of the following five ways: + a) If you make changes to Vim yourself, you must clearly describe in + the distribution how to contact you. When the maintainer asks you + (in any way) for a copy of the modified Vim you distributed, you + must make your changes, including source code, available to the + maintainer without fee. The maintainer reserves the right to + include your changes in the official version of Vim. What the + maintainer will do with your changes and under what license they + will be distributed is negotiable. If there has been no negotiation + then this license, or a later version, also applies to your changes. + The current maintainer is Bram Moolenaar <Bram@vim.org>. If this + changes it will be announced in appropriate places (most likely + vim.sf.net, www.vim.org and/or comp.editors). When it is completely + impossible to contact the maintainer, the obligation to send him + your changes ceases. Once the maintainer has confirmed that he has + received your changes they will not have to be sent again. + b) If you have received a modified Vim that was distributed as + mentioned under a) you are allowed to further distribute it + unmodified, as mentioned at I). If you make additional changes the + text under a) applies to those changes. + c) Provide all the changes, including source code, with every copy of + the modified Vim you distribute. This may be done in the form of a + context diff. You can choose what license to use for new code you + add. The changes and their license must not restrict others from + making their own changes to the official version of Vim. + d) When you have a modified Vim which includes changes as mentioned + under c), you can distribute it without the source code for the + changes if the following three conditions are met: + - The license that applies to the changes permits you to distribute + the changes to the Vim maintainer without fee or restriction, and + permits the Vim maintainer to include the changes in the official + version of Vim without fee or restriction. + - You keep the changes for at least three years after last + distributing the corresponding modified Vim. When the maintainer + or someone who you distributed the modified Vim to asks you (in + any way) for the changes within this period, you must make them + available to him. + - You clearly describe in the distribution how to contact you. This + contact information must remain valid for at least three years + after last distributing the corresponding modified Vim, or as long + as possible. + e) When the GNU General Public License (GPL) applies to the changes, + you can distribute the modified Vim under the GNU GPL version 2 or + any later version. + 3) A message must be added, at least in the output of the ":version" + command and in the intro screen, such that the user of the modified Vim + is able to see that it was modified. When distributing as mentioned + under 2)e) adding the message is only required for as far as this does + not conflict with the license used for the changes. + 4) The contact information as required under 2)a) and 2)d) must not be + removed or changed, except that the person himself can make + corrections. + +III) If you distribute a modified version of Vim, you are encouraged to use + the Vim license for your changes and make them available to the + maintainer, including the source code. The preferred way to do this is + by e-mail or by uploading the files to a server and e-mailing the URL. + If the number of changes is small (e.g., a modified Makefile) e-mailing a + context diff will do. The e-mail address to be used is + <maintainer@vim.org> + +IV) It is not allowed to remove this license from the distribution of the Vim + sources, parts of it or from a modified version. You may use this + license for previous Vim releases instead of the license that they came + with, at your option. diff --git a/sources_non_forked/ack.vim/README.md b/sources_non_forked/ack.vim/README.md new file mode 100644 index 00000000..af8f522d --- /dev/null +++ b/sources_non_forked/ack.vim/README.md @@ -0,0 +1,161 @@ +# ack.vim + +Run your favorite search tool from Vim, with an enhanced results list. + +This plugin was designed as a Vim frontend for the Perl module [App::Ack]. Ack +can be used as a replacement for 99% of the uses of _grep_. The plugin allows +you to run ack from Vim, and shows the results in a split window. + +But here's a little secret for the Vim-seasoned: it's just a light wrapper for +Vim's [grepprg] and the [quickfix] window for match results. This makes it easy +to integrate with your own Vim configuration and use existing knowledge of core +features. It also means the plugin is flexible to use with other search tools. + +[App::Ack]: http://search.cpan.org/~petdance/ack/ack +[grepprg]: http://vimdoc.sourceforge.net/htmldoc/options.html#'grepprg' +[quickfix]: http://vimdoc.sourceforge.net/htmldoc/quickfix.html#quickfix + +## Installation + +### Ack + +You will need ack (>= 2.0), of course. To install it follow the +[manual](http://beyondgrep.com/install/). + +### The Plugin + +It is recommended to use one of the popular plugin managers for Vim. There are +many and you probably already have a preferred one, but a few examples for your +copy-and-paste convenience: + +#### Pathogen + + $ git clone https://github.com/mileszs/ack.vim.git ~/.vim/bundle/ack.vim + +#### Vundle + +```vim +Plugin 'mileszs/ack.vim' +``` + +#### NeoBundle + +```vim +NeoBundle 'mileszs/ack.vim' +``` + +#### Manual (not recommended) + +[Download][releases] the plugin and extract it in `~/.vim/` (or +`%PROGRAMFILES%/Vim/vimfiles` on Windows). + +[zipball]: https://github.com/mileszs/ack.vim/archive/master.zip + +## Usage + + :Ack [options] {pattern} [{directories}] + +Search recursively in `{directories}` (which defaults to the current directory) +for the `{pattern}`. + +Files containing the search term will be listed in the quickfix window, along +with the line number of the occurrence, once for each occurrence. `<Enter>` on +a line in this window will open the file, and place the cursor on the matching +line. + +Just like where you use `:grep`, `:grepadd`, `:lgrep`, and :`lgrepadd`, you can +use `:Ack`, `:AckAdd`, `:LAck`, and `:LAckAdd` respectively. (See `:help Ack` +after installing, or [`doc/ack.txt`][doc] in the repo, for more information.) + +For more ack help see [ack documentation](http://beyondgrep.com/documentation/). + +[doc]: https://github.com/mileszs/ack.vim/blob/master/doc/ack.txt + +### Keyboard Shortcuts + +The quickfix results window is augmented with these convenience mappings: + + ? a quick summary of these keys, repeat to close + o to open (same as Enter) + O to open and close the quickfix window + go to preview file, open but maintain focus on ack.vim results + t to open in new tab + T to open in new tab without moving to it + h to open in horizontal split + H to open in horizontal split, keeping focus on the results + v to open in vertical split + gv to open in vertical split, keeping focus on the results + q to close the quickfix window + +### Gotchas + +Some characters have special meaning, and need to be escaped in your search +pattern. For instance, `#`. You need to escape it with `:Ack '\\\#define +foo'` to search for '#define foo'. See [issue #5]. + +[issue #5]: https://github.com/mileszs/ack.vim/issues/5 + +## Possibly FAQ + +#### Can I use `ag` ([The Silver Searcher]) with this? + +Absolutely, and probably other tools if their output is similar or you can +write a pattern match for it--just set `g:ackprg`. If you like, you can fall +back to Ack in case you use your vimrc on a system without Ag available: + +```vim +if executable('ag') + let g:ackprg = 'ag --vimgrep' +endif +``` + +Since Ack is quite portable you might check a copy of it into your dotfiles +repository in `~/bin` so you'll nearly always have it available. + +#### What's the difference from ag.vim? + +Well... not a lot really. + +Present maintainer, yours truly, [kind of wishes they never forked][sadface], +contributes to both, and wouldn't mind seeing them merged again. ag.vim got a +nice code clean-up (which ack.vim is now hopefully getting), and ack.vim picked +up a few features that haven't made their way to ag.vim, like `:AckWindow`, +optional background search execution with [vim-dispatch], and auto-previewing. + +#### I don't want to jump to the first result automatically. #### + +Use `:Ack!`, with bang. If you want this behavior most of the time, you might +like an abbreviation or mapping in your personal config, something like these: + +```vim +cnoreabbrev Ack Ack! +nnoremap <Leader>a :Ack!<Space> +``` + +Most of the `:[L]Ack*` commands support this. Note that this behavior follows +the convention of Vim's built-in `:grep` and `:make` commands. + +[The Silver Searcher]: https://github.com/ggreer/the_silver_searcher +[sadface]: https://github.com/mileszs/ack.vim/commit/d97090fb502d40229e6976dfec0e06636ba227d5#commitcomment-5771145 + +## Changelog + +Please see [the Github releases page][releases]. + +## Credits + +This plugin is derived from Antoine Imbert's blog post [Ack and Vim +Integration][] (in particular, the function in the update to the post). [Miles +Sterrett][mileszs] packaged it up as a plugin and documented it in Vim's help +format, and since then [many contributors][contributors] have submitted +enhancements and fixes. + +And of course, where would we be without [Ack]. And, you know, Vim. + +[Ack and Vim Integration]: http://blog.ant0ine.com/typepad/2007/03/ack-and-vim-integration.html +[mileszs]: https://github.com/mileszs +[contributors]: https://github.com/mileszs/ack.vim/graphs/contributors +[Ack]: http://beyondgrep.com/ + +[vim-dispatch]: https://github.com/tpope/vim-dispatch +[releases]: https://github.com/mileszs/ack.vim/releases diff --git a/sources_non_forked/ack.vim/autoload/ack.vim b/sources_non_forked/ack.vim/autoload/ack.vim new file mode 100644 index 00000000..dbf84572 --- /dev/null +++ b/sources_non_forked/ack.vim/autoload/ack.vim @@ -0,0 +1,246 @@ +if exists('g:autoloaded_ack') || &cp + finish +endif + +if exists('g:ack_use_dispatch') + if g:ack_use_dispatch && !exists(':Dispatch') + call s:Warn('Dispatch not loaded! Falling back to g:ack_use_dispatch = 0.') + let g:ack_use_dispatch = 0 + endif +else + let g:ack_use_dispatch = 0 +endif + +"----------------------------------------------------------------------------- +" Public API +"----------------------------------------------------------------------------- + +function! ack#Ack(cmd, args) "{{{ + call s:Init(a:cmd) + redraw + + " Local values that we'll temporarily set as options when searching + let l:grepprg = g:ackprg + let l:grepformat = '%f:%l:%c:%m,%f:%l:%m' " Include column number + + " Strip some options that are meaningless for path search and set match + " format accordingly. + if s:SearchingFilepaths() + let l:grepprg = substitute(l:grepprg, '-H\|--column', '', 'g') + let l:grepformat = '%f' + endif + + " Check user policy for blank searches + if empty(a:args) + if !g:ack_use_cword_for_empty_search + echo "No regular expression found." + return + endif + endif + + " If no pattern is provided, search for the word under the cursor + let l:grepargs = empty(a:args) ? expand("<cword>") : a:args . join(a:000, ' ') + + "Bypass search if cursor is on blank string + if l:grepargs == "" + echo "No regular expression found." + return + endif + + " NOTE: we escape special chars, but not everything using shellescape to + " allow for passing arguments etc + let l:escaped_args = escape(l:grepargs, '|#%') + + echo "Searching ..." + + if g:ack_use_dispatch + call s:SearchWithDispatch(l:grepprg, l:escaped_args, l:grepformat) + else + call s:SearchWithGrep(a:cmd, l:grepprg, l:escaped_args, l:grepformat) + endif + + " Dispatch has no callback mechanism currently, we just have to display the + " list window early and wait for it to populate :-/ + call ack#ShowResults() + call s:Highlight(l:grepargs) +endfunction "}}} + +function! ack#AckFromSearch(cmd, args) "{{{ + let search = getreg('/') + " translate vim regular expression to perl regular expression. + let search = substitute(search, '\(\\<\|\\>\)', '\\b', 'g') + call ack#Ack(a:cmd, '"' . search . '" ' . a:args) +endfunction "}}} + +function! ack#AckHelp(cmd, args) "{{{ + let args = a:args . ' ' . s:GetDocLocations() + call ack#Ack(a:cmd, args) +endfunction "}}} + +function! ack#AckWindow(cmd, args) "{{{ + let files = tabpagebuflist() + + " remove duplicated filenames (files appearing in more than one window) + let files = filter(copy(sort(files)), 'index(files,v:val,v:key+1)==-1') + call map(files, "bufname(v:val)") + + " remove unnamed buffers as quickfix (empty strings before shellescape) + call filter(files, 'v:val != ""') + + " expand to full path (avoid problems with cd/lcd in au QuickFixCmdPre) + let files = map(files, "shellescape(fnamemodify(v:val, ':p'))") + let args = a:args . ' ' . join(files) + + call ack#Ack(a:cmd, args) +endfunction "}}} + +function! ack#ShowResults() "{{{ + let l:handler = s:UsingLocList() ? g:ack_lhandler : g:ack_qhandler + execute l:handler + call s:ApplyMappings() + redraw! +endfunction "}}} + +"----------------------------------------------------------------------------- +" Private API +"----------------------------------------------------------------------------- + +function! s:ApplyMappings() "{{{ + if !s:UsingListMappings() || &filetype != 'qf' + return + endif + + let l:wintype = s:UsingLocList() ? 'l' : 'c' + let l:closemap = ':' . l:wintype . 'close<CR>' + let g:ack_mappings.q = l:closemap + + nnoremap <buffer> <silent> ? :call <SID>QuickHelp()<CR> + + if g:ack_autoclose + " We just map the 'go' and 'gv' mappings to close on autoclose, wtf? + for key_map in items(g:ack_mappings) + execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1) . l:closemap) + endfor + + execute "nnoremap <buffer> <silent> <CR> <CR>" . l:closemap + else + for key_map in items(g:ack_mappings) + execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1)) + endfor + endif + + if exists("g:ackpreview") " if auto preview in on, remap j and k keys + nnoremap <buffer> <silent> j j<CR><C-W><C-W> + nnoremap <buffer> <silent> k k<CR><C-W><C-W> + nmap <buffer> <silent> <Down> j + nmap <buffer> <silent> <Up> k + endif +endfunction "}}} + +function! s:GetDocLocations() "{{{ + let dp = '' + for p in split(&rtp, ',') + let p = p . '/doc/' + if isdirectory(p) + let dp = p . '*.txt ' . dp + endif + endfor + + return dp +endfunction "}}} + +function! s:Highlight(args) "{{{ + if !g:ackhighlight + return + endif + + let @/ = matchstr(a:args, "\\v(-)\@<!(\<)\@<=\\w+|['\"]\\zs.{-}\\ze['\"]") + call feedkeys(":let &hlsearch=1 \| echo \<CR>", "n") +endfunction "}}} + +" Initialize state for an :Ack* or :LAck* search +function! s:Init(cmd) "{{{ + let s:searching_filepaths = (a:cmd =~# '-g$') ? 1 : 0 + let s:using_loclist = (a:cmd =~# '^l') ? 1 : 0 + + if g:ack_use_dispatch && s:using_loclist + call s:Warn('Dispatch does not support location lists! Proceeding with quickfix...') + let s:using_loclist = 0 + endif +endfunction "}}} + +function! s:QuickHelp() "{{{ + execute 'edit' globpath(&rtp, 'doc/ack_quick_help.txt') + + silent normal gg + setlocal buftype=nofile bufhidden=hide nobuflisted + setlocal nomodifiable noswapfile + setlocal filetype=help + setlocal nonumber norelativenumber nowrap + setlocal foldmethod=diff foldlevel=20 + + nnoremap <buffer> <silent> ? :q!<CR>:call ack#ShowResults()<CR> +endfunction "}}} + +function! s:SearchWithDispatch(grepprg, grepargs, grepformat) "{{{ + let l:makeprg_bak = &l:makeprg + let l:errorformat_bak = &l:errorformat + + " We don't execute a :grep command for Dispatch, so add -g here instead + if s:SearchingFilepaths() + let l:grepprg = a:grepprg . ' -g' + else + let l:grepprg = a:grepprg + endif + + try + let &l:makeprg = l:grepprg . ' ' . a:grepargs + let &l:errorformat = a:grepformat + + Make + finally + let &l:makeprg = l:makeprg_bak + let &l:errorformat = l:errorformat_bak + endtry +endfunction "}}} + +function! s:SearchWithGrep(grepcmd, grepprg, grepargs, grepformat) "{{{ + let l:grepprg_bak = &l:grepprg + let l:grepformat_bak = &grepformat + + try + let &l:grepprg = a:grepprg + let &grepformat = a:grepformat + + silent execute a:grepcmd a:grepargs + finally + let &l:grepprg = l:grepprg_bak + let &grepformat = l:grepformat_bak + endtry +endfunction "}}} + +" Are we finding matching files, not lines? (the -g option -- :AckFile) +function! s:SearchingFilepaths() "{{{ + return get(s:, 'searching_filepaths', 0) +endfunction "}}} + +" Predicate for whether mappings are enabled for list type of current search. +function! s:UsingListMappings() "{{{ + if s:UsingLocList() + return g:ack_apply_lmappings + else + return g:ack_apply_qmappings + endif +endfunction "}}} + +" Were we invoked with a :LAck command? +function! s:UsingLocList() "{{{ + return get(s:, 'using_loclist', 0) +endfunction "}}} + +function! s:Warn(msg) "{{{ + echohl WarningMsg | echomsg 'Ack: ' . a:msg | echohl None +endf "}}} + +let g:autoloaded_ack = 1 +" vim:set et sw=2 ts=2 tw=78 fdm=marker diff --git a/sources_non_forked/ack.vim/doc/ack.txt b/sources_non_forked/ack.vim/doc/ack.txt new file mode 100644 index 00000000..22e884bc --- /dev/null +++ b/sources_non_forked/ack.vim/doc/ack.txt @@ -0,0 +1,315 @@ +*ack.txt* Plugin that integrates ack with Vim + +============================================================================== +Author: Antoine Imbert <antoine.imbert+ackvim@gmail.com> *ack-author* +License: Same terms as Vim itself (see |license|) + +This plugin is only available if 'compatible' is not set. + +{Vi does not have any of this} + +============================================================================== +INTRODUCTION *ack* + +This plugin is a front for the Perl module App::Ack. Ack can be used as a +replacement for grep. This plugin will allow you to run ack from vim, and +shows the results in a split window. + +:Ack[!] [options] {pattern} [{directory}] *:Ack* + + Search recursively in {directory} (which defaults to the current + directory) for the {pattern}. Behaves just like the |:grep| command, but + will open the |Quickfix| window for you. If [!] is not given the first + occurrence is jumped to. + +:AckAdd [options] {pattern} [{directory}] *:AckAdd* + + Just like |:Ack|, but instead of making a new list, the matches are + appended to the current |quickfix| list. + +:AckFromSearch [{directory}] *:AckFromSearch* + + Just like |:Ack| but the pattern is from previous search. + +:LAck [options] {pattern} [{directory}] *:LAck* + + Just like |:Ack| but instead of the |quickfix| list, matches are placed in + the current |location-list|. + +:LAckAdd [options] {pattern} [{directory}] *:LAckAdd* + + Just like |:AckAdd| but instead of the |quickfix| list, matches are added + to the current |location-list| + +:AckFile [options] {pattern} [{directory}] *:AckFile* + + Search recursively in {directory} (which defaults to the current + directory) for filenames matching the {pattern}. Behaves just like the + |:grep| command, but will open the |Quickfix| window for you. + +:AckHelp[!] [options] {pattern} *:AckHelp* + + Search vim documentation files for the {pattern}. Behaves just like the + |:Ack| command, but searches only vim documentation .txt files + +:LAckHelp [options] {pattern} *:LAckHelp* + + Just like |:AckHelp| but instead of the |quickfix| list, matches are placed + in the current |location-list|. + +:AckWindow[!] [options] {pattern} *:AckWindow* + + Search all buffers visible in the screen (current tab page only) files for + the {pattern}. + +:LAckWindow [options] {pattern} *:LAckWindow* + + Just like |:AckWindow| but instead of the |quickfix| list, matches are + placed in the current |location-list|. + +Files containing the search term will be listed in the split window, along +with the line number of the occurrence, once for each occurrence. <Enter> on +a line in this window will open the file, and place the cursor on the matching +line. + +Note that if you are using Dispatch.vim with |g:ack_use_dispatch|, location +lists are not supported, because Dispatch does not support them at this time. +`:LAck` versions of commands above will give a warning and proceed to use the +quickfix list instead. + +See http://beyondgrep.com/ for more information on searching with ack. + + +============================================================================== +CONFIGURATION *ack-configuration* + + *g:ackprg* +g:ackprg +Default for ubuntu: "ack-grep" +Default for other systems: "ack" + +Use this option to specify the search command and its default arguments. + +Example: +> + let g:ackprg = "ag --vimgrep" +< + *g:ack_default_options* +g:ack_default_options +Default: " -s -H --nocolor --nogroup --column" + +Use this option to specify the default arguments given to `ack`. This is only +used if |g:ackprg| has not been customized from the default--if you are using +a custom search program instead of Ack, set your preferred options in +|g:ackprg|. + +NOTE: This option may be deprecated in the future. ~ + +Example: +> + let g:ack_default_options = + \ " -s -H --nocolor --nogroup --column --smart-case --follow" +< + *g:ack_apply_qmappings* +g:ack_apply_qmappings +Default: 1 + +This option enables mappings on the |quickfix| window. + + *g:ack_apply_lmappings* +g:ack_apply_lmappings +Default: 1 + +This option enables mappings on |location-list| windows. + + *g:ack_mappings* +g:ack_mappings +Default: { + \ "t": "<C-W><CR><C-W>T", + \ "T": "<C-W><CR><C-W>TgT<C-W>j", + \ "o": "<CR>", + \ "O": "<CR><C-W><C-W>:ccl<CR>", + \ "go": "<CR><C-W>j", + \ "h": "<C-W><CR><C-W>K", + \ "H": "<C-W><CR><C-W>K<C-W>b", + \ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t", + \ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" } + +This option list all maps create on quickfix/Location list window. + +Example, if you want to open the result in the middle of the screen: +> + let g:ack_mappings = { "o": "<CR>zz" } +< + *g:ack_qhandler* +g:ack_qhandler +Default: "botright copen" + +Command to open the quickview window. + +If you want to open a quickview window with 30 lines you can do: +> + let g:ack_qhandler = "botright copen 30" +< + *g:ack_lhandler* +g:ack_lhandler +Default: "botright lopen" + +Command to open the Location list window. + +If you want to open a Location list window with 30 lines you can do: +> + let g:ack_lhandler = "botright lopen 30" +< + *g:ackhighlight* +g:ackhighlight +Default: 0 + +Use this option to highlight the searched term. + +Example: +> + let g:ackhighlight = 1 +< + *g:ack_autoclose* +g:ack_autoclose +Default: 0 + +Use this option to specify whether to close the quickfix window after +using any of the shortcuts. + +Example: +> + let g:ack_autoclose = 1 +< + *g:ack_autofold_results* +g:ack_autofold_results +Default: 0 + +Use this option to fold the results in quickfix by file name. Only the current +fold will be open by default and while you press 'j' and 'k' to move between the +results if you hit other fold the last one will be closed and the current will +be open. + +Example: +> + let g:ack_autofold_results = 1 +< + *g:ackpreview* +g:ackpreview +Default: 0 + +Use this option to automagically open the file with 'j' or 'k'. + +Example: +> + let g:ackpreview = 1 +< + *g:ack_use_dispatch* +g:ack_use_dispatch +Default: 0 + +Use this option to use vim-dispatch to run searches in the background, with a +variety of execution backends for different systems. + +Due to limitations in Dispatch at this time, location lists are unsupported +and result windows will appear before results are ready. Still, these may be +acceptable tradeoffs for very large projects where searches are slow. + +Example: +> + let g:ack_use_dispatch = 1 +< + *g:ack_use_cword_for_empty_search* +g:ack_use_cword_for_empty_search +Default: 1 + +Use this option to enable blank searches to run against the word under the +cursor. When this option is not set, blank searches will only output an error +message. + +Example: +> + let g:ack_use_cword_for_empty_search = 0 +< +============================================================================== +MAPPINGS *ack-mappings* + +The following keyboard shortcuts are available in the |quickfix| and +|location-list| windows: + +? display a quick summary of these mappings. + +o open file (same as Enter). + +O open file and close the quickfix window. + +go preview file (open but maintain focus on ack.vim results). + +t open in a new tab. + +T open in new tab without moving to it. + +h open in horizontal split. + +H open in horizontal split, keeping focus on the results. + +v open in vertical split. + +gv open in vertical split, keeping focus on the results. + +q close the quickfix window. + +To adjust these, see |g:ack_mappings|. + +============================================================================== +Ignoring files *ack-ignore* + +If you're using this plugin with ag, The Silver Searcher, bear in mind that: + + - It ignores file patterns from your .gitignore and .hgignore. + + - If there are other files in your source repository you don't wish to + search, you can add their patterns to an .agignore file. + +============================================================================== +ISSUES AND FAQ *ack-issues-and-faq* + +I don't want to jump to the first result automatically.~ + + Use `:Ack!`, with bang. If you want this behavior most of the time, you + might like an abbreviation or mapping in your personal config, something + like these: +> + cnoreabbrev Ack Ack! + nnoremap <Leader>a :Ack!<Space> +< + Most of the `:[L]Ack*` commands support this. Note that this behavior + follows the convention of Vim's built-in |:grep| and |:make| commands. + +I use NERDTree and opening ack.vim results in a vertical split displacing it.~ + + You are probably using NERDTree with its default alignment at the left + side of the window. Set these custom mappings in your vimrc to work around + this: +> + let g:ack_mappings = { + \ 'v': '<C-W><CR><C-W>L<C-W>p<C-W>J<C-W>p', + \ 'gv': '<C-W><CR><C-W>L<C-W>p<C-W>J' } +< + This solution will be improved in the future. + +Results show a mix of relative and absolute paths, making them hard to read.~ + + This is a quirk of Vim that can happen with plain |:vimgrep| too. You can + try this in your vimrc to work around it: +> + autocmd BufAdd * exe "cd" fnameescape(getcwd()) +< + but for some users this may be disruptive to their Vim workflow. For more + details, see: + + http://vi.stackexchange.com/a/4816/7174 + https://github.com/mileszs/ack.vim/issues/143 + +vim:set et sw=4 ts=4 tw=78: diff --git a/sources_non_forked/ack.vim/doc/ack_quick_help.txt b/sources_non_forked/ack.vim/doc/ack_quick_help.txt new file mode 100644 index 00000000..94306a0e --- /dev/null +++ b/sources_non_forked/ack.vim/doc/ack_quick_help.txt @@ -0,0 +1,15 @@ +==== ack.vim quick help =============== + + *?:* a quick summary of these keys, repeat to close + *o:* to open (same as Enter) + *O:* to open and close the quickfix window + *go:* to preview file, open but maintain focus on ack.vim results + *t:* to open in new tab + *T:* to open in new tab without moving to it + *h:* to open in horizontal split + *H:* to open in horizontal split, keeping focus on the results + *v:* to open in vertical split + *gv:* to open in vertical split, keeping focus on the results + *q:* to close the quickfix window + +======================================== diff --git a/sources_non_forked/ack.vim/ftplugin/qf.vim b/sources_non_forked/ack.vim/ftplugin/qf.vim new file mode 100644 index 00000000..27564fa7 --- /dev/null +++ b/sources_non_forked/ack.vim/ftplugin/qf.vim @@ -0,0 +1,9 @@ +if exists("g:ack_autofold_results") && g:ack_autofold_results + setlocal foldlevel=0 + setlocal foldmethod=expr + setlocal foldexpr=matchstr(getline(v:lnum),'^[^\|]\\+')==#matchstr(getline(v:lnum+1),'^[^\|]\\+')?1:'<1' + setlocal foldenable + setlocal foldclose=all + setlocal foldopen=all + nnoremap <buffer> j jzz +endif diff --git a/sources_non_forked/ack.vim/plugin/ack.vim b/sources_non_forked/ack.vim/plugin/ack.vim new file mode 100644 index 00000000..202ae2ea --- /dev/null +++ b/sources_non_forked/ack.vim/plugin/ack.vim @@ -0,0 +1,83 @@ +if exists('g:loaded_ack') || &cp + finish +endif + +if !exists("g:ack_default_options") + let g:ack_default_options = " -s -H --nopager --nocolor --nogroup --column" +endif + +" Location of the ack utility +if !exists("g:ackprg") + if executable('ack-grep') + let g:ackprg = "ack-grep" + elseif executable('ack') + let g:ackprg = "ack" + else + finish + endif + let g:ackprg .= g:ack_default_options +endif + +if !exists("g:ack_apply_qmappings") + let g:ack_apply_qmappings = !exists("g:ack_qhandler") +endif + +if !exists("g:ack_apply_lmappings") + let g:ack_apply_lmappings = !exists("g:ack_lhandler") +endif + +let s:ack_mappings = { + \ "t": "<C-W><CR><C-W>T", + \ "T": "<C-W><CR><C-W>TgT<C-W>j", + \ "o": "<CR>", + \ "O": "<CR><C-W>p<C-W>c", + \ "go": "<CR><C-W>p", + \ "h": "<C-W><CR><C-W>K", + \ "H": "<C-W><CR><C-W>K<C-W>b", + \ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t", + \ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" } + +if exists("g:ack_mappings") + let g:ack_mappings = extend(s:ack_mappings, g:ack_mappings) +else + let g:ack_mappings = s:ack_mappings +endif + +if !exists("g:ack_qhandler") + let g:ack_qhandler = "botright copen" +endif + +if !exists("g:ack_lhandler") + let g:ack_lhandler = "botright lopen" +endif + +if !exists("g:ackhighlight") + let g:ackhighlight = 0 +endif + +if !exists("g:ack_autoclose") + let g:ack_autoclose = 0 +endif + +if !exists("g:ack_autofold_results") + let g:ack_autofold_results = 0 +endif + +if !exists("g:ack_use_cword_for_empty_search") + let g:ack_use_cword_for_empty_search = 1 +endif + +command! -bang -nargs=* -complete=file Ack call ack#Ack('grep<bang>', <q-args>) +command! -bang -nargs=* -complete=file AckAdd call ack#Ack('grepadd<bang>', <q-args>) +command! -bang -nargs=* -complete=file AckFromSearch call ack#AckFromSearch('grep<bang>', <q-args>) +command! -bang -nargs=* -complete=file LAck call ack#Ack('lgrep<bang>', <q-args>) +command! -bang -nargs=* -complete=file LAckAdd call ack#Ack('lgrepadd<bang>', <q-args>) +command! -bang -nargs=* -complete=file AckFile call ack#Ack('grep<bang> -g', <q-args>) +command! -bang -nargs=* -complete=help AckHelp call ack#AckHelp('grep<bang>', <q-args>) +command! -bang -nargs=* -complete=help LAckHelp call ack#AckHelp('lgrep<bang>', <q-args>) +command! -bang -nargs=* AckWindow call ack#AckWindow('grep<bang>', <q-args>) +command! -bang -nargs=* LAckWindow call ack#AckWindow('lgrep<bang>', <q-args>) + +let g:loaded_ack = 1 + +" vim:set et sw=2 ts=2 tw=78 fdm=marker diff --git a/sources_non_forked/ag.vim/.gitignore b/sources_non_forked/ag.vim/.gitignore deleted file mode 100644 index e350eccf..00000000 --- a/sources_non_forked/ag.vim/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -tags -ag-vim.tgz diff --git a/sources_non_forked/ag.vim/README.md b/sources_non_forked/ag.vim/README.md deleted file mode 100644 index e02a4d3e..00000000 --- a/sources_non_forked/ag.vim/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# ag.vim # - -## Deprecated: See [this comment](https://github.com/rking/ag.vim/issues/124#issuecomment-227038003) for more info. Maybe try [ack.vim](https://github.com/mileszs/ack.vim#can-i-use-ag-the-silver-searcher-with-this) as an alternative. ## - -This plugin is a front for ag, A.K.A. -[the_silver_searcher](https://github.com/ggreer/the_silver_searcher). Ag can -be used as a replacement for 153% of the uses of `ack`. This plugin will allow -you to run ag from vim, and shows the results in a split window. - -## Installation ## - -See [the_silver_searcher's README](https://github.com/ggreer/the_silver_searcher#installing) for its installation instructions (if you haven't installed it already). - -You have to first install [ag](https://github.com/ggreer/the_silver_searcher), itself. On Mac+Homebrew, Gentoo Linux, several others, there's package named `the_silver_searcher`, but if your OS/distro don't have one, the GitHub repo installs fine: - -Vim has various ways of installing plugins, the standard way is in [the documentation](http://vimdoc.sourceforge.net/htmldoc/usr_05.html#plugin), but most people use a plugin to manage their plugins. If you don't already have a preferred plugin manager plugin, why not try one of the following? -- [vim-plug](https://github.com/junegunn/vim-plug#readme) -- [vim-pathogen](https://github.com/tpope/vim-pathogen#readme) -- [Vundle.vim](https://github.com/gmarik/Vundle.vim#readme) -- Or, if you don't use any sort of Vim plugin management: - - ```sh - cd ~/.vim/bundle && git clone https://github.com/rking/ag.vim ag && echo "set runtimepath^=~/.vim/bundle/ag" >> ~/.vimrc - ``` - - Then open vim and run `:helptags ~/.vim/bundle/ag/doc`. - -### Configuration ### - -You can specify a custom ag name and path in your .vimrc like so: - - let g:ag_prg="<custom-ag-path-goes-here> --vimgrep" - -You can configure ag.vim to always start searching from your project root -instead of the cwd - - let g:ag_working_path_mode="r" - -## Usage ## - - :Ag [options] {pattern} [{directory}] - -Search recursively in {directory} (which defaults to the current directory) for the {pattern}. - -Files containing the search term will be listed in the split window, along with -the line number of the occurrence, once for each occurrence. [Enter] on a line -in this window will open the file, and place the cursor on the matching line. - -Just like where you use :grep, :grepadd, :lgrep, and :lgrepadd, you can use `:Ag`, `:AgAdd`, `:LAg`, and `:LAgAdd` respectively. (See `doc/ag.txt`, or install and `:h Ag` for more information.) - -### Gotchas ### - -Some characters have special meaning, and need to be escaped your search pattern. For instance, '#'. You have to escape it like this `:Ag '\\\#define foo'` to search for `#define foo`. (From [blueyed in issue #5](https://github.com/mileszs/ack.vim/issues/5).) - -Sometimes `git grep` is even faster, though in my experience it's not noticeably so. - -### Keyboard Shortcuts ### - -In the quickfix window, you can use: - - e to open file and close the quickfix window - o to open (same as enter) - go to preview file (open but maintain focus on ag.vim results) - t to open in new tab - T to open in new tab silently - h to open in horizontal split - H to open in horizontal split silently - v to open in vertical split - gv to open in vertical split silently - q to close the quickfix window - -### Related Plugin ### -[vim-ag-anything](https://github.com/Chun-Yang/vim-ag-anything) adds an 'ga' action to search any text object. - -### Acknowledgements ### - -This Vim plugin is derived (and by derived, I mean copied, almost entirely) -from [milesz's ack.vim](https://github.com/mileszs/ack.vim), which I also -recommend installing since you might be in a situation where you have ack but -not ag, and don't want to stop to install ag. Also, ack supports `--type`, and -a few other features. diff --git a/sources_non_forked/ag.vim/Rakefile b/sources_non_forked/ag.vim/Rakefile deleted file mode 100644 index e6bb6da7..00000000 --- a/sources_non_forked/ag.vim/Rakefile +++ /dev/null @@ -1,3 +0,0 @@ -task :tgz do - sh 'cd ..; tar czvf ag/ag-vim.tgz ag/{plugin,autoload,doc}' -end diff --git a/sources_non_forked/ag.vim/autoload/ag.vim b/sources_non_forked/ag.vim/autoload/ag.vim deleted file mode 100644 index 432ef444..00000000 --- a/sources_non_forked/ag.vim/autoload/ag.vim +++ /dev/null @@ -1,234 +0,0 @@ -" NOTE: You must, of course, install ag / the_silver_searcher - -" FIXME: Delete deprecated options below on or after 2016-4 (6 months from when the deprecation warning was added) {{{ - -if exists("g:agprg") - let g:ag_prg = g:agprg - echohl WarningMsg - call input('g:agprg is deprecated and will be removed. Please use g:ag_prg') - echohl None -endif - -if exists("g:aghighlight") - let g:ag_highlight = g:aghighlight - echohl WarningMsg - call input('g:aghighlight is deprecated and will be removed. Please use g:ag_highlight') - echohl None -endif - -if exists("g:agformat") - let g:ag_format = g:agformat - echohl WarningMsg - call input('g:agformat is deprecated and will be removed. Please use g:ag_format') - echohl None -endif - -" }}} FIXME: Delete the deprecated options above on or after 15-7 (6 months from when they were changed) - -" Location of the ag utility -if !exists("g:ag_prg") - " --vimgrep (consistent output we can parse) is available from version 0.25.0+ - if split(system("ag --version"), "[ \n\r\t]")[2] =~ '\d\+.\(\(2[5-9]\)\|\([3-9][0-9]\)\)\(.\d\+\)\?' - let g:ag_prg="ag --vimgrep" - else - " --noheading seems odd here, but see https://github.com/ggreer/the_silver_searcher/issues/361 - let g:ag_prg="ag --column --nogroup --noheading" - endif -endif - -if !exists("g:ag_apply_qmappings") - let g:ag_apply_qmappings=1 -endif - -if !exists("g:ag_apply_lmappings") - let g:ag_apply_lmappings=1 -endif - -if !exists("g:ag_qhandler") - let g:ag_qhandler="botright copen" -endif - -if !exists("g:ag_lhandler") - let g:ag_lhandler="botright lopen" -endif - -if !exists("g:ag_mapping_message") - let g:ag_mapping_message=1 -endif - -if !exists("g:ag_working_path_mode") - let g:ag_working_path_mode = 'c' -endif - -function! ag#AgBuffer(cmd, args) - let l:bufs = filter(range(1, bufnr('$')), 'buflisted(v:val)') - let l:files = [] - for buf in l:bufs - let l:file = fnamemodify(bufname(buf), ':p') - if !isdirectory(l:file) - call add(l:files, l:file) - endif - endfor - call ag#Ag(a:cmd, a:args . ' ' . join(l:files, ' ')) -endfunction - -function! ag#Ag(cmd, args) - let l:ag_executable = get(split(g:ag_prg, " "), 0) - - " Ensure that `ag` is installed - if !executable(l:ag_executable) - echoe "Ag command '" . l:ag_executable . "' was not found. Is the silver searcher installed and on your $PATH?" - return - endif - - " If no pattern is provided, search for the word under the cursor - if empty(a:args) - let l:grepargs = expand("<cword>") - else - let l:grepargs = a:args . join(a:000, ' ') - end - - if empty(l:grepargs) - echo "Usage: ':Ag {pattern}' (or just :Ag to search for the word under the cursor). See ':help :Ag' for more information." - return - endif - - " Format, used to manage column jump - if a:cmd =~# '-g$' - let s:ag_format_backup=g:ag_format - let g:ag_format="%f" - elseif exists("s:ag_format_backup") - let g:ag_format=s:ag_format_backup - elseif !exists("g:ag_format") - let g:ag_format="%f:%l:%c:%m" - endif - - let l:grepprg_bak=&grepprg - let l:grepformat_bak=&grepformat - let l:t_ti_bak=&t_ti - let l:t_te_bak=&t_te - try - let &grepprg=g:ag_prg - let &grepformat=g:ag_format - set t_ti= - set t_te= - if g:ag_working_path_mode ==? 'r' " Try to find the projectroot for current buffer - let l:cwd_back = getcwd() - let l:cwd = s:guessProjectRoot() - try - exe "lcd ".l:cwd - catch - echom 'Failed to change directory to:'.l:cwd - finally - silent! execute a:cmd . " " . escape(l:grepargs, '|') - exe "lcd ".l:cwd_back - endtry - else " Someone chose an undefined value or 'c' so we revert to the default - silent! execute a:cmd . " " . escape(l:grepargs, '|') - endif - finally - let &grepprg=l:grepprg_bak - let &grepformat=l:grepformat_bak - let &t_ti=l:t_ti_bak - let &t_te=l:t_te_bak - endtry - - if a:cmd =~# '^l' - let l:match_count = len(getloclist(winnr())) - else - let l:match_count = len(getqflist()) - endif - - if a:cmd =~# '^l' && l:match_count - exe g:ag_lhandler - let l:apply_mappings = g:ag_apply_lmappings - let l:matches_window_prefix = 'l' " we're using the location list - elseif l:match_count - exe g:ag_qhandler - let l:apply_mappings = g:ag_apply_qmappings - let l:matches_window_prefix = 'c' " we're using the quickfix window - endif - - " If highlighting is on, highlight the search keyword. - if exists('g:ag_highlight') - let @/ = matchstr(a:args, "\\v(-)\@<!(\<)\@<=\\w+|['\"]\\zs.{-}\\ze['\"]") - call feedkeys(":let &hlsearch=1 \| echo \<CR>", 'n') - end - - redraw! - - if l:match_count - if l:apply_mappings - nnoremap <silent> <buffer> h <C-W><CR><C-w>K - nnoremap <silent> <buffer> H <C-W><CR><C-w>K<C-w>b - nnoremap <silent> <buffer> o <CR> - nnoremap <silent> <buffer> t <C-w><CR><C-w>T - nnoremap <silent> <buffer> T <C-w><CR><C-w>TgT<C-W><C-W> - nnoremap <silent> <buffer> v <C-w><CR><C-w>H<C-W>b<C-W>J<C-W>t - - exe 'nnoremap <silent> <buffer> e <CR><C-w><C-w>:' . l:matches_window_prefix .'close<CR>' - exe 'nnoremap <silent> <buffer> go <CR>:' . l:matches_window_prefix . 'open<CR>' - exe 'nnoremap <silent> <buffer> q :' . l:matches_window_prefix . 'close<CR>' - - exe 'nnoremap <silent> <buffer> gv :let b:height=winheight(0)<CR><C-w><CR><C-w>H:' . l:matches_window_prefix . 'open<CR><C-w>J:exe printf(":normal %d\<lt>c-w>_", b:height)<CR>' - " Interpretation: - " :let b:height=winheight(0)<CR> Get the height of the quickfix/location list window - " <CR><C-w> Open the current item in a new split - " <C-w>H Slam the newly opened window against the left edge - " :copen<CR> -or- :lopen<CR> Open either the quickfix window or the location list (whichever we were using) - " <C-w>J Slam the quickfix/location list window against the bottom edge - " :exe printf(":normal %d\<lt>c-w>_", b:height)<CR> Restore the quickfix/location list window's height from before we opened the match - - if g:ag_mapping_message && l:apply_mappings - echom "ag.vim keys: q=quit <cr>/e/t/h/v=enter/edit/tab/split/vsplit go/T/H/gv=preview versions of same" - endif - endif - else " Close the split window automatically: - cclose - lclose - echohl WarningMsg - echom 'No matches for "'.a:args.'"' - echohl None - endif -endfunction - -function! ag#AgFromSearch(cmd, args) - let search = getreg('/') - " translate vim regular expression to perl regular expression. - let search = substitute(search,'\(\\<\|\\>\)','\\b','g') - call ag#Ag(a:cmd, '"' . search .'" '. a:args) -endfunction - -function! ag#GetDocLocations() - let dp = '' - for p in split(&runtimepath,',') - let p = p.'doc/' - if isdirectory(p) - let dp = p.'*.txt '.dp - endif - endfor - return dp -endfunction - -function! ag#AgHelp(cmd,args) - let args = a:args.' '.ag#GetDocLocations() - call ag#Ag(a:cmd,args) -endfunction - -function! s:guessProjectRoot() - let l:splitsearchdir = split(getcwd(), "/") - - while len(l:splitsearchdir) > 2 - let l:searchdir = '/'.join(l:splitsearchdir, '/').'/' - for l:marker in ['.rootdir', '.git', '.hg', '.svn', 'bzr', '_darcs', 'build.xml'] - " found it! Return the dir - if filereadable(l:searchdir.l:marker) || isdirectory(l:searchdir.l:marker) - return l:searchdir - endif - endfor - let l:splitsearchdir = l:splitsearchdir[0:-2] " Splice the list to get rid of the tail directory - endwhile - - " Nothing found, fallback to current working dir - return getcwd() -endfunction diff --git a/sources_non_forked/ag.vim/doc/ag.txt b/sources_non_forked/ag.vim/doc/ag.txt deleted file mode 100644 index e702c291..00000000 --- a/sources_non_forked/ag.vim/doc/ag.txt +++ /dev/null @@ -1,174 +0,0 @@ -*ag.txt* Plugin that integrates ag with Vim - -============================================================================== -INTRODUCTION *ag* - -This plugin is a front for the_silver_searcher: ag. Ag can be used as a -replacement for ack. This plugin will allow you to run ag from vim, and shows -the results in a split window. - -:Ag[!] [options] {pattern} [{directory}] *:Ag* - - Search recursively in {directory} (which defaults to the current - directory) for the {pattern}. Behaves just like the |:grep| command, but - will open the |Quickfix| window for you. If [!] is not given the first - error is jumped to. - -:AgBuffer[!] [options] {pattern} *:AgBuffer* - - Search for {pattern} in all open buffers. Behaves just like the |:grep| - command, but will open the |Quickfix| window for you. If [!] is not given - the first error is jumped to. - - Note: this will not find changes in modified buffers, since ag can only - find what is on disk! You can save buffers automatically when searching - with the 'autowrite' option. A buffer will be ignored if it is a directory - (an explorer, like netrw). - -:AgAdd [options] {pattern} [{directory}] *:AgAdd* - - Just like |:Ag|, but instead of making a new list, the matches are - appended to the current |quickfix| list. - -:AgFromSearch [{directory}] *:AgFromSearch* - - Just like |:Ag| but the pattern is from previous search. - -:LAg [options] {pattern} [{directory}] *:LAg* - - Just like |:Ag| but instead of the |quickfix| list, matches are placed in - the current |location-list|. - -:LAgBuffer [options] {pattern} *:LAgBuffer* - - Just like |:AgBuffer| but instead of the |quickfix| list, matches are - placed in the current |location-list|. - -:LAgAdd [options] {pattern} [{directory}] *:LAgAdd* - - Just like |:AgAdd| but instead of the |quickfix| list, matches are added - to the current |location-list| - -:AgFile [options] {pattern} [{directory}] *:AgFile* - - Search recursively in {directory} (which defaults to the current - directory) for filenames matching the {pattern}. Behaves just like the - |:grep| command, but will open the |Quickfix| window for you. - -:AgHelp[!] [options] {pattern} *:AgHelp* - - Search vim documentation files for the {pattern}. Behaves just like the - |:Ag| command, but searches only vim documentation .txt files - -:LAgHelp [options] {pattern} *:LAgHelp* - - Just like |:AgHelp| but instead of the |quickfix| list, matches are placed - in the current |location-list|. - -Files containing the search term will be listed in the split window, along -with the line number of the occurrence, once for each occurrence. <Enter> on a -line in this window will open the file, and place the cursor on the matching -line. - -See http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/ for -more information. - -============================================================================== -OPTIONS *ag-options* - - *g:ag_prg* -The location of the Ag program, and any options you want passed to it before -searching. Default: "ag --vimgrep" (for parsable output). Example: > - let g:ag_prg="ag --vimgrep --smart-case" -< -Note: the `--vimgrep` option was added in Ag 0.25.0. If ag.vim detects that -you're using a lower version, the following default will be used instead: > - let g:ag_prg="ag --column --nogroup --noheading" -< -This works around inconsistent behaviors in earlier Ag versions, but it is -recommended that you upgrade if possible for a better experience. `--vimgrep` -supports multiple matches on the same line of text, for example. - -For background, see: https://github.com/rking/ag.vim/pull/88 - - *g:ag_working_path_mode* -A mapping that describes where ag will be run. Default is the current working -directory. Specifying 'r' as the argument will tell it to run from the project -rootdirectory. For now any other mapping will result to the default. -Example: - let g:ag_working_path_mode='r' - - *g:ag_highlight* -If 1, highlight the search terms after searching. Default: 0. Example: > - let g:ag_highlight=1 -< - - *g:ag_format* -Format to recognize the matches. See 'errorformat' for more info. Default: -"%f" when searching for files, "%f:%l:%c:%m" if not otherwise set. For -example, if your `g:ag_prg` is set to just "ag" (no column numbers in the -output, so when you jump to a match your cursor will be on the start of the -line): > - let g:ag_format="%f:%l:%m" -< - - *g:ag_apply_lmappings* -Whether or not to add custom mappings to location list windows opened by this -plugin. Only applies if you're using the location list. Default 1. Example: > - let g:ag_apply_lmappings=0 -< - - *g:ag_apply_qmappings* -Whether or not to add custom mappings to quickfix windows opened by this -plugin. Only applies if you're using the error list. Default 1. Example: > - let g:ag_apply_qmappings=0 -< - - *g:ag_lhandler* -A custom command used to open the location list after it's populated. -Default: "botright lopen". You might want to set this to change where the -location list is opened, or what size it is. Example: > - let g:ag_lhandler="topleft lopen" -< - - *g:ag_qhandler* -A custom command used to open the error list after it's populated. Default: -"botright copen". You might want to set this to change where the quickfix -window is opened, or what size it is. Example: > - let g:ag_qhandler="copen 20" -< - - *g:ag_mapping_message* -Whether or not to show the message explaining the extra mappings that are -added to the results list this plugin populates. This message is not shown if -the mappings are not applied (see |g:ag_apply_qmappings| and -|g:ag_apply_lmappings| for more info. Default 1. Example: > - let g:ag_mapping_message=0 -< - -============================================================================== -MAPPINGS *ag-mappings* - -The following keyboard shortcuts are available in the quickfix window: - -e open file and close the quickfix window. - -o open file (same as enter). - -go preview file (open but maintain focus on ag.vim results). - -t open in a new tab. - -T open in new tab silently. - -h open in horizontal split. - -H open in horizontal split silently. - -v open in vertical split. - -gv open in vertical split silently. - -q close the quickfix window. - - vim:tw=78:fo=tcq2:ft=help:norl: diff --git a/sources_non_forked/ag.vim/plugin/ag.vim b/sources_non_forked/ag.vim/plugin/ag.vim deleted file mode 100644 index 053f213c..00000000 --- a/sources_non_forked/ag.vim/plugin/ag.vim +++ /dev/null @@ -1,11 +0,0 @@ -" NOTE: You must, of course, install ag / the_silver_searcher -command! -bang -nargs=* -complete=file Ag call ag#Ag('grep<bang>',<q-args>) -command! -bang -nargs=* -complete=file AgBuffer call ag#AgBuffer('grep<bang>',<q-args>) -command! -bang -nargs=* -complete=file AgAdd call ag#Ag('grepadd<bang>', <q-args>) -command! -bang -nargs=* -complete=file AgFromSearch call ag#AgFromSearch('grep<bang>', <q-args>) -command! -bang -nargs=* -complete=file LAg call ag#Ag('lgrep<bang>', <q-args>) -command! -bang -nargs=* -complete=file LAgBuffer call ag#AgBuffer('lgrep<bang>',<q-args>) -command! -bang -nargs=* -complete=file LAgAdd call ag#Ag('lgrepadd<bang>', <q-args>) -command! -bang -nargs=* -complete=file AgFile call ag#Ag('grep<bang> -g', <q-args>) -command! -bang -nargs=* -complete=help AgHelp call ag#AgHelp('grep<bang>',<q-args>) -command! -bang -nargs=* -complete=help LAgHelp call ag#AgHelp('lgrep<bang>',<q-args>) diff --git a/sources_non_forked/vim-snipmate/autoload/snipMate.vim b/sources_non_forked/vim-snipmate/autoload/snipMate.vim index 407ee869..9d1786ab 100644 --- a/sources_non_forked/vim-snipmate/autoload/snipMate.vim +++ b/sources_non_forked/vim-snipmate/autoload/snipMate.vim @@ -384,7 +384,7 @@ function! snipMate#DefaultPool(scopes, trigger, result) abort let s:lookup_state.extends = [] for expr in s:snippet_filenames(scope, escape(a:trigger, "*[]?{}`'$|#%")) - for path in g:snipMate.snippet_dirs + for path in s:snippet_dirs() for file in s:Glob(path, expr) source `=file` endfor @@ -416,6 +416,10 @@ fun! snipMate#GetSnippets(scopes, trigger) abort return result endf +function! s:snippet_dirs() abort + return get(g:snipMate, 'snippet_dirs', split(&rtp, ',')) +endfunction + function! snipMate#OpenSnippetFiles() abort let files = [] let scopes_done = [] @@ -425,7 +429,7 @@ function! snipMate#OpenSnippetFiles() abort let files += s:snippet_filenames(scope, '') endfor call filter(files, "v:val !~# '\\*'") - for path in g:snipMate.snippet_dirs + for path in s:snippet_dirs() let fullpaths = map(copy(files), 'printf("%s/%s", path, v:val)') let exists += filter(copy(fullpaths), 'filereadable(v:val)') let notexists += map(filter(copy(fullpaths), diff --git a/sources_non_forked/vim-snipmate/plugin/snipMate.vim b/sources_non_forked/vim-snipmate/plugin/snipMate.vim index 837f0dcc..75e74aab 100644 --- a/sources_non_forked/vim-snipmate/plugin/snipMate.vim +++ b/sources_non_forked/vim-snipmate/plugin/snipMate.vim @@ -93,8 +93,7 @@ endif let g:snipMate['get_snippets'] = get(g:snipMate, 'get_snippets', funcref#Function("snipMate#GetSnippets")) " List of paths where snippets/ dirs are located -let g:snipMate['snippet_dirs'] = get(g:snipMate, 'snippet_dirs', split(&rtp, ',')) -if type(g:snipMate['snippet_dirs']) != type([]) +if exists('g:snipMate.snippet_dirs') && type(g:snipMate['snippet_dirs']) != type([]) echohl WarningMsg echom "g:snipMate['snippet_dirs'] must be a List" echohl None diff --git a/update_plugins.py b/update_plugins.py index 9b364de9..00c3ec03 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -16,7 +16,7 @@ from os import path #--- Globals ---------------------------------------------- PLUGINS = """ -ag.vim https://github.com/rking/ag.vim +ack.vim https://github.com/mileszs/ack.vim bufexplorer https://github.com/corntrace/bufexplorer ctrlp.vim https://github.com/ctrlpvim/ctrlp.vim mayansmoke https://github.com/vim-scripts/mayansmoke diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index b783aef3..c45c3bce 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -4,7 +4,7 @@ " http://amix.dk - amix@amix.dk " " Version: -" 5.0 - 29/05/12 15:43:36 +" 6.0 - 01/04/17 14:24:34 " " Blog_post: " http://amix.dk/blog/post/19691#The-ultimate-Vim-configuration-on-Github @@ -313,36 +313,6 @@ if has("autocmd") endif -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" => Ag searching and cope displaying -" requires ag.vim - it's much better than vimgrep/grep -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -" When you press gv you Ag after the selected text -vnoremap <silent> gv :call VisualSelection('gv', '')<CR> - -" Open Ag and put the cursor in the right position -map <leader>g :Ag - -" When you press <leader>r you can search and replace the selected text -vnoremap <silent> <leader>r :call VisualSelection('replace', '')<CR> - -" Do :help cope if you are unsure what cope is. It's super useful! -" -" When you search with Ag, display your results in cope by doing: -" <leader>cc -" -" To go to the next search result do: -" <leader>n -" -" To go to the previous search results do: -" <leader>p -" -map <leader>cc :botright cope<cr> -map <leader>co ggVGy:tabnew<cr>:set syntax=qf<cr>pgg -map <leader>n :cn<cr> -map <leader>p :cp<cr> - - """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Spell checking """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -372,35 +342,9 @@ map <leader>x :e ~/buffer.md<cr> map <leader>pp :setlocal paste!<cr> - - """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Helper functions """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -function! CmdLine(str) - exe "menu Foo.Bar :" . a:str - emenu Foo.Bar - unmenu Foo -endfunction - -function! VisualSelection(direction, extra_filter) range - let l:saved_reg = @" - execute "normal! vgvy" - - let l:pattern = escape(@", "\\/.*'$^~[]") - let l:pattern = substitute(l:pattern, "\n$", "", "") - - if a:direction == 'gv' - call CmdLine("Ag '" . l:pattern . "' " ) - elseif a:direction == 'replace' - call CmdLine("%s" . '/'. l:pattern . '/') - endif - - let @/ = l:pattern - let @" = l:saved_reg -endfunction - - " Returns true if paste mode is enabled function! HasPaste() if &paste @@ -429,8 +373,3 @@ function! <SID>BufcloseCloseIt() execute("bdelete! ".l:currentBufNum) endif endfunction - -" Make VIM remember position in file after reopen -" if has("autocmd") -" au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif -"endif diff --git a/vimrcs/extended.vim b/vimrcs/extended.vim index 7d5bf3f9..f6b5cfb0 100644 --- a/vimrcs/extended.vim +++ b/vimrcs/extended.vim @@ -108,6 +108,41 @@ iab xdate <c-r>=strftime("%d/%m/%y %H:%M:%S")<cr> autocmd FileType css set omnifunc=csscomplete#CompleteCSS +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" => Ack searching and cope displaying +" requires ack.vim - it's much better than vimgrep/grep +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" Use the the_silver_searcher if possible (much faster than Ack) +if executable('ag') + let g:ackprg = 'ag --vimgrep --smart-case' +endif + +" When you press gv you Ack after the selected text +vnoremap <silent> gv :call VisualSelection('gv', '')<CR> + +" Open Ack and put the cursor in the right position +map <leader>g :Ack + +" When you press <leader>r you can search and replace the selected text +vnoremap <silent> <leader>r :call VisualSelection('replace', '')<CR> + +" Do :help cope if you are unsure what cope is. It's super useful! +" +" When you search with Ack, display your results in cope by doing: +" <leader>cc +" +" To go to the next search result do: +" <leader>n +" +" To go to the previous search results do: +" <leader>p +" +map <leader>cc :botright cope<cr> +map <leader>co ggVGy:tabnew<cr>:set syntax=qf<cr>pgg +map <leader>n :cn<cr> +map <leader>p :cp<cr> + + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Helper functions @@ -135,3 +170,28 @@ endfunc func! CurrentFileDir(cmd) return a:cmd . " " . expand("%:p:h") . "/" endfunc + +function! CmdLine(str) + exe "menu Foo.Bar :" . a:str + emenu Foo.Bar + unmenu Foo +endfunction + +function! VisualSelection(direction, extra_filter) range + let l:saved_reg = @" + execute "normal! vgvy" + + let l:pattern = escape(@", "\\/.*'$^~[]") + let l:pattern = substitute(l:pattern, "\n$", "", "") + + if a:direction == 'gv' + call CmdLine("Ack '" . l:pattern . "' " ) + elseif a:direction == 'replace' + call CmdLine("%s" . '/'. l:pattern . '/') + endif + + let @/ = l:pattern + let @" = l:saved_reg +endfunction + + From 85e105159e4e11a433d7c4bdcacfc202d7c62f94 Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Tue, 2 May 2017 14:42:08 +0200 Subject: [PATCH 215/254] Updated plugins --- sources_non_forked/ack.vim/README.md | 4 +- .../ctrlp.vim/autoload/ctrlp.vim | 2 +- .../ctrlp.vim/autoload/ctrlp/line.vim | 2 +- sources_non_forked/ctrlp.vim/doc/ctrlp.cnx | 57 ++- sources_non_forked/goyo.vim/doc/goyo.txt | 4 +- sources_non_forked/lightline.vim/.travis.yml | 27 +- sources_non_forked/lightline.vim/README.md | 2 +- .../nerdtree/autoload/nerdtree.vim | 2 +- sources_non_forked/syntastic/README.markdown | 16 +- .../autoload/syntastic/preprocess.vim | 33 +- .../syntastic/doc/syntastic-checkers.txt | 320 +++++++++++++--- .../syntastic/plugin/syntastic.vim | 2 +- .../syntastic/plugin/syntastic/registry.vim | 2 + .../syntastic/syntax_checkers/c/cppclean.vim | 40 ++ .../syntax_checkers/c/flawfinder.vim | 61 ++++ .../syntax_checkers/cmake/cmakelint.vim | 40 ++ .../syntax_checkers/cpp/cppclean.vim | 22 ++ .../syntax_checkers/cpp/flawfinder.vim | 26 ++ .../syntax_checkers/dart/dartanalyzer.vim | 5 +- .../syntastic/syntax_checkers/julia/lint.vim | 51 +++ .../syntastic/syntax_checkers/php/php.vim | 4 +- .../syntastic/syntax_checkers/po/dennis.vim | 43 +++ .../syntax_checkers/python/bandit.vim | 54 +++ .../syntax_checkers/typescript/tslint.vim | 6 +- .../syntastic/syntax_checkers/vim/vimlint.vim | 10 +- .../vim-fugitive/README.markdown | 12 +- .../vim-fugitive/doc/fugitive.txt | 8 +- .../vim-fugitive/plugin/fugitive.vim | 151 ++++---- sources_non_forked/vim-gitgutter/README.mkd | 7 +- .../vim-gitgutter/autoload/gitgutter/diff.vim | 5 +- .../vim-gitgutter/doc/gitgutter.txt | 2 +- .../vim-gitgutter/plugin/gitgutter.vim | 19 +- sources_non_forked/vim-go/CHANGELOG.md | 8 + sources_non_forked/vim-go/README.md | 344 ++---------------- sources_non_forked/vim-go/autoload/go/cmd.vim | 2 +- .../vim-go/autoload/go/coverage.vim | 2 +- sources_non_forked/vim-go/autoload/go/def.vim | 2 +- .../vim-go/autoload/go/guru.vim | 28 +- sources_non_forked/vim-go/autoload/go/job.vim | 27 +- .../vim-go/autoload/go/lint.vim | 23 +- .../vim-go/autoload/go/rename.vim | 11 +- sources_non_forked/vim-go/doc/vim-go.txt | 91 ++++- .../vim-markdown/README.markdown | 8 + .../vim-markdown/ftplugin/markdown.vim | 27 +- .../vim-markdown/syntax/markdown.vim | 5 +- .../vim-multiple-cursors/README.md | 3 + .../autoload/multiple_cursors.vim | 14 +- sources_non_forked/vim-pug/syntax/pug.vim | 5 +- .../vim-repeat/autoload/repeat.vim | 2 +- sources_non_forked/vim-snipmate/README.md | 14 + .../vim-snipmate/doc/snipMate.txt | 63 +++- .../vim-snippets/UltiSnips/rust.snippets | 72 ---- .../vim-snippets/UltiSnips/tex.snippets | 24 +- .../vim-snippets/snippets/cs.snippets | 199 ++++++---- .../vim-snippets/snippets/elixir.snippets | 34 +- .../vim-snippets/snippets/elm.snippets | 3 +- .../vim-snippets/snippets/fortran.snippets | 2 + .../vim-snippets/snippets/idris.snippets | 46 +++ .../vim-snippets/snippets/purescript.snippets | 9 +- .../vim-snippets/snippets/python.snippets | 4 + .../vim-snippets/snippets/ruby.snippets | 4 +- .../vim-snippets/snippets/rust.snippets | 7 + .../vim-snippets/snippets/tex.snippets | 4 +- 63 files changed, 1389 insertions(+), 737 deletions(-) create mode 100644 sources_non_forked/syntastic/syntax_checkers/c/cppclean.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/c/flawfinder.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/cmake/cmakelint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/cpp/cppclean.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/cpp/flawfinder.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/julia/lint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/po/dennis.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/python/bandit.vim create mode 100644 sources_non_forked/vim-snippets/snippets/idris.snippets diff --git a/sources_non_forked/ack.vim/README.md b/sources_non_forked/ack.vim/README.md index af8f522d..643ce65a 100644 --- a/sources_non_forked/ack.vim/README.md +++ b/sources_non_forked/ack.vim/README.md @@ -78,9 +78,9 @@ The quickfix results window is augmented with these convenience mappings: ? a quick summary of these keys, repeat to close o to open (same as Enter) O to open and close the quickfix window - go to preview file, open but maintain focus on ack.vim results + go to preview file, keeping focus on the results t to open in new tab - T to open in new tab without moving to it + T to open in new tab, keeping focus on the results h to open in horizontal split H to open in horizontal split, keeping focus on the results v to open in vertical split diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index 7b2d660a..b1fe859c 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -2305,7 +2305,7 @@ fu! s:lastvisual() let cview = winsaveview() let [ovreg, ovtype] = [getreg('v'), getregtype('v')] let [oureg, outype] = [getreg('"'), getregtype('"')] - sil! norm! gv"vy + sil! norm! gV"vy let selected = s:regisfilter('v') cal setreg('v', ovreg, ovtype) cal setreg('"', oureg, outype) diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim index 5bec47ee..17b6061b 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim @@ -31,7 +31,7 @@ endf " Public {{{1 fu! ctrlp#line#init(bufnr) let [lines, bufnr] = [[], exists('s:bufnr') ? s:bufnr : a:bufnr] - let bufs = exists('s:lnmode') && s:lnmode ? ctrlp#buffers('id') : [bufnr] + let bufs = exists('s:lnmode') && !empty(s:lnmode) ? ctrlp#buffers('id') : [bufnr] for bufnr in bufs let [lfb, bufn] = [getbufline(bufnr, 1, '$'), bufname(bufnr)] if lfb == [] && bufn != '' diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx b/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx index c2d69729..1f8a2ee6 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.cnx @@ -1,4 +1,4 @@ -*ctrlp.txt* 模糊的 文件, 缓冲区, 最近最多使用, 标签, ... 检索. v1.79 +*ctrlp.txt* 支æŒæ¨¡ç³ŠåŒ¹é…çš„ 文件, 缓冲区, 最近最多使用, 标签, ... 检索. v1.79 *CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'* =============================================================================== # # @@ -68,7 +68,7 @@ OPTIONS *ctrlp-options* |ctrlp_arg_map|...............是å¦æ‹¦æˆª<c-y> å’Œ <c-o> 命令。 |ctrlp_follow_symlinks|.......是å¦è·Ÿéšé“¾æŽ¥ã€‚ |ctrlp_lazy_update|...........åœæ­¢è¾“入时æ‰æ›´æ–°ã€‚ - |ctrlp_default_input|.........为æ示符é¢æ¿æ供一个ç§å­ã€‚ + |ctrlp_default_input|.........为æ示符é¢æ¿æ供一个åˆå§‹å­—符串。 |ctrlp_abbrev|................输入缩写。 |ctrlp_key_loop|..............为多字节输入开å¯è¾“入事件循环。 |ctrlp_prompt_mappings|.......改å˜æ示符é¢æ¿å†…部的按键绑定。 @@ -76,6 +76,7 @@ OPTIONS *ctrlp-options* |ctrlp_open_single_match|.....当åªæœ‰ä¸€ä¸ªå€™é€‰æ—¶è‡ªåŠ¨æŽ¥å—。 |ctrlp_brief_prompt|..........æ示符为空的时候使用<bs>退出 CtrlP。 |ctrlp_match_current_file|....在匹é…æ¡ç›®ä¸­åŒ…å«å½“å‰æ–‡ä»¶ã€‚ + |ctrlp_types|.................內建类型的å称。 最近最多使用模å¼: |ctrlp_mruf_max|..............记录的最近最多使用的最大数æ®ã€‚ @@ -154,6 +155,7 @@ OPTIONS *ctrlp-options* 结果集的最大数目: results:{n} - 列出最多 {n} æ¡ç»“æžœ (默认: 和最大高度åŒæ­¥). + 0代表没有é™åˆ¶ã€‚ 注æ„: 当一个设置项没有被设置时,将会使用默认值。 @@ -254,7 +256,7 @@ OPTIONS *ctrlp-options* 考虑清楚。 *'g:ctrlp_custom_ignore'* -作为对 |'wildignore'| 的补充,用æ¥è®¾ç½®ä½ åªæ˜¯æƒ³åœ¨CtrlP中éšè—的文件和目录。使用正 +作为对 |'wildignore'| å’Œ |g:ctrlp_show_hidden| 的补充,用æ¥è®¾ç½®ä½ åªæ˜¯æƒ³åœ¨CtrlP中éšè—的文件和目录。使用正 则表达å¼æ¥æŒ‡å®šåŒ¹é…模å¼: > let g:ctrlp_custom_ignore = '' < @@ -439,13 +441,19 @@ OPTIONS *ctrlp-options* *'g:ctrlp_match_current_file'* -在匹é…æ¡ç›®ä¸­åŒ…å«å½“å‰æ–‡ä»¶: +在匹é…æ¡ç›®ä¸­åŒ…å«å½“å‰æ–‡ä»¶: > let g:ctrlp_match_current_file = 1 默认情况下,当å‰æ–‡ä»¶ä¸åŒ…å«åœ¨åˆ—表中。 注æ„: 当使用 |g:ctrlp_match_func| æ—¶ä¸ä¼šåº”用这个选项。 + *'g:ctrlp_types'* +通过设置这个列表å˜é‡çš„值æ¥å®šåˆ¶æ ¸å¿ƒç±»åž‹: > + let g:ctrlp_types = ['mru', 'fil'] + +类型默认为: > + let g:ctrlp_types = ['fil', 'buf', 'mru']. *'g:ctrlp_abbrev'* 定义å¯ä»¥åœ¨æ示é¢åŒ…内被扩展(内部的或者å¯è§çš„)的输入缩写: > @@ -817,7 +825,8 @@ MRU mode options:~ :CtrlP [起始目录] 用文件æœç´¢æ¨¡å¼æ‰“å¼€CtrlP。 - 如果没有给定å‚数,|g:ctrlp_working_path_mode| 会被用æ¥å†³å®šèµ·å§‹ç›®å½•ã€‚ + 如果没有给定å‚数,|g:ctrlp_working_path_mode| 会被用æ¥å†³å®šèµ·å§‹ç›®å½•ã€‚临时覆盖 + 这个å‚æ•° çš„æ–¹æ³•è§ |:CtrlPCurFile| å’Œ |:CtrlPCurWD| 。 在输入时你å¯ä»¥ä½¿ç”¨ <tab> 自动补全[起始目录]。 @@ -825,6 +834,16 @@ MRU mode options:~ :CtrlPBuffer 用缓冲区æœç´¢æ¨¡å¼æ‰“å¼€CtrlP。 + *:CtrlPCurFile* +:CtrlPCurFile + 行为类似å˜é‡ |g:ctrlp_working_path_mode| = '' 时执行 |:CtrlP| ,忽略这个å˜é‡ + 现在的值。 + + *:CtrlPCurWD* +:CtrlPCurWD + 行为类似å˜é‡ |g:ctrlp_working_path_mode| = '' 时执行 |:CtrlP| ,忽略这个å˜é‡ + 现在的值。 + *:CtrlPMRU* :CtrlPMRU 用最近最多使用模å¼æ‰“å¼€CtrlP。 @@ -1259,7 +1278,8 @@ h) 使用?打开帮助文件。 缓冲标签模å¼é€‰é¡¹:~ *'g:ctrlp_buftag_ctags_bin'* -如果ctags没有在环境å˜é‡ä¸­é…置,使用该选项æ¥æŒ‡å®šå®ƒçš„ä½ç½®: > +如果ctags没有在环境å˜é‡ä¸­é…置,或者一个二进制ctags文件存在于 +/opt/local/bin 或 /usr/local/bin,使用该选项æ¥æŒ‡å®šå®ƒçš„ä½ç½®: > let g:ctrlp_buftag_ctags_bin = '' < @@ -1411,6 +1431,31 @@ Git 仓库: https://github.com/ctrlpvim/ctrlp.vim =============================================================================== 更新日志 *ctrlp-changelog* + * 新选项 |g:ctrlp_custom_tag_files| 用æ¥æŒ‡å®šè‡ªå®šä¹‰çš„标签文件。 + * 设置 g:ctrlp_match_window 为0æ¥ä¸é™åˆ¶çª—å£å¤§å° + +Before 2016/11/28~ + + + 新命令: |YankLine()| æ¥å¤åˆ¶æ•´ä¸ªæ–‡ä»¶ã€‚ + + 新选项: |g:ctrlp_types| æ¥é€‰æ‹©å…§å»ºç±»åž‹ã€‚ + + 新特性: 异步在新线程中调用 |g:ctrlp_user_command| 。 设置 + |g:user_command_async| 为1æ¥å¯ç”¨ã€‚ + + 为 delphi, rust å’Œ golangæä¾›buffertag支æŒã€‚ + + 新选项: |g:ctrlp_brief_prompt|, + |g:match_current_file|, + |g:ctrlp_compare_lim|. + + 新功能: 自动忽略扩展。 + + 为 ant, tex, dosbatch, matlab å’Œ vhdlæä¾›buffertag支æŒã€‚ + + 新选项 |g:ctrlp_line_prefix| æ¥ç»“åˆç¬¬ä¸‰æ–¹æ’件。 + + 新选项 |g:open_single_match| 在 matches 中打开å•ä¸ªæ–‡ä»¶ã€‚ + + 添加å¯åŠ¨æ–¹å¼ <plug>(ctrlp) 。 + + æŽ¥å— bang for CtrlPBookmarkDirAdd æ¥é¿å…确认。 + + 处ç†åƒ "g:ctrlp_TYPE_MODE" 大å°å†™æ··åˆçš„å˜é‡å。 + 例如: let g:ctrlp_path_sort + + 新选项: |g:ctrlp_custom_ancestors| + +在2014/08/08之å‰~ + + 新的支æŒé«˜äº®çš„缓冲区æµè§ˆæ¨¡å¼ (建议 |+conceal|) + 新选项: |g:ctrlp_bufname_mod|, |g:ctrlp_bufpath_mod| diff --git a/sources_non_forked/goyo.vim/doc/goyo.txt b/sources_non_forked/goyo.vim/doc/goyo.txt index cdc129f8..0af9e6b3 100644 --- a/sources_non_forked/goyo.vim/doc/goyo.txt +++ b/sources_non_forked/goyo.vim/doc/goyo.txt @@ -1,4 +1,4 @@ -goyo.txt goyo Last change: April 1 2017 +goyo.txt goyo Last change: April 2 2017 GOYO - TABLE OF CONTENTS *goyo* *goyo-toc* ============================================================================== @@ -12,7 +12,7 @@ GOYO - TABLE OF CONTENTS *goyo* *goyo-to Pros. License -GOYO.VIM (ê³ ìš”) *goyo* +GOYO.VIM (ê³ ìš”) *goyo-vim* ============================================================================== Distraction-free writing in Vim. diff --git a/sources_non_forked/lightline.vim/.travis.yml b/sources_non_forked/lightline.vim/.travis.yml index ae4b73fb..3767d735 100644 --- a/sources_non_forked/lightline.vim/.travis.yml +++ b/sources_non_forked/lightline.vim/.travis.yml @@ -4,19 +4,26 @@ sudo: false install: - git clone --depth=1 https://github.com/thinca/vim-themis /tmp/themis - - git clone https://github.com/vim/vim $HOME/vim - - (if ! test -d $HOME/vim-7.4/bin; then cd $HOME/vim && git checkout . && git checkout v7.4 && ./configure --prefix=$HOME/vim-7.4 && make && make install; fi) - - (if ! test -d $HOME/vim-7.3/bin; then cd $HOME/vim && git checkout . && git checkout v7.3 && ./configure --prefix=$HOME/vim-7.3 && make && make install; fi) - - (if ! test -d $HOME/vim-7.2.051/bin; then cd $HOME/vim && git checkout . && git checkout v7.2.051 && ./configure --prefix=$HOME/vim-7.2.051 && make && make install; fi) + - (if ! test -d $HOME/vim-$VIM_VERSION/bin; then + git clone https://github.com/vim/vim $HOME/vim && + cd $HOME/vim && + git checkout v$VIM_VERSION && + ./configure --prefix=$HOME/vim-$VIM_VERSION && + make && + make install; + fi) cache: directories: - - $HOME/vim-7.4 - - $HOME/vim-7.3 - - $HOME/vim-7.2.051 + - $HOME/vim-$VIM_VERSION + +env: + - VIM_VERSION=8.0.0000 + - VIM_VERSION=7.4 + - VIM_VERSION=7.3 + - VIM_VERSION=7.2.051 script: + - export PATH=$HOME/vim-$VIM_VERSION/bin:$PATH + - vim --version - /tmp/themis/bin/themis --reporter spec - - PATH=$HOME/vim-7.4/bin/:$PATH /tmp/themis/bin/themis --reporter spec - - PATH=$HOME/vim-7.3/bin/:$PATH /tmp/themis/bin/themis --reporter spec - - PATH=$HOME/vim-7.2.051/bin/:$PATH /tmp/themis/bin/themis --reporter spec diff --git a/sources_non_forked/lightline.vim/README.md b/sources_non_forked/lightline.vim/README.md index 2b80f35b..e97b6b7a 100644 --- a/sources_non_forked/lightline.vim/README.md +++ b/sources_non_forked/lightline.vim/README.md @@ -65,7 +65,7 @@ This software is released under the MIT License, see LICENSE. git clone https://github.com/itchyny/lightline.vim ~/.vim/bundle/lightline.vim -### Vundle (https://github.com/gmarik/Vundle.vim) +### Vundle (https://github.com/VundleVim/Vundle.vim) 1. Add the following configuration to your `.vimrc`. Plugin 'itchyny/lightline.vim' diff --git a/sources_non_forked/nerdtree/autoload/nerdtree.vim b/sources_non_forked/nerdtree/autoload/nerdtree.vim index e0d86efa..4402b4f4 100644 --- a/sources_non_forked/nerdtree/autoload/nerdtree.vim +++ b/sources_non_forked/nerdtree/autoload/nerdtree.vim @@ -92,7 +92,7 @@ endfunction " same as :exec cmd but eventignore=all is set for the duration function! nerdtree#exec(cmd) let old_ei = &ei - set ei=all + set ei=BufEnter,BufLeave,VimEnter exec a:cmd let &ei = old_ei endfunction diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index 4212c95a..8f0e4607 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -58,15 +58,15 @@ their script to find them. At the time of this writing, syntastic has checking plugins for ACPI Source Language, ActionScript, Ada, Ansible configurations, API Blueprint, -AppleScript, AsciiDoc, Assembly languages, BEMHTML, Bro, Bourne shell, C, -C++, C#, Cabal, Chef, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, +AppleScript, AsciiDoc, Assembly languages, BEMHTML, Bro, Bourne shell, C, C++, +C#, Cabal, Chef, CMake, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dockerfile, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata, -GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON, -JSX, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, -MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl -POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug (formerly -Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax NG, -reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity, +GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, +JSON, JSX, Julia, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, +Markdown, MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, +Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug +(formerly Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax +NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity, Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, Vim help, VimL, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, z80, Zope page templates, and Zsh. See the [manual][checkers] for details about the diff --git a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim index 451d308c..52ec865a 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim @@ -8,6 +8,37 @@ set cpo&vim " Public functions {{{1 +function! syntastic#preprocess#bandit(errors) abort " {{{2 + let out = [] + let json = s:_decode_JSON(join(a:errors, '')) + + if type(json) == type({}) && has_key(json, 'results') && type(json['results']) == type([]) + for issue in json['results'] + if type(issue) == type({}) + try + call add(out, + \ issue['filename'] . ':' . + \ issue['line_number'] . ':' . + \ { 'LOW': 'I', 'MEDIUM': 'W', 'HIGH': 'E' }[issue['issue_severity']] . ':' . + \ issue['test_id'][1:] . ':' . + \ issue['issue_text'] . + \ ' [' . issue['test_name'] . '] (confidence: ' . issue['issue_confidence'] . ')') + catch /\m^Vim\%((\a\+)\)\=:E716/ + call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue)) + let out = [] + break + endtry + else + call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue)) + endif + endfor + else + call syntastic#log#warn('checker python/bandit: unrecognized error format (crashed checker?)') + endif + + return out +endfunction " }}}2 + function! syntastic#preprocess#cabal(errors) abort " {{{2 let out = [] let star = 0 @@ -435,7 +466,7 @@ echomsg string(out) endfunction " }}}2 function! syntastic#preprocess#tslint(errors) abort " {{{2 - return map(copy(a:errors), 'substitute(v:val, ''\m^\(([^)]\+)\)\s\(.\+\)$'', ''\2 \1'', "")') + return map(copy(a:errors), 'substitute(v:val, ''\v^((ERROR|WARNING): )?\zs(\([^)]+\))\s(.+)$'', ''\4 \3'', "")') endfunction " }}}2 function! syntastic#preprocess#validator(errors) abort " {{{2 diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index 7c902f9a..e70d61a0 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -23,6 +23,7 @@ SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* C++......................................|syntastic-checkers-cpp| Cabal....................................|syntastic-checkers-cabal| Chef.....................................|syntastic-checkers-chef| + CMake....................................|syntastic-checkers-cmake| COBOL....................................|syntastic-checkers-cobol| Coco.....................................|syntastic-checkers-co| CoffeeScript.............................|syntastic-checkers-coffee| @@ -58,6 +59,7 @@ SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* Java.....................................|syntastic-checkers-java| JavaScript...............................|syntastic-checkers-javascript| JSON.....................................|syntastic-checkers-json| + Julia....................................|syntastic-checkers-julia| LESS.....................................|syntastic-checkers-less| Lex......................................|syntastic-checkers-lex| @@ -530,12 +532,14 @@ The following checkers are available for C (filetype "c"): 3. ClangCheck...............|syntastic-c-clang_check| 4. Clang-Tidy...............|syntastic-c-clang_tidy| 5. Cppcheck.................|syntastic-c-cppcheck| - 6. GCC......................|syntastic-c-gcc| - 7. make.....................|syntastic-c-make| - 8. OClint...................|syntastic-c-oclint| - 9. PC-Lint..................|syntastic-c-pc_lint| - 10. Sparse..................|syntastic-c-sparse| - 11. Splint..................|syntastic-c-splint| + 6. cppclean.................|syntastic-c-cppclean| + 7. Flawfinder...............|syntastic-c-flawfinder| + 8. GCC......................|syntastic-c-gcc| + 9. make.....................|syntastic-c-make| + 10. OClint..................|syntastic-c-oclint| + 11. PC-Lint.................|syntastic-c-pc_lint| + 12. Sparse..................|syntastic-c-sparse| + 13. Splint..................|syntastic-c-splint| ------------------------------------------------------------------------------ 1. AVR-GCC *syntastic-c-avrgcc* @@ -693,7 +697,57 @@ one option per line (cf. |syntastic-config-files|). See also: |syntastic-cpp-cppcheck|. ------------------------------------------------------------------------------ -6. GCC *syntastic-c-gcc* +6. cppclean *syntastic-c-cppclean* + +Name: cppclean +Maintainer: LCD 47 <lcd047@gmail.com> + +"cppclean" attempts to find problems in C++ source that slow development in +large code bases, for example various forms of unused code. See the project's +page at GitHub for more information: + + https://github.com/myint/cppclean + +Installation~ + +Install it with "pip": > + pip install cppclean +< +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-cpp-cppclean|. + +------------------------------------------------------------------------------ +7. Flawfinder *syntastic-c-flawfinder* + +Name: flawfinder +Maintainer: LCD 47 <lcd047@gmail.com> + +"Flawfinder" scans C/C++ source code for possible security weaknesses. See the +project's page for more information: + + https://www.dwheeler.com/flawfinder + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +Additionally: + + *'g:syntastic_c_flawfinder_thres'* +Type: integer +Default: 3 +Error threshold. Policy violations with a severity above this value are +highlighted as errors, the others are considered warnings by syntastic. + +See also: |syntastic-cpp-flawfinder|. + +------------------------------------------------------------------------------ +8. GCC *syntastic-c-gcc* Name: gcc Maintainer: Gregor Uhlenheuer <kongo2002@gmail.com> @@ -790,7 +844,7 @@ executable. See also: |syntastic-cpp-gcc|. ------------------------------------------------------------------------------ -7. make *syntastic-c-make* +9. make *syntastic-c-make* Name: make Maintainer: Gregor Uhlenheuer <kongo2002@gmail.com> @@ -801,7 +855,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -8. OClint *syntastic-c-oclint* +10. OClint *syntastic-c-oclint* Name: oclint Maintainer: "UnCO" Lin <undercooled@lavabit.com> @@ -840,7 +894,7 @@ Config files pointed to by 'g:syntastic_oclint_config_file' are then ignored. See also: |syntastic-cpp-oclint|. ------------------------------------------------------------------------------ -9. PC-Lint *syntastic-c-pc_lint* +11. PC-Lint *syntastic-c-pc_lint* Name: pc_lint Maintainer: Steve Bragg <steve@empresseffects.com> @@ -867,7 +921,7 @@ current directory and in parent directories; first such file found is used. See also: |syntastic-cpp-pc_lint|. ------------------------------------------------------------------------------ -10. Sparse *syntastic-c-sparse* +12. Sparse *syntastic-c-sparse* Name: sparse Maintainer: Daniel Walker <dwalker@fifo99.com> @@ -899,7 +953,7 @@ your vimrc: > This allows "Sparse" to read "GCC"'s private include files. ------------------------------------------------------------------------------ -11. Splint *syntastic-c-splint* +13. Splint *syntastic-c-splint* Name: splint Maintainer: LCD 47 <lcd047@gmail.com> @@ -955,11 +1009,13 @@ The following checkers are available for C++ (filetype "cpp"): 2. ClangCheck...............|syntastic-cpp-clang_check| 3. Clang-Tidy...............|syntastic-cpp-clang_tidy| 4. Cppcheck.................|syntastic-cpp-cppcheck| - 5. Cpplint..................|syntastic-cpp-cpplint| - 6. GCC......................|syntastic-cpp-gcc| - 7. OClint...................|syntastic-cpp-oclint| - 8. PC-Lint..................|syntastic-cpp-pc_lint| - 9. Vera++...................|syntastic-cpp-verapp| + 5. cppclean.................|syntastic-cpp-cppclean| + 6. Cpplint..................|syntastic-cpp-cpplint| + 7. Flawfinder...............|syntastic-cpp-flawfinder| + 8. GCC......................|syntastic-cpp-gcc| + 9. OClint...................|syntastic-cpp-oclint| + 10. PC-Lint.................|syntastic-cpp-pc_lint| + 11. Vera++..................|syntastic-cpp-verapp| ------------------------------------------------------------------------------ 1. AVR-GCC *syntastic-cpp-avrgcc* @@ -1103,7 +1159,31 @@ one option per line (cf. |syntastic-config-files|). See also: |syntastic-c-cppcheck|. ------------------------------------------------------------------------------ -5. Cpplint *syntastic-cpp-cpplint* +5. cppclean *syntastic-cpp-cppclean* + +Name: cppclean +Maintainer: LCD 47 <lcd047@gmail.com> + +"cppclean" attempts to find problems in C++ source that slow development in +large code bases, for example various forms of unused code. See the project's +page at GitHub for more information: + + https://github.com/myint/cppclean + +Installation~ + +Install it with "pip": > + pip install cppclean +< +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +See also: |syntastic-c-cppclean|. + +------------------------------------------------------------------------------ +6. Cpplint *syntastic-cpp-cpplint* Name: cpplint Maintainer: LCD 47 <lcd047@gmail.com> @@ -1139,7 +1219,33 @@ However, if your "cpplint" was installed with "pip", the script's name is let g:syntastic_cpp_cpplint_exec = "cpplint" < ------------------------------------------------------------------------------ -6. GCC *syntastic-cpp-gcc* +7. Flawfinder *syntastic-cpp-flawfinder* + +Name: flawfinder +Maintainer: LCD 47 <lcd047@gmail.com> + +"Flawfinder" scans C/C++ source code for possible security weaknesses. See the +project's page for more information: + + https://www.dwheeler.com/flawfinder + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +Additionally: + + *'g:syntastic_cpp_flawfinder_thres'* +Type: integer +Default: 3 +Error threshold. Policy violations with a severity above this value are +highlighted as errors, the others are considered warnings by syntastic. + +See also: |syntastic-c-flawfinder|. + +------------------------------------------------------------------------------ +8. GCC *syntastic-cpp-gcc* Name: gcc Maintainer: Gregor Uhlenheuer <kongo2002@gmail.com> @@ -1236,7 +1342,7 @@ executable. See also: |syntastic-c-gcc|. ------------------------------------------------------------------------------ -7. OClint *syntastic-cpp-oclint* +9. OClint *syntastic-cpp-oclint* Name: oclint Maintainer: "UnCO" Lin <undercooled@lavabit.com> @@ -1276,7 +1382,7 @@ Config files pointed to by 'g:syntastic_oclint_config_file' are then ignored. See also: |syntastic-c-oclint|. ------------------------------------------------------------------------------ -8. PC-Lint *syntastic-cpp-pc_lint* +10. PC-Lint *syntastic-cpp-pc_lint* Name: pc_lint Maintainer: Steve Bragg <steve@empresseffects.com> @@ -1303,7 +1409,7 @@ current directory and in parent directories; first such file found is used. See also: |syntastic-c-pc_lint|. ------------------------------------------------------------------------------ -9. Vera++ *syntastic-cpp-verapp* +11. Vera++ *syntastic-cpp-verapp* Name: verapp Maintainer: Lucas Verney <phyks@phyks.me> @@ -1381,6 +1487,34 @@ You probably also need a plugin to set |filetype| for Chef files, such as https://github.com/dougireton/vim-chef +============================================================================== +SYNTAX CHECKERS FOR CMAKE *syntastic-checkers-cmake* + +The following checkers are available for CMake (filetype "cmake"): + + 1. cmakelint................|syntastic-cmake-cmakelint| + +------------------------------------------------------------------------------ +1. cmakelint *syntastic-cmake-cmakelint* + +Name: cmakelint +Maintainer: LCD 47 <lcd047@gmail.com> + +"cmakelint" is a style checker for "CMake" files (https://cmake.org/). +See the project's page at GitHub more information: + + https://github.com/richq/cmake-lint + +Installation~ + +Install it with "pip": > + pip install cmakelint +< +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + ============================================================================== SYNTAX CHECKERS FOR COBOL *syntastic-checkers-cobol* @@ -2244,10 +2378,37 @@ SYNTAX CHECKERS FOR GETTEXT PO *syntastic-checkers-po* The following checkers are available for gettext .po files (filetype "po"): - 1. msgfmt...................|syntastic-po-msgfmt| + 1. Dennis...................|syntastic-po-dennis| + 2. msgfmt...................|syntastic-po-msgfmt| ------------------------------------------------------------------------------ -1. msgfmt *syntastic-po-msgfmt* +1. Dennis *syntastic-po-dennis* + +Name: dennis +Maintainer: LCD 47 <lcd047@gmail.com> + +"Dennis" is a set of utilities for working with gettext Portable Object +(http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html) +translation files: + + https://github.com/willkg/dennis/ + +See the program's manual for further details: + + http://dennis.readthedocs.io/en/latest/linting.html + +Installation~ + +Install it with "pip": > + pip install dennis +< +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +------------------------------------------------------------------------------ +2. msgfmt *syntastic-po-msgfmt* Name: msgfmt Maintainer: Ryo Okubo <syucream1031@gmail.com> @@ -3591,6 +3752,44 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +============================================================================== +SYNTAX CHECKERS FOR JULIA *syntastic-checkers-julia* + +The following checkers are available for Julia (filetype "julia"): + + 1. lint.....................|syntastic-julia-lint| + +------------------------------------------------------------------------------ +1. lint *syntastic-julia-lint* + +Name: lint +Maintainer: LCD 47 <lcd047@gmail.com> + +This is a checker for Julia files (https://julialang.org/), using the Julia +package "Lint". See the package's documentation for more information: + + http://lintjl.readthedocs.io/ + +Installation~ + +You need to install Julia itself, and the package "Lint". You can install +"Lint" from the Julia package manager, with the command: > + Pkg.add("Lint") +< +Checker Options~ + +This checker doesn't call the "makeprgBuild()" function, and thus it ignores +the usual 'g:syntastic_julia_lint_<option>' variables. The only exception is +'g:syntastic_julia_lint_exec', which can still be used to override the "julia" +executable. + +Note~ + +You probably also need a plugin to set |filetype| for Julia files, such as +"julia-vim": + + https://github.com/JuliaEditorSupport/julia-vim + ============================================================================== SYNTAX CHECKERS FOR LESS *syntastic-checkers-less* @@ -4629,20 +4828,49 @@ SYNTAX CHECKERS FOR PYTHON *syntastic-checkers-python* The following checkers are available for Python (filetype "python"): - 1. flake8...................|syntastic-python-flake8| - 2. Frosted..................|syntastic-python-frosted| - 3. mypy.....................|syntastic-python-mypy| - 4. Prospector...............|syntastic-python-prospector| - 5. py3kwarn.................|syntastic-python-py3kwarn| - 6. pycodestyle..............|syntastic-python-pycodestyle| - 7. pydocstyle...............|syntastic-python-pydocstyle| - 8. Pyflakes.................|syntastic-python-pyflakes| - 9. Pylama...................|syntastic-python-pylama| - 10. Pylint..................|syntastic-python-pylint| - 11. python..................|syntastic-python-python| + 1. Bandit...................|syntastic-python-bandit| + 2. flake8...................|syntastic-python-flake8| + 3. Frosted..................|syntastic-python-frosted| + 4. mypy.....................|syntastic-python-mypy| + 5. Prospector...............|syntastic-python-prospector| + 6. py3kwarn.................|syntastic-python-py3kwarn| + 7. pycodestyle..............|syntastic-python-pycodestyle| + 8. pydocstyle...............|syntastic-python-pydocstyle| + 9. Pyflakes.................|syntastic-python-pyflakes| + 10. Pylama..................|syntastic-python-pylama| + 11. Pylint..................|syntastic-python-pylint| + 12. python..................|syntastic-python-python| ------------------------------------------------------------------------------ -1. flake8 *syntastic-python-flake8* +1. Bandit *syntastic-python-bandit* + +Name: bandit +Maintainer: LCD 47 <lcd047@gmail.com> + +"Bandit" is an AST-based static analyzer for Python from OpenStack Security +Group (http://openstack.org). See the project's official documentation for +details: + + https://wiki.openstack.org/wiki/Security/Projects/Bandit + +Installation~ + +Install it with "pip": > + pip install bandit +< +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + +Note~ + +In order to check all files in a project, rather than the current file: > + let g:syntastic_python_bandit_fname = ['/path/to/project'] + let g:syntastic_python_bandit_args = '-r' +< +------------------------------------------------------------------------------ +2. flake8 *syntastic-python-flake8* Name: flake8 Maintainers: Sylvain Soliman <Sylvain.Soliman+git@gmail.com> @@ -4662,7 +4890,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -2. Frosted *syntastic-python-frosted* +3. Frosted *syntastic-python-frosted* Name: frosted Maintainer: LCD 47 <lcd047@gmail.com> @@ -4678,7 +4906,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -3. mypy *syntastic-python-mypy* +4. mypy *syntastic-python-mypy* Name: mypy Maintainer: Russ Hewgill <Russ.Hewgill@gmail.com> @@ -4694,7 +4922,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -4. Prospector *syntastic-python-prospector* +5. Prospector *syntastic-python-prospector* Name: prospector Maintainer: LCD 47 <lcd047@gmail.com> @@ -4717,7 +4945,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -5. py3kwarn *syntastic-python-py3kwarn* +6. py3kwarn *syntastic-python-py3kwarn* Name: py3kwarn Author: Liam Curry <liam@curry.name> @@ -4733,7 +4961,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -6. pycodestyle *syntastic-python-pycodestyle* +7. pycodestyle *syntastic-python-pycodestyle* Name: pycodestyle Maintainer: LCD 47 <lcd047@gmail.com> @@ -4750,7 +4978,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -7. pydocstyle *syntastic-python-pydocstyle* +8. pydocstyle *syntastic-python-pydocstyle* Name: pydocstyle Maintainer: LCD 47 <lcd047@gmail.com> @@ -4768,7 +4996,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -8. Pyflakes *syntastic-python-pyflakes* +9. Pyflakes *syntastic-python-pyflakes* Name: pyflakes Authors: Martin Grenfell <martin.grenfell@gmail.com> @@ -4786,7 +5014,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -9. Pylama *syntastic-python-pylama* +10. Pylama *syntastic-python-pylama* Name: pylama Maintainer: LCD 47 <lcd047@gmail.com> @@ -4812,7 +5040,7 @@ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. ------------------------------------------------------------------------------ -10. Pylint *syntastic-python-pylint* +11. Pylint *syntastic-python-pylint* Name: pylint Author: Parantapa Bhattacharya <parantapa@gmail.com> @@ -4842,7 +5070,7 @@ recognise any messages. Example: > \ '--msg-template="{path}:{line}:{column}:{C}: [{symbol} {msg_id}] {msg}"' < ------------------------------------------------------------------------------ -11. python *syntastic-python-python* +12. python *syntastic-python-python* Name: python Maintainer: LCD 47 <lcd047@gmail.com> diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index a26917a3..06d60cc9 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-35' +let g:_SYNTASTIC_VERSION = '3.8.0-51' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/sources_non_forked/syntastic/plugin/syntastic/registry.vim b/sources_non_forked/syntastic/plugin/syntastic/registry.vim index 69ef5817..4efd5098 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/registry.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/registry.vim @@ -19,6 +19,7 @@ let s:_DEFAULT_CHECKERS = { \ 'c': ['gcc'], \ 'cabal': ['cabal'], \ 'chef': ['foodcritic'], + \ 'cmake': ['cmakelint'], \ 'co': ['coco'], \ 'cobol': ['cobc'], \ 'coffee': ['coffee', 'coffeelint'], @@ -50,6 +51,7 @@ let s:_DEFAULT_CHECKERS = { \ 'java': ['javac'], \ 'javascript': ['jshint', 'jslint'], \ 'json': ['jsonlint', 'jsonval'], + \ 'julia': [], \ 'less': ['lessc'], \ 'lex': ['flex'], \ 'limbo': ['limbo'], diff --git a/sources_non_forked/syntastic/syntax_checkers/c/cppclean.vim b/sources_non_forked/syntastic/syntax_checkers/c/cppclean.vim new file mode 100644 index 00000000..bddd979b --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/c/cppclean.vim @@ -0,0 +1,40 @@ +"============================================================================ +"File: cppclean.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_c_cppclean_checker') + finish +endif +let g:loaded_syntastic_c_cppclean_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_c_cppclean_GetLocList() dict + let makeprg = self.makeprgBuild({}) + + let errorformat = '%f:%l: %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'subtype': 'Style', + \ 'returns': [0, 1] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'c', + \ 'name': 'cppclean' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/c/flawfinder.vim b/sources_non_forked/syntastic/syntax_checkers/c/flawfinder.vim new file mode 100644 index 00000000..f47912ca --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/c/flawfinder.vim @@ -0,0 +1,61 @@ +"============================================================================ +"File: flawfinder.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_c_flawfinder_checker') + finish +endif +let g:loaded_syntastic_c_flawfinder_checker = 1 + +if !exists('g:syntastic_c_flawfinder_sort') + let g:syntastic_c_flawfinder_sort = 1 +endif + +if !exists('g:syntastic_c_flawfinder_thres') + let g:syntastic_c_flawfinder_thres = 3 +endif + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_c_flawfinder_GetHighlightRegex(item) + let term = matchstr(a:item['text'], '\m^(\S\+)\s\+\zs\S\+\ze:') + return term !=# '' ? '\V\<' . escape(term, '\') . '\>' : '' +endfunction + +function! SyntaxCheckers_c_flawfinder_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'args_after': '--columns --dataonly --singleline --quiet' }) + + let errorformat = '%f:%l:%c: [%n] %m' + + let loclist = SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'subtype': 'Style', + \ 'returns': [0] }) + + for e in loclist + let e['type'] = e['nr'] < g:syntastic_{self.getFiletype()}_flawfinder_thres ? 'W' : 'E' + let e['nr'] = 0 + endfor + + return loclist +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'c', + \ 'name': 'flawfinder' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/cmake/cmakelint.vim b/sources_non_forked/syntastic/syntax_checkers/cmake/cmakelint.vim new file mode 100644 index 00000000..84686081 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/cmake/cmakelint.vim @@ -0,0 +1,40 @@ +"============================================================================ +"File: cmakelint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_cmake_cmakelint_checker') + finish +endif +let g:loaded_syntastic_cmake_cmakelint_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_cmake_cmakelint_GetLocList() dict + let makeprg = self.makeprgBuild({}) + + let errorformat = '%f:%l: %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'subtype': 'Style', + \ 'returns': [0, 1] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'cmake', + \ 'name': 'cmakelint' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/cpp/cppclean.vim b/sources_non_forked/syntastic/syntax_checkers/cpp/cppclean.vim new file mode 100644 index 00000000..f2afa4c0 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/cpp/cppclean.vim @@ -0,0 +1,22 @@ +"============================================================================ +"File: cppclean.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: Benjamin Bannier <bbannier at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +"============================================================================ + +if exists('g:loaded_syntastic_cpp_cppclean_checker') + finish +endif +let g:loaded_syntastic_cpp_cppclean_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'cpp', + \ 'name': 'cppclean', + \ 'redirect': 'c/cppclean'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/cpp/flawfinder.vim b/sources_non_forked/syntastic/syntax_checkers/cpp/flawfinder.vim new file mode 100644 index 00000000..a003982a --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/cpp/flawfinder.vim @@ -0,0 +1,26 @@ +"============================================================================ +"File: flawfinder.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: Benjamin Bannier <bbannier at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +"============================================================================ + +if exists('g:loaded_syntastic_cpp_flawfinder_checker') + finish +endif +let g:loaded_syntastic_cpp_flawfinder_checker = 1 + +if !exists('g:syntastic_cpp_flawfinder_thres') + let g:syntastic_cpp_flawfinder_thres = 3 +endif + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'cpp', + \ 'name': 'flawfinder', + \ 'redirect': 'c/flawfinder'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/dart/dartanalyzer.vim b/sources_non_forked/syntastic/syntax_checkers/dart/dartanalyzer.vim index 63b8267b..7afc5e55 100644 --- a/sources_non_forked/syntastic/syntax_checkers/dart/dartanalyzer.vim +++ b/sources_non_forked/syntastic/syntax_checkers/dart/dartanalyzer.vim @@ -30,7 +30,10 @@ function! SyntaxCheckers_dart_dartanalyzer_GetHighlightRegex(error) endfunction function! SyntaxCheckers_dart_dartanalyzer_GetLocList() dict - let makeprg = self.makeprgBuild({ 'args_after': '--machine' }) + if !exists('s:format_machine') + let s:format_machine = syntastic#util#versionIsAtLeast(self.getVersion(), [1, 23]) ? '--format=machine' : '--machine' + endif + let makeprg = self.makeprgBuild({ 'args_after': s:format_machine }) " Machine readable format looks like: " SEVERITY|TYPE|ERROR_CODE|FILENAME|LINE_NUMBER|COLUMN|LENGTH|MESSAGE diff --git a/sources_non_forked/syntastic/syntax_checkers/julia/lint.vim b/sources_non_forked/syntastic/syntax_checkers/julia/lint.vim new file mode 100644 index 00000000..bf660d0f --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/julia/lint.vim @@ -0,0 +1,51 @@ +"============================================================================ +"File: lint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_julia_lint_checker') + finish +endif +let g:loaded_syntastic_julia_lint_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_julia_lint_GetHighlightRegex(item) + let term = matchstr(a:item['text'], '\m^\S\+\ze:') + return term !=# '' ? '\V' . escape(term, '\') : '' +endfunction + +function! SyntaxCheckers_julia_lint_IsAvailable() dict + return + \ executable(self.getExec()) && + \ syntastic#util#system(self.getExecEscaped() . ' -e ' . syntastic#util#shescape('import Lint')) ==# '' && + \ v:shell_error == 0 +endfunction + +function! SyntaxCheckers_julia_lint_GetLocList() dict + let buf = bufnr('') + + let makeprg = self.getExecEscaped() . ' -e ' . syntastic#util#shescape('using Lint; display(filter(err -> !isinfo(err), lintfile("' . escape(bufname(buf), '\"') . '")))') + + let errorformat = '%f:%l %t%n %m' + + return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'julia', + \ 'name': 'lint', + \ 'exec': 'julia' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/php/php.vim b/sources_non_forked/syntastic/syntax_checkers/php/php.vim index 5b118f68..071f976d 100644 --- a/sources_non_forked/syntastic/syntax_checkers/php/php.vim +++ b/sources_non_forked/syntastic/syntax_checkers/php/php.vim @@ -1,6 +1,6 @@ "============================================================================ "File: php.vim -"Description: Syntax checking plugin for syntastic.vim +"Description: Syntax checking plugin for syntastic "Maintainer: Martin Grenfell <martin.grenfell at gmail dot com> "License: This program is free software. It comes without any warranty, " to the extent permitted by applicable law. You can redistribute @@ -26,7 +26,7 @@ endfunction function! SyntaxCheckers_php_php_GetLocList() dict let makeprg = self.makeprgBuild({ \ 'args': '-d error_reporting=E_ALL', - \ 'args_after': '-l -d display_errors=1 -d log_errors=0 -d xdebug.cli_color=0' }) + \ 'args_after': '-l -d error_log= -d display_errors=1 -d log_errors=0 -d xdebug.cli_color=0' }) let errorformat = \ '%-GNo syntax errors detected in%.%#,'. diff --git a/sources_non_forked/syntastic/syntax_checkers/po/dennis.vim b/sources_non_forked/syntastic/syntax_checkers/po/dennis.vim new file mode 100644 index 00000000..f3fade07 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/po/dennis.vim @@ -0,0 +1,43 @@ +"============================================================================ +"File: dennis.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_po_dennis_checker') + finish +endif +let g:loaded_syntastic_po_dennis_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_po_dennis_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'exe_after': 'lint', + \ 'post_args_after': '--reporter line' }) + + let errorformat = '%f:%l:%c:%t%n:%m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'subtype': 'Style', + \ 'returns': [0, 1] }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'po', + \ 'name': 'dennis', + \ 'exec': 'dennis-cmd' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/python/bandit.vim b/sources_non_forked/syntastic/syntax_checkers/python/bandit.vim new file mode 100644 index 00000000..f3d000a9 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/python/bandit.vim @@ -0,0 +1,54 @@ +"============================================================================ +"File: bandit +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 <lcd047 at gmail dot com> +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_python_bandit_checker') + finish +endif +let g:loaded_syntastic_python_bandit_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_python_bandit_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'args_after': '--format json', + \ 'tail': '2> ' . syntastic#util#DevNull() }) + + let errorformat = '%f:%l:%t:%n:%m' + + let env = syntastic#util#isRunningWindows() ? {} : { 'TERM': 'dumb' } + + let loclist = SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'env': env, + \ 'preprocess': 'bandit', + \ 'returns': [0, 1] }) + + for e in loclist + if e['type'] ==? 'I' + let e['type'] = 'W' + let e['subtype'] = 'Style' + endif + endfor + + return loclist +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'python', + \ 'name': 'bandit' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/typescript/tslint.vim b/sources_non_forked/syntastic/syntax_checkers/typescript/tslint.vim index de224b6b..c8f9ab89 100644 --- a/sources_non_forked/syntastic/syntax_checkers/typescript/tslint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/typescript/tslint.vim @@ -30,8 +30,10 @@ function! SyntaxCheckers_typescript_tslint_GetLocList() dict \ 'args_after': '--format verbose', \ 'fname_before': (s:tslint_new ? '' : '-f') }) - " (comment-format) ts/app.ts[12, 36]: comment must start with lowercase letter - let errorformat = '%f[%l\, %c]: %m' + let errorformat = + \ '%EERROR: %f[%l\, %c]: %m,' . + \ '%WWARNING: %f[%l\, %c]: %m,' . + \ '%E%f[%l\, %c]: %m' return SyntasticMake({ \ 'makeprg': makeprg, diff --git a/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim b/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim index 210eeece..968337d7 100644 --- a/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/vim/vimlint.vim @@ -36,8 +36,14 @@ function! SyntaxCheckers_vim_vimlint_GetHighlightRegex(item) " {{{1 endfunction " }}}1 function! SyntaxCheckers_vim_vimlint_IsAvailable() dict " {{{1 - let vimlparser = globpath(&runtimepath, 'autoload/vimlparser.vim', 1) - let vimlint = globpath(&runtimepath, 'autoload/vimlint.vim', 1) + try + " Vim 7.2-051 and later + let vimlparser = globpath(&runtimepath, 'autoload/vimlparser.vim', 1) + let vimlint = globpath(&runtimepath, 'autoload/vimlint.vim', 1) + catch /\m^Vim\%((\a\+)\)\=:E118/ + let vimlparser = globpath(&runtimepath, 'autoload/vimlparser.vim') + let vimlint = globpath(&runtimepath, 'autoload/vimlint.vim') + endtry call self.log("globpath(&runtimepath, 'autoload/vimlparser.vim', 1) = " . string(vimlparser) . ', ' . \ "globpath(&runtimepath, 'autoload/vimlint.vim', 1) = " . string(vimlint)) return vimlparser !=# '' && vimlint !=# '' diff --git a/sources_non_forked/vim-fugitive/README.markdown b/sources_non_forked/vim-fugitive/README.markdown index 71b8bc47..4509a493 100644 --- a/sources_non_forked/vim-fugitive/README.markdown +++ b/sources_non_forked/vim-fugitive/README.markdown @@ -35,9 +35,15 @@ and you never get any warnings about the file changing outside Vim. making it like `git add` when called from a work tree file and like `git checkout` when called from the index or a blob in history. -Use `:Gbrowse` to open the current file on GitHub, with optional line -range (try it in visual mode!). If your current repository isn't on -GitHub, `git instaweb` will be spun up instead. +Use `:Gbrowse` to open the current file on the web front-end of your favorite +hosting provider, with optional line range (try it in visual mode!). Built-in +support is provided for `git instaweb`, and plugins are available for popular +providers such as [GitHub][rhubarb.vim], [GitLab][fugitive-gitlab.vim], and +[Bitbucket][fubitive.vim]. + +[rhubarb.vim]: https://github.com/tpope/vim-rhubarb +[fugitive-gitlab.vim]: https://github.com/shumphrey/fugitive-gitlab.vim +[fubitive.vim]: https://github.com/tommcdo/vim-fubitive Add `%{fugitive#statusline()}` to `'statusline'` to get an indicator with the current branch in (surprise!) your statusline. diff --git a/sources_non_forked/vim-fugitive/doc/fugitive.txt b/sources_non_forked/vim-fugitive/doc/fugitive.txt index 51fc591f..ceff2ddd 100644 --- a/sources_non_forked/vim-fugitive/doc/fugitive.txt +++ b/sources_non_forked/vim-fugitive/doc/fugitive.txt @@ -181,7 +181,9 @@ that are part of Git repositories). to the right or bottom, depending on 'diffopt' and the width of the window relative to 'textwidth'. Use |do| and |dp| and write to the index file to simulate - "git add --patch". + "git add --patch". For the three-way diff, there is + also d2o and d3o pulling the hunk to the middle from + the left or the right window, respectively. *fugitive-:Gsdiff* :Gsdiff [revision] Like |:Gdiff|, but always split horizontally. @@ -232,9 +234,7 @@ that are part of Git repositories). Upstream providers can be added by installing an appropriate Vim plugin. For example, GitHub can be supported by installing rhubarb.vim, available at - <https://github.com/tpope/vim-rhubarb>. (Native - support for GitHub is currently included, but that is - slated to be removed.) + <https://github.com/tpope/vim-rhubarb>. The hosting provider is determined by looking at the remote for the current or specified branch and falls diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index 66948f70..46a48613 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -70,6 +70,10 @@ endfunction let s:git_versions = {} +function! s:git_command() abort + return get(g:, 'fugitive_git_command', g:fugitive_git_executable) +endfunction + function! fugitive#git_version(...) abort if !has_key(s:git_versions, g:fugitive_git_executable) let s:git_versions[g:fugitive_git_executable] = matchstr(system(g:fugitive_git_executable.' --version'), "\\S\\+\n") @@ -127,7 +131,12 @@ function! fugitive#extract_git_dir(path) abort if s:shellslash(a:path) =~# '^fugitive://.*//' return matchstr(s:shellslash(a:path), '\C^fugitive://\zs.\{-\}\ze//') endif - let root = s:shellslash(simplify(fnamemodify(a:path, ':p:s?[\/]$??'))) + if isdirectory(a:path) + let path = fnamemodify(a:path, ':p:s?[\/]$??') + else + let path = fnamemodify(a:path, ':p:h:s?[\/]$??') + endif + let root = s:shellslash(resolve(path)) let previous = "" while root !=# previous if root =~# '\v^//%([^/]+/?)?$' @@ -179,6 +188,9 @@ function! fugitive#detect(path) abort let dir = fugitive#extract_git_dir(a:path) if dir !=# '' let b:git_dir = dir + if empty(fugitive#buffer().path()) + silent! exe haslocaldir() ? 'lcd .' : 'cd .' + endif endif endif if exists('b:git_dir') @@ -374,12 +386,14 @@ endfunction call s:add_methods('repo',['dir','tree','bare','translate','head']) function! s:repo_git_command(...) dict abort - let git = g:fugitive_git_executable . ' --git-dir='.s:shellesc(self.git_dir) + let git = s:git_command() . ' --git-dir='.s:shellesc(self.git_dir) return git.join(map(copy(a:000),'" ".s:shellesc(v:val)'),'') endfunction function! s:repo_git_chomp(...) dict abort - return s:sub(system(call(self.git_command,a:000,self)),'\n$','') + let git = g:fugitive_git_executable . ' --git-dir='.s:shellesc(self.git_dir) + let output = git.join(map(copy(a:000),'" ".s:shellesc(v:val)'),'') + return s:sub(system(output),'\n$','') endfunction function! s:repo_git_chomp_in_tree(...) dict abort @@ -456,7 +470,7 @@ endfunction call s:add_methods('repo',['dirglob','superglob']) function! s:repo_config(conf) dict abort - return matchstr(system(s:repo().git_command('config').' '.a:conf),"[^\r\n]*") + return matchstr(s:repo().git_chomp('config',a:conf),"[^\r\n]*") endfun function! s:repo_user() dict abort @@ -480,9 +494,9 @@ call s:add_methods('repo',['config', 'user', 'aliases']) function! s:repo_keywordprg() dict abort let args = ' --git-dir='.escape(self.dir(),"\\\"' ") if has('gui_running') && !has('win32') - return g:fugitive_git_executable . ' --no-pager' . args . ' log -1' + return s:git_command() . ' --no-pager' . args . ' log -1' else - return g:fugitive_git_executable . args . ' show' + return s:git_command() . args . ' show' endif endfunction @@ -693,7 +707,7 @@ function! s:Git(bang, args) abort if a:bang return s:Edit('edit', 1, a:args) endif - let git = g:fugitive_git_executable + let git = s:git_command() if has('gui_running') && !has('win32') let git .= ' --no-pager' endif @@ -1211,7 +1225,7 @@ function! s:Merge(cmd, bang, args) abort \ !empty(s:repo().git_chomp('diff-files', '--diff-filter=U'))) let &l:makeprg = g:fugitive_git_executable.' diff-files --name-status --diff-filter=U' else - let &l:makeprg = s:sub(g:fugitive_git_executable . ' ' . a:cmd . + let &l:makeprg = s:sub(s:git_command() . ' ' . a:cmd . \ (a:args =~# ' \%(--no-edit\|--abort\|-m\)\>' ? '' : ' --edit') . \ ' ' . a:args, ' *$', '') endif @@ -1390,6 +1404,9 @@ function! s:Edit(cmd,bang,...) abort return 'redraw|echo '.string(':!'.git.' '.args) else let temp = resolve(tempname()) + if has('win32') + let temp = fnamemodify(fnamemodify(temp, ':h'), ':p').fnamemodify(temp, ':t') + endif let s:temp_files[s:cpath(temp)] = { 'dir': buffer.repo().dir(), 'args': arglist } silent execute a:cmd.' '.temp if a:cmd =~# 'pedit' @@ -1632,7 +1649,7 @@ function! s:Dispatch(bang, args) try let b:current_compiler = 'git' let &l:errorformat = s:common_efm - let &l:makeprg = g:fugitive_git_executable . ' ' . a:args + let &l:makeprg = substitute(s:git_command() . ' ' . a:args, '\s\+$', '', '') execute cd fnameescape(s:repo().tree()) if exists(':Make') == 2 noautocmd Make @@ -2011,6 +2028,9 @@ function! s:Blame(bang,line1,line2,count,args) abort endif let top = line('w0') + &scrolloff let current = line('.') + if has('win32') + let temp = fnamemodify(fnamemodify(temp, ':h'), ':p').fnamemodify(temp, ':t') + endif let s:temp_files[s:cpath(temp)] = { 'dir': s:repo().dir(), 'args': cmd } exe 'keepalt leftabove vsplit '.temp let b:fugitive_blamed_bufnr = bufnr @@ -2188,7 +2208,7 @@ endfunction function! s:RehighlightBlame() abort for [hash, cterm] in items(s:hash_colors) - if !empty(cterm) || has('gui_running') + if !empty(cterm) || has('gui_running') || has('termguicolors') && &termguicolors exe 'hi FugitiveblameHash'.hash.' guifg=#'.hash.get(s:hash_colors, hash, '') else exe 'hi link FugitiveblameHash'.hash.' Identifier' @@ -2260,10 +2280,11 @@ function! s:Browse(bang,line1,count,...) abort if path =~# '^\.git/refs/remotes/.' if empty(remote) let remote = matchstr(path, '^\.git/refs/remotes/\zs[^/]\+') + let branch = matchstr(path, '^\.git/refs/remotes/[^/]\+/\zs.\+') + else + let merge = matchstr(path, '^\.git/refs/remotes/[^/]\+/\zs.\+') + let path = '.git/refs/heads/'.merge endif - let merge = matchstr(path, '^\.git/refs/remotes/[^/]\+/\zs.\+') - let branch = '' - let path = '.git/refs/heads/'.merge elseif path =~# '^\.git/refs/heads/.' let branch = path[16:-1] elseif !exists('branch') @@ -2300,9 +2321,14 @@ function! s:Browse(bang,line1,count,...) abort if empty(remote) let remote = '.' - let raw = s:repo().git_chomp('remote','get-url','origin') + let remote_for_url = 'origin' else - let raw = s:repo().git_chomp('remote','get-url',remote) + let remote_for_url = remote + endif + if fugitive#git_version() =~# '^[01]\.|^2\.[0-6]\.' + let raw = s:repo().git_chomp('config','remote.'.remote_for_url.'.url') + else + let raw = s:repo().git_chomp('remote','get-url',remote_for_url) endif if raw ==# '' let raw = remote @@ -2365,46 +2391,8 @@ function! s:github_url(opts, ...) abort if repo ==# '' return '' endif - let path = substitute(a:opts.path, '^/', '', '') - if index(domains, 'http://' . matchstr(repo, '^[^:/]*')) >= 0 - let root = 'http://' . s:sub(repo,':','/') - else - let root = 'https://' . s:sub(repo,':','/') - endif - if path =~# '^\.git/refs/heads/' - let branch = a:opts.repo.git_chomp('config','branch.'.path[16:-1].'.merge')[11:-1] - if branch ==# '' - return root . '/commits/' . path[16:-1] - else - return root . '/commits/' . branch - endif - elseif path =~# '^\.git/refs/tags/' - return root . '/releases/tag/' . path[15:-1] - elseif path =~# '^\.git/refs/remotes/[^/]\+/.' - return root . '/commits/' . matchstr(path,'remotes/[^/]\+/\zs.*') - elseif path =~# '.git/\%(config$\|hooks\>\)' - return root . '/admin' - elseif path =~# '^\.git\>' - return root - endif - if a:opts.commit =~# '^\d\=$' - let commit = a:opts.repo.rev_parse('HEAD') - else - let commit = a:opts.commit - endif - if get(a:opts, 'type', '') ==# 'tree' || a:opts.path =~# '/$' - let url = substitute(root . '/tree/' . commit . '/' . path, '/$', '', 'g') - elseif get(a:opts, 'type', '') ==# 'blob' || a:opts.path =~# '[^/]$' - let url = root . '/blob/' . commit . '/' . path - if get(a:opts, 'line2') && a:opts.line1 == a:opts.line2 - let url .= '#L' . a:opts.line1 - elseif get(a:opts, 'line2') - let url .= '#L' . a:opts.line1 . '-L' . a:opts.line2 - endif - else - let url = root . '/commit/' . commit - endif - return url + call s:warn('Install rhubarb.vim for GitHub support') + return 'https://github.com/tpope/vim-rhubarb' endfunction function! s:instaweb_url(opts) abort @@ -2662,7 +2650,7 @@ function! s:BufReadObject() abort let b:fugitive_type = s:repo().git_chomp('cat-file','-t',hash) endif if b:fugitive_type !~# '^\%(tag\|commit\|tree\|blob\)$' - return "echoerr 'fugitive: unrecognized git type'" + return "echoerr ".string("fugitive: unrecognized git type '".b:fugitive_type."'") endif let firstline = getline('.') if !exists('b:fugitive_display_format') && b:fugitive_type != 'blob' @@ -2906,7 +2894,7 @@ function! s:cfile() abort let ref = matchstr(getline('.'),'\x\{40\}') echoerr "warning: unknown context ".matchstr(getline('.'),'^\l*') - elseif getline('.') =~# '^[+-]\{3\} [ab/]' + elseif getline('.') =~# '^[+-]\{3\} [abciwo12]\=/' let ref = getline('.')[4:] elseif getline('.') =~# '^[+-]' && search('^@@ -\d\+,\d\+ +\d\+,','bnW') @@ -2920,7 +2908,7 @@ function! s:cfile() abort let lnum -= 1 endwhile let offset += matchstr(getline(lnum), type.'\zs\d\+') - let ref = getline(search('^'.type.'\{3\} [ab]/','bnW'))[4:-1] + let ref = getline(search('^'.type.'\{3\} [abciwo12]/','bnW'))[4:-1] let dcmds = [offset, 'normal!zv'] elseif getline('.') =~# '^rename from ' @@ -2929,22 +2917,22 @@ function! s:cfile() abort let ref = 'b/'.getline('.')[10:] elseif getline('.') =~# '^@@ -\d\+,\d\+ +\d\+,' - let diff = getline(search('^diff --git \%(a/.*\|/dev/null\) \%(b/.*\|/dev/null\)', 'bcnW')) + let diff = getline(search('^diff --git \%([abciwo12]/.*\|/dev/null\) \%([abciwo12]/.*\|/dev/null\)', 'bcnW')) let offset = matchstr(getline('.'), '+\zs\d\+') - let dref = matchstr(diff, '\Cdiff --git \zs\%(a/.*\|/dev/null\)\ze \%(b/.*\|/dev/null\)') - let ref = matchstr(diff, '\Cdiff --git \%(a/.*\|/dev/null\) \zs\%(b/.*\|/dev/null\)') + let dref = matchstr(diff, '\Cdiff --git \zs\%([abciwo12]/.*\|/dev/null\)\ze \%([abciwo12]/.*\|/dev/null\)') + let ref = matchstr(diff, '\Cdiff --git \%([abciwo12]/.*\|/dev/null\) \zs\%([abciwo12]/.*\|/dev/null\)') let dcmd = 'Gdiff! +'.offset - elseif getline('.') =~# '^diff --git \%(a/.*\|/dev/null\) \%(b/.*\|/dev/null\)' - let dref = matchstr(getline('.'),'\Cdiff --git \zs\%(a/.*\|/dev/null\)\ze \%(b/.*\|/dev/null\)') - let ref = matchstr(getline('.'),'\Cdiff --git \%(a/.*\|/dev/null\) \zs\%(b/.*\|/dev/null\)') + elseif getline('.') =~# '^diff --git \%([abciwo12]/.*\|/dev/null\) \%([abciwo12]/.*\|/dev/null\)' + let dref = matchstr(getline('.'),'\Cdiff --git \zs\%([abciwo12]/.*\|/dev/null\)\ze \%([abciwo12]/.*\|/dev/null\)') + let ref = matchstr(getline('.'),'\Cdiff --git \%([abciwo12]/.*\|/dev/null\) \zs\%([abciwo12]/.*\|/dev/null\)') let dcmd = 'Gdiff!' - elseif getline('.') =~# '^index ' && getline(line('.')-1) =~# '^diff --git \%(a/.*\|/dev/null\) \%(b/.*\|/dev/null\)' + elseif getline('.') =~# '^index ' && getline(line('.')-1) =~# '^diff --git \%([abciwo12]/.*\|/dev/null\) \%([abciwo12]/.*\|/dev/null\)' let line = getline(line('.')-1) - let dref = matchstr(line,'\Cdiff --git \zs\%(a/.*\|/dev/null\)\ze \%(b/.*\|/dev/null\)') - let ref = matchstr(line,'\Cdiff --git \%(a/.*\|/dev/null\) \zs\%(b/.*\|/dev/null\)') + let dref = matchstr(line,'\Cdiff --git \zs\%([abciwo12]/.*\|/dev/null\)\ze \%([abciwo12]/.*\|/dev/null\)') + let ref = matchstr(line,'\Cdiff --git \%([abciwo12]/.*\|/dev/null\) \zs\%([abciwo12]/.*\|/dev/null\)') let dcmd = 'Gdiff!' elseif line('$') == 1 && getline('.') =~ '^\x\{40\}$' @@ -2957,18 +2945,21 @@ function! s:cfile() abort let ref = '' endif - if myhash ==# '' - let ref = s:sub(ref,'^a/','HEAD:') - let ref = s:sub(ref,'^b/',':0:') - if exists('dref') - let dref = s:sub(dref,'^a/','HEAD:') - endif - else - let ref = s:sub(ref,'^a/',myhash.'^:') - let ref = s:sub(ref,'^b/',myhash.':') - if exists('dref') - let dref = s:sub(dref,'^a/',myhash.'^:') - endif + let prefixes = { + \ '1': '', + \ '2': '', + \ 'b': ':0:', + \ 'i': ':0:', + \ 'o': '', + \ 'w': ''} + + if len(myhash) + let prefixes.a = myhash.'^:' + let prefixes.b = myhash.':' + endif + let ref = s:sub(ref, '^\(\w\)/', 'get(prefixes, submatch(1), "HEAD:")') + if exists('dref') + let dref = s:sub(dref, '^\(\w\)/', 'get(prefixes, submatch(1), "HEAD:")') endif if ref ==# '/dev/null' @@ -3076,7 +3067,7 @@ function! fugitive#foldtext() abort endif endfor if filename ==# '' - let filename = matchstr(getline(v:foldstart), '^diff .\{-\} a/\zs.*\ze b/') + let filename = matchstr(getline(v:foldstart), '^diff .\{-\} [abciow12]/\zs.*\ze [abciow12]/') endif if filename ==# '' let filename = getline(v:foldstart)[5:-1] diff --git a/sources_non_forked/vim-gitgutter/README.mkd b/sources_non_forked/vim-gitgutter/README.mkd index 25cab5c9..21665e13 100644 --- a/sources_non_forked/vim-gitgutter/README.mkd +++ b/sources_non_forked/vim-gitgutter/README.mkd @@ -215,6 +215,7 @@ By default the signs are updated as follows: | Switch buffer | To notice change to git index | `g:gitgutter_eager` | | Switch tab | To notice change to git index | `g:gitgutter_eager` | | Focus the GUI | To notice change to git index | `g:gitgutter_eager` (not gVim on Windows) | +| After shell command | To notice change to git index | `g:gitgutter_eager` | | Read a file into a buffer | To display initial signs | [always] | | Save a buffer | So non-realtime signs are up to date | [always] | | Change a file outside Vim | To notice `git stash` | [always] | @@ -338,11 +339,11 @@ See above for configuring maps for hunk-jumping and staging/undoing. #### Use a custom `grep` command -If you use an alternative to grep, or your grep does not support the `color` flag, you can tell vim-gitgutter to use it here. It only needs to support extended POSIX regex. +If you use an alternative to grep, you can tell vim-gitgutter to use it here. ```viml " Default: -let g:gitgutter_grep_command = 'grep --color=never -e' +let g:gitgutter_grep_command = 'grep' ``` #### To turn off vim-gitgutter by default @@ -526,7 +527,7 @@ Here are some things you can check: * Your git config is compatible with the version of git returned by the command above. * Your Vim supports signs (`:echo has('signs')` should give `1`). * Your file is being tracked by git and has unstaged changes. -* If your grep does not support the `color` flag, add `let g:gitgutter_grep_command = 'grep -e'` to your `~/.vimrc`. +* If you have aliased or configured `grep` to use any flags, add `let g:gitgutter_grep_command = 'grep'` to your `~/.vimrc`. ### Shameless Plug diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim index c321aa98..2cf7acf9 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim @@ -4,7 +4,10 @@ if exists('g:gitgutter_grep_command') else let s:grep_available = executable('grep') if s:grep_available - let s:grep_command = 'grep --color=never -e' + let s:grep_command = 'grep' + if $GREP_OPTIONS =~# '--color=always' + let s:grep_command .= ' --color=never' + endif endif endif let s:hunk_re = '^@@ -\(\d\+\),\?\(\d*\) +\(\d\+\),\?\(\d*\) @@' diff --git a/sources_non_forked/vim-gitgutter/doc/gitgutter.txt b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt index 6524564e..0065d098 100644 --- a/sources_non_forked/vim-gitgutter/doc/gitgutter.txt +++ b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt @@ -274,7 +274,7 @@ TO USE A CUSTOM GREP COMMAND To use a custom invocation for grep, use this: > - let g:gitgutter_grep_command = 'grep --color=never -e' + let g:gitgutter_grep_command = 'grep' < TO TURN OFF VIM-GITGUTTER BY DEFAULT diff --git a/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim index eeaffb15..11a5adfc 100644 --- a/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim +++ b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim @@ -196,30 +196,17 @@ augroup gitgutter endif if g:gitgutter_eager - autocmd BufWritePost,FileChangedShellPost * call gitgutter#process_buffer(bufnr(''), 0) - - " When you enter a new tab, BufEnter is only fired if the buffer you enter - " is not the one you came from. - " - " For example: - " - " `:tab split` fires TabEnter but not BufEnter. - " `:tab new` fires TabEnter and BufEnter. - " - " As and when both TabEnter and BufEnter are fired, we do not want to - " process the entered buffer twice. We avoid this by setting and clearing - " a flag. + autocmd BufWritePost,FileChangedShellPost,ShellCmdPost * call gitgutter#process_buffer(bufnr(''), 0) autocmd BufEnter * \ if gettabvar(tabpagenr(), 'gitgutter_didtabenter') | \ call settabvar(tabpagenr(), 'gitgutter_didtabenter', 0) | + \ call gitgutter#all() | \ else | \ call gitgutter#process_buffer(bufnr(''), 0) | \ endif - autocmd TabEnter * - \ call settabvar(tabpagenr(), 'gitgutter_didtabenter', 1) | - \ call gitgutter#all() + autocmd TabEnter * call settabvar(tabpagenr(), 'gitgutter_didtabenter', 1) if !has('gui_win32') autocmd FocusGained * call gitgutter#all() diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 2333ecae..2db6358a 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -1,5 +1,13 @@ ## unplanned +IMPROVEMENTS + +* :GoMetaLinter can now exclude linters with the new `g:go_metalinter_excludes` option [gh-1253] + +BUG FIXES: + +* job: fix race between channel close and job exit [gh-1247] + ## 1.12 - (March 29, 2017) FEATURES: diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md index 9e881747..7fdd1c91 100644 --- a/sources_non_forked/vim-go/README.md +++ b/sources_non_forked/vim-go/README.md @@ -4,336 +4,64 @@ <img style="float: right;" src="assets/vim-go.png" alt="Vim-go logo"/> </p> -Go (golang) support for Vim, which comes with pre-defined sensible settings (like -auto gofmt on save), with autocomplete, snippet support, improved syntax -highlighting, go toolchain commands, and more. If needed vim-go installs all -necessary binaries for providing seamless Vim integration with current -commands. It's highly customizable and each individual feature can be -disabled/enabled easily. - ## Features -* Improved Syntax highlighting with items such as Functions, Operators, Methods. -* Auto completion support via `gocode` -* Better `gofmt` on save, which keeps cursor position and doesn't break your undo - history -* Go to symbol/declaration with `:GoDef` -* Look up documentation with `:GoDoc` inside Vim or open it in browser -* Automatically import packages via `:GoImport` or plug it into autosave -* Compile your package with `:GoBuild`, install it with `:GoInstall` or test - them with `:GoTest` (also supports running single tests via `:GoTestFunc`) +This plugin adds Go language support for Vim, with the following main features: + +* Build with `:GoBuild`, install with `:GoInstall` or test + with `:GoTest` (run single tests via `:GoTestFunc`) +* Show test coverage with `:GoCoverage` or in browser with `:GoCoverageBrowser` +* Goto definition with `:GoDef` +* Quick jump to declarations with `:GoDecls` or `:GoDeclsDir` +* Show documentation with `:GoDoc` inside or in browser with `:GoDocBrowser` * Quickly execute your current file/files with `:GoRun` -* Automatic `GOPATH` detection based on the directory structure (i.e. `gb` - projects, `godep` vendored projects) -* Change or display `GOPATH` with `:GoPath` -* Create a coverage profile and display annotated source code to see which - functions are covered with `:GoCoverage` -* Call `gometalinter` with `:GoMetaLinter`, which invokes all possible linters - (golint, vet, errcheck, deadcode, etc..) and shows the warnings/errors -* Lint your code with `:GoLint` -* Run your code through `:GoVet` to catch static errors * Advanced source analysis tools utilizing guru, such as `:GoImplements`, `:GoCallees`, and `:GoReferrers` -* Precise type-safe renaming of identifiers with `:GoRename` -* List all source files and dependencies -* Unchecked error checking with `:GoErrCheck` -* Integrated and improved snippets, supporting `ultisnips` or `neosnippet` -* Share your current code to [play.golang.org](http://play.golang.org) with `:GoPlay` -* On-the-fly type information about the word under the cursor. Plug it into - your custom vim function. -* Go asm formatting on save -* Tagbar support to show tags of the source code in a sidebar with `gotags` -* Custom vim text objects such as `a function` or `inner function` - list. -* Jump to function or type declarations with `:GoDecls` or `:GoDeclsDir` -* Vim 8.0 support. Async execution for most commands, various underlying improvements. -* NeoVim support (beta). Async execution for some commands. -* Alternate between implementation and test code with `:GoAlternate` +* Change or display `GOPATH` with `:GoPath` +* Multiple 3rd linter support with `:GoMetaLinter` +* Renaming identifiers with `:GoRename` +* Share your code to [play.golang.org](http://play.golang.org) with `:GoPlay` +* Switch between `*.go` and `*_test.go` code with `:GoAlternate` +* Add/Remove tags on struct fields with `:GoAddTags` +* Add import paths via `:GoImport` or remove them with `:GoDrop` +* Custom vim text objects such as `a function (af)` or `inner function (if)` +* ... and many more! Please see [doc/vim-go.txt](doc/vim-go.txt) for more information. -Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial) -that goes literally over all features and shows many tips and tricks. It shows -how to install vim-go and explains many unknown use cases. Recommended for -beginners as well as advanced users: https://github.com/fatih/vim-go-tutorial ## Install -Master branch is supposed to be a development branch. So stuff here can break -and change. Please try use always the [latest -release](https://github.com/fatih/vim-go/releases/latest) +Master branch is a **development** branch. Please use with caution. +I recommend to use the [**latest stable release**](https://github.com/fatih/vim-go/releases/latest) -Vim-go follows the standard runtime path structure, so I highly recommend to -use a common and well known plugin manager to install vim-go. Do not use vim-go -with other Go oriented vim plugins. For Pathogen just clone the repo. For other -plugin managers add the appropriate lines and execute the plugin's install -command. +Vim-go follows the standard runtime path structure. Below are some helper lines +for popular package managers: * [Pathogen](https://github.com/tpope/vim-pathogen) - * `git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go` + * `git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go` * [vim-plug](https://github.com/junegunn/vim-plug) - * `Plug 'fatih/vim-go'` -* [NeoBundle](https://github.com/Shougo/neobundle.vim) - * `NeoBundle 'fatih/vim-go'` -* [Vundle](https://github.com/gmarik/vundle) - * `Plugin 'fatih/vim-go'` -* [Vim packages](http://vimhelp.appspot.com/repeat.txt.html#packages) (since Vim 7.4.1528) - * `git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go` + * `Plug 'fatih/vim-go'` +* [Vim packages](http://vimhelp.appspot.com/repeat.txt.html#packages) + * `git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go` -Please be sure all necessary binaries are installed (such as `gocode`, `godef`, -`goimports`, etc.). You can easily install them with the included -`:GoInstallBinaries` command. If invoked, all necessary binaries will be -automatically downloaded and installed to your `$GOBIN` environment (if not set -it will use `$GOPATH/bin`). Note that this command requires `git` for fetching -the individual Go packages. Additionally, use `:GoUpdateBinaries` to update the -installed binaries. +After installing, please install all necessary binaries. We have a handy +command for it: -### Optional +``` +:GoInstallBinaries +``` -* Autocompletion is enabled by default via `<C-x><C-o>`. To get real-time -completion (completion by type) install: -[neocomplete](https://github.com/Shougo/neocomplete.vim) for Vim or -[deoplete](https://github.com/Shougo/deoplete.nvim) and -[deoplete-go](https://github.com/zchee/deoplete-go) for NeoVim or -[SimpleAutoCmplPop](https://github.com/roxma/SimpleAutoComplPop) -* To display source code tag information on a sidebar install -[tagbar](https://github.com/majutsushi/tagbar). -* For snippet features install: -[neosnippet](https://github.com/Shougo/neosnippet.vim) or -[ultisnips](https://github.com/SirVer/ultisnips). -* Screenshot color scheme is a slightly modified molokai: - [fatih/molokai](https://github.com/fatih/molokai). -* For a better documentation viewer checkout: - [go-explorer](https://github.com/garyburd/go-explorer). +for more information please check out the [documentation](doc/vim-go.txt) ## Usage -Many of the plugin's [features](#features) are enabled by default. There are no -additional settings needed. All usages and commands are listed in -`doc/vim-go.txt`. Note that help tags needs to be populated. Check your plugin -manager settings to generate the documentation (some do it automatically). -After that just open the help page to see all commands: - - :help vim-go - -## Example Mappings - -vim-go has several `<Plug>` mappings which can be used to create custom -mappings. Unless otherwise specified, none of these mappings are enabled -by default. Here some examples you might find useful: - -Run commands such as `go run` for the current file with `<leader>r` or `go -build` and `go test` for the current package with `<leader>b` and `<leader>t` -respectively. Display beautifully annotated source code to see which functions -are covered with `<leader>c`. - -```vim -au FileType go nmap <leader>r <Plug>(go-run) -au FileType go nmap <leader>b <Plug>(go-build) -au FileType go nmap <leader>t <Plug>(go-test) -au FileType go nmap <leader>c <Plug>(go-coverage) -``` - -By default the mapping `gd` is enabled, which opens the target identifier in -current buffer. You can also open the definition/declaration, in a new vertical, -horizontal, or tab, for the word under your cursor: - -```vim -au FileType go nmap <leader>ds <Plug>(go-def-split) -au FileType go nmap <leader>dv <Plug>(go-def-vertical) -au FileType go nmap <leader>dt <Plug>(go-def-tab) -``` - -Open the relevant Godoc for the word under the cursor with `<leader>gd` or open -it vertically with `<leader>gv` - -```vim -au FileType go nmap <leader>gd <Plug>(go-doc) -au FileType go nmap <leader>gv <Plug>(go-doc-vertical) -``` - -Or open the Godoc in browser - -```vim -au FileType go nmap <leader>gb <Plug>(go-doc-browser) -``` - -Show a list of interfaces which is implemented by the type under your cursor -with `<leader>s` - -```vim -au FileType go nmap <leader>s <Plug>(go-implements) -``` - -Show type info for the word under your cursor with `<leader>i` (useful if you -have disabled auto showing type info via `g:go_auto_type_info`) - -```vim -au FileType go nmap <leader>i <Plug>(go-info) -``` - -Rename the identifier under the cursor to a new name - -```vim -au FileType go nmap <leader>e <Plug>(go-rename) -``` - -More `<Plug>` mappings can be seen with `:he go-mappings`. Also these are just -recommendations, you are free to create more advanced mappings or functions -based on `:he go-commands`. - -## Settings -Below are some settings you might find useful. For the full list see `:he -go-settings`. - -By default syntax-highlighting for Functions, Methods and Structs is disabled. -To change it: -```vim -let g:go_highlight_functions = 1 -let g:go_highlight_methods = 1 -let g:go_highlight_fields = 1 -let g:go_highlight_types = 1 -let g:go_highlight_operators = 1 -let g:go_highlight_build_constraints = 1 -``` - -Enable goimports to automatically insert import paths instead of gofmt: - -```vim -let g:go_fmt_command = "goimports" -``` - -By default vim-go shows errors for the fmt command, to disable it: - -```vim -let g:go_fmt_fail_silently = 1 -``` - -Disable auto fmt on save: - -```vim -let g:go_fmt_autosave = 0 -``` - -Disable opening browser after posting your snippet to `play.golang.org`: - -```vim -let g:go_play_open_browser = 0 -``` - -By default when `:GoInstallBinaries` is called, the binaries are installed to -`$GOBIN` or `$GOPATH/bin`. To change it: - -```vim -let g:go_bin_path = expand("~/.gotools") -let g:go_bin_path = "/home/fatih/.mypath" "or give absolute path -``` - -Disable updating dependencies when installing/updating binaries: -```vim -let g:go_get_update = 0 -``` - -### Using with Neovim (beta) - -Note: Neovim currently is not a first class citizen for vim-go. You are free -to open bug, however I'm not using Neovim so it's hard for me to test it. -vim-go might not work well as good as in Vim. I'm happy to accept pull requests -or very detailed bug reports. If you're interested to improve the state of -Neovim in vim-go you're always welcome! - - -Run `:GoRun` in a new tab, horizontal split or vertical split terminal - -```vim -au FileType go nmap <leader>rt <Plug>(go-run-tab) -au FileType go nmap <leader>rs <Plug>(go-run-split) -au FileType go nmap <leader>rv <Plug>(go-run-vertical) -``` - -By default new terminals are opened in a vertical split. To change it - -```vim -let g:go_term_mode = "split" -``` - -By default the testing commands run asynchronously in the background and -display results with `go#jobcontrol#Statusline()`. To make them run in a new -terminal - -```vim -let g:go_term_enabled = 1 -``` - -### Using with Syntastic -Sometimes when using both `vim-go` and `syntastic` Vim will start lagging while -saving and opening files. The following fixes this: - -```vim -let g:syntastic_go_checkers = ['golint', 'govet', 'errcheck'] -let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] } -``` - -Another issue with `vim-go` and `syntastic` is that the location list window -that contains the output of commands such as `:GoBuild` and `:GoTest` might not appear. -To resolve this: - -```vim -let g:go_list_type = "quickfix" -``` - -## More info - -Check out the [Wiki](https://github.com/fatih/vim-go/wiki) page for more -information. It includes -[Screencasts](https://github.com/fatih/vim-go/wiki/Screencasts), an [FAQ -section](https://github.com/fatih/vim-go/wiki/FAQ-Troubleshooting), and many -other [various pieces](https://github.com/fatih/vim-go/wiki) of information. - -## Development & Testing - -vim-go supports now test files. Please check `autoload` folder for examples. If -you add a new feature be sure you also include the `_test.vim` file next to the -script. Test functions should be starting with `Test_`, example: - - -```viml -function Test_run_fmt() - call assert_equal(expected, actual) - ... -endfunction -``` - -You can locally test it by running: +Official documentation can be found under [doc/vim-go.txt](doc/vim-go.txt). You can display it from within Vim with: ``` -make +:help vim-go ``` - -This will run all tests and print either `PASS` or `FAIL` to indicate the final -status of all tests. - -Additionally, each new pull request will trigger a new Travis-ci job. - -## Donation - -People have asked for this for a long time, now you can be a fully supporter by -[being a patron](https://www.patreon.com/fatih)! - -By being a patron, you are enabling vim-go to grow and mature, helping me to -invest in bug fixes, new documentation, and improving both current and future -features. It's completely optional and is just a direct way to support Vim-go's -ongoing development. Thanks! - -[https://www.patreon.com/fatih](https://www.patreon.com/fatih) - -## Credits - -* Go Authors for official vim plugins -* Gocode, Godef, Golint, Guru, Goimports, Gotags, Errcheck projects and - authors of those projects. -* Other vim-plugins, thanks for inspiration (vim-golang, go.vim, vim-gocode, - vim-godef) -* [Contributors](https://github.com/fatih/vim-go/graphs/contributors) of vim-go +We also have an [official vim-go +tutorial](https://github.com/fatih/vim-go-tutorial). ## License -The BSD 3-Clause License - see `LICENSE` for more details +The BSD 3-Clause License - see [`LICENSE`](LICENSE) for more details diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index 3702d168..ec7d44cd 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -445,7 +445,7 @@ function s:cmd_job(args) abort let start_options = { \ 'callback': callbacks.callback, - \ 'close_cb': callbacks.close_cb, + \ 'exit_cb': callbacks.exit_cb, \ } " modify GOPATH if needed diff --git a/sources_non_forked/vim-go/autoload/go/coverage.vim b/sources_non_forked/vim-go/autoload/go/coverage.vim index 493d4205..fd2bb76e 100644 --- a/sources_non_forked/vim-go/autoload/go/coverage.vim +++ b/sources_non_forked/vim-go/autoload/go/coverage.vim @@ -288,7 +288,7 @@ function s:coverage_job(args) let start_options = { \ 'callback': callbacks.callback, - \ 'close_cb': callbacks.close_cb, + \ 'exit_cb': callbacks.exit_cb, \ } " modify GOPATH if needed diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim index a3d5f84a..2f73ceee 100644 --- a/sources_non_forked/vim-go/autoload/go/def.vim +++ b/sources_non_forked/vim-go/autoload/go/def.vim @@ -303,7 +303,7 @@ function s:def_job(args) abort let start_options = { \ 'callback': callbacks.callback, - \ 'close_cb': callbacks.close_cb, + \ 'exit_cb': callbacks.exit_cb, \ } if &modified diff --git a/sources_non_forked/vim-go/autoload/go/guru.vim b/sources_non_forked/vim-go/autoload/go/guru.vim index 7edd6716..5cff49d8 100644 --- a/sources_non_forked/vim-go/autoload/go/guru.vim +++ b/sources_non_forked/vim-go/autoload/go/guru.vim @@ -155,21 +155,12 @@ function! s:async_guru(args) abort endif endif - function! s:close_cb(chan) closure - let messages = [] - while ch_status(a:chan, {'part': 'out'}) == 'buffered' - let msg = ch_read(a:chan, {'part': 'out'}) - call add(messages, msg) - endwhile - - while ch_status(a:chan, {'part': 'err'}) == 'buffered' - let msg = ch_read(a:chan, {'part': 'err'}) - call add(messages, msg) - endwhile - - let l:job = ch_getjob(a:chan) - let l:info = job_info(l:job) + let messages = [] + function! s:callback(chan, msg) closure + call add(messages, a:msg) + endfunction + function! s:exit_cb(job, exitval) closure let out = join(messages, "\n") let status = { @@ -178,21 +169,22 @@ function! s:async_guru(args) abort \ 'state': "finished", \ } - if l:info.exitval + if a:exitval let status.state = "failed" endif call go#statusline#Update(status_dir, status) if has_key(a:args, 'custom_parse') - call a:args.custom_parse(l:info.exitval, out) + call a:args.custom_parse(a:exitval, out) else - call s:parse_guru_output(l:info.exitval, out, a:args.mode) + call s:parse_guru_output(a:exitval, out, a:args.mode) endif endfunction let start_options = { - \ 'close_cb': funcref("s:close_cb"), + \ 'callback': funcref("s:callback"), + \ 'exit_cb': funcref("s:exit_cb"), \ } if has_key(result, 'stdin_content') diff --git a/sources_non_forked/vim-go/autoload/go/job.vim b/sources_non_forked/vim-go/autoload/go/job.vim index e60b2b45..6fb03af7 100644 --- a/sources_non_forked/vim-go/autoload/go/job.vim +++ b/sources_non_forked/vim-go/autoload/go/job.vim @@ -30,28 +30,17 @@ function go#job#Spawn(args) call add(self.messages, a:msg) endfunction - function cbs.close_cb(chan) dict - let l:job = ch_getjob(a:chan) - let l:status = job_status(l:job) - - " the job might be in fail status, we assume by default it's failed. - " However if it's dead, we can use the real exitval - let exitval = 1 - if l:status == "dead" - let l:info = job_info(l:job) - let exitval = l:info.exitval - endif - + function cbs.exit_cb(job, exitval) dict if has_key(self, 'custom_cb') - call self.custom_cb(l:job, exitval, self.messages) + call self.custom_cb(a:job, a:exitval, self.messages) endif if has_key(self, 'error_info_cb') - call self.error_info_cb(l:job, exitval, self.messages) + call self.error_info_cb(a:job, a:exitval, self.messages) endif if get(g:, 'go_echo_command_info', 1) - if exitval == 0 + if a:exitval == 0 call go#util#EchoSuccess("SUCCESS") else call go#util#EchoError("FAILED") @@ -59,7 +48,7 @@ function go#job#Spawn(args) endif let l:listtype = go#list#Type("quickfix") - if exitval == 0 + if a:exitval == 0 call go#list#Clean(l:listtype) call go#list#Window(l:listtype) return @@ -99,9 +88,9 @@ function go#job#Spawn(args) let cbs.callback = a:args.callback endif - " override close callback handler if user provided it - if has_key(a:args, 'close_cb') - let cbs.close_cb = a:args.close_cb + " override exit callback handler if user provided it + if has_key(a:args, 'exit_cb') + let cbs.exit_cb = a:args.exit_cb endif return cbs diff --git a/sources_non_forked/vim-go/autoload/go/lint.vim b/sources_non_forked/vim-go/autoload/go/lint.vim index 84d8ba45..cbc7b337 100644 --- a/sources_non_forked/vim-go/autoload/go/lint.vim +++ b/sources_non_forked/vim-go/autoload/go/lint.vim @@ -10,6 +10,10 @@ if !exists("g:go_metalinter_enabled") let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] endif +if !exists("g:go_metalinter_excludes") + let g:go_metalinter_excludes = [] +endif + if !exists("g:go_golint_bin") let g:go_golint_bin = "golint" endif @@ -40,6 +44,10 @@ function! go#lint#Gometa(autosave, ...) abort let cmd += ["--enable=".linter] endfor + for exclude in g:go_metalinter_excludes + let cmd += ["--exclude=".exclude] + endfor + " path let cmd += [expand('%:p:h')] else @@ -252,23 +260,14 @@ function s:lint_job(args) copen endfunction - function! s:close_cb(chan) closure - let l:job = ch_getjob(a:chan) - let l:status = job_status(l:job) - - let exitval = 1 - if l:status == "dead" - let l:info = job_info(l:job) - let exitval = l:info.exitval - endif - + function! s:exit_cb(job, exitval) closure let status = { \ 'desc': 'last status', \ 'type': "gometaliner", \ 'state': "finished", \ } - if exitval + if a:exitval let status.state = "failed" endif @@ -297,7 +296,7 @@ function s:lint_job(args) let start_options = { \ 'callback': funcref("s:callback"), - \ 'close_cb': funcref("s:close_cb"), + \ 'exit_cb': funcref("s:exit_cb"), \ } call job_start(a:args.cmd, start_options) diff --git a/sources_non_forked/vim-go/autoload/go/rename.vim b/sources_non_forked/vim-go/autoload/go/rename.vim index ac2f0181..3ca47d58 100644 --- a/sources_non_forked/vim-go/autoload/go/rename.vim +++ b/sources_non_forked/vim-go/autoload/go/rename.vim @@ -71,28 +71,25 @@ function s:rename_job(args) let status_dir = expand('%:p:h') - function! s:close_cb(chan) closure - let l:job = ch_getjob(a:chan) - let l:info = job_info(l:job) - + function! s:exit_cb(job, exitval) closure let status = { \ 'desc': 'last status', \ 'type': "gorename", \ 'state': "finished", \ } - if l:info.exitval + if a:exitval let status.state = "failed" endif call go#statusline#Update(status_dir, status) - call s:parse_errors(l:info.exitval, a:args.bang, messages) + call s:parse_errors(a:exitval, a:args.bang, messages) endfunction let start_options = { \ 'callback': funcref("s:callback"), - \ 'close_cb': funcref("s:close_cb"), + \ 'exit_cb': funcref("s:exit_cb"), \ } " modify GOPATH if needed diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 2c3de9cc..857924d5 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -21,8 +21,10 @@ CONTENTS *go-contents* 5. Text Objects.................................|go-text-objects| 6. Functions....................................|go-functions| 7. Settings.....................................|go-settings| - 8. Troubleshooting..............................|go-troubleshooting| - 9. Credits......................................|go-credits| + 8. FAQ/Troubleshooting..........................|go-troubleshooting| + 9. Development..................................|go-development| + 10. Donation.....................................|go-donation| + 11. Credits......................................|go-credits| ============================================================================== INTRO *go-intro* @@ -100,7 +102,7 @@ command. Plugin 'fatih/vim-go' -* Vim |packages| (since Vim 7.4.1528) +* Vim |packages| > git clone https://github.com/fatih/vim-go.git \ ~/.vim/pack/plugins/start/vim-go @@ -1349,6 +1351,13 @@ Specifies the currently enabled linters for the |:GoMetaLinter| command. By default it's using `vet`, `golint` and `errcheck`. > let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] +< + *'g:go_metalinter_excludes'* + +Specifies the linters to be excluded from the |:GoMetaLinter| command. By +default it's empty +> + let g:go_metalinter_excludes = [] < *'g:go_metalinter_command'* @@ -1530,7 +1539,29 @@ default it's 60 seconds. Must be in milliseconds. let g:go_statusline_duration = 60000 < ============================================================================== -TROUBLESHOOTING *go-troubleshooting* +DEVELOPMENT *go-development* + +vim-go supports test files written in VimL. Please check `autoload` folder for +examples. If you add a new feature be sure you also include the `_test.vim` +file next to the script. Test functions should be starting with `Test_`, +example: +> + function Test_run_fmt() + call assert_equal(expected, actual) + ... + endfunction +< +You can locally test it by running: +> + make +< +This will run all tests and print either `PASS` or `FAIL` to indicate the final +status of all tests. Additionally, each new pull request will trigger a new +Travis-ci job. + + +============================================================================== +FAQ TROUBLESHOOTING *go-troubleshooting* I get "not an editor command" error when I invoke :GoXXX~ @@ -1568,15 +1599,63 @@ If you see errors like this: > Error installing golang.org/x/tools/cmd/goimports < -that means your local Go setup is broken or the remote website is down. For +that means your local Go setup is broken or the remote website is down. For example sometimes code.google.com times out. To test, just execute a simple `go get`: - +> go get golang.org/x/tools/cmd/goimports < You'll see a more detailed error. If this works, vim-go will work too. +How do I use vim-go with syntastic?~ + +Sometimes when using both `vim-go` and `syntastic` Vim will start lagging +while saving and opening files. The following fixes this: +> + let g:syntastic_go_checkers = ['golint', 'govet', 'errcheck'] + let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] } +< +Another issue with `vim-go` and `syntastic` is that the location list window +that contains the output of commands such as `:GoBuild` and `:GoTest` might +not appear. To resolve this: +> + let g:go_list_type = "quickfix" +< + +Using with NeoVim~ + +Note: Neovim currently is not a first class citizen for vim-go. You are free +to open bug, however I'm not using Neovim so it's hard for me to test it. +vim-go might not work well as good as in Vim. I'm happy to accept pull requests +or very detailed bug reports. If you're interested to improve the state of +Neovim in vim-go you're always welcome! + +Run `:GoRun` in a new tab, horizontal split or vertical split terminal +> + au FileType go nmap <leader>rt <Plug>(go-run-tab) + au FileType go nmap <leader>rs <Plug>(go-run-split) + au FileType go nmap <leader>rv <Plug>(go-run-vertical) +< +By default new terminals are opened in a vertical split. To change it +> + let g:go_term_mode = "split" +> + +============================================================================== +DONATION *go-donation* + +People have asked for this for a long time, now you can be a fully supporter +by being a patreon at: https://www.patreon.com/fatih + +By being a patron, you are enabling vim-go to grow and mature, helping me to +invest in bug fixes, new documentation, and improving both current and future +features. It's completely optional and is just a direct way to support Vim-go's +ongoing development. Thanks! + +Check it out: https://www.patreon.com/fatih + + ============================================================================== CREDITS *go-credits* diff --git a/sources_non_forked/vim-markdown/README.markdown b/sources_non_forked/vim-markdown/README.markdown index cd79315f..8c7c6d07 100644 --- a/sources_non_forked/vim-markdown/README.markdown +++ b/sources_non_forked/vim-markdown/README.markdown @@ -20,6 +20,14 @@ To disable markdown syntax concealing add the following to your vimrc: let g:markdown_syntax_conceal = 0 +Syntax highlight is synchronized in 50 lines. It may cause collapsed +highlighting at large fenced code block. +In the case, please set larger value in your vimrc: + + let g:markdown_minlines = 100 + +Note that setting too large value may cause bad performance on highlighting. + ## License Copyright © Tim Pope. Distributed under the same terms as Vim itself. diff --git a/sources_non_forked/vim-markdown/ftplugin/markdown.vim b/sources_non_forked/vim-markdown/ftplugin/markdown.vim index f406db58..2fbdf66d 100644 --- a/sources_non_forked/vim-markdown/ftplugin/markdown.vim +++ b/sources_non_forked/vim-markdown/ftplugin/markdown.vim @@ -41,10 +41,35 @@ function! MarkdownFold() return "=" endfunction +function! MarkdownFoldText() + let hash_indent = s:HashIndent(v:foldstart) + let title = substitute(getline(v:foldstart), '^#\+\s*', '', '') + let foldsize = (v:foldend - v:foldstart + 1) + let linecount = '['.foldsize.' lines]' + return hash_indent.' '.title.' '.linecount +endfunction + +function! s:HashIndent(lnum) + let hash_header = matchstr(getline(a:lnum), '^#\{1,6}') + if len(hash_header) > 0 + " hashtag header + return hash_header + else + " == or -- header + let nextline = getline(a:lnum + 1) + if nextline =~ '^=\+\s*$' + return repeat('#', 1) + elseif nextline =~ '^-\+\s*$' + return repeat('#', 2) + endif + endif +endfunction + if has("folding") && exists("g:markdown_folding") setlocal foldexpr=MarkdownFold() setlocal foldmethod=expr - let b:undo_ftplugin .= " foldexpr< foldmethod<" + setlocal foldtext=MarkdownFoldText() + let b:undo_ftplugin .= " foldexpr< foldmethod< foldtext<" endif " vim:set sw=2: diff --git a/sources_non_forked/vim-markdown/syntax/markdown.vim b/sources_non_forked/vim-markdown/syntax/markdown.vim index ad925cc2..35dd1a36 100644 --- a/sources_non_forked/vim-markdown/syntax/markdown.vim +++ b/sources_non_forked/vim-markdown/syntax/markdown.vim @@ -33,7 +33,10 @@ endfor unlet! s:type unlet! s:done_include -syn sync minlines=10 +if !exists('g:markdown_minlines') + let g:markdown_minlines = 50 +endif +execute 'syn sync minlines=' . g:markdown_minlines syn case ignore syn match markdownValid '[<>]\c[a-z/$!]\@!' diff --git a/sources_non_forked/vim-multiple-cursors/README.md b/sources_non_forked/vim-multiple-cursors/README.md index 26cb6d02..9b3877ca 100644 --- a/sources_non_forked/vim-multiple-cursors/README.md +++ b/sources_non_forked/vim-multiple-cursors/README.md @@ -188,6 +188,9 @@ endfunction With this locking and unlocking we prevent neocomplete to trigger it's function calls until we are finished with multiple cursors editing. +Plugins themselves can register `User` autocommands on `MultipleCursorsPre` and +`MultipleCursorsPost` for automatic integration. + ### Highlight The plugin uses the highlight group `multiple_cursors_cursor` and `multiple_cursors_visual` to highlight the virtual cursors and their visual selections respectively. You can customize them by putting something similar like the following in your vimrc: diff --git a/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim b/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim index 0df3e8ae..1e7a5f50 100644 --- a/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim +++ b/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim @@ -111,8 +111,11 @@ endfunction " attempted to be created at the next occurrence of the visual selection function! multiple_cursors#new(mode, word_boundary) " Call before function if exists only once until it is canceled (<Esc>) - if exists('*Multiple_cursors_before') && !s:before_function_called - exe "call Multiple_cursors_before()" + if !s:before_function_called + doautocmd User MultipleCursorsPre + if exists('*Multiple_cursors_before') + exe "call Multiple_cursors_before()" + endif let s:before_function_called = 1 endif let s:use_word_boundary = a:word_boundary @@ -436,8 +439,11 @@ function! s:CursorManager.reset(restore_view, restore_setting, ...) dict call self.restore_user_settings() endif " Call after function if exists and only if action is canceled (<Esc>) - if exists('*Multiple_cursors_after') && a:0 && s:before_function_called - exe "call Multiple_cursors_after()" + if a:0 && s:before_function_called + if exists('*Multiple_cursors_after') + exe "call Multiple_cursors_after()" + endif + doautocmd User MultipleCursorsPost let s:before_function_called = 0 endif endfunction diff --git a/sources_non_forked/vim-pug/syntax/pug.vim b/sources_non_forked/vim-pug/syntax/pug.vim index 0fb146d8..7b0f1c37 100644 --- a/sources_non_forked/vim-pug/syntax/pug.vim +++ b/sources_non_forked/vim-pug/syntax/pug.vim @@ -37,7 +37,9 @@ syn match pugComment '\(\s\+\|^\)\/\/.*$' contains=pugCommentTodo,@Spell syn region pugCommentBlock start="\z(\s\+\|^\)\/\/.*$" end="^\%(\z1\s\|\s*$\)\@!" contains=pugCommentTodo,@Spell keepend syn region pugHtmlConditionalComment start="<!--\%(.*\)>" end="<!\%(.*\)-->" contains=pugCommentTodo,@Spell syn region pugAngular2 start="(" end=")" contains=htmlEvent -syn region pugAttributes matchgroup=pugAttributesDelimiter start="(" end=")" contained contains=@htmlJavascript,pugHtmlArg,pugAngular2,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@pugComponent +syn region pugJavascriptString start=+"+ skip=+\\\("\|$\)+ end=+"\|$+ contained +syn region pugJavascriptString start=+'+ skip=+\\\('\|$\)+ end=+'\|$+ contained +syn region pugAttributes matchgroup=pugAttributesDelimiter start="(" end=")" contained contains=pugJavascriptString,pugHtmlArg,pugAngular2,htmlArg,htmlEvent,htmlCssDefinition nextgroup=@pugComponent syn match pugClassChar "\." containedin=htmlTagName nextgroup=pugClass syn match pugBlockExpansionChar ":\s\+" contained nextgroup=pugTag,pugClassChar,pugIdChar syn match pugIdChar "#[[{]\@!" contained nextgroup=pugId @@ -99,6 +101,7 @@ hi def link pugCommentTodo Todo hi def link pugComment Comment hi def link pugCommentBlock Comment hi def link pugHtmlConditionalComment pugComment +hi def link pugJavascriptString String let b:current_syntax = "pug" diff --git a/sources_non_forked/vim-repeat/autoload/repeat.vim b/sources_non_forked/vim-repeat/autoload/repeat.vim index f2caeb4a..fde6a38e 100644 --- a/sources_non_forked/vim-repeat/autoload/repeat.vim +++ b/sources_non_forked/vim-repeat/autoload/repeat.vim @@ -40,7 +40,7 @@ " in your mapping will look like this: " " nnoremap <silent> <Plug>MyMap -" \ :<C-U>execute 'silent! call repeat#setreg("\<lt>Plug>MyMap", v:register)'<Bar> +" \ :<C-U>silent! call repeat#setreg("\<lt>Plug>MyMap", v:register)<Bar> " \ call <SID>MyFunction(v:register, ...)<Bar> " \ silent! call repeat#set("\<lt>Plug>MyMap")<CR> diff --git a/sources_non_forked/vim-snipmate/README.md b/sources_non_forked/vim-snipmate/README.md index b47b56df..f025dce5 100644 --- a/sources_non_forked/vim-snipmate/README.md +++ b/sources_non_forked/vim-snipmate/README.md @@ -96,6 +96,20 @@ will load the `ruby-rails` scope whenever the `ruby` scope is active. The buffer. The [vim-rails](https://github.com/tpope/vim-rails) plugin automatically does `:SnipMateLoadScope rails` when editing a Rails project for example. +> What are the snippet parser versions and what's the difference between them? + +Originally SnipMate used regex to parse a snippet. Determining where stops were, +what the placeholders were, where mirrors were, etc. were all done with regex. +Needless to say this was a little fragile. When the time came for a rewritten +parser, some incompatibilities were a little necessary. Rather than break +everyone's snippets everywhere, we provided both the new (version 1) and the old +(version 0) and let the user choose between them. + +Version 0 is considered legacy and not a lot of effort is going to go into +improving or even maintaining it. Version 1 is the future, and one can expect +new features to only exist for version 1 users. A full list of differences can +be found in the docs at `:h SnipMate-parser-versions`. + ## Release Notes ## ### 0.89 - 2016-05-29 ### diff --git a/sources_non_forked/vim-snipmate/doc/snipMate.txt b/sources_non_forked/vim-snipmate/doc/snipMate.txt index c97205a6..d00e6b20 100644 --- a/sources_non_forked/vim-snipmate/doc/snipMate.txt +++ b/sources_non_forked/vim-snipmate/doc/snipMate.txt @@ -148,7 +148,8 @@ g:snipMate.snippet_version 1 Use the newer parser If unset, SnipMate defaults to version 0. The value of this option is also used for all - .snippet files. + .snippet files. See |SnipMate-parser-versions| + for more information. g:snipMate.override As detailed below, when two snippets with the @@ -265,14 +266,18 @@ Note: Hard tabs in the expansion text are required. When the snippet is expanded in the text and 'expandtab' is set, each tab will be replaced with spaces based on 'softtabstop' if nonzero or 'shiftwidth' otherwise. -Which version parser the snippets in a file should be used with can be -specified with a version line, e.g.: > + +SnipMate currently provides two versions for the snippet parser. The +differences between them can be found at |SnipMate-parser-versions|. Which +version parser the snippets in a file should be used with can be specified +with a version line, e.g.: > version 1 Specification of a version applies to the snippets following it. Multiple version specifications can appear in a single file to intermix version 0 and -version 1 snippets. +version 1 snippets. The default is determined by the +g:snipMate.snippet_version option. |SnipMate-options| Comments can be made in .snippets files by starting a line with a # character. However these can't be used inside of snippet definitions: > @@ -286,7 +291,7 @@ However these can't be used inside of snippet definitions: > This should hopefully be clear with the included syntax highlighting. - *snipMate-extends* + *SnipMate-extends* Borrowing from UltiSnips, .snippets files can also contain an extends directive, for example: > @@ -296,6 +301,11 @@ will tell SnipMate to also read html, javascript, and css snippets. SNIPPET SYNTAX *snippet-syntax* *SnipMate-syntax* +As mentioned above, there are two versions of the snippet parser. They are +selected by the g:snipMate.snippet_version option (|SnipMate-options|) or the +version directive in .snippets files. Differences will be mentioned throughout +with a summary at |SnipMate-parser-versions|. + Anywhere in a snippet, a backslash escapes the character following it, regardless of whether that character is special or not. That is, '\a' will always result in an 'a' in the output. A single backslash can be output by @@ -366,13 +376,15 @@ edited. These look like a tab stop without a placeholder; $1 for example. In the event that no placeholder is specified for a certain tab stop--say $1--the first instance becomes the tab stop and the rest become mirrors. -Additionally substitutions similar to |:substitute| can be performed. For -instance ${1/foo/bar/g} will replace all instances of "foo" in the $1 mirror -with "bar". This uses |substitute()| behind the scenes. +Additionally, in version 1 of the parser, substitutions similar to +|:substitute| can be performed. For instance ${1/foo/bar/g} will replace all +instances of "foo" in the $1 mirror with "bar". This uses |substitute()| +behind the scenes. Note: Just like with tab stops, braces can be used to avoid ambiguities: ${1}2 is a mirror of the first tab stop followed by a 2. Version 0 of the snippet -parser offers no way to resolve such ambiguities. +parser offers no way to resolve such ambiguities. Version 0 also requires that +a tabstop have a placeholder before its mirrors work. As an example, > @@ -436,6 +448,39 @@ Example: > <div> ${0:${VISUAL:<!-- content -->}} </div> +< + *SnipMate-parser-versions* +Parser Versions~ + +SnipMate provides two versions for its snippet parser. Version 0 is the legacy +regex based version and is updated sparingly. Version 1 is the revamped +version with new features. Any newly developed features will likely only be +available to version 1 users. + +Which version is used is determined by version directives in snippet files +(|SnipMate-snippet-files|) and by the g:snipMate.snippet_version option +(|SnipMate-options|). + +A complete list of current differences is as follows: +- Backslash escaping is guaranteed to work in version 1. In certain edge cases + this may not work in version 0. +- Certain syntactic errors, such as a missing closing brace for a tabstop, are + more gracefully handled in version 1. In most cases, the parser will either + discard the error or, as in the previous example, end an item at the end of + line. Version 0 may not be predictable in this regard. +- Braces are not mandatory in version 1. SnipMate will determine which + instance of a stop ID to use based on the presence of a placeholder, or + whichever instance occurs first. Braces can therefore be used to + disambiguate between stop 12, $12, and stop 1 followed by a 2, ${1}2. In + other words, version 0 makes a distinction between a mirror and a stop while + version 1 resolves the differences for you. +- Placeholders are not mandatory to enable mirror support in version 1. +- Version 0 uses the confusing syntax {VISUAL} to refer to visual content. + Version 1 treats it as just another stop ID, so both $VISUAL and ${VISUAL} + work. Plus version 1 allows a default value in case no visual selection has + been made. +- Transformations similar to |:substitute| can be preformed on any mirror, + including visual content. ============================================================================== SNIPPET SOURCES *SnipMate-snippet-sources* diff --git a/sources_non_forked/vim-snippets/UltiSnips/rust.snippets b/sources_non_forked/vim-snippets/UltiSnips/rust.snippets index 482f78e4..24af1b37 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/rust.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/rust.snippets @@ -4,25 +4,6 @@ priority -50 -snippet let "let variable declaration" b -let ${1:name}${2:: ${3:type}} = $4; -endsnippet - -snippet letm "let mut variable declaration" b -let mut ${1:name}${2:: ${3:type}} = $4; -endsnippet - -snippet fn "A function, optionally with arguments and return type." -fn ${1:function_name}($2)${3/..*/ -> /}$3 { - ${VISUAL}$0 -} -endsnippet - -snippet pfn "A public function, optionally with arguments and return type." -pub fn ${1:function_name}($2)${3/..*/ -> /}$3 { - ${VISUAL}$0 -} -endsnippet snippet arg "Function Arguments" i ${1:a}: ${2:T}${3:, arg} @@ -38,18 +19,6 @@ ${1:move }|$2| { } endsnippet -snippet pri "print!(..)" b -print!("$1"${2/..*/, /}$2); -endsnippet - -snippet pln "println!(..)" b -println!("$1"${2/..*/, /}$2); -endsnippet - -snippet fmt "format!(..)" -format!("$1"${2/..*/, /}$2); -endsnippet - snippet macro "macro_rules!" b macro_rules! ${1:name} { (${2:matcher}) => ( @@ -58,49 +27,8 @@ macro_rules! ${1:name} { } endsnippet -snippet mod "A module" b -mod ${1:`!p snip.rv = snip.basename.lower() or "name"`} { - ${VISUAL}$0 -} -endsnippet - -snippet for "for .. in .." b -for ${1:i} in $2 { - ${VISUAL}$0 -} -endsnippet - -snippet todo "A Todo comment" -// [TODO]: ${1:Description} - `!v strftime("%Y-%m-%d %I:%M%P")` -endsnippet - -snippet st "Struct" b -struct ${1:`!p snip.rv = snip.basename.title() or "Name"`} { - ${VISUAL}$0 -} -endsnippet - -# TODO: fancy dynamic field mirroring like Python slotclass -snippet stn "Struct with new constructor." b -pub struct ${1:`!p snip.rv = snip.basename.title() or "Name"`} { - fd$0 -} - -impl $1 { - pub fn new($2) -> $1 { - $1 { $3 } - } -} -endsnippet - snippet fd "Struct field definition" w ${1:name}: ${2:Type}, endsnippet -snippet impl "Struct/Trait implementation" b -impl ${1:Type/Trait}${2: for ${3:Type}} { - $0 -} -endsnippet - # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets index 9957b3f7..5a67abbc 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets @@ -78,6 +78,14 @@ snippet sec "Section" b $0 endsnippet +snippet sec* "Section" b +\section*{${1:section name}} +\label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} + +${0} +endsnippet + + snippet sub "Subsection" b \subsection{${1:subsection name}} \label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} @@ -85,6 +93,13 @@ snippet sub "Subsection" b $0 endsnippet +snippet sub* "Subsection" b +\subsection*{${1:subsection name}} +\label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} + +${0} +endsnippet + snippet ssub "Subsubsection" b \subsubsection{${1:subsubsection name}} \label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} @@ -92,6 +107,13 @@ snippet ssub "Subsubsection" b $0 endsnippet +snippet ssub* "Subsubsection" b +\subsubsection*{${1:subsubsection name}} +\label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} + +${0} +endsnippet + snippet par "Paragraph" b \paragraph{${1:paragraph name}} \label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}} @@ -112,7 +134,7 @@ $0 endsnippet snippet pac "Package" b -\usepackage[${1:options}]{${2:package}}$0 +\usepackage`!p snip.rv='[' if t[1] else ""`${1:options}`!p snip.rv = ']' if t[1] else ""`{${2:package}}$0 endsnippet snippet lp "Long parenthesis" diff --git a/sources_non_forked/vim-snippets/snippets/cs.snippets b/sources_non_forked/vim-snippets/snippets/cs.snippets index decf79af..110c85f4 100644 --- a/sources_non_forked/vim-snippets/snippets/cs.snippets +++ b/sources_non_forked/vim-snippets/snippets/cs.snippets @@ -58,28 +58,34 @@ # # Main snippet sim - ${1:public }static int Main(string[] args) { + ${1:public} static int Main(string[] args) + { ${0} return 0; } snippet simc - public class Application { - ${1:public }static int Main(string[] args) { + public class Application + { + ${1:public} static int Main(string[] args) + { ${0} return 0; } } snippet svm - ${1:public }static void Main(string[] args) { + ${1:public} static void Main(string[] args) + { ${0} } # if condition snippet if - if (${1:true}) { + if (${1:true}) + { ${0:${VISUAL}} } snippet el - else { + else + { ${0:${VISUAL}} } snippet ifs @@ -92,81 +98,99 @@ snippet ? ${1} ? ${2} : ${0} # do while loop snippet do - do { + do + { ${0:${VISUAL}} } while (${1:true}); # while loop snippet wh - while (${1:true}) { + while (${1:true}) + { ${0:${VISUAL}} } # for loop snippet for - for (int ${1:i} = 0; $1 < ${2:count}; $1${3:++}) { + for (int ${1:i} = 0; $1 < ${2:count}; $1${3:++}) + { ${0} } snippet forr - for (int ${1:i} = ${2:length}; $1 >= 0; $1--) { + for (int ${1:i} = ${2:length}; $1 >= 0; $1--) + { ${0} } # foreach snippet fore - foreach (${1:var} ${2:entry} in ${3}) { + foreach (${1:var} ${2:entry} in ${3}) + { ${0} } snippet foreach - foreach (${1:var} ${2:entry} in ${3}) { + foreach (${1:var} ${2:entry} in ${3}) + { ${0} } snippet each - foreach (${1:var} ${2:entry} in ${3}) { + foreach (${1:var} ${2:entry} in ${3}) + { ${0} } # interfaces snippet interface - public interface ${1:`vim_snippets#Filename()`} { + public interface ${1:`vim_snippets#Filename()`} + { ${0} } snippet if+ - public interface ${1:`vim_snippets#Filename()`} { + public interface ${1:`vim_snippets#Filename()`} + { ${0} } # class bodies snippet class - public class ${1:`vim_snippets#Filename()`} { + public class ${1:`vim_snippets#Filename()`} + { ${0} } snippet cls - ${2:public} class ${1:`vim_snippets#Filename()`} { + ${2:public} class ${1:`vim_snippets#Filename()`} + { ${0} } snippet cls+ - public class ${1:`vim_snippets#Filename()`} { + public class ${1:`vim_snippets#Filename()`} + { ${0} } snippet cls+^ - public static class ${1:`vim_snippets#Filename()`} { + public static class ${1:`vim_snippets#Filename()`} + { ${0} } snippet cls& - internal class ${1:`vim_snippets#Filename()`} { + internal class ${1:`vim_snippets#Filename()`} + { ${0} } snippet cls&^ - internal static class ${1:`vim_snippets#Filename()`} { + internal static class ${1:`vim_snippets#Filename()`} + { ${0} } snippet cls| - protected class ${1:`vim_snippets#Filename()`} { + protected class ${1:`vim_snippets#Filename()`} + { ${0} } snippet cls|% - protected abstract class ${1:`vim_snippets#Filename()`} { + protected abstract class ${1:`vim_snippets#Filename()`} + { ${0} } # constructor snippet ctor - public ${1:`vim_snippets#Filename()`}() { + public ${1:`vim_snippets#Filename()`}() + { ${0} } # properties - auto properties by default. @@ -266,101 +290,124 @@ snippet ps- private string ${1} { get; set; } # members - void snippet m - ${1:public} ${2:void} ${3}(${4}) { + ${1:public} ${2:void} ${3}(${4}) + { ${0} } snippet m+ - public ${1:void} ${2}(${3}) { + public ${1:void} ${2}(${3}) + { ${0} } snippet m& - internal ${1:void} ${2}(${3}) { + internal ${1:void} ${2}(${3}) + { ${0} } snippet m| - protected ${1:void} ${2}(${3}) { + protected ${1:void} ${2}(${3}) + { ${0} } snippet m- - private ${1:void} ${2}(${3}) { + private ${1:void} ${2}(${3}) + { ${0} } # members - int snippet mi - ${1:public} int ${2}(${3}) { + ${1:public} int ${2}(${3}) + { ${0:return 0;} } snippet mi+ - public int ${1}(${2}) { + public int ${1}(${2}) + { ${0:return 0;} } snippet mi& - internal int ${1}(${2}) { + internal int ${1}(${2}) + { ${0:return 0;} } snippet mi| - protected int ${1}(${2}) { + protected int ${1}(${2}) + { ${0:return 0;} } snippet mi- - private int ${1}(${2}) { + private int ${1}(${2}) + { ${0:return 0;} } # members - bool snippet mb - ${1:public} bool ${2}(${3}) { + ${1:public} bool ${2}(${3}) + { ${0:return false;} } snippet mb+ - public bool ${1}(${2}) { + public bool ${1}(${2}) + { ${0:return false;} } snippet mb& - internal bool ${1}(${2}) { + internal bool ${1}(${2}) + { ${0:return false;} } snippet mb| - protected bool ${1}(${2}) { + protected bool ${1}(${2}) + { ${0:return false;} } snippet mb- - private bool ${1}(${2}) { + private bool ${1}(${2}) + { ${0:return false;} } # members - string snippet ms - ${1:public} string ${2}(${3}) { + ${1:public} string ${2}(${3}) + { ${0:return "";} } snippet ms+ - public string ${1}(${2}) { + public string ${1}(${2}) + { ${0:return "";} } snippet ms& - internal string ${1}(${2}) { + internal string ${1}(${2}) + { ${0:return "";} } snippet ms| - protected string ${1:}(${2:}) { + protected string ${1:}(${2:}) + { ${0:return "";} } snippet ms- - private string ${1}(${2}) { + private string ${1}(${2}) + { ${0:return "";} } # structure snippet struct - public struct ${1:`vim_snippets#Filename()`} { + public struct ${1:`vim_snippets#Filename()`} + { ${0} } # enumeration snippet enum - enum ${1} { + enum ${1} + { ${0} } snippet enum+ - public enum ${1} { + public enum ${1} + { ${0} } # preprocessor directives @@ -391,8 +438,10 @@ snippet cw # equals override snippet eq - public override bool Equals(object obj) { - if (obj == null || GetType() != obj.GetType()) { + public override bool Equals(object obj) + { + if (obj == null || GetType() != obj.GetType()) + { return false; } ${0:throw new NotImplementedException();} @@ -400,7 +449,8 @@ snippet eq } # exception snippet exc - public class ${1:MyException} : ${2:Exception} { + public class ${1:MyException} : ${2:Exception} + { public $1() { } public $1(string message) : base(message) { } public $1(string message, Exception inner) : base(message, inner) { } @@ -411,24 +461,28 @@ snippet exc } # indexer snippet index - public ${1:object} this[${2:int} index] { + public ${1:object} this[${2:int} index] + { get { ${0} } set { ${0} } } # eventhandler snippet inv EventHandler temp = ${1:MyEvent}; - if (${2:temp} != null) { + if (${2:temp} != null) + { $2(); } # lock snippet lock - lock (${1:this}) { + lock (${1:this}) + { ${0} } # namespace snippet namespace - namespace ${1:MyNamespace} { + namespace ${1:MyNamespace} + { ${0} } # property @@ -436,35 +490,42 @@ snippet prop public ${1:int} ${2:MyProperty} { get; set; } snippet propf private ${1:int} ${2:myVar}; - public $1 ${3:MyProperty} { - get { return $2; } - set { $2 = value; } - } + public $1 ${3:MyProperty} + { + get { return $2; } + set { $2 = value; } + } snippet propg public ${1:int} ${2:MyProperty} { get; private set; } # switch snippet switch - switch (${1:switch_on}) { + switch (${1:switch_on}) + { ${0} default: } # try snippet try - try { - ${0:${VISUAL}} - } - catch (${1:System.Exception}) { - throw; - } -snippet tryf - try { + try + { ${0:${VISUAL}} } - finally { + catch (${1:System.Exception}) + { + throw; + } +snippet tryf + try + { + ${0:${VISUAL}} + } + finally + { ${1} } # using snippet usi - using(${1:resource}) { + using (${1:resource}) + { ${0} } diff --git a/sources_non_forked/vim-snippets/snippets/elixir.snippets b/sources_non_forked/vim-snippets/snippets/elixir.snippets index ccc5fb73..963470e9 100644 --- a/sources_non_forked/vim-snippets/snippets/elixir.snippets +++ b/sources_non_forked/vim-snippets/snippets/elixir.snippets @@ -2,6 +2,12 @@ snippet do do ${0:${VISUAL}} end +snippet put IO.puts + IO.puts "${0}" +snippet ins IO.inspect + IO.inspect ${0} +snippet insl IO.inspect with label + IO.inspect(${0}label: "${1:label}") snippet if if .. do .. end if ${1} do ${0:${VISUAL}} @@ -44,14 +50,14 @@ snippet for for ${1:item} <- ${2:items} do ${0} end +snippet for: + for ${1:item} <- ${2:items}, do: ${0} snippet fori for ${1:item} <- ${2:items}, into: ${3} do ${0} end snippet wi - with( - ${1:item} <- ${2:items} - ) do + with ${1:item} <- ${2:items} do ${0} end snippet wie @@ -63,6 +69,16 @@ snippet wie ${4} -> ${0} end +snippet sp + @spec ${1:name}(${2:args}) :: ${3:returns} +snippet op + @opaque ${1:type_name} :: ${2:type} +snippet ty + @type ${1:type_name} :: ${2:type} +snippet typ + @typep ${1:type_name} :: ${2:type} +snippet cb + @callback ${1:name}(${2:args}) :: ${3:returns} snippet df def ${1:name}, do: ${2} snippet def @@ -157,3 +173,15 @@ snippet qu snippet beh @behaviour ${1:Mix.Task} ${0} +snippet >e pipe to each + |> Enum.each(fn ${1} -> ${0} end) +snippet >m pipe to map + |> Enum.map(fn ${1} -> ${0} end) +snippet >f pipe to filter + |> Enum.filter(fn ${1} -> ${0} end) +snippet >r pipe to reduce + |> Enum.reduce(${1:acc}, fn ${2}, ${3:acc} -> ${0} end) +snippet >i pipe to inspect + |> IO.inspect +snippet >il pipe to inspect with label + |> IO.inspect(label: "${1:label}") diff --git a/sources_non_forked/vim-snippets/snippets/elm.snippets b/sources_non_forked/vim-snippets/snippets/elm.snippets index 7898d5f3..7a4e3ef5 100644 --- a/sources_non_forked/vim-snippets/snippets/elm.snippets +++ b/sources_non_forked/vim-snippets/snippets/elm.snippets @@ -34,7 +34,8 @@ snippet - ${0} snippet let let - ${1} = ${2} + ${1} = + ${2} in ${0} snippet if diff --git a/sources_non_forked/vim-snippets/snippets/fortran.snippets b/sources_non_forked/vim-snippets/snippets/fortran.snippets index e61d3fb5..e04d4fda 100644 --- a/sources_non_forked/vim-snippets/snippets/fortran.snippets +++ b/sources_non_forked/vim-snippets/snippets/fortran.snippets @@ -91,6 +91,8 @@ snippet func end function $1 snippet pr write(*,*) $0 +snippet dpr + write(*,*) '$1 = ', $1 snippet read read(unit = ${1:fp}, file = ${2:filename}, iostat = ${3:ierr}) $0 snippet write diff --git a/sources_non_forked/vim-snippets/snippets/idris.snippets b/sources_non_forked/vim-snippets/snippets/idris.snippets new file mode 100644 index 00000000..abbedb62 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/idris.snippets @@ -0,0 +1,46 @@ +snippet mod + module `substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')` + ${0} +snippet imp + import ${0:List} +snippet fn + ${1:fn} : ${2:a} -> ${3:a} + $1 ${4} = + ${0} +snippet fn1 + ${1:fn} : ${2:a} -> ${3:a} + $1 ${4} = + ${0} +snippet fn2 + ${1:fn} : ${2:a} -> ${3:a} -> ${4:a} + $1 ${5} = + ${0} +snippet fn3 + ${1:fn} : ${2:a} -> ${3:a} -> ${4:a} -> ${5:a} + $1 ${6} = + ${0} +snippet fn0 + ${1:fn} : ${2:a} + $1 = + ${0} +snippet case + case ${1} of + ${2} => + ${0} +snippet let + let + ${1} = + ${2} + in + ${0} +snippet wh + where + ${0} +snippet if + if ${1} then + ${2:${VISUAL}} + else + ${0} + ${0} +snippet \ "Lambda function (\x => ...)" + (\\${1:_} => ${0}) diff --git a/sources_non_forked/vim-snippets/snippets/purescript.snippets b/sources_non_forked/vim-snippets/snippets/purescript.snippets index 06d6b34a..cdbcbd2c 100644 --- a/sources_non_forked/vim-snippets/snippets/purescript.snippets +++ b/sources_non_forked/vim-snippets/snippets/purescript.snippets @@ -3,9 +3,9 @@ snippet mod ( ) where - import Prelude + import Prelude - ${0} + ${0} snippet imp import ${0:Data.List} snippet impq @@ -50,3 +50,8 @@ snippet testunit Assert.equal "Hello, world!" "Hello, sailor!" +snippet if + if ${1} then + ${2:${VISUAL}} + else + ${0} diff --git a/sources_non_forked/vim-snippets/snippets/python.snippets b/sources_non_forked/vim-snippets/snippets/python.snippets index b32ef0a8..faa716eb 100644 --- a/sources_non_forked/vim-snippets/snippets/python.snippets +++ b/sources_non_forked/vim-snippets/snippets/python.snippets @@ -150,6 +150,10 @@ snippet pdbbb snippet rpdb import rpdb rpdb.set_trace() +# web python debugger (wdb) +snippet wdb + import wdb + wdb.set_trace() # ptpython snippet ptpython from ptpython.repl import embed diff --git a/sources_non_forked/vim-snippets/snippets/ruby.snippets b/sources_non_forked/vim-snippets/snippets/ruby.snippets index 340391eb..3f909a0c 100644 --- a/sources_non_forked/vim-snippets/snippets/ruby.snippets +++ b/sources_non_forked/vim-snippets/snippets/ruby.snippets @@ -703,9 +703,9 @@ snippet is snippet isn it { should_not ${0} } snippet iexp - it { expect(${1:object}).${1} ${0} } + it { expect(${1:object}).${2} ${0} } snippet iexpb - it { expect { ${1:object} }.${1} ${0} } + it { expect { ${1:object} }.${2} ${0} } snippet iiexp it { is_expected.to ${0} } snippet iiexpn diff --git a/sources_non_forked/vim-snippets/snippets/rust.snippets b/sources_non_forked/vim-snippets/snippets/rust.snippets index 25effe6e..51f10055 100644 --- a/sources_non_forked/vim-snippets/snippets/rust.snippets +++ b/sources_non_forked/vim-snippets/snippets/rust.snippets @@ -39,10 +39,17 @@ snippet letm "let mut variable declaration with type inference" let mut ${1} = ${2}; snippet lettm "let mut variable declaration with explicit type annotation" let mut ${1}: ${2} = ${3}; +snippet pri "print!" + print!("${1}"); +snippet pri, "print! with format param" + print!("${1}", ${2}); snippet pln "println!" println!("${1}"); snippet pln, "println! with format param" println!("${1}", ${2}); +snippet fmt "format!" + format!("${1}", ${2}); + # Modules snippet ec "extern crate" extern crate ${1:sync}; diff --git a/sources_non_forked/vim-snippets/snippets/tex.snippets b/sources_non_forked/vim-snippets/snippets/tex.snippets index c095b5a4..2808cf71 100644 --- a/sources_non_forked/vim-snippets/snippets/tex.snippets +++ b/sources_non_forked/vim-snippets/snippets/tex.snippets @@ -149,12 +149,12 @@ snippet sub* \subsection* \\label{sub:${2:$1}} ${0} # Sub Sub Section -snippet subs \subsubsection +snippet ssub \subsubsection \\subsubsection{${1:subsubsection name}} \\label{ssub:${2:$1}} ${0} # Sub Sub Section without number -snippet subs* \subsubsection* +snippet ssub* \subsubsection* \\subsubsection*{${1:subsubsection name}} \\label{ssub:${2:$1}} ${0} From 0a8ca3c28bffe1743014eb093133d075b97a175f Mon Sep 17 00:00:00 2001 From: Nicolas Djambazian <nicolas@djambazian.fr> Date: Sat, 20 May 2017 11:33:48 +0200 Subject: [PATCH 216/254] Allow to install custom plugins --- .gitignore | 1 + my_plugins/.gitkeep | 0 vimrcs/plugins_config.vim | 1 + 3 files changed, 2 insertions(+) create mode 100644 my_plugins/.gitkeep diff --git a/.gitignore b/.gitignore index 56dee29f..55273366 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ temp_dirs/yankring_history_v2.txt sources_forked/yankring/doc/tags sources_non_forked/tlib/doc/tags sources_non_forked/ctrlp.vim/doc/tags* +my_plugins/ my_configs.vim tags .DS_Store diff --git a/my_plugins/.gitkeep b/my_plugins/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index e67e5a07..05be1e6d 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -11,6 +11,7 @@ let s:vim_runtime = expand('<sfile>:p:h')."/.." call pathogen#infect(s:vim_runtime.'/sources_forked/{}') call pathogen#infect(s:vim_runtime.'/sources_non_forked/{}') +call pathogen#infect(s:vim_runtime.'/my_plugins/{}') call pathogen#helptags() """""""""""""""""""""""""""""" From 48a2c325c30a079ada3719a7876b97546d0e58ad Mon Sep 17 00:00:00 2001 From: amix <amix@amix.dk> Date: Fri, 26 May 2017 11:30:32 +0200 Subject: [PATCH 217/254] Updated plugins and added vim-abolish --- sources_non_forked/ack.vim/README.md | 24 +- sources_non_forked/ctrlp.vim/plugin/ctrlp.vim | 4 +- .../nerdtree/autoload/nerdtree.vim | 4 +- sources_non_forked/nerdtree/doc/NERD_tree.txt | 2 +- .../nerdtree/lib/nerdtree/path.vim | 2 +- .../syntastic/doc/syntastic-checkers.txt | 33 + .../syntastic/plugin/syntastic.vim | 2 +- .../syntastic/syntax_checkers/go/gotype.vim | 18 +- .../syntastic/syntax_checkers/php/phpstan.vim | 49 ++ sources_non_forked/vim-abolish/.gitignore | 1 + .../vim-abolish/CONTRIBUTING.markdown | 1 + .../vim-abolish/README.markdown | 150 +++++ .../vim-abolish/doc/abolish.txt | 181 +++++ .../vim-abolish/plugin/abolish.vim | 631 ++++++++++++++++++ .../vim-bundle-mako/indent/mako.vim | 5 +- .../vim-fugitive/plugin/fugitive.vim | 45 +- .../vim-go/.github/CONTRIBUTING.md | 4 +- sources_non_forked/vim-go/CHANGELOG.md | 15 + .../vim-go/autoload/go/keyify.vim | 58 ++ .../vim-go/autoload/go/lint.vim | 13 +- .../vim-go/autoload/go/path.vim | 18 +- .../vim-go/autoload/go/tags.vim | 2 + .../vim-go/autoload/go/util.vim | 63 +- sources_non_forked/vim-go/doc/vim-go.txt | 90 ++- sources_non_forked/vim-go/ftplugin/go.vim | 2 + .../vim-go/ftplugin/go/commands.vim | 3 + .../vim-go/gosnippets/UltiSnips/go.snippets | 7 + .../vim-go/gosnippets/snippets/go.snip | 8 + sources_non_forked/vim-go/plugin/go.vim | 1 + .../vim-markdown/syntax/markdown.vim | 4 +- .../vim-snippets/UltiSnips/blade.snippets | 135 ++++ .../vim-snippets/UltiSnips/html.snippets | 568 ++++++++++++---- .../vim-snippets/UltiSnips/tex.snippets | 6 + .../vim-snippets/snippets/_.snippets | 3 +- .../vim-snippets/snippets/sh.snippets | 9 +- .../vim-snippets/snippets/typescript.snippets | 1 + .../vim-snippets/snippets/vue.snippets | 1 + update_plugins.py | 1 + 38 files changed, 1876 insertions(+), 288 deletions(-) create mode 100644 sources_non_forked/syntastic/syntax_checkers/php/phpstan.vim create mode 100644 sources_non_forked/vim-abolish/.gitignore create mode 100644 sources_non_forked/vim-abolish/CONTRIBUTING.markdown create mode 100644 sources_non_forked/vim-abolish/README.markdown create mode 100644 sources_non_forked/vim-abolish/doc/abolish.txt create mode 100644 sources_non_forked/vim-abolish/plugin/abolish.vim create mode 100644 sources_non_forked/vim-go/autoload/go/keyify.vim create mode 100644 sources_non_forked/vim-snippets/UltiSnips/blade.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/typescript.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/vue.snippets diff --git a/sources_non_forked/ack.vim/README.md b/sources_non_forked/ack.vim/README.md index 643ce65a..fca907fa 100644 --- a/sources_non_forked/ack.vim/README.md +++ b/sources_non_forked/ack.vim/README.md @@ -2,22 +2,22 @@ Run your favorite search tool from Vim, with an enhanced results list. -This plugin was designed as a Vim frontend for the Perl module [App::Ack]. Ack -can be used as a replacement for 99% of the uses of _grep_. The plugin allows -you to run ack from Vim, and shows the results in a split window. +This plugin was designed as a Vim frontend for the programmer's search tool +[ack]. ack can be used as a replacement for 99% of the uses of `grep`. The +plugin allows you to search with ack from within Vim and shows the results in a +split window. But here's a little secret for the Vim-seasoned: it's just a light wrapper for Vim's [grepprg] and the [quickfix] window for match results. This makes it easy to integrate with your own Vim configuration and use existing knowledge of core features. It also means the plugin is flexible to use with other search tools. -[App::Ack]: http://search.cpan.org/~petdance/ack/ack [grepprg]: http://vimdoc.sourceforge.net/htmldoc/options.html#'grepprg' [quickfix]: http://vimdoc.sourceforge.net/htmldoc/quickfix.html#quickfix ## Installation -### Ack +### ack You will need ack (>= 2.0), of course. To install it follow the [manual](http://beyondgrep.com/install/). @@ -49,8 +49,6 @@ NeoBundle 'mileszs/ack.vim' [Download][releases] the plugin and extract it in `~/.vim/` (or `%PROGRAMFILES%/Vim/vimfiles` on Windows). -[zipball]: https://github.com/mileszs/ack.vim/archive/master.zip - ## Usage :Ack [options] {pattern} [{directories}] @@ -60,7 +58,7 @@ for the `{pattern}`. Files containing the search term will be listed in the quickfix window, along with the line number of the occurrence, once for each occurrence. `<Enter>` on -a line in this window will open the file, and place the cursor on the matching +a line in this window will open the file and place the cursor on the matching line. Just like where you use `:grep`, `:grepadd`, `:lgrep`, and :`lgrepadd`, you can @@ -140,22 +138,22 @@ the convention of Vim's built-in `:grep` and `:make` commands. ## Changelog -Please see [the Github releases page][releases]. +Please see [the GitHub releases page][releases]. ## Credits -This plugin is derived from Antoine Imbert's blog post [Ack and Vim +This plugin is derived from Antoine Imbert's blog post [ack and Vim Integration][] (in particular, the function in the update to the post). [Miles Sterrett][mileszs] packaged it up as a plugin and documented it in Vim's help format, and since then [many contributors][contributors] have submitted enhancements and fixes. -And of course, where would we be without [Ack]. And, you know, Vim. +And of course, where would we be without [ack]. And, you know, Vim. -[Ack and Vim Integration]: http://blog.ant0ine.com/typepad/2007/03/ack-and-vim-integration.html +[ack and Vim Integration]: http://blog.ant0ine.com/typepad/2007/03/ack-and-vim-integration.html [mileszs]: https://github.com/mileszs [contributors]: https://github.com/mileszs/ack.vim/graphs/contributors -[Ack]: http://beyondgrep.com/ +[ack]: http://beyondgrep.com/ [vim-dispatch]: https://github.com/tpope/vim-dispatch [releases]: https://github.com/mileszs/ack.vim/releases diff --git a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim index f31b64a2..1e56ecaf 100644 --- a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim @@ -39,7 +39,9 @@ if g:ctrlp_map != '' && !hasmapto('<plug>(ctrlp)') exe 'map' g:ctrlp_map '<plug>(ctrlp)' en -cal ctrlp#mrufiles#init() +if !exists('g:ctrlp_types') || index(g:ctrlp_types, 'mru') >= 0 + cal ctrlp#mrufiles#init() +en com! -bar CtrlPTag cal ctrlp#init(ctrlp#tag#id()) com! -bar CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id()) diff --git a/sources_non_forked/nerdtree/autoload/nerdtree.vim b/sources_non_forked/nerdtree/autoload/nerdtree.vim index 4402b4f4..63fa5c13 100644 --- a/sources_non_forked/nerdtree/autoload/nerdtree.vim +++ b/sources_non_forked/nerdtree/autoload/nerdtree.vim @@ -89,7 +89,9 @@ function! nerdtree#deprecated(func, ...) endfunction " FUNCTION: nerdtree#exec(cmd) {{{2 -" same as :exec cmd but eventignore=all is set for the duration +" Same as :exec cmd but with eventignore set for the duration +" to disable the autocommands used by NERDTree (BufEnter, +" BufLeave and VimEnter) function! nerdtree#exec(cmd) let old_ei = &ei set ei=BufEnter,BufLeave,VimEnter diff --git a/sources_non_forked/nerdtree/doc/NERD_tree.txt b/sources_non_forked/nerdtree/doc/NERD_tree.txt index d0af4a82..3b7b9504 100644 --- a/sources_non_forked/nerdtree/doc/NERD_tree.txt +++ b/sources_non_forked/nerdtree/doc/NERD_tree.txt @@ -806,7 +806,7 @@ then all files ending in .vim or ~ will be ignored. There are 2 magic flags that can be appended to the end of each regular expression to specify that the regex should match only files or only dirs. These flags are "[[dir]]" and "[[file]]". Example: > - let NERDTreeIgnore=['.d$[[dir]]', '.o$[[file]]'] + let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]'] < This will cause all dirs ending in ".d" to be ignored and all files ending in ".o" to be ignored. diff --git a/sources_non_forked/nerdtree/lib/nerdtree/path.vim b/sources_non_forked/nerdtree/lib/nerdtree/path.vim index 26db4a31..6f48a188 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/path.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/path.vim @@ -544,7 +544,7 @@ function! s:Path.readInfoFromDisk(fullpath) throw "NERDTree.InvalidFiletypeError: Cant handle FIFO files: " . a:fullpath endif - let self.pathSegments = split(fullpath, '/') + let self.pathSegments = filter(split(fullpath, '/'), '!empty(v:val)') let self.isReadOnly = 0 if isdirectory(a:fullpath) diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index e70d61a0..38248b07 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -4633,6 +4633,7 @@ The following checkers are available for PHP (filetype "php"): 2. PHP_CodeSniffer..........|syntastic-php-phpcs| 3. PHPLint..................|syntastic-php-phplint| 4. PHP Mess Detector........|syntastic-php-phpmd| + 5. PHPStan..................|syntastic-php-phpstan| ------------------------------------------------------------------------------ 1. PHP *syntastic-php-php* @@ -4712,6 +4713,24 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +------------------------------------------------------------------------------ +5. PHP Static Analysis Tool *syntastic-php-phpstan* + +Name: phpstan +Maintainer: Przepompownia <przepompownia@users.noreply.github.com> + +"PHPStan" focuses on finding errors in your code without actually running it. +See the project's page iat GitHub for details: + + https://github.com/phpstan/phpstan + +Syntastic supports "PHPStan" versions 0.7 and later. + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at |syntastic-config-makeprg|. + ============================================================================== SYNTAX CHECKERS FOR POD *syntastic-checkers-pod* @@ -6123,6 +6142,13 @@ Installation~ You can install "Slim-Lint" with "gem": > gem install slim_lint < +Note~ + +You probably also need a plugin to set |filetype| for Slim files, such as +"vim-slim": + + https://github.com/slim-template/vim-slim + ------------------------------------------------------------------------------ 2. Slimrb *syntastic-slim-slimrb* @@ -6139,6 +6165,13 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. +Note~ + +You probably also need a plugin to set |filetype| for Slim files, such as +"vim-slim": + + https://github.com/slim-template/vim-slim + ============================================================================== SYNTAX CHECKERS FOR SML *syntastic-checkers-sml* diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 06d60cc9..d5a9304e 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-51' +let g:_SYNTASTIC_VERSION = '3.8.0-55' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim b/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim index ca276eb7..fefe3a4c 100644 --- a/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim +++ b/sources_non_forked/syntastic/syntax_checkers/go/gotype.vim @@ -20,8 +20,24 @@ set cpo&vim function! SyntaxCheckers_go_gotype_GetLocList() dict let buf = bufnr('') + + if !exists('s:go_new') + let command = syntastic#util#shescape(syntastic#util#bufVar(buf, 'go_go_exec', 'go')) . ' version' + let version_output = syntastic#util#system(command) + call self.log('finding go version: ' . string(command) . ': ' . + \ string(split(version_output, "\n", 1)) . + \ (v:shell_error ? ' (exit code ' . v:shell_error . ')' : '')) + let parsed_ver = syntastic#util#parseVersion(version_output) + if len(parsed_ver) + let s:go_new = syntastic#util#versionIsAtLeast(parsed_ver, [1, 8]) + else + call syntastic#log#error("checker " . self.getCName() . ": can't parse go version (abnormal termination?)") + return [] + endif + endif + let makeprg = self.makeprgBuild({ - \ 'args': (bufname(buf) =~# '\m_test\.go$' ? '-a' : ''), + \ 'args': (bufname(buf) =~# '\m_test\.go$' ? (s:go_new ? '-t' : '-a') : ''), \ 'fname': '.' }) let errorformat = diff --git a/sources_non_forked/syntastic/syntax_checkers/php/phpstan.vim b/sources_non_forked/syntastic/syntax_checkers/php/phpstan.vim new file mode 100644 index 00000000..b81ccc97 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/php/phpstan.vim @@ -0,0 +1,49 @@ +"============================================================================ +"File: phpstan.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: Przepompownia przepompownia@users.noreply.github.com +"License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +"============================================================================ + +if exists('g:loaded_syntastic_php_phpstan_checker') + finish +endif +let g:loaded_syntastic_php_phpstan_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_php_phpstan_IsAvailable() dict + if !executable(self.getExec()) + return 0 + endif + return syntastic#util#versionIsAtLeast(self.getVersion(), [0, 7]) +endfunction + +function! SyntaxCheckers_php_phpstan_GetLocList() dict + let makeprg = self.makeprgBuild({ + \ 'exe_after': 'analyse', + \ 'args': '--level=5', + \ 'args_after': '--errorFormat raw' }) + + let errorformat = '%f:%l:%m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'subtype' : 'Style' }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'php', + \ 'name': 'phpstan'}) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/vim-abolish/.gitignore b/sources_non_forked/vim-abolish/.gitignore new file mode 100644 index 00000000..0a56e3fc --- /dev/null +++ b/sources_non_forked/vim-abolish/.gitignore @@ -0,0 +1 @@ +/doc/tags diff --git a/sources_non_forked/vim-abolish/CONTRIBUTING.markdown b/sources_non_forked/vim-abolish/CONTRIBUTING.markdown new file mode 100644 index 00000000..b3f00951 --- /dev/null +++ b/sources_non_forked/vim-abolish/CONTRIBUTING.markdown @@ -0,0 +1 @@ +See the [contribution guidelines for pathogen.vim](https://github.com/tpope/vim-pathogen/blob/master/CONTRIBUTING.markdown). diff --git a/sources_non_forked/vim-abolish/README.markdown b/sources_non_forked/vim-abolish/README.markdown new file mode 100644 index 00000000..beb696cb --- /dev/null +++ b/sources_non_forked/vim-abolish/README.markdown @@ -0,0 +1,150 @@ +# abolish.vim + +I sat on this plugin for 3 years before releasing it, primarily +because it's so gosh darn hard to explain. It's three superficially +unrelated plugins in one that share a common theme: working with +variants of a word. + +## Abbreviation + +I know how to spell "separate". I know how to spell "desperate". My +fingers, however, have trouble distinguishing between the two, and I +invariably have a 50 percent chance of typing "seperate" or "desparate" +each time one of these comes up. At first, I tried abbreviations: + + :iabbrev seperate separate + :iabbrev desparate desperate + +But this falls short at the beginning of a sentence. + + :iabbrev Seperate Separate + :iabbrev Desparate Desperate + +To be really thorough, we need uppercase too! + + :iabbrev SEPERATE SEPARATE + :iabbrev DESPARATE DESPERATE + +Oh, but consider the noun form, and the adverb form! + + :iabbrev seperation separation + :iabbrev desparation desperation + :iabbrev seperately separately + :iabbrev desparately desperately + :iabbrev Seperation separation + :iabbrev Desparation Desperation + :iabbrev Seperately Separately + :iabbrev Desparately Desperately + :iabbrev SEPERATION SEPARATION + :iabbrev DESPARATION DESPERATION + :iabbrev SEPERATELY SEPARATELY + :iabbrev DESPARATELY DESPERATELY + +Wait, there's also "separates", "separated", "separating", +"separations", "separator"... + +Abolish.vim provides a simpler way. The following one command produces +48 abbreviations including all of the above. + + :Abolish {despa,sepe}rat{e,es,ed,ing,ely,ion,ions,or} {despe,sepa}rat{} + +My current configuration has 25 Abolish commands that create hundreds of +corrections my fingers refuse to learn. + +## Substitution + +One time I had an application with a domain model called +"facility" that needed to be renamed to "building". So, a simple +search and replace, right? + + :%s/facility/building/g + +Oh, but the case variants! + + :%s/Facility/Building/g + :%s/FACILITY/BUILDING/g + +Wait, the plural is more than "s" so we need to get that too! + + :%s/facilities/buildings/g + :%s/Facilities/Buildings/g + :%s/FACILITIES/BUILDINGS/g + +Abolish.vim has your back. One command to do all six, and you can +repeat it with `&` too! + + :%Subvert/facilit{y,ies}/building{,s}/g + +From a conceptual level, one way to think about how this substitution +works is to imagine that in the braces you are declaring the +requirements for turning that word from singular to plural. In +the facility example, the same base letters in both the singular +and plural form of the word are `facilit` To turn "facility" to a +plural word you must change the `y` to `ies` so you specify +`{y,ies}` in the braces. + +To convert the word "building" from singular to plural, again +look at the common letters between the singular and plural forms: +`building`. In this case you do not need to remove any letter +from building to turn it into plural form and you need to +add an `s` so the braces should be `{,s}`. + +A few more examples: + +Address to Reference + + :Subvert/address{,es}/reference{,s}/g + +Blog to Post (you can just do this with a regular :s also) + + :Subvert/blog{,s}/post{,s}/g + +Child to Adult + + :Subvert/child{,ren}/adult{,s}/g + +Be amazed as it correctly turns the word children into the word adults! + +Die to Spinner + + :Subvert/di{e,ce}/spinner{,s}/g + +You can abbreviate it as `:S`, and it accepts the full range of flags +including things like `c` (confirm). + +There's also a variant for searching and a variant for grepping. + +## Coercion + +Want to turn `fooBar` into `foo_bar`? Press `crs` (coerce to +snake\_case). MixedCase (`crm`), camelCase (`crc`), snake\_case +(`crs`), UPPER\_CASE (`cru`), dash-case (`cr-`), dot.case (`cr.`), +space case (`cr<space>`), and Title Case (`crt`) are all just 3 +keystrokes away. These commands support +[repeat.vim](https://github.com/tpope/vim-repeat). + +## Installation + +If you don't have a preferred installation method, I recommend +installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and +then simply copy and paste: + + cd ~/.vim/bundle + git clone git://github.com/tpope/vim-abolish.git + +Once help tags have been generated, you can view the manual with +`:help abolish`. + +## Self-Promotion + +Like abolish.vim? Follow the repository on +[GitHub](https://github.com/tpope/vim-abolish) and vote for it on +[vim.org](http://www.vim.org/scripts/script.php?script_id=1545). And if +you're feeling especially charitable, follow [tpope](http://tpo.pe/) on +[Twitter](http://twitter.com/tpope) and +[GitHub](https://github.com/tpope). + +## License + +Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. +See `:help license`. diff --git a/sources_non_forked/vim-abolish/doc/abolish.txt b/sources_non_forked/vim-abolish/doc/abolish.txt new file mode 100644 index 00000000..91f24da9 --- /dev/null +++ b/sources_non_forked/vim-abolish/doc/abolish.txt @@ -0,0 +1,181 @@ +*abolish.txt* Language friendly searches, substitutions, and abbreviations + +Author: Tim Pope <http://tpo.pe/> +License: Same terms as Vim itself (see |license|) + +This plugin is only available if 'compatible' is not set. + +INTRODUCTION *abolish* *:Abolish* *:Subvert* + +Abolish lets you quickly find, substitute, and abbreviate several variations +of a word at once. By default, three case variants (foo, Foo, and FOO) are +operated on by every command. + +Two commands are provided. :Abolish is the most general interface. +:Subvert provides an alternative, more concise syntax for searching and +substituting. +> + :Abolish [options] {abbreviation} {replacement} + :Abolish -delete [options] {abbreviation} + + :Abolish -search [options] {pattern} + :Subvert/{pattern}[/flags] + :Abolish!-search [options] {pattern} + :Subvert?{pattern}[?flags] + + :Abolish -search [options] {pattern} {grep-arguments} + :Subvert /{pattern}/[flags] {grep-options} + :Abolish!-search [options] {pattern} {grep-arguments} + :Subvert!/{pattern}/[flags] {grep-options} + + :[range]Abolish -substitute [options] {pattern} {replacement} + :[range]Subvert/{pattern}/{replacement}[/flags] +< + *:S* +In addition to the :Subvert command, a :S synonym is provided if not +already defined. This will be used in examples below. + +PATTERNS *abolish-patterns* + +Patterns can include brace pairs that contain comma separated alternatives: + + box{,es} => box, boxes, Box, Boxes, BOX, BOXES + +For commands with a replacement, corresponding brace pairs are used in both +halves. If the replacement should be identical to the pattern, an empty +brace pair may be used. If fewer replacements are given than were given in +the pattern, they are looped. That is, {a,b} on the replacement side is the +same as {a,b,a,b,a,b,...} repeated indefinitely. + +The following replaces several different misspellings of "necessary": +> + :%S/{,un}nec{ce,ces,e}sar{y,ily}/{}nec{es}sar{}/g +< +ABBREVIATING *abolish-abbrev* + +By default :Abolish creates abbreviations, which replace words automatically +as you type. This is good for words you frequently misspell, or as +shortcuts for longer words. Since these are just Vim abbreviations, only +whole words will match. +> + :Abolish anomol{y,ies} anomal{} + :Abolish {,in}consistant{,ly} {}consistent{} + :Abolish Tqbf The quick, brown fox jumps over the lazy dog +< +Accepts the following options: + + -buffer: buffer local + -cmdline: work in command line in addition to insert mode + +A good place to define abbreviations is "after/plugin/abolish.vim", +relative to ~\vimfiles on Windows and ~/.vim everywhere else. + +With a bang (:Abolish!) the abbreviation is also appended to the file in +g:abolish_save_file. The default is "after/plugin/abolish.vim", relative +to the install directory. + +Abbreviations can be removed with :Abolish -delete: +> + Abolish -delete -buffer -cmdline anomol{y,ies} +< +SEARCHING *abolish-search* + +The -search command does a search in a manner similar to / key. +search. After searching, you can use |n| and |N| as you would with a normal +search. + +The following will search for box, Box, and BOX: +> + :Abolish -search box +< +When given a single word to operate on, :Subvert defaults to doing a +search as well: +> + :S/box/ +< +This one searches for box, boxes, boxed, boxing, Box, Boxes, Boxed, Boxing, +BOX, BOXES, BOXED, and BOXING: +> + :S/box{,es,ed,ing}/ +< +The following syntaxes search in reverse. +> + :Abolish! -search box + :S?box? +< +Flags can be given with the -flags= option to :Abolish, or by appending them +after the separator to :Subvert. The flags trigger the following behaviors: + + I: Disable case variations (box, Box, BOX) + v: Match inside variable names (match my_box, myBox, but not mybox) + w: Match whole words (like surrounding with \< and \>) + +A |search-offset| may follow the flags. +> + :Abolish -search -flags=avs+1 box + :S?box{,es,ed,ing}?we +< +GREPPING *abolish-grep* + +Grepping works similar to searching, and is invoked when additional options +are given. These options are passed directly to the :grep command. +> + :Abolish -search box{,es} + :S /box{,es}/ * + :S /box/aw *.txt *.html +< +The slash delimiters must both be present if used with :Subvert. They may +both be omitted if no flags are used. + +Both an external grepprg and vimgrep (via grepprg=internal) are supported. +With an external grep, the "v" flag behaves less intelligently, due to the +lack of look ahead and look behind support in grep regexps. + +SUBSTITUTING *abolish-substitute* + +Giving a range switches :Subvert into substitute mode. This command will +change box -> bag, boxes -> bags, Box -> Bag, Boxes -> Bags, BOX -> BAG, +BOXES -> BAGS across the entire document: +> + :%Abolish -substitute -flags=g box{,es} bag{,s} + :%S/box{,es}/bag{,s}/g +< +The "c", "e", "g", and "n" flags can be used from the substitute command +|:s_flags|, along with the "a", "I", "v", and "w" flags from searching. + +COERCION *abolish-coercion* *cr* + +Abolish's case mutating algorithms can be applied to the word under the cursor +using the cr mapping (mnemonic: CoeRce) followed by one of the following +characters: + + c: camelCase + m: MixedCase + _: snake_case + s: snake_case + u: SNAKE_UPPERCASE + U: SNAKE_UPPERCASE + -: dash-case (not usually reversible; see |abolish-coercion-reversible|) + k: kebab-case (not usually reversible; see |abolish-coercion-reversible|) + .: dot.case (not usually reversible; see |abolish-coercion-reversible|) + <space>: space case (not usually reversible; see |abolish-coercion-reversible|) + t: Title Case (not usually reversible; see |abolish-coercion-reversible|) + +For example, cru on a lowercase word is a slightly easier to type equivalent +to gUiw. + +COERCION REVERSIBILITY *abolish-coercion-reversible* + +Some separators, such as "-" and ".", are listed as "not usually reversible". +The reason is that these are not "keyword characters", so vim (and +abolish.vim) will treat them as breaking a word. + +For example: "key_word" is a single keyword. The dash-case version, +"key-word", is treated as two keywords, "key" and "word". + +This behaviour is governed by the 'iskeyword' option. If a separator appears +in 'iskeyword', the corresponding coercion will be reversible. For instance, +dash-case is reversible in 'lisp' files, and dot-case is reversible in R +files. + + vim:tw=78:ts=8:ft=help:norl: diff --git a/sources_non_forked/vim-abolish/plugin/abolish.vim b/sources_non_forked/vim-abolish/plugin/abolish.vim new file mode 100644 index 00000000..e2486c11 --- /dev/null +++ b/sources_non_forked/vim-abolish/plugin/abolish.vim @@ -0,0 +1,631 @@ +" abolish.vim - Language friendly searches, substitutions, and abbreviations +" Maintainer: Tim Pope <http://tpo.pe/> +" Version: 1.1 +" GetLatestVimScripts: 1545 1 :AutoInstall: abolish.vim + +" Initialization {{{1 + +if exists("g:loaded_abolish") || &cp || v:version < 700 + finish +endif +let g:loaded_abolish = 1 + +if !exists("g:abolish_save_file") + if isdirectory(expand("~/.vim")) + let g:abolish_save_file = expand("~/.vim/after/plugin/abolish.vim") + elseif isdirectory(expand("~/vimfiles")) || has("win32") + let g:abolish_save_file = expand("~/vimfiles/after/plugin/abolish.vim") + else + let g:abolish_save_file = expand("~/.vim/after/plugin/abolish.vim") + endif +endif + +" }}}1 +" Utility functions {{{1 + +function! s:function(name) + return function(substitute(a:name,'^s:',matchstr(expand('<sfile>'), '<SNR>\d\+_'),'')) +endfunction + +function! s:send(self,func,...) + if type(a:func) == type('') || type(a:func) == type(0) + let Func = get(a:self,a:func,'') + else + let Func = a:func + endif + let s = type(a:self) == type({}) ? a:self : {} + if type(Func) == type(function('tr')) + return call(Func,a:000,s) + elseif type(Func) == type({}) && has_key(Func,'apply') + return call(Func.apply,a:000,Func) + elseif type(Func) == type({}) && has_key(Func,'call') + return call(Func.call,a:000,s) + elseif type(Func) == type('') && Func == '' && has_key(s,'function missing') + return call('s:send',[s,'function missing',a:func] + a:000) + else + return Func + endif +endfunction + +let s:object = {} +function! s:object.clone(...) + let sub = deepcopy(self) + return a:0 ? extend(sub,a:1) : sub +endfunction + +if !exists("g:Abolish") + let Abolish = {} +endif +call extend(Abolish, s:object, 'force') +call extend(Abolish, {'Coercions': {}}, 'keep') + +function! s:throw(msg) + let v:errmsg = a:msg + throw "Abolish: ".a:msg +endfunction + +function! s:words() + let words = [] + let lnum = line('w0') + while lnum <= line('w$') + let line = getline(lnum) + let col = 0 + while match(line,'\<\k\k\+\>',col) != -1 + let words += [matchstr(line,'\<\k\k\+\>',col)] + let col = matchend(line,'\<\k\k\+\>',col) + endwhile + let lnum += 1 + endwhile + return words +endfunction + +function! s:extractopts(list,opts) + let i = 0 + while i < len(a:list) + if a:list[i] =~ '^-[^=]' && has_key(a:opts,matchstr(a:list[i],'-\zs[^=]*')) + let key = matchstr(a:list[i],'-\zs[^=]*') + let value = matchstr(a:list[i],'=\zs.*') + if type(get(a:opts,key)) == type([]) + let a:opts[key] += [value] + elseif type(get(a:opts,key)) == type(0) + let a:opts[key] = 1 + else + let a:opts[key] = value + endif + else + let i += 1 + continue + endif + call remove(a:list,i) + endwhile + return a:opts +endfunction + +" }}}1 +" Dictionary creation {{{1 + +function! s:mixedcase(word) + return substitute(s:camelcase(a:word),'^.','\u&','') +endfunction + +function! s:camelcase(word) + let word = substitute(a:word, '-', '_', 'g') + if word !~# '_' && word =~# '\l' + return substitute(word,'^.','\l&','') + else + return substitute(word,'\C\(_\)\=\(.\)','\=submatch(1)==""?tolower(submatch(2)) : toupper(submatch(2))','g') + endif +endfunction + +function! s:snakecase(word) + let word = substitute(a:word,'::','/','g') + let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g') + let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g') + let word = substitute(word,'[.-]','_','g') + let word = tolower(word) + return word +endfunction + +function! s:uppercase(word) + return toupper(s:snakecase(a:word)) +endfunction + +function! s:dashcase(word) + return substitute(s:snakecase(a:word),'_','-','g') +endfunction + +function! s:spacecase(word) + return substitute(s:snakecase(a:word),'_',' ','g') +endfunction + +function! s:dotcase(word) + return substitute(s:snakecase(a:word),'_','.','g') +endfunction + +function! s:titlecase(word) + return substitute(s:spacecase(a:word), '\(\<\w\)','\=toupper(submatch(1))','g') +endfunction + +call extend(Abolish, { + \ 'camelcase': s:function('s:camelcase'), + \ 'mixedcase': s:function('s:mixedcase'), + \ 'snakecase': s:function('s:snakecase'), + \ 'uppercase': s:function('s:uppercase'), + \ 'dashcase': s:function('s:dashcase'), + \ 'dotcase': s:function('s:dotcase'), + \ 'spacecase': s:function('s:spacecase'), + \ 'titlecase': s:function('s:titlecase') + \ }, 'keep') + +function! s:create_dictionary(lhs,rhs,opts) + let dictionary = {} + let i = 0 + let expanded = s:expand_braces({a:lhs : a:rhs}) + for [lhs,rhs] in items(expanded) + if get(a:opts,'case',1) + let dictionary[s:mixedcase(lhs)] = s:mixedcase(rhs) + let dictionary[tolower(lhs)] = tolower(rhs) + let dictionary[toupper(lhs)] = toupper(rhs) + endif + let dictionary[lhs] = rhs + endfor + let i += 1 + return dictionary +endfunction + +function! s:expand_braces(dict) + let new_dict = {} + for [key,val] in items(a:dict) + if key =~ '{.*}' + let redo = 1 + let [all,kbefore,kmiddle,kafter;crap] = matchlist(key,'\(.\{-\}\){\(.\{-\}\)}\(.*\)') + let [all,vbefore,vmiddle,vafter;crap] = matchlist(val,'\(.\{-\}\){\(.\{-\}\)}\(.*\)') + ["","","",""] + if all == "" + let [vbefore,vmiddle,vafter] = [val, ",", ""] + endif + let targets = split(kmiddle,',',1) + let replacements = split(vmiddle,',',1) + if replacements == [""] + let replacements = targets + endif + for i in range(0,len(targets)-1) + let new_dict[kbefore.targets[i].kafter] = vbefore.replacements[i%len(replacements)].vafter + endfor + else + let new_dict[key] = val + endif + endfor + if exists("redo") + return s:expand_braces(new_dict) + else + return new_dict + endif +endfunction + +" }}}1 +" Abolish Dispatcher {{{1 + +function! s:SubComplete(A,L,P) + if a:A =~ '^[/?]\k\+$' + let char = strpart(a:A,0,1) + return join(map(s:words(),'char . v:val'),"\n") + elseif a:A =~# '^\k\+$' + return join(s:words(),"\n") + endif +endfunction + +function! s:Complete(A,L,P) + let g:L = a:L + " Vim bug: :Abolish -<Tab> calls this function with a:A equal to 0 + if a:A =~# '^[^/?-]' && type(a:A) != type(0) + return join(s:words(),"\n") + elseif a:L =~# '^\w\+\s\+\%(-\w*\)\=$' + return "-search\n-substitute\n-delete\n-buffer\n-cmdline\n" + elseif a:L =~# ' -\%(search\|substitute\)\>' + return "-flags=" + else + return "-buffer\n-cmdline" + endif +endfunction + +let s:commands = {} +let s:commands.abstract = s:object.clone() + +function! s:commands.abstract.dispatch(bang,line1,line2,count,args) + return self.clone().go(a:bang,a:line1,a:line2,a:count,a:args) +endfunction + +function! s:commands.abstract.go(bang,line1,line2,count,args) + let self.bang = a:bang + let self.line1 = a:line1 + let self.line2 = a:line2 + let self.count = a:count + return self.process(a:bang,a:line1,a:line2,a:count,a:args) +endfunction + +function! s:dispatcher(bang,line1,line2,count,args) + let i = 0 + let args = copy(a:args) + let command = s:commands.abbrev + while i < len(args) + if args[i] =~# '^-\w\+$' && has_key(s:commands,matchstr(args[i],'-\zs.*')) + let command = s:commands[matchstr(args[i],'-\zs.*')] + call remove(args,i) + break + endif + let i += 1 + endwhile + try + return command.dispatch(a:bang,a:line1,a:line2,a:count,args) + catch /^Abolish: / + echohl ErrorMsg + echo v:errmsg + echohl NONE + return "" + endtry +endfunction + +" }}}1 +" Subvert Dispatcher {{{1 + +function! s:subvert_dispatcher(bang,line1,line2,count,args) + try + return s:parse_subvert(a:bang,a:line1,a:line2,a:count,a:args) + catch /^Subvert: / + echohl ErrorMsg + echo v:errmsg + echohl NONE + return "" + endtry +endfunction + +function! s:parse_subvert(bang,line1,line2,count,args) + if a:args =~ '^\%(\w\|$\)' + let args = (a:bang ? "!" : "").a:args + else + let args = a:args + endif + let separator = matchstr(args,'^.') + let split = split(args,separator,1)[1:] + if a:count || split == [""] + return s:parse_substitute(a:bang,a:line1,a:line2,a:count,split) + elseif len(split) == 1 + return s:find_command(separator,"",split[0]) + elseif len(split) == 2 && split[1] =~# '^[A-Za-z]*n[A-Za-z]*$' + return s:parse_substitute(a:bang,a:line1,a:line2,a:count,[split[0],"",split[1]]) + elseif len(split) == 2 && split[1] =~# '^[A-Za-z]*\%([+-]\d\+\)\=$' + return s:find_command(separator,split[1],split[0]) + elseif len(split) >= 2 && split[1] =~# '^[A-Za-z]* ' + let flags = matchstr(split[1],'^[A-Za-z]*') + let rest = matchstr(join(split[1:],separator),' \zs.*') + return s:grep_command(rest,a:bang,flags,split[0]) + elseif len(split) >= 2 && separator == ' ' + return s:grep_command(join(split[1:],' '),a:bang,"",split[0]) + else + return s:parse_substitute(a:bang,a:line1,a:line2,a:count,split) + endif +endfunction + +function! s:normalize_options(flags) + if type(a:flags) == type({}) + let opts = a:flags + let flags = get(a:flags,"flags","") + else + let opts = {} + let flags = a:flags + endif + let g:op1 = copy(opts) + if flags =~# 'w' + let opts.boundaries = 2 + elseif flags =~# 'v' + let opts.boundaries = 1 + elseif !has_key(opts,'boundaries') + let opts.boundaries = 0 + endif + let opts.case = (flags !~# 'I' ? get(opts,'case',1) : 0) + let opts.flags = substitute(flags,'\C[avIiw]','','g') + let g:op2 = copy(opts) + return opts +endfunction + +" }}}1 +" Searching {{{1 + +function! s:subesc(pattern) + return substitute(a:pattern,'[][\\/.*+?~%()&]','\\&','g') +endfunction + +function! s:sort(a,b) + if a:a ==? a:b + return a:a == a:b ? 0 : a:a > a:b ? 1 : -1 + elseif strlen(a:a) == strlen(a:b) + return a:a >? a:b ? 1 : -1 + else + return strlen(a:a) < strlen(a:b) ? 1 : -1 + endif +endfunction + +function! s:pattern(dict,boundaries) + if a:boundaries == 2 + let a = '<' + let b = '>' + elseif a:boundaries + let a = '%(<|_@<=|[[:lower:]]@<=[[:upper:]]@=)' + let b = '%(>|_@=|[[:lower:]]@<=[[:upper:]]@=)' + else + let a = '' + let b = '' + endif + return '\v\C'.a.'%('.join(map(sort(keys(a:dict),function('s:sort')),'s:subesc(v:val)'),'|').')'.b +endfunction + +function! s:egrep_pattern(dict,boundaries) + if a:boundaries == 2 + let a = '\<' + let b = '\>' + elseif a:boundaries + let a = '(\<\|_)' + let b = '(\>\|_\|[[:upper:]][[:lower:]])' + else + let a = '' + let b = '' + endif + return a.'('.join(map(sort(keys(a:dict),function('s:sort')),'s:subesc(v:val)'),'\|').')'.b +endfunction + +function! s:c() + call histdel('search',-1) + return "" +endfunction + +function! s:find_command(cmd,flags,word) + let opts = s:normalize_options(a:flags) + let dict = s:create_dictionary(a:word,"",opts) + " This is tricky. If we use :/pattern, the search drops us at the + " beginning of the line, and we can't use position flags (e.g., /foo/e). + " If we use :norm /pattern, we leave ourselves vulnerable to "press enter" + " prompts (even with :silent). + let cmd = (a:cmd =~ '[?!]' ? '?' : '/') + let @/ = s:pattern(dict,opts.boundaries) + if opts.flags == "" || !search(@/,'n') + return "norm! ".cmd."\<CR>" + elseif opts.flags =~ ';[/?]\@!' + call s:throw("E386: Expected '?' or '/' after ';'") + else + return "exe 'norm! ".cmd.cmd.opts.flags."\<CR>'|call histdel('search',-1)" + return "" + endif +endfunction + +function! s:grep_command(args,bang,flags,word) + let opts = s:normalize_options(a:flags) + let dict = s:create_dictionary(a:word,"",opts) + if &grepprg == "internal" + let lhs = "'".s:pattern(dict,opts.boundaries)."'" + else + let lhs = "-E '".s:egrep_pattern(dict,opts.boundaries)."'" + endif + return "grep".(a:bang ? "!" : "")." ".lhs." ".a:args +endfunction + +let s:commands.search = s:commands.abstract.clone() +let s:commands.search.options = {"word": 0, "variable": 0, "flags": ""} + +function! s:commands.search.process(bang,line1,line2,count,args) + call s:extractopts(a:args,self.options) + if self.options.word + let self.options.flags .= "w" + elseif self.options.variable + let self.options.flags .= "v" + endif + let opts = s:normalize_options(self.options) + if len(a:args) > 1 + return s:grep_command(join(a:args[1:]," "),a:bang,opts,a:args[0]) + elseif len(a:args) == 1 + return s:find_command(a:bang ? "!" : " ",opts,a:args[0]) + else + call s:throw("E471: Argument required") + endif +endfunction + +" }}}1 +" Substitution {{{1 + +function! Abolished() + return get(g:abolish_last_dict,submatch(0),submatch(0)) +endfunction + +function! s:substitute_command(cmd,bad,good,flags) + let opts = s:normalize_options(a:flags) + let dict = s:create_dictionary(a:bad,a:good,opts) + let lhs = s:pattern(dict,opts.boundaries) + let g:abolish_last_dict = dict + return a:cmd.'/'.lhs.'/\=Abolished()'."/".opts.flags +endfunction + +function! s:parse_substitute(bang,line1,line2,count,args) + if get(a:args,0,'') =~ '^[/?'']' + let separator = matchstr(a:args[0],'^.') + let args = split(join(a:args,' '),separator,1) + call remove(args,0) + else + let args = a:args + endif + if len(args) < 2 + call s:throw("E471: Argument required") + elseif len(args) > 3 + call s:throw("E488: Trailing characters") + endif + let [bad,good,flags] = (args + [""])[0:2] + if a:count == 0 + let cmd = "substitute" + else + let cmd = a:line1.",".a:line2."substitute" + endif + return s:substitute_command(cmd,bad,good,flags) +endfunction + +let s:commands.substitute = s:commands.abstract.clone() +let s:commands.substitute.options = {"word": 0, "variable": 0, "flags": "g"} + +function! s:commands.substitute.process(bang,line1,line2,count,args) + call s:extractopts(a:args,self.options) + if self.options.word + let self.options.flags .= "w" + elseif self.options.variable + let self.options.flags .= "v" + endif + let opts = s:normalize_options(self.options) + if len(a:args) <= 1 + call s:throw("E471: Argument required") + else + let good = join(a:args[1:],"") + let cmd = a:bang ? "." : "%" + return s:substitute_command(cmd,a:args[0],good,self.options) + endif +endfunction + +" }}}1 +" Abbreviations {{{1 + +function! s:badgood(args) + let words = filter(copy(a:args),'v:val !~ "^-"') + call filter(a:args,'v:val =~ "^-"') + if empty(words) + call s:throw("E471: Argument required") + elseif !empty(a:args) + call s:throw("Unknown argument: ".a:args[0]) + endif + let [bad; words] = words + return [bad, join(words," ")] +endfunction + +function! s:abbreviate_from_dict(cmd,dict) + for [lhs,rhs] in items(a:dict) + exe a:cmd lhs rhs + endfor +endfunction + +let s:commands.abbrev = s:commands.abstract.clone() +let s:commands.abbrev.options = {"buffer":0,"cmdline":0,"delete":0} +function! s:commands.abbrev.process(bang,line1,line2,count,args) + let args = copy(a:args) + call s:extractopts(a:args,self.options) + if self.options.delete + let cmd = "unabbrev" + let good = "" + else + let cmd = "noreabbrev" + endif + if !self.options.cmdline + let cmd = "i" . cmd + endif + if self.options.delete + let cmd = "silent! ".cmd + endif + if self.options.buffer + let cmd = cmd . " <buffer>" + endif + let [bad, good] = s:badgood(a:args) + if substitute(bad,'{.\{-\}.}','','g') !~ '^\k\+$' + call s:throw("E474: Invalid argument (not a keyword: ".string(bad).")") + endif + if !self.options.delete && good == "" + call s:throw("E471: Argument required".a:args[0]) + endif + let dict = s:create_dictionary(bad,good,self.options) + call s:abbreviate_from_dict(cmd,dict) + if a:bang + let i = 0 + let str = "Abolish ".join(args," ") + let file = g:abolish_save_file + if !isdirectory(fnamemodify(file,':h')) + call mkdir(fnamemodify(file,':h'),'p') + endif + + if filereadable(file) + let old = readfile(file) + else + let old = ["\" Exit if :Abolish isn't available.","if !exists(':Abolish')"," finish","endif",""] + endif + call writefile(old + [str],file) + endif + return "" +endfunction + +let s:commands.delete = s:commands.abbrev.clone() +let s:commands.delete.options.delete = 1 + +" }}}1 +" Maps {{{1 + +function! s:unknown_coercion(letter,word) + return a:word +endfunction + +call extend(Abolish.Coercions, { + \ 'c': Abolish.camelcase, + \ 'm': Abolish.mixedcase, + \ 's': Abolish.snakecase, + \ '_': Abolish.snakecase, + \ 'u': Abolish.uppercase, + \ 'U': Abolish.uppercase, + \ '-': Abolish.dashcase, + \ 'k': Abolish.dashcase, + \ '.': Abolish.dotcase, + \ ' ': Abolish.spacecase, + \ 't': Abolish.titlecase, + \ "function missing": s:function("s:unknown_coercion") + \}, "keep") + +function! s:coerce(transformation) + let clipboard = &clipboard + try + set clipboard= + let regbody = getreg('"') + let regtype = getregtype('"') + let c = v:count1 + while c > 0 + let c -= 1 + norm! yiw + let word = @@ + let @@ = s:send(g:Abolish.Coercions,a:transformation,word) + if !exists('begin') + let begin = getpos("'[") + endif + if word !=# @@ + let changed = 1 + norm! viwpw + else + norm! w + endif + endwhile + call setreg('"',regbody,regtype) + call setpos("'[",begin) + call setpos(".",begin) + if exists("changed") + silent! call repeat#set("\<Plug>Coerce".a:transformation) + endif + finally + let &clipboard = clipboard + endtry +endfunction + +nnoremap <silent> <Plug>Coerce :<C-U>call <SID>coerce(nr2char(getchar()))<CR> + +" }}}1 + +if !exists("g:abolish_no_mappings") || ! g:abolish_no_mappings + nmap cr <Plug>Coerce +endif + +command! -nargs=+ -bang -bar -range=0 -complete=custom,s:Complete Abolish + \ :exec s:dispatcher(<bang>0,<line1>,<line2>,<count>,[<f-args>]) +command! -nargs=1 -bang -bar -range=0 -complete=custom,s:SubComplete Subvert + \ :exec s:subvert_dispatcher(<bang>0,<line1>,<line2>,<count>,<q-args>) +if exists(':S') != 2 + command -nargs=1 -bang -bar -range=0 -complete=custom,s:SubComplete S + \ :exec s:subvert_dispatcher(<bang>0,<line1>,<line2>,<count>,<q-args>) +endif + +" vim:set ft=vim sw=2 sts=2: diff --git a/sources_non_forked/vim-bundle-mako/indent/mako.vim b/sources_non_forked/vim-bundle-mako/indent/mako.vim index 8f6b97b6..4433cc4a 100644 --- a/sources_non_forked/vim-bundle-mako/indent/mako.vim +++ b/sources_non_forked/vim-bundle-mako/indent/mako.vim @@ -42,8 +42,6 @@ " 0.1 - 06 June 2009 " - Initial public release of mako indent file -let sw=2 " default shiftwidth of 2 spaces - if exists("b:did_indent") finish endif @@ -53,6 +51,9 @@ setlocal nosmartindent setlocal noautoindent setlocal nocindent setlocal nolisp +setlocal expandtab +setlocal softtabstop=2 +setlocal shiftwidth=2 setlocal indentexpr=GetMakoIndent() setlocal indentkeys+=*<Return>,<>>,<bs>,end,: diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index 46a48613..9cda172b 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -298,6 +298,9 @@ endfunction function! s:repo_tree(...) dict abort if self.dir() =~# '/\.git$' let dir = self.dir()[0:-6] + if dir !~# '/' + let dir .= '/' + endif else let dir = s:configured_tree(self.git_dir) endif @@ -972,11 +975,14 @@ function! s:StageToggle(lnum1,lnum2) abort continue endif execute lnum - if filename =~ ' -> ' - let cmd = ['mv','--'] + reverse(split(filename,' -> ')) - let filename = cmd[-1] - elseif section ==# 'staged' - let cmd = ['reset','-q','--',filename] + if section ==# 'staged' + if filename =~ ' -> ' + let files_to_unstage = split(filename,' -> ') + else + let files_to_unstage = [filename] + endif + let filename = files_to_unstage[-1] + let cmd = ['reset','-q','--'] + files_to_unstage elseif getline(lnum) =~# '^#\tdeleted:' let cmd = ['rm','--',filename] elseif getline(lnum) =~# '^#\tmodified:' @@ -1118,7 +1124,7 @@ function! s:Commit(args, ...) abort elseif error ==# '!' return s:Status() else - call s:throw(error) + call s:throw(empty(error)?join(errors, ' '):error) endif endif catch /^fugitive:/ @@ -1385,6 +1391,7 @@ function! s:Edit(cmd,bang,...) abort endif endif endfor + diffoff! endif endif endif @@ -2894,7 +2901,7 @@ function! s:cfile() abort let ref = matchstr(getline('.'),'\x\{40\}') echoerr "warning: unknown context ".matchstr(getline('.'),'^\l*') - elseif getline('.') =~# '^[+-]\{3\} [abciwo12]\=/' + elseif getline('.') =~# '^[+-]\{3\} [abciow12]\=/' let ref = getline('.')[4:] elseif getline('.') =~# '^[+-]' && search('^@@ -\d\+,\d\+ +\d\+,','bnW') @@ -2908,7 +2915,7 @@ function! s:cfile() abort let lnum -= 1 endwhile let offset += matchstr(getline(lnum), type.'\zs\d\+') - let ref = getline(search('^'.type.'\{3\} [abciwo12]/','bnW'))[4:-1] + let ref = getline(search('^'.type.'\{3\} [abciow12]/','bnW'))[4:-1] let dcmds = [offset, 'normal!zv'] elseif getline('.') =~# '^rename from ' @@ -2917,22 +2924,22 @@ function! s:cfile() abort let ref = 'b/'.getline('.')[10:] elseif getline('.') =~# '^@@ -\d\+,\d\+ +\d\+,' - let diff = getline(search('^diff --git \%([abciwo12]/.*\|/dev/null\) \%([abciwo12]/.*\|/dev/null\)', 'bcnW')) + let diff = getline(search('^diff --git \%([abciow12]/.*\|/dev/null\) \%([abciow12]/.*\|/dev/null\)', 'bcnW')) let offset = matchstr(getline('.'), '+\zs\d\+') - let dref = matchstr(diff, '\Cdiff --git \zs\%([abciwo12]/.*\|/dev/null\)\ze \%([abciwo12]/.*\|/dev/null\)') - let ref = matchstr(diff, '\Cdiff --git \%([abciwo12]/.*\|/dev/null\) \zs\%([abciwo12]/.*\|/dev/null\)') + let dref = matchstr(diff, '\Cdiff --git \zs\%([abciow12]/.*\|/dev/null\)\ze \%([abciow12]/.*\|/dev/null\)') + let ref = matchstr(diff, '\Cdiff --git \%([abciow12]/.*\|/dev/null\) \zs\%([abciow12]/.*\|/dev/null\)') let dcmd = 'Gdiff! +'.offset - elseif getline('.') =~# '^diff --git \%([abciwo12]/.*\|/dev/null\) \%([abciwo12]/.*\|/dev/null\)' - let dref = matchstr(getline('.'),'\Cdiff --git \zs\%([abciwo12]/.*\|/dev/null\)\ze \%([abciwo12]/.*\|/dev/null\)') - let ref = matchstr(getline('.'),'\Cdiff --git \%([abciwo12]/.*\|/dev/null\) \zs\%([abciwo12]/.*\|/dev/null\)') + elseif getline('.') =~# '^diff --git \%([abciow12]/.*\|/dev/null\) \%([abciow12]/.*\|/dev/null\)' + let dref = matchstr(getline('.'),'\Cdiff --git \zs\%([abciow12]/.*\|/dev/null\)\ze \%([abciow12]/.*\|/dev/null\)') + let ref = matchstr(getline('.'),'\Cdiff --git \%([abciow12]/.*\|/dev/null\) \zs\%([abciow12]/.*\|/dev/null\)') let dcmd = 'Gdiff!' - elseif getline('.') =~# '^index ' && getline(line('.')-1) =~# '^diff --git \%([abciwo12]/.*\|/dev/null\) \%([abciwo12]/.*\|/dev/null\)' + elseif getline('.') =~# '^index ' && getline(line('.')-1) =~# '^diff --git \%([abciow12]/.*\|/dev/null\) \%([abciow12]/.*\|/dev/null\)' let line = getline(line('.')-1) - let dref = matchstr(line,'\Cdiff --git \zs\%([abciwo12]/.*\|/dev/null\)\ze \%([abciwo12]/.*\|/dev/null\)') - let ref = matchstr(line,'\Cdiff --git \%([abciwo12]/.*\|/dev/null\) \zs\%([abciwo12]/.*\|/dev/null\)') + let dref = matchstr(line,'\Cdiff --git \zs\%([abciow12]/.*\|/dev/null\)\ze \%([abciow12]/.*\|/dev/null\)') + let ref = matchstr(line,'\Cdiff --git \%([abciow12]/.*\|/dev/null\) \zs\%([abciow12]/.*\|/dev/null\)') let dcmd = 'Gdiff!' elseif line('$') == 1 && getline('.') =~ '^\x\{40\}$' @@ -2957,9 +2964,9 @@ function! s:cfile() abort let prefixes.a = myhash.'^:' let prefixes.b = myhash.':' endif - let ref = s:sub(ref, '^\(\w\)/', 'get(prefixes, submatch(1), "HEAD:")') + let ref = substitute(ref, '^\(\w\)/', '\=get(prefixes, submatch(1), "HEAD:")', '') if exists('dref') - let dref = s:sub(dref, '^\(\w\)/', 'get(prefixes, submatch(1), "HEAD:")') + let dref = substitute(dref, '^\(\w\)/', '\=get(prefixes, submatch(1), "HEAD:")', '') endif if ref ==# '/dev/null' diff --git a/sources_non_forked/vim-go/.github/CONTRIBUTING.md b/sources_non_forked/vim-go/.github/CONTRIBUTING.md index 450f9598..eebdd6b5 100644 --- a/sources_non_forked/vim-go/.github/CONTRIBUTING.md +++ b/sources_non_forked/vim-go/.github/CONTRIBUTING.md @@ -1,9 +1,9 @@ Thanks for improving vim-go! Before you dive in please read the following: 1. Please read our - [FAQ](https://github.com/fatih/vim-go/wiki/FAQ-Troubleshooting), it might + [Documentation](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt), it might have answers for your problem 2. If you add a new feature please don't forget to update the documentation: - [doc/vim-go.txt](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt) + [doc/vim-go.txt](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt. 3. If it's a breaking change or exceed +100 lines please open an issue first and describe the changes you want to make. diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 2db6358a..77cbf810 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -1,12 +1,27 @@ ## unplanned +FEATURES: + +* New `:GoKeyify` command that turns unkeyed struct literals into keyed struct literals. [gh-1258] +* New `g:go_addtags_transform` setting to change the transform rule (snakecase, camelcase, etc..) for `:GoAddTags` command [gh-1275] +* New snippet shortcut assigned to `ife` that expands to `if err := foo(); err != nil { ... }` [gh-1268] + IMPROVEMENTS * :GoMetaLinter can now exclude linters with the new `g:go_metalinter_excludes` option [gh-1253] +* Override `<C-LeftMouse>` mapping so `:GoDef` is used by default (as we do the same for `CTRL-]`, `gd`, etc. [gh-1264] BUG FIXES: * job: fix race between channel close and job exit [gh-1247] +* internal: fix system calls when using tcsh [gh-1276] +* path: return the unmodified GOPATH if autodetect is disabled [gh-1280] +* fix jumping to quickfix window when autom gometalinter on save was enabled [gh-1293] + +BACKWARDS INCOMPATIBILITIES: + +* `:GoLint` works on the whole directory instead of the current file. To use it for the current file give it as an argument, i.e `:GoLint foo.go` [gh-1295] +* `go_snippet_case_type` is removed in favor of the new `go_addtags_transform` setting [gh-1299] ## 1.12 - (March 29, 2017) diff --git a/sources_non_forked/vim-go/autoload/go/keyify.vim b/sources_non_forked/vim-go/autoload/go/keyify.vim new file mode 100644 index 00000000..32b30c61 --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/keyify.vim @@ -0,0 +1,58 @@ +function! go#keyify#Keyify() + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + let bin_path = go#path#CheckBinPath("keyify") + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + + if empty(bin_path) || !exists('*json_decode') + let $GOPATH = old_gopath + return + endif + + " Get result of command as json, that contains `start`, `end` and `replacement` + let command = printf("%s -json %s:#%s", bin_path, fname, go#util#OffsetCursor()) + let output = go#util#System(command) + silent! let result = json_decode(output) + + " We want to output the error message in case the result isn't a JSON + if type(result) != type({}) + call go#util#EchoError(s:chomp(output)) + let $GOPATH = old_gopath + return + endif + + " Because keyify returns the byte before the region we want, we goto the + " byte after that + execute "goto" result.start + 1 + let start = getpos('.') + execute "goto" result.end + let end = getpos('.') + + let vis_start = getpos("'<") + let vis_end = getpos("'>") + + " Replace contents between start and end with `replacement` + call setpos("'<", start) + call setpos("'>", end) + + let select = 'gv' + + " Make sure the visual mode is 'v', to avoid some bugs + normal! gv + if mode() !=# 'v' + let select .= 'v' + endif + + silent! execute "normal!" select."\"=result.replacement\<cr>p" + + " Replacement text isn't aligned, so it needs fix + normal! '<v'>= + + call setpos("'<", vis_start) + call setpos("'>", vis_end) + let $GOPATH = old_gopath +endfunction + +function! s:chomp(string) + return substitute(a:string, '\n\+$', '', '') +endfunction diff --git a/sources_non_forked/vim-go/autoload/go/lint.vim b/sources_non_forked/vim-go/autoload/go/lint.vim index cbc7b337..9c85b47f 100644 --- a/sources_non_forked/vim-go/autoload/go/lint.vim +++ b/sources_non_forked/vim-go/autoload/go/lint.vim @@ -123,12 +123,11 @@ function! go#lint#Golint(...) abort endif if a:0 == 0 - let goargs = shellescape(expand('%')) + let out = go#util#System(bin_path) else - let goargs = go#util#Shelljoin(a:000) + let out = go#util#System(bin_path . " " . go#util#Shelljoin(a:000)) endif - let out = go#util#System(bin_path . " " . goargs) if empty(out) echon "vim-go: " | echohl Function | echon "[lint] PASS" | echohl None return @@ -255,9 +254,13 @@ function s:lint_job(args) caddexpr a:msg let &errorformat = old_errorformat - " TODO(arslan): cursor still jumps to first error even If I don't want - " it. Seems like there is a regression somewhere, but not sure where. + " TODO(jinleileiking): give a configure to jump or not + let l:winnr = winnr() + copen + + exe l:winnr . "wincmd w" + endfunction function! s:exit_cb(job, exitval) closure diff --git a/sources_non_forked/vim-go/autoload/go/path.vim b/sources_non_forked/vim-go/autoload/go/path.vim index 5c1acd91..b34fd429 100644 --- a/sources_non_forked/vim-go/autoload/go/path.vim +++ b/sources_non_forked/vim-go/autoload/go/path.vim @@ -33,22 +33,16 @@ function! go#path#GoPath(...) abort let $GOPATH = a:1 endfunction -" Default returns the default GOPATH. If there is a single GOPATH it returns -" it. For multiple GOPATHS separated with a the OS specific separator, only -" the first one is returned. If GOPATH is not set, it uses the default GOPATH -" set starting with GO 1.8. This GOPATH can be retrieved via 'go env GOPATH' +" Default returns the default GOPATH. If GOPATH is not set, it uses the +" default GOPATH set starting with Go 1.8. This GOPATH can be retrieved via +" 'go env GOPATH' function! go#path#Default() abort if $GOPATH == "" " use default GOPATH via go env return go#util#gopath() endif - let go_paths = split($GOPATH, go#util#PathListSep()) - if len(go_paths) == 1 - return $GOPATH - endif - - return go_paths[0] + return $GOPATH endfunction " HasPath checks whether the given path exists in GOPATH environment variable @@ -134,8 +128,8 @@ function! go#path#BinPath() abort elseif $GOBIN != "" let bin_path = $GOBIN else - " GOPATH (user set or default GO) - let bin_path = expand(go#path#Default() . "/bin/") + let go_paths = split(go#path#Default(), go#util#PathListSep()) + let bin_path = expand(go_paths[0] . "/bin/") endif return bin_path diff --git a/sources_non_forked/vim-go/autoload/go/tags.vim b/sources_non_forked/vim-go/autoload/go/tags.vim index 4ef7d282..fecf52e3 100644 --- a/sources_non_forked/vim-go/autoload/go/tags.vim +++ b/sources_non_forked/vim-go/autoload/go/tags.vim @@ -122,11 +122,13 @@ func s:create_cmd(args) abort let l:offset = a:args.offset let l:mode = a:args.mode let l:cmd_args = a:args.cmd_args + let l:modifytags_transform = get(g:, 'go_addtags_transform', "snakecase") " start constructing the command let cmd = [bin_path] call extend(cmd, ["-format", "json"]) call extend(cmd, ["-file", a:args.fname]) + call extend(cmd, ["-transform", l:modifytags_transform]) if l:offset != 0 call extend(cmd, ["-offset", l:offset]) diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim index 86d0726c..1edc02b4 100644 --- a/sources_non_forked/vim-go/autoload/go/util.vim +++ b/sources_non_forked/vim-go/autoload/go/util.vim @@ -94,19 +94,29 @@ function! go#util#osarch() abort return go#util#goos() . '_' . go#util#goarch() endfunction -" System runs a shell command. It will reset the shell to /bin/sh for Unix-like -" systems if it is executable. +" System runs a shell command. If possible, it will temporary set +" the shell to /bin/sh for Unix-like systems providing a Bourne +" POSIX like environment. function! go#util#System(str, ...) abort + " Preserve original shell and shellredir values let l:shell = &shell + let l:shellredir = &shellredir + + " Use a Bourne POSIX like shell. Some parts of vim-go expect + " commands to be executed using bourne semantics #988 and #1276. + " Alter shellredir to match bourne. Especially important if login shell + " is set to any of the csh or zsh family #1276. if !go#util#IsWin() && executable('/bin/sh') - let &shell = '/bin/sh' + set shell=/bin/sh shellredir=>%s\ 2>&1 endif try let l:output = call('system', [a:str] + a:000) return l:output finally + " Restore original values let &shell = l:shell + let &shellredir = l:shellredir endtry endfunction @@ -203,7 +213,7 @@ endfunction " snippetcase converts the given word to given preferred snippet setting type " case. function! go#util#snippetcase(word) abort - let l:snippet_case = get(g:, 'go_snippet_case_type', "snakecase") + let l:snippet_case = get(g:, 'go_addtags_transform', "snakecase") if l:snippet_case == "snakecase" return go#util#snakecase(a:word) elseif l:snippet_case == "camelcase" @@ -235,51 +245,6 @@ function! go#util#camelcase(word) abort endif endfunction -function! go#util#AddTags(line1, line2, ...) abort - " default is json - let l:keys = ["json"] - if a:0 - let l:keys = a:000 - endif - - let l:line1 = a:line1 - let l:line2 = a:line2 - - " If we're inside a struct and just call this function let us add the tags - " to all fields - " TODO(arslan): I don't like using patterns. Check if we can move it to - " `motion` and do it via AST based position - let ln1 = searchpair('struct {', '', '}', 'bcnW') - if ln1 == 0 - echon "vim-go: " | echohl ErrorMsg | echon "cursor is outside the struct" | echohl None - return - endif - - " searchpair only returns a single position - let ln2 = search('}', "cnW") - - " if no range is given we apply for the whole struct - if l:line1 == l:line2 - let l:line1 = ln1 + 1 - let l:line2 = ln2 - 1 - endif - - for line in range(l:line1, l:line2) - " get the field name (word) that are not part of a commented line - let l:matched = matchstr(getline(line), '\(\/\/.*\)\@<!\w\+') - if empty(l:matched) - continue - endif - - let word = go#util#snippetcase(l:matched) - let tags = map(copy(l:keys), 'printf("%s:%s", v:val,"\"'. word .'\"")') - let updated_line = printf("%s `%s`", getline(line), join(tags, " ")) - - " finally, update the line inplace - call setline(line, updated_line) - endfor -endfunction - " TODO(arslan): I couldn't parameterize the highlight types. Check if we can " simplify the following functions " diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index 857924d5..fdc48d2c 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -102,7 +102,7 @@ command. Plugin 'fatih/vim-go' -* Vim |packages| +* Vim |packages| > git clone https://github.com/fatih/vim-go.git \ ~/.vim/pack/plugins/start/vim-go @@ -167,7 +167,7 @@ COMMANDS *go-commands* *:GoLint* :GoLint [packages] - Run golint for the current Go file, or for given packages. + Run golint for the current directory, or for given packages. *:GoDoc* :GoDoc [word] @@ -219,14 +219,17 @@ COMMANDS *go-commands* If [!] is not given the first error is jumped to. *:GoDef* -:GoDef +:GoDef gd CTRL-] +g<C-LeftMouse> +<C-LeftMouse> - Goto declaration/definition for the declaration under the cursor. By default - the CTRL-] key and the mapping `gd` are enabled to invoke :GoDef for the - identifier under the cursor. See |'g:go_def_mapping_enabled'| to disable - them. No explicit arguments are supported. + Goto declaration/definition for the declaration under the cursor. By + default the CTRL-] shortcut, the mapping `gd` and <C-LeftMouse>, + g<LeftMouse> are enabled to invoke :GoDef for the identifier under the + cursor. See |'g:go_def_mapping_enabled'| to disable them. No explicit + arguments are supported. vim-go also keeps a per-window location stack, roughly analogous to how Vim's internal |tags| functionality works. This is pushed to every time a @@ -605,7 +608,7 @@ CTRL-t Changes the build tags for various commands. If you have any file that uses a custom build tag, such as `//+build integration` , this command can be used to pass it to all tools that accepts tags, such as guru, gorenate, - etc.. + etc.. The build tags is cleared (unset) if `""` is given. If no arguments is given it prints the current custom build tags. @@ -742,7 +745,22 @@ CTRL-t Toggles |'g:go_template_autocreate'|. + *:GoKeyify* +:GoKeyify + Uses `keyify` to turn unkeyed struct literals into keyed ones. + + For example: +> + Person{"John", "Smith"} +< + Becomes: +> + Person{ + Name: "John", + Surname: "Smith", + } +< ============================================================================== MAPPINGS *go-mappings* @@ -1128,9 +1146,10 @@ Use this option to define the command to be used for |:GoDef|. By default < *'g:go_def_mapping_enabled'* -Use this option to enable/disable the default mapping of CTRL-] and (`gd`) for -GoDef and CTRL-t for :GoDefPop. Disabling it allows you to map something else -to these keys or mappings. Default is enabled. > +Use this option to enable/disable the default mapping of CTRL-], +<C-LeftMouse>, g<C-LeftMouse> and (`gd`) for GoDef and CTRL-t for :GoDefPop. +Disabling it allows you to map something else to these keys or mappings. +Default is enabled. > let g:go_def_mapping_enabled = 1 < @@ -1169,28 +1188,6 @@ Use this option to define the default snippet engine. By default "ultisnips" is used. Use "neosnippet" for neosnippet.vim: > let g:go_snippet_engine = "ultisnips" -< - *'g:go_snippet_case_type'* - -Use this option to define the default conversion type of snippet expansion for -field tags. For the following case, if `snakecase` is used the `json` snippet -will expand to: -> - type T struct { - FooBarQuz string `json:"foo_bar_quz" - } -< - -If "camelcase" is used: -> - type T struct { - FooBarQuz string `json:"fooBarQuz" - } -< -By default "snakecase" is used. Current values are: ["snakecase", -"camelcase"]. -> - let g:go_snippet_case_type = "snakecase" < *'g:go_get_update'* @@ -1213,7 +1210,7 @@ set, so the relevant commands defaults are being used. *'g:go_build_tags'* These options that will be automatically passed to the `-tags` option of -various tools, such as `guru`, `gorename`, etc... This is a permanatent +various tools, such as `guru`, `gorename`, etc... This is a permanent setting. A more useful way is to use |:GoBuildTags| to dynamically change or remove build tags. By default it's not set. > @@ -1538,6 +1535,31 @@ default it's 60 seconds. Must be in milliseconds. > let g:go_statusline_duration = 60000 < + + *'g:go_addtags_transform'* + +Sets the `transform` option for `gomodifytags` when using |:GoAddTags| or if +it's being used for snippet expansion of single fields. Possible options are: +`snakecase`, `camelcase`. For the following case, if `snakecase` is used the +field will be transformed to: +> + type T struct { + FooBarQuz string `json:"foo_bar_quz" + } +< + +If "camelcase" is used: +> + type T struct { + FooBarQuz string `json:"fooBarQuz" + } +< +By default "snakecase" is used. Current values are: ["snakecase", +"camelcase"]. +> + let g:go_addtags_transform = 'snakecase' +< + ============================================================================== DEVELOPMENT *go-development* diff --git a/sources_non_forked/vim-go/ftplugin/go.vim b/sources_non_forked/vim-go/ftplugin/go.vim index de830f9c..8ebf4318 100644 --- a/sources_non_forked/vim-go/ftplugin/go.vim +++ b/sources_non_forked/vim-go/ftplugin/go.vim @@ -33,6 +33,8 @@ if get(g:, "go_def_mapping_enabled", 1) " useful again for Go source code nnoremap <buffer> <silent> gd :GoDef<cr> nnoremap <buffer> <silent> <C-]> :GoDef<cr> + nnoremap <buffer> <silent> <C-LeftMouse> <LeftMouse>:GoDef<cr> + nnoremap <buffer> <silent> g<LeftMouse> <LeftMouse>:GoDef<cr> nnoremap <buffer> <silent> <C-w><C-]> :<C-u>call go#def#Jump("split")<CR> nnoremap <buffer> <silent> <C-w>] :<C-u>call go#def#Jump("split")<CR> nnoremap <buffer> <silent> <C-t> :<C-U>call go#def#StackPop(v:count1)<cr> diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim index f5357d2a..692d0277 100644 --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim @@ -92,4 +92,7 @@ command! -nargs=* -buffer -complete=customlist,go#impl#Complete GoImpl call go#i " -- template command! -nargs=0 GoTemplateAutoCreateToggle call go#template#ToggleAutoCreate() +" -- keyify +command! -nargs=0 GoKeyify call go#keyify#Keyify() + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets index 9db78db1..89e13613 100644 --- a/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets +++ b/sources_non_forked/vim-go/gosnippets/UltiSnips/go.snippets @@ -143,6 +143,13 @@ else { } endsnippet +# if inline error +snippet ife "If with inline erro" +if err := ${1:condition}; err != nil { + ${0:${VISUAL}} +} +endsnippet + # error snippet snippet errn "Error return " !b if err != nil { diff --git a/sources_non_forked/vim-go/gosnippets/snippets/go.snip b/sources_non_forked/vim-go/gosnippets/snippets/go.snip index 2db20f57..9a480b07 100644 --- a/sources_non_forked/vim-go/gosnippets/snippets/go.snip +++ b/sources_non_forked/vim-go/gosnippets/snippets/go.snip @@ -118,6 +118,14 @@ snippet else else { ${0} } + +# if inline error +snippet ife +abbr if err := ...; err != nil { ... } + if err := ${1:condition}; err != nil { + ${0} + } + # error snippet snippet errn abbr if err != nil { ... } diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim index 577c72a9..1eb5c27f 100644 --- a/sources_non_forked/vim-go/plugin/go.vim +++ b/sources_non_forked/vim-go/plugin/go.vim @@ -21,6 +21,7 @@ let s:packages = [ \ "github.com/fatih/gomodifytags", \ "github.com/zmb3/gogetdoc", \ "github.com/josharian/impl", + \ "github.com/dominikh/go-tools/cmd/keyify", \ ] " These commands are available on any filetypes diff --git a/sources_non_forked/vim-markdown/syntax/markdown.vim b/sources_non_forked/vim-markdown/syntax/markdown.vim index 35dd1a36..14d288ba 100644 --- a/sources_non_forked/vim-markdown/syntax/markdown.vim +++ b/sources_non_forked/vim-markdown/syntax/markdown.vim @@ -97,7 +97,7 @@ exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start= syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart -syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```*.*$" end="^\s*```*\ze\s*$" keepend +syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*````*.*$" end="^\s*````*\ze\s*$" keepend syn match markdownFootnote "\[^[^\]]\+\]" syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:" @@ -108,7 +108,7 @@ if main_syntax ==# 'markdown' if has_key(s:done_include, matchstr(s:type,'[^.]*')) continue endif - exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```*\s*'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```*\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') + exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*````*\s*'.matchstr(s:type,'[^=]*').'\S\@!.*$" end="^\s*````*\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') let s:done_include[matchstr(s:type,'[^.]*')] = 1 endfor unlet! s:type diff --git a/sources_non_forked/vim-snippets/UltiSnips/blade.snippets b/sources_non_forked/vim-snippets/UltiSnips/blade.snippets new file mode 100644 index 00000000..e56610c2 --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/blade.snippets @@ -0,0 +1,135 @@ +priority -50 + +extends html + +# We want to overwrite everything in parent ft. +priority -49 + +snippet break "@break" +@break +endsnippet + +snippet component "@component directive" +@component('$1') + ${2:${VISUAL}} +@endcomponent +endsnippet + +snippet each "@each directive" +@each('$1', $$2, '$3') +endsnippet + +snippet else "@else directive" +@else +endsnippet + +snippet eif "@else if directive" +@else if ($1) + ${2:${VISUAL}} +endsnippet + +snippet for "@for directive" +@for ($1) + ${2:${VISUAL}} +@endfor +endsnippet + +snippet foreach "@foreach directive" +@foreach ($$1 as $$2) + ${3:${VISUAL}} +@endforeach +endsnippet + +snippet extends "@extends directive" +@extends('$1') +endsnippet + +snippet if "@if directive" +@if ($1) + ${2:${VISUAL}} +@endif +endsnippet + +snippet ife "@if @else structure" +@if ($1) + ${2:${VISUAL}} +@else + ${3:${VISUAL}} +@endif +endsnippet + +snippet include "@include directive" +@include('$1') +endsnippet + +snippet includeIf "@includeIf directive" +@includeIf('$1') +endsnippet + +snippet isset "@isset directive" +@isset + ${1:${VISUAL}} +@endisset +endsnippet + +snippet inject "@inject directive" +@inject('$1', '$2') +endsnippet + +snippet php "@php directive" +@php + ${1:${VISUAL}} +@endphp +endsnippet + +snippet push "@push directive" +@push('$1') + ${2:${VISUAL}} +@endpush +endsnippet + +snippet section "@section directive" +@section('$1') +endsnippet + +snippet show "@show directive" +@show +endsnippet + +snippet slot "@slot directive" +@slot('$1') + ${2:${VISUAL}} +@endslot +endsnippet + +snippet unless "@unless directive" +@unless + ${1:${VISUAL}} +@endunless +endsnippet + +snippet verbatim "@verbatim directive" +@verbatim + ${0:$VISUAL} +@endverbatim +endsnippet + +snippet wh "@while directive" +@while ($1) + ${2:${VISUAL}} +@endwhile +endsnippet + +snippet yield "@yield directive" +@yield('$1') +endsnippet + +snippet { "{{ }} statement." +{{ $1 }} +endsnippet + +snippet {! "{!! !!} statement" +{!! $1 !!} +endsnippet + +# vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/html.snippets b/sources_non_forked/vim-snippets/UltiSnips/html.snippets index 6d98cb1c..04802770 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/html.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/html.snippets @@ -32,6 +32,18 @@ snippet escape "Escape (escape)" ⎋ endsnippet +snippet left "Left (left)" +← +endsnippet + +snippet return "Return (return)" +↩ +endsnippet + +snippet right "Right (right)" +→ +endsnippet + snippet shift "Shift (shift)" ⇧ endsnippet @@ -44,67 +56,103 @@ snippet up "Up (up)" ↑ endsnippet -snippet return "Return (return)" -↩ -endsnippet - -snippet right "Right (right)" -→ -endsnippet - -snippet left "Left (left)" -← -endsnippet - ############# # HTML TAGS # ############# -snippet input "Input with Label" w -<label for="${2:${1/[[:alpha:]]+|( )/(?1:_:\L$0)/g}}">$1</label><input type="${3:text/submit/hidden/button}" name="${4:$2}" value="$5"${6: id="${7:$2}"}`!p x(snip)`> +snippet a "Link" w +<a href="${1:http://www.${2:url.com}}"${3: target="_blank"}>${4:Anchor Text}</a> endsnippet -snippet input "HTML <input>" w -<input type="${1:text/submit/hidden/button}" name="${2:some_name}" value="$3"${4: id="${5:$2}"}`!p x(snip)`> +snippet abbr "<abbr>" w +<abbr title="$2">$1</abbr> endsnippet - -snippet option "Option" w -<option${1: value="${2:option}"}>${3:$2}</option> +snippet access "accesskey global attribute" +accesskey="$1" endsnippet -snippet select "Select Box" w -<select name="${1:some_name}" id="${2:$1}"${3:${4: multiple}${5: onchange="${6:}"}${7: size="${8:1}"}}> - ${0:${VISUAL}} -</select> +snippet address "<address>" w +<address>$1</address> endsnippet - -snippet textarea "HTML <textarea>" w -<textarea name="${1:Name}" rows="${2:8}" cols="${3:40}">$0</textarea> +snippet article "<article>" +<article> + ${1:article content} +</article> endsnippet -snippet mailto "HTML <a mailto: >" w -<a href="mailto:${1:joe@example.com}?subject=${2:feedback}">${3:email me}</a> +snippet aside "<aside>" +<aside> + ${1:aside content} +</aside> +endsnippet + +snippet b "<b>" w +<b>$1</b> endsnippet snippet base "HTML <base>" w <base href="$1"${2: target="$3"}`!p x(snip)`> endsnippet +snippet blockquote "<blockquote>" +<blockquote>$1</blockquote> +endsnippet + snippet body "<body>" <body> ${0:${VISUAL}} </body> endsnippet -snippet div "<div>" w -<div> - ${0:${VISUAL}} -</div> +snippet br "<br>" w +<br>$1</br> endsnippet -snippet div. "<div> with class" w -<div`!p snip.rv=' class="' if t[1] else ""`${1:name}`!p snip.rv = '"' if t[1] else ""`> +snippet button "<button>" +<button>$1</button> +endsnippet + +snippet caption "<caption>" +<caption>$1</caption> +endsnippet + +snippet cite "<cite>" w +<cite>$1</cite> +endsnippet + +snippet class "class global attribute" +class="$1" +endsnippet + +snippet code "<code>" w +<code>$1</code> +endsnippet + +snippet data "<data>" +<data value="$2">$1</data> +endsnippet + +snippet datalist "<datalist>" +<datalist id="$1" name="$2"> + opt$3 +</datalist> +endsnippet + +snippet dd "<dd>" +<dd>$1</dd> +endsnippet + +snippet del "<del>" w +<del cite="$2" datetime="${3:`date '+%Y-%m-%dT%H:%M:%S%:z'`}">$1</del> +endsnippet + +snippet dfn "<dfn>" w +<dfn>$1</dfn> +endsnippet + +snippet div "<div>" w +<div> ${0:${VISUAL}} </div> endsnippet @@ -115,120 +163,24 @@ snippet div# "<div> with ID & class" w </div> endsnippet -snippet form "XHTML <form>" w -<form action="${1:`!p -snip.rv = (snip.basename or 'unnamed') + '_submit' -`}" method="${2:get}" accept-charset="utf-8"> +snippet div. "<div> with class" w +<div`!p snip.rv=' class="' if t[1] else ""`${1:name}`!p snip.rv = '"' if t[1] else ""`> ${0:${VISUAL}} -</form> +</div> endsnippet -snippet h1 "XHTML <h1>" w -<h1>${0:${VISUAL}}</h1> +snippet dl "<dl>" +<dl> + ${1:Definition list} +</dl> endsnippet -snippet h2 "XHTML <h2>" w -<h2>${0:${VISUAL}}</h2> +snippet dt "<dt>" +<dt>$1</dt> endsnippet -snippet h3 "XHTML <h3>" w -<h3>${0:${VISUAL}}</h3> -endsnippet - -snippet h4 "XHTML <h4>" w -<h4>${0:${VISUAL}}</h4> -endsnippet - -snippet h5 "XHTML <h5>" w -<h5>${0:${VISUAL}}</h5> -endsnippet - -snippet h6 "XHTML <h6>" w -<h6>${0:${VISUAL}}</h6> -endsnippet - -snippet head "XHTML <head>" -<head> - <meta charset="utf-8"> - <title>${1:`!p snip.rv = snip.basename or "Page Title"`} - ${0:${VISUAL}} - -endsnippet - -snippet link "XHTML " w - -endsnippet - -snippet meta "XHTML " w - -endsnippet - -snippet scriptsrc "HTML -endsnippet - -snippet script "HTML -endsnippet - -snippet span "" w - ${0:${VISUAL}} -endsnippet - -snippet span. " with class" w - ${0:${VISUAL}} -endsnippet - -snippet span# " with ID & class" w - ${0:${VISUAL}} -endsnippet - -snippet style "XHTML -endsnippet - -snippet table "XHTML " w -
    - ${0:${VISUAL}} -
    -endsnippet - -snippet a "Link" w -${4:Anchor Text} -endsnippet - -snippet p "paragraph" w -

    ${0:${VISUAL}}

    -endsnippet - -snippet li "list item" w -
  5. ${0:${VISUAL}}
  6. -endsnippet - -snippet ul "unordered list" w -
      - ${0:${VISUAL}} -
    -endsnippet - -snippet td "table cell" w -${0:${VISUAL}} -endsnippet - -snippet th "table header" w -${0:${VISUAL}} -endsnippet - -snippet tr "table row" w -${0:${VISUAL}} -endsnippet - -snippet title "XHTML " w -<title>${1:`!p snip.rv = snip.basename or "Page Title"`} +snippet em "" w +$1 endsnippet snippet fieldset "Fieldset" w @@ -238,7 +190,341 @@ snippet fieldset "Fieldset" w