kw-20191112/0000755000175000017500000000000013574463526012310 5ustar rodrigorodrigokw-20191112/documentation/0000755000175000017500000000000013574463526015161 5ustar rodrigorodrigokw-20191112/documentation/content/0000755000175000017500000000000013574463526016633 5ustar rodrigorodrigokw-20191112/documentation/content/howtocontribute.rst0000644000175000017500000001410713574463526022627 0ustar rodrigorodrigo===================== How to Contribute ===================== .. contents:: :depth: 1 :local: :backlinks: none .. highlight:: console Overview -------- The Linux Kernel and Git community inspired our contribution process. As a result, this document is directly based on their contribution documentation. In particular, the text under 'Commit Messages' and 'Certify Your Work by Adding Your "Signed-off-by: " Line' are directly copied-and-pasted from Git's SubmittingPatches doc (with some modifications). For the original document, please check https://git-scm.com/docs/SubmittingPatches/ Development Cycle and Branches ------------------------------ Our development cycle relies on two different branches: 1. **master**: We maintain the kw stable version in the master branch, and we try our best to keep master working well for final users. If you only want to use kw, this branch is perfect for you. 2. **ustable**: This branch has the kw latest version, and it is the development branch. If you want to contribute to kw, base your work in this branch. .. warning:: If you want to contribute to `kw`, use the **unstable** branch and send your pull requests to this branch. From time to time, when we feel happy with the unstable version, we merge the commit from the unstable version to master. The Figure below summarizes the development cycle. .. image:: ../images/dev_cycle.png :alt: Development cycle :align: center .. note:: One of our main goals it keeps kw stable, in this sense, **if you send a new patch do not forget to add tests**. If you want to know more about tests, take a look at `About Tests` page. Commit Messages --------------- The first line of the commit message should be a short description (50 characters is the soft limit), and should skip the full stop. It is also conventional in most cases to prefix the first line with "area: " where the area is a filename or identifier for the general area of the code being modified, e.g. * setup: disable unnecessary download of checkpatch script * src: mk: remove unnecessary multiplication of PARALLEL_CORES If in doubt which identifier to use, run `git log --no-merges` on the files you are modifying to see the current conventions. It's customary to start the remainder of the first line after "area: " with a lower-case letter. E.g. "doc: clarify...", not "doc: Clarify...". (But as you might see in our log, that's a soft rule in kw.) The body should provide a meaningful commit message, which: * explains the problem the change tries to solve, i.e. what is wrong with the current code without the change. * justifies the way the change solves the problem, i.e. why the result with the change is better. * alternate solutions considered but discarded, if any. Describe your changes in imperative mood, e.g. "make xyzzy do frotz" instead of "[This patch] makes xyzzy do frotz" or "[I] changed xyzzy to do frotz", as if you are giving orders to the codebase to change its behavior. Try to make sure your explanation can be understood without external resources. At the bottom of the message body, you might include references to the issues that the said commit solves. This can be something like "Solves #30", "Fixes: #28" or "Closes #10". Certify Your Work by Adding Your "Signed-off-by: " Line ------------------------------------------------------- To improve tracking of who did what, we've borrowed the "sign-off" procedure from the Linux kernel project on patches that are being emailed around. Although core Git is a lot smaller project it is a good discipline to follow it. The sign-off is a simple line at the end of the explanation for the patch, which certifies that you wrote it or otherwise have the right to pass it on as an open-source patch. The rules are pretty simple: if you can certify the below Developer's Certificate of Origin (D-C-O): .. important:: By making a contribution to this project, I certify that: 1. The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or 2. The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or 3. The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. 4. I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. then you just add a line saying:: Signed-off-by: Xpto Lalala Blabla This line can be automatically added by Git if you run the git-commit command with the `-s` option. Notice that you can place your own Signed-off-by: line when forwarding somebody else's patch with the above rules for D-C-O. Indeed you are encouraged to do so. .. note:: Also notice that a real name is used in the Signed-off-by: line. Please don't hide your real name. If you like, you can put extra tags at the end: 1. Reported-by: is used to credit someone who found the bug that the patch attempts to fix. 2. Acked-by: says that the person who is more familiar with the area the patch attempts to modify liked the patch. 3. Reviewed-by:, unlike the other tags, can only be offered by the reviewer and means that she is completely satisfied that the patch is ready for application. It is usually offered only after a detailed review. 4. Tested-by: is used to indicate that the person applied the patch and found it to have the desired effect. You can also create your own tag or use one that’s in common usage such as `Co-authored-by` or `Helped-by`. kw-20191112/documentation/content/tests.rst0000644000175000017500000000176513574463526020540 0ustar rodrigorodrigo=============== About Tests =============== Kw's tests rely on `shunit2`. The `run_tests.sh` script automatically detects `shunit2` in `$PATH` in the case installed it via package. Alternatively, you can have shunit2 source code in `tests/` (you can clone it from https://github.com/kward/shunit2). If you want to run all the tests, try::: run_tests.sh List all available test files:: run_tests.sh list Or run individual test with:: run_tests.sh test TESTFILE1 ... Tests rely on some external files. These files are automatically downloaded when you first try to run a test. You can, however, force `run_tests.sh` to prepare the environment for running tests with:: run_tests.sh prepare Also, if you already have the test's environment prepared but want to update the external files, you can use:: run_tests.sh prepare -f|--force-update .. note:: `run_tests.sh` script must be run from the directory it is in, i.e. the root of the repository. Otherwise, it may not execute properly. kw-20191112/documentation/content/installanduninstall.rst0000644000175000017500000000705013574463526023452 0ustar rodrigorodrigo=========================== Install and Remove `kw` =========================== .. contents:: :depth: 1 :local: :backlinks: none .. highlight:: console Package Dependencies -------------------- You have to figure out the correct package name in your distro for the following dependencies: * libguestfs * Qemu * Ansible * Bash * git * python-docutils * rsync If you want to use the default alert system (for commands that may take longer to run), you also have to install: * paplay * notify-send or dunst For development, you will need: * dash * shunit2 * fish For getting the Sphinx Documentation: * Sphinx Recommendations ~~~~~~~~~~~~~~~ If you want to use Qemu, we suggest the following steps: 1. Create a Qemu image; 2. Create a working directory in your host machine at: `mkdir -p ~/p/mount`; 3. After you have your working QEMU image, we recommend you to setup basic stuff (this can vary depending on the distribution you choose - kernel setup, ssh, etc); Install ------- Manual install ~~~~~~~~~~~~~~ In the kw's directory, type:: ./setup.sh -i bash --login This command will install `kw` in `~/.config/kw`, and append the following lines at the end of your `.bashrc`.:: # kw PATH=$PATH:/home/$USER/.config/kw source /home/$USER/.config/kw/src/bash_autocomplete.sh If you use another shell (`ksh`, for example), you will need to manually add the path to `kw` to `PATH` environment variable. To check if the installations was ok, open another terminal and type:: kw help Package install ~~~~~~~~~~~~~~~ - Arch Linux: Available at AUR: https://aur.archlinux.org/packages/kworkflow-git/ Update ------ Every time you want to get a new version of `kw`, just pull from this repository and install kw again (`./setup -i` removes legacy files and installs new ones). Remove ------ There's two way to remove kw: soft and hard way. The soft way (recommended method) does not remove .config files under kw management and you can type:: ./setup.sh --uninstall # or just -u .. warning:: Beware: that the following command is dangerous! Use it only if you are entirely aware of what are you doing. If you want to remove all files under kw management, you can use:: ./setup.sh --completely-remove Global Configuration File ------------------------- All the default configurations adopted by kworflow can be seen at `~/.config/kw/etc/kworkflow.config`; this config file has a comment on each configuration option. Finally, it is essential to highlight that kw loads the default configurations; next, it tries to find a local configuration file (detailed ahead) and overwrites the global options with the ones read from the local config file. In summary, the local config has higher precedence than the global config. Local Configuration File ------------------------ Kw allows you to have a specific set of configuration per project. For example, if you have a particular kernel tree named ‘drm-work’ and want a different configuration from the default you can follow these steps: 1. Copy `kw.config.example` as follows:: cp kworkflow.config.example /PATH/KERNEL/SOURCE/kworkflow.config .. note:: The default name **must be** `kworkflow.config` 2. Change the options inside:: qemu_hw_options=-enable-kvm -daemonize -m 3G -smp cores=4,cpus=4 qemu_net_options=-net nic -net user,hostfwd=tcp::2222-:22,smb=$HOME qemu_path_image=$HOME/p/virty.qcow2 3. Done! Every time you execute any command in the root dir of drm-work the configuration file will be read. If the file does not exist, the default operation will be used. kw-20191112/documentation/man/0000755000175000017500000000000013574463526015734 5ustar rodrigorodrigokw-20191112/documentation/man/kw.rst0000644000175000017500000002402413574463526017111 0ustar rodrigorodrigo===== kw ===== -------------------------------------------- Inglorious kernel developer workflow scripts -------------------------------------------- :Author: Rodrigo Siqueira :Author: Matheus Tavares :Date: 2018-05-18 :Copyright: GPLv2+ :Manual section: 1 :Manual group: Kernel Workflow SYNOPSIS ======== **kw** *COMMAND* [*OPTION* ...] DESCRIPTION =========== **kw** is a set of scripts that have a single mission: reduce the overhead related with infrastructure project setup in projects that have a similar workflow to the Linux Kernel. It can (and should) be customized by editing the *kworkflow.config* file, as discussed in section "ABOUT kworflow.config". COMMANDS ======== **kw** offers several subcommands catering to different audiences and targeting different functionality groups. Most subcommands have sane defaults. COMMANDS FOR USING QEMU ----------------------- Projects that use a QEMU VM in the development cycle to host the development environment usually require that developers use some specific commands to manage this VM. In this section, you can find all commands available in **kw** to manage many daily tasks related to QEMU VM operation. Notice that some rules are specific for the Linux Kernel project. mo, mount ~~~~~~~~~ Mount the QEMU image in a specific directory, based on the data available in the **kworkflow.config**. Notice that the configuration file has the information about the source image and destiny mount point. .. note:: **Only run this command after you turn off your VM**. um, umount ~~~~~~~~~~ Umount the previously mounted QEMU image. u, up ~~~~~ Start the QEMU VM based on parameters in the **kworkflow.config** file. s, ssh [--script|-s="PATH"]|[--command|-c="COMMAND"] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ssh into the QEMU VM. The *--script* parameter expects a bash script as a parameter to evaluate it in the VM. The *--command* parameter expects a command to be executed inside the QEMU VM. i, install ~~~~~~~~~~ Installs or updates the Linux kernel modules on the QEMU VM. Under the hood, it executes the mount operation, followed by **make modules_install** with a specific target, and finally umounts the QEMU image. .. note:: **Only run this command after you turn off your VM**. p, prepare ~~~~~~~~~~ **(EXPERIMENTAL)** Starting from a generic image, *prepare* sets up the necessary packages, files, etc. inside the QEMU image so that it is ready for development work. For this to work, you have to: 1. Add your public key in the VM in the authorized_keys file. 2. Remove the requirement for password in the VM to become root. This command (currently) uses Ansible playbooks. COMMANDS FOR WORKING WITH CODE ------------------------------ Projects that have a similar workflow to the Linux Kernel usually have a set of tools that simplify part of the tasks related with the code. This section describes some of the key features supported by **kw** to help with code. b, build ~~~~~~~~ This command calls make on a local Makefile to build the project. It tries to take advantage of your hardware by using the *-j* option with the appropriate parameter. c, codestyle [*DIRECTORY|FILE*] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The **checkpatch** tool is one of the most fabulous scripts provided by the Linux Kernel to help developers follow the code style adopted by the project. This command is a wrapper for **checkpatch**, with the goal of simplifying the use of this tool; notice that you can specify a single file or an entire directory. e, explore [log] [*EXPRESSION*] [-p] [*DIRECTORY|FILE*] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The *explore* command is based on git grep. It can search for string matches in either the git repository contents or in the git log messages. For example, you can use **kw e functionName** to find *functionName* in the source directory. You can also search the git log history by using *log* after the *e*; for instance, **kw e log STRING_MATCH**. Additionally, you can use *-p* to see the diff in the search. m, maintainers [*-a|--authors*] [*DIRECTORY|FILE*] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Based on the Linux Kernel get_maintainers script, this command shows the maintainers of a given Kernel module (a given file or directory). The *[-a|--authors]* option will also print the authors of the top-level target files (non-recursively). Files with more than one author will have their names separated by ",". This output should not be used by scripts because some authors include "," in their names (e.g. "Company X, Inc."). OTHER COMMANDS -------------- This section describes a tool available in **kw** to help developers keep track of configuration files and other features provided by **kw** that do not fit in the previous sections. g, configm [--save *NAME* [-d *DESCRIPTION*][-f]]|[--ls]|[--get *NAME* [-f]]|[--rm *NAME* [-f]] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The 'configm' command manages different versions of the project's '.config' file. It provides the save, load, remove, and list operations of such files. 1. --save NAME [-d DESCRIPTION] [-f]: The save option searches the current directory for a '.config' file to be kept under the management of kw. The save option expects a name to identify this version of the file. Additionally, users can add a description by using *-d* flag. Finally, if the user tries to add the same name twice, **kw** will issue a warning; the '-f' will suppress this message. 2. --ls lists all the .config file versions available. 3. --get *NAME* [-f]: Get a config file based on the *NAME* and paste it in the current directory. It pop-up a warning message because this operation override the current .config file. The user can suppress this warning by using -f flag. 4. --rm *NAME* [-f]: Remove config labeled with *NAME*. It pop-up a warning message because it will remove the config file from kw management. The user can suppress this warning by using -f. v, vars ~~~~~~~ Shows configurations being used by **kw** in the current working directory. To do that, it examines both global and local *kworkflow.config* files. bi ~~ Build and install a new module version. It is a combination of the **build** and **install** commands. alert=[*vs|sv,v,s,n*] ~~~~~~~~~~~~~~~~~~~~~ Some commands take considerable time to execute. **kw** gives you an option to be notified when they finish. The commands *prepare*, *build*, *install*, *mount*, *umount*, new and *bi* offer this feature. 1. *v* enables visual notification. 2. *s* enables sound notification. 3. *vs* or *sv* enables both. 4. *n* (or any other option) disables notifications (this is the default). h, help ~~~~~~~ Show basic help. ABOUT kworflow.config ===================== **kw** reads its configuration from two files: the global *PATH/etc/kworkflow.config* file and the local *kworkflow.config* file present at the current working directory. The global **kworkflow.config** is a part of the **kw** code and provides the overall behavior for **kw**. Local **kworkflow.config** settings override global ones; you may have one **kworkflow.config** per project. In this section, we describe the possible fields you can specify in the configuration files. ssh_ip=IP --------- Sets the IP address to be used by ssh. By default **kw** uses **localhost**. ssh_port=PORT ------------- Sets the ssh port. By default **kw** uses 2222. arch=ARCHITECTURE ----------------- Allows you to specify the default architecture used by **kw**. By default, **kw** uses x86_64. virtualizer=VIRTUALIZER ----------------------- Defines the virtualization tool that should be used by kw. Currently, we only support QEMU and, as a result, the default is **qemu-system-x86_64** mount_point=PATH ---------------- Defines the kw mount point, which will be used by libguestfs during the mount/umount operation of a VM. By default, **kw** uses /home/$USER/p/mount. qemu_hw_options=OPTIONS ----------------------- Sets QEMU options. By default, **kw** uses **-enable-kvm -daemonize -smp 2 -m 1024** qemu_net_options=OPTIONS ------------------------ Defines the network configuration. By default, **kw** uses **-net nic -net user,hostfwd=tcp::2222-:22,smb=/home/USER** qemu_path_image=PATH -------------------- Specify the VM image path. By default, **kw** uses **/home/USERKW/p/virty.qcow2** alert=[vs|s|v|n] ---------------- Default alert options, you have: 1. v: enables visual notification. 2. s enables sound notification. 3. vs or sv enables both. 4. n (or any other option) disables notifications. sound_alert_command=COMMAND --------------------------- Command to run for sound completion alert. By default, **kw** uses **paplay INSTALLPATH/sounds/complete.wav &** visual_alert_command=COMMAND ---------------------------- Command to run for visual completion alert. By default, **kw** uses notify-send -i checkbox -t 10000 "kw" "Command: \\"$COMMAND\\" completed!" (Note: You may use COMMAND, which will be replaced by the kw command whose conclusion the user wished to be alerted.) EXAMPLE ======= For these examples, we suppose the fields in your *kworkflow.config* file is already configured. First, if you are working in a specific kernel module, and if you want to install your recent changes in your VM you can use:: cd /KERNEL/PATH kw i .. note:: Turn off your VM before use the *intall* command. For building and installing a new module version based on the current kernel version, you can use:: cd /KERNEL/PATH kw bi For checking the code style:: cd /KERNEL/PATH kw c drivers/iio/dummy/ kw c drivers/iio/dummy/iio_simple_dummy.c If you want to check the maintainers:: cd /KERNEL/PATH kw m drivers/iio/dummy/iio_simple_dummy.c In case you want that kw saves your current .config file, you can use:: cd /KERNEL/PATH kw g --save my_current_config You can see the config's file maintained by kw with:: kw g --ls You can turn on your VM with:: kw u After you start your VM you can ssh into it with:: kw s -c="dmesg -wH" kw s .. note:: You have to wait for the sshd become ready. kw-20191112/documentation/conf.py0000644000175000017500000001303613574463526016463 0ustar rodrigorodrigo# -*- coding: utf-8 -*- # # Configuration file for the Sphinx documentation builder. # # This file does only contain a selection of the most common options. For a # full list see the documentation: # http://www.sphinx-doc.org/en/master/config # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # import os import sys sys.path.insert(0, os.path.abspath('..')) # -- Project information ----------------------------------------------------- project = 'kw' copyright = '2019, Rodrigo Siqueira, Matheus Tavares' author = 'Rodrigo Siqueira, Matheus Tavares' # The short X.Y version version = '' # The full version, including alpha/beta/rc tags release = '' # -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.imgmath', 'sphinx.ext.viewcode', 'sphinx.ext.napoleon', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The master toctree document. master_doc = 'index' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. pygments_style = None # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'alabaster' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Custom sidebar templates, must be a dictionary that maps document names # to template names. # # The default sidebars (for documents that don't match any pattern) are # defined by theme itself. Builtin themes are using these templates by # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', # 'searchbox.html']``. # # html_sidebars = {} # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. htmlhelp_basename = 'KernelWorkflowdoc' # -- Options for LaTeX output ------------------------------------------------ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'KernelWorkflow.tex', 'KernelWorkflow Documentation', 'Rodrigo Siqueira, Matheus Tavares', 'manual'), ] # -- Options for manual page output ------------------------------------------ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'kernelworkflow', 'KernelWorkflow Documentation', [author], 1) ] # -- Options for Texinfo output ---------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'KernelWorkflow', 'KernelWorkflow Documentation', author, 'KernelWorkflow', 'Inglorious kernel developer workflow scripts.', 'Miscellaneous'), ] # -- Options for Epub output ------------------------------------------------- # Bibliographic Dublin Core info. epub_title = project # The unique identifier of the text. This can be a ISBN number # or the project homepage. # # epub_identifier = '' # A unique identification for the text. # # epub_uid = '' # A list of files that should not be packed into the epub file. epub_exclude_files = ['search.html'] # -- Extension configuration ------------------------------------------------- # -- Options for todo extension ---------------------------------------------- # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True kw-20191112/documentation/images/0000755000175000017500000000000013574463526016426 5ustar rodrigorodrigokw-20191112/documentation/images/dev_cycle.png0000644000175000017500000003036613574463526021101 0ustar rodrigorodrigoPNG  IHDRdn9"PLTEGpLFFFBfd+++DDDHHHqIIIHHHDDD7ȫGGGIIIIIIͧIIIKKKIII7ȫ7ȫ7ȫ7ȫMMMIII7ȫHHH7ȫ7ȫ7ȫMMM7Ǫ7ȫDDDMMMMMM7ȫDDDHHH7ȫͧͧ7ȫDDDDDD7ȫͧͧͧJJJE>#7ȫ7ȫͧ7ȫ7ȫͧͧͧ*DDD7ȫMMM쫷 (֊r) 'gT >2ֱ"xR\A>Ȫ$.$΁ͪZɤzd/á˙vvvkʟ̓aaaf8886̍pIɨ...%͈|TDWWWkkkHHHrrriObtRNS~u  =gt&\0M5L`ή!JA+~&j9:jT_W0CfL~quWx~vc.!IDATxKkN~H7AčAJ }vhfb_@ݹQR@@VVjT4U<93sq8\m nIGAܢ c8uѳ-<~!_q]ʑ+Hh }o٭(Aɽ kw<J/b&1]8:UdD"[2" 37K3/w;Ly'Mô*LԲB1/ݝNS]j?=^M䧕>~uT|׼'kddwC⽟PLV;D~l@{]A~9,V[Ǿyf-Y`|Ӛ+B`F.ү%kO-V411G~{47v@O6F鿘yh);o˴߰Dk<+' \ t$.ij5[Džo1Q蠶&貒e!'`y<].Bu buA0(JˣƒXRe<߶3=@y9t>^j> =$kÇ-Uv-7tso4-LS\o5@G] j=|^91\e|+]M!oǸUTdIUd$W\%9[gE==D&t Y;lgCVKW_r6󕒮 :LtrKZ6WJ&IP&VKRx]W.7/YlI}SNch$NP(:Kd&Ü3MmY\[}Pbd *AUۄ,L3Altsi?kainN;>ܶA3Io%S .ܺ(^ilI늌>BzPt)mT 2b9g9eƺ#!:I)1UJz) ZEm@nzmUA>d-SU9z07,XӇ7ҽ]N OJ$3 ZUg.l~&FI5V^YQ؜PwHm8%:BX;9&UaY7JO+kz|/RM~3]Oic>^oMrwptLGI2]r8XxA.f؝Ub`1Ԝcj3&*UŶQYg$n۷$wցU4ns?-( $US >H? tDr3AɑNOV4xG[rt&YlFxTNj3vCss2|Od^ªFr+o5 Xi]JF\~שy?u,trx9t;U }ա,Fm, ZE'eeU%\! JH&.xبP2 ^8]ORPz:qvk*#Hnn+F6!/=]U4ۘ{wS_^.xv Mb-G}en헙w_;急4y*-:ל2fӴj#Թ8fd[Dͬ+l*<oc|]ѭQ{A0<"Q]yj%5ctB`b|18UZLJ=zK9”uCH/sAH f^h0RQ*k-JKW[WЕzOݞwb { OM]@w *ĤDA`T4<7/B66> L]o$ibl /xOǂ "+݅9i*3s9lN |f 02Fa όMjΰ&t]:ʇ*?0`گo9A:blǪ @Vz)W8.r?H%ST]TʅqeơTATľ^s-s0&o.Go x 9>'c,[ 05-h;=w3HM8!SG0~ϝuwU0O”TsXtj;q_@I$>c p9n2;U)tB990b޼,$29Cpٝ#'׏N~TϯS'XzI~5P8rwtbASbg uKi-G\6Ztz݋A4f}Mȋ_]ɐ]W՚~=R$Gu}M.5{/0Բ;yGj϶Q6n/gU0RӷlxWYU _<2=3O~4 R=tsCrCʃsPKthmS&ju%gužjwKtVk^_>*̒5^ VчtO\gB;CtnK /W&s ˻*FuHsxgp &=O~q;rpJX/gг.﯌$(GOV=eSÝ4>9&a'uR{^e<9q蠳<GɎƩggP%9=kQ߇֨۵38KK,o.𗙣뫳byy0dgA9TN+7w9 ]'j-ڐ_޹L$8)68Gûk]i"3hQ<^Jr30Z+a+|q>g\En:<+#H㖾Y?7Io] Sq=ņlK-x%njj qd;$eZNٖl^mn<06ȍq|غM=KXNIг=/b{nUY%iΕP|!OA}h,=!š25]tO>$z$t4.(x-p&{-˒9sBf@7g~-c Z$-/;&3>[lMI|_XjۈlU9EN l*s #*2cYmfde. /ևս h_kn:ŵU|/0_AY@N==|y͹?oav|iMMtC ͎ϭlOխjyjk{a~͍'gWǑ~ڻͷo8_}6GSIkn|qinjPVW7޼[Y^~5e)/^-.OlIn-| 6*T *ŭK.*Ş>\y1blw]:t #4=MwtN2VUv_B'^L-P5=KS脡& 0Cw#RN6 =w+ޤ:sk&0"i|L[7}5WL)6i kzuCN/CN_v-wTQ*K銺 tجkw0ׁ<4+2ךrt892Փ39sx_BR]8䫲1 S.w=AX;&]pKC:]5K{ָ;!+L1E-&"tew6;$tN}Ң J|&x>5f[IRO)'sR~O3dAV{=LLt6'"<&:cOS8C oZVjkjR>C%edj-0RJEJE;F]G`>i-1%FDp*Nokq^qRE<|R+Q:}F{o͐JiwYGCv%Gyi@g*G;*TpU/OeYaY2GB\H"1"ecN$"ͯx$D,AZɚ#BAFzw0#rG".%Ћ xfBeOB)f5]E'fG҈(t2. ෽:; 2 ⯸^O/"7@wUNisEO,Qw02;gjesm:<>DC%BoOaZ\%oQt͕ǒmV ag܎meM?tX{n͋[ۦjX9'(kb{2bmkzݰJ8^M{phn}k#(zQ_VKz{#IW9=b6:G-C賿eRq)2q#ih^IưKހz:٠meôb#t2Yw6sm[}z2!ޣƅNҺju\-+@`kQ0/xbkӦB/ҎĶǑh'\qQ+| { `pmes˹geͽ8nvv=?ݹEej FgC>޹z_ i}uЩV6,Nã|@RoľV6:3GldO4icmmv_~v;p=y|<޴Q:5 NBFSЩQ(tj:5 NBFSЩQ(tj:NBFSЩQ(tjj[ -SA,>i?џ[G_},Dz7W#\Tň?5??R=>k?S1A(fAJX@J8 oտ~R,PA@"ooTE24IunOeX,I_4TEe`h4VWk%C=`qwO‘o00gڏDp|e8~2I퇏wv,%g,`G^BP8z;g 82VsjT^ ι n~,j|>E |j7.7o9f+5$WTvZTQ|zFeHvwud9L,;}nԑYS:? )ua4}z-pIA(r,1AaNs/ieJ\;Y?f^3 %|7{VาA<9W)x&&uڽfEطΰomSG1e# q1i<Ͽ:A1c|`sIï*iv\껳 ɐA.> !m uc j{] uïqfwOHop\-t62ޞeHێsǜY1Ҡ9MQO:{fsf< a};GηF5 Z$b(-%)WFBZh5R9EA700Я{H)M[JJ 9NV&DBxzCES 왩^yz$[KY:ӈ; ^78M$ e3l𨱩쳑.6tKo*cf;'dD]$}Z x>S1AO\G^&ם.mcN9^n+ŀ x^@\o{@G; |7,:)fOc1dxOaV(z^ꌩCxQy>]JP$u ^K.` d-IY"d1Oig \2RsfCjƐ q->t\ji^Bp Ȝ&TPU7uk-, ubg/RFʓģdx?L=eE:*QR1ȁ8QF:I {aäv_ژK %=pfVU@6WչMC^謒@;n|`ǀgn_ R2 dJ#Bϖ̟E K{}YT5wADХwԄT9(BtZQ0h\ah:+P .gY@ڂ\B X9*Ô0 KEg늪.8Cm^WJjV&)Hb[a%RHeE}񥈰>]y [u xeL>Mh2/vߜ9%WhaBۿ &ן>pv-}|RJ_O?Rie) fM݇xÿZ.e=bC=)q KNf6F֮3!g=,[=j-VZ 6iÚD{z|R<FIZr+vmIJo'= fAOׇCZ| iw7-Wxߧ]b@K̛V&Aؓbg=6ۛ1mxv+ɉ];ڧ~n6[j88Rѹάع32bCk*8ݿ{g,hyӶguYnh}}Ό{_o+FeohW/GRLvB?ַ9]$9@ϯq8 9jJ;|^7A2uGw3*(.o$8?1:,A`79aΎKk3FϨgN;4 J=Z`q92Q\W,ݏ͒Z+(o5k]Y-5XKɕE/Z*̬e}k5 3N1V,,#YH.9`+v4/̶w-bX{㩶rfUJDsd=W Smu3Y2rabX_訉ZiiGm[N M '`hb!cĀ:]\j7X꼳./Hub;k a`1.1$W99Wn/^ݣ;*^iTJ >b,:һ5͠rhTGZVJ\gw7uCUsbW;8vrMt}!FAY@w8^( ~I[ [\Q k9cWsKRn1soR>٭5tsQ?Swzc`)fVpuK\jyoo;ŭT.V 1F cbHwݭInBG|^sW xbpYE,zړ%{V&zm.@ir)sw[XC)I%wB.8.ӬM|) sݸyEkyκo :tEʸl r 359M2ndι09GtE<S 6U^RgU<$ nf#ǦY5׶9Oqո乍\ŴRW2*'YSxoQ4;6NF#޳~ _V8+rsĴ6ĺM#+nwQ-jx ٧eYCM,ʋvYD;Wj/in4eŠj L[Q2Nшa "htO{f< /oыIOL}|h T4:7ZݸOsA,:2Q <>kǒ^vC\J5Ca<݄ש? t|MɅ!4TF7l& €IYy8{pG>뇱>?УfyGsD LXy|96C]j~y9NL:tm!tؗ}CN-Y/bBdNHqu$zBסo]xR$ߜ Gzv}hq-܁zep=͞zAk} =%zj>Vy*"',Q">Tf`|< 4.P&Jv>MLOdxĭ%:5)/(Sl(3]H rmSQmz`G%<[`"FBW o"14Ӟ֞7+ACaTcn%xi $#Y>.v}W(q$u!ܴ(4+`d)ƴFn? ؀IENDB`kw-20191112/documentation/images/dev_cycle.svg0000644000175000017500000005336313574463526021116 0ustar rodrigorodrigo image/svg+xml Merge Master Unstable Buf fix NewFeatures Etc Merge Request kw-20191112/documentation/index.rst0000644000175000017500000000136013574463526017022 0ustar rodrigorodrigoWelcome to KernelWorkflow's Documentation! ========================================== This set of scripts have a simple mission: reduces the environment and setup overhead for developing for GNU/Linux. Kw is composed of different scripts unified in a single interface after the installation, kw commands become available in the command line interface. .. toctree:: :maxdepth: 1 :caption: Content: content/installanduninstall content/howtocontribute content/tests kw Man ====== If you want to see kw man page, you can take a look at link below (The HTML renderings of the man pages), or you can install kw and run the command `kw man`. .. toctree:: :maxdepth: 1 man/kw Indices and Tables ================== * :ref:`search` kw-20191112/kw0000755000175000017500000000625113574463525012662 0ustar rodrigorodrigo#!/bin/bash # Set required variables EASY_KERNEL_WORKFLOW=${EASY_KERNEL_WORKFLOW:-"kw"} src_script_path=${src_script_path:-"$HOME/.config/$EASY_KERNEL_WORKFLOW/src"} external_script_path=${external_script_path:-"$HOME/.config/$EASY_KERNEL_WORKFLOW/external"} etc_files_path=${etc_files_path:-"$HOME/.config/$EASY_KERNEL_WORKFLOW/etc"} config_files_path=${config_files_path:-"$HOME/.config/$EASY_KERNEL_WORKFLOW"} # Export external variables required by kworkflow export EASY_KERNEL_WORKFLOW function kw() { action=$1 shift case "$action" in mount|mo) ( . "$src_script_path"/vm.sh --source-only vm_mount local ret=$? alert_completion "kw build" "$1" return $ret ) ;; umount|um) ( . "$src_script_path"/vm.sh --source-only vm_umount local ret=$? alert_completion "kw build" "$1" return $ret ) ;; boot|bo) ( . "$src_script_path"/vm.sh --source-only vm_boot ) ;; up|u) ( . "$src_script_path"/vm.sh --source-only vm_up ) ;; prepare|p) ( . "$src_script_path"/vm.sh --source-only vm_prepare local ret=$? alert_completion "kw prepare" "$1" return $ret ) ;; build|b) ( . "$src_script_path"/mk.sh --source-only mk_build local ret=$? alert_completion "kw build" "$1" return $ret ) ;; install|i) ( . "$src_script_path"/mk.sh --source-only mk_install local ret=$? alert_completion "kw install" "$1" return $ret ) ;; new|n) ( . "$src_script_path"/mk.sh --source-only vm_new_release_deploy local ret=$? alert_completion "kw new" "$1" return $ret ) ;; bi) ( . "$src_script_path"/mk.sh --source-only mk_build && mk_install local ret=$? alert_completion "kw bi" "$1" return $ret ) ;; ssh|s) ( . "$src_script_path"/vm.sh --source-only vm_ssh $@ ) ;; vars|v) ( . "$src_script_path"/commons.sh --source-only show_variables ) ;; codestyle|c) ( . "$src_script_path"/checkpatch_wrapper.sh --source-only execute_checkpatch $@ ) ;; maintainers|m) ( . "$src_script_path"/get_maintainer_wrapper.sh --source-only execute_get_maintainer $@ ) ;; configm|g) ( . "$src_script_path"/config_manager.sh --source-only execute_config_manager $@ ) ;; help|h) ( . "$src_script_path"/help.sh --source-only kworkflow-help ) ;; explore|e) ( . "$src_script_path"/explore.sh --source-only explore "$@" ) ;; man) ( . $src_script_path/help.sh --source-only kworkflow-man ) ;; *) ( . "$src_script_path"/help.sh --source-only complain "Invalid option" kworkflow-help return 1 ) ;; esac } kw $@ kw-20191112/build-drm-misc0000755000175000017500000000075113574463525015050 0ustar rodrigorodrigo#!/bin/bash BASE=$HOME/p/linux-trees BUILD_DIR=$BASE/build-linux function build_arch { echo "building $1..." export KBUILD_OUTPUT=$BUILD_DIR/drm-misc/$1 mkdir -p $KBUILD_OUTPUT cp $BASE/drm-rerere/drm-misc-$1_defconfig $KBUILD_OUTPUT/.config make oldconfig make $MAKE_OPTS > /dev/null echo "Done." echo "==============" } cd $BASE/drm-misc build_arch x86 ARCH="arm" CROSS_COMPILE="arm-linux-gnu-" build_arch arm ARCH="arm64" CROSS_COMPILE="aarch64-linux-gnu-" build_arch arm64 kw-20191112/LICENSE0000644000175000017500000004325413574463525013324 0ustar rodrigorodrigo GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. kw-20191112/tests/0000755000175000017500000000000013574463526013452 5ustar rodrigorodrigokw-20191112/tests/kwio_test.sh0000755000175000017500000000532613574463526016027 0ustar rodrigorodrigo#!/bin/bash . ./tests/utils --source-only . ./src/kwio.sh --source-only declare -A configurations sound_file="$PWD/tests/.kwio_test_aux/sound.file" visual_file="$PWD/tests/.kwio_test_aux/visual.file" function suite { suite_addTest "testAlertOptions" suite_addTest "testAlertDefaultOptions" suite_addTest "testAlertCommandPrinting" } function setUp { mkdir -p tests/.kwio_test_aux configurations["sound_alert_command"]="touch $sound_file" configurations["visual_alert_command"]="touch $visual_file" } function tearDown { rm -rf tests/.kwio_test_aux } function testAlertOptions { configurations["alert"]="n" rm -f "$sound_file" "$visual_file" alert_completion "" "--alert=vs" [[ -f "$sound_file" && -f "$visual_file" ]] assertTrue "Alert's vs option didn't work." $? rm -f "$sound_file" "$visual_file" alert_completion "" "--alert=sv" [[ -f "$sound_file" && -f "$visual_file" ]] assertTrue "Alert's sv option didn't work." $? rm -f "$sound_file" "$visual_file" alert_completion "" "--alert=s" [[ -f "$sound_file" && ! -f "$visual_file" ]] assertTrue "Alert's s option didn't work." $? rm -f "$sound_file" "$visual_file" alert_completion "" "--alert=v" [[ ! -f "$sound_file" && -f "$visual_file" ]] assertTrue "Alert's v option didn't work." $? rm -f "$sound_file" "$visual_file" alert_completion "" "--alert=n" [[ ! -f "$sound_file" && ! -f "$visual_file" ]] assertTrue "Alert's n option didn't work." $? true } function testAlertDefaultOptions { mkdir -p tests/.kwio_test_aux rm -f "$sound_file" "$visual_file" configurations["alert"]="vs" alert_completion "" "" [[ -f "$sound_file" && -f "$visual_file" ]] assertTrue "Alert's vs option didn't work." $? rm -f "$sound_file" "$visual_file" configurations["alert"]="sv" alert_completion "" "" [[ -f "$sound_file" && -f "$visual_file" ]] assertTrue "Alert's sv option didn't work." $? rm -f "$sound_file" "$visual_file" configurations["alert"]="s" alert_completion "" "" [[ -f "$sound_file" && ! -f "$visual_file" ]] assertTrue "Alert's s option didn't work." $? rm -f "$sound_file" "$visual_file" configurations["alert"]="v" alert_completion "" "" [[ ! -f "$sound_file" && -f "$visual_file" ]] assertTrue "Alert's v option didn't work." $? rm -f "$sound_file" "$visual_file" configurations["alert"]="n" alert_completion "" "" [[ ! -f "$sound_file" && ! -f "$visual_file" ]] assertTrue "Alert's n option didn't work." $? true } function testAlertCommandPrinting { local expected="TESTING COMMAND" configurations["visual_alert_command"]="echo \$COMMAND" ret="$(alert_completion "$expected" "--alert=v")" assertEquals "Variable $v should exist." "$ret" "$expected" true } invoke_shunit kw-20191112/tests/checkpatch_wrapper_test.sh0000755000175000017500000000311113574463526020701 0ustar rodrigorodrigo#!/bin/bash . ./src/checkpatch_wrapper.sh --source-only . ./tests/utils --source-only function suite { suite_addTest "testWarning" suite_addTest "testError" suite_addTest "testChecks" suite_addTest "testCorrect" } # Those variables hold the last line execute_checkpatch prints in a code that is # correct, has 1 warning, has 1 erros and has 1 check, respectively. The sample # codes used in this test are in tests/samples/ CORRECT_MSG="=========================================================" WARNING_MSG="total: 0 errors, 1 warnings, 0 checks, 25 lines checked" ERROR_MSG="total: 1 errors, 0 warnings, 0 checks, 25 lines checked" CHECK_MSG="total: 0 errors, 0 warnings, 1 checks, 26 lines checked" declare -A MSG=( \ ["correct"]=CORRECT_MSG \ ["warning"]=WARNING_MSG \ ["error"]=ERROR_MSG \ ["check"]=CHECK_MSG \ ) FAKE_KERNEL="tests/.tmp" function oneTimeSetUp { mk_fake_kernel_root "$FAKE_KERNEL" cp -f tests/external/checkpatch.pl "$FAKE_KERNEL"/scripts/ cp -f tests/external/const_structs.checkpatch "$FAKE_KERNEL"/scripts/ cp -f tests/external/spelling.txt "$FAKE_KERNEL"/scripts/ cp -r tests/samples "$FAKE_KERNEL" } function oneTimeTearDown { rm -rf "$FAKE_KERNEL" } function checkpatch { res=$(execute_checkpatch "$FAKE_KERNEL/samples/codestyle_$1.c" 2>&1) [[ "$res" == *"${!MSG[$1]}" ]] assertTrue "Checkpatch should output: ${!MSG[$1]}" $? } function testWarning { checkpatch "warning" } function testError { checkpatch "error" } function testChecks { checkpatch "check" } function testCorrect { checkpatch "correct" } invoke_shunit kw-20191112/tests/samples/0000755000175000017500000000000013574463526015116 5ustar rodrigorodrigokw-20191112/tests/samples/codestyle_correct.c0000644000175000017500000000055413574463526021002 0ustar rodrigorodrigo// SPDX-License-Identifier: GPL-2.0 /* * codestyle.c * * Copyright (C) 2018 John Doe * * This file is used for codestyle checking. * */ #include void camel_case(void) { puts("One should avoid camel case."); } int main(int argc, char *args[]) { int i; printf("%d\n", argc); for (i = 0; i < argc; ++i) printf("%s ", args[i]); return 0; } kw-20191112/tests/samples/kworkflow.config0000644000175000017500000000017413574463526020334 0ustar rodrigorodrigossh_ip=127.0.0.1 ssh_port=3333 arch=arm virtualizer=libvirt mount_point=/home/lala qemu_path_image=/home/xpto/p/virty.qcow2 kw-20191112/tests/samples/dmesg0000644000175000017500000000011213574463526016132 0ustar rodrigorodrigoif [ "$#" -gt 0 ]; then dmesg $@; else dmesg -wH --color='always'; fi kw-20191112/tests/samples/test.patch0000644000175000017500000000661413574463526017125 0ustar rodrigorodrigoFrom 9cfd2e8fb9f420ea900ca4cf54ce84139970429e Mon Sep 17 00:00:00 2001 From: Lala Xpto Date: Sun, 24 Feb 2019 12:16:25 -0300 Subject: [PATCH 41/54] Fix the extra '=*' in the codestyle command Currently, if we use 'kw c' in a source file without any warning, it displays something like this: $ kw c drivers/gpu/drm/vkms/ Running checkpatch.pl on: drivers/gpu/drm/vkms/ ========================================================= PATH:70: ANY OUTPUT total: 0 errors, 0 warnings, 1 checks, 144 lines checked ========================================================= ========================================================= ========================================================= ========================================================= This patch, fix this problem by removing the extra "=*". Additionally, this commit updates the test to better fit this new output and add a new check for the case that does not have any issue in the code. --- src/checkpatch_wrapper.sh | 8 ++++++-- tests/checkpatch_wrapper_test.sh | 14 +++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/checkpatch_wrapper.sh b/src/checkpatch_wrapper.sh index 63949fc..cb38f78 100755 --- a/src/checkpatch_wrapper.sh +++ b/src/checkpatch_wrapper.sh @@ -22,11 +22,11 @@ function execute_checkpatch() FLIST=`find $FILE_OR_DIR_CHECK -type f ! -name '*\.mod\.c' | grep "\.[ch]$" ` say "Running checkpatch.pl on: $FILE_OR_DIR_CHECK" + say $SEPARATOR for current_file in $FLIST do file=$current_file - echo if [ ! -e "$file" ] then @@ -34,7 +34,11 @@ function execute_checkpatch() continue fi - say $SEPARATOR $checkpatch $file + + if [ $? != 0 ]; then + say $SEPARATOR + fi + done } diff --git a/tests/checkpatch_wrapper_test.sh b/tests/checkpatch_wrapper_test.sh index c079b32..cc60012 100755 --- a/tests/checkpatch_wrapper_test.sh +++ b/tests/checkpatch_wrapper_test.sh @@ -8,18 +8,17 @@ function suite suite_addTest "testWarning" suite_addTest "testError" suite_addTest "testChecks" + suite_addTest "testNothing" } # Those variables hold the last line execute_checkpatch prints in a code that is correct, has # 1 warning, has 1 erros and has 1 check, respectively. The sample codes used in this test are # in tests/samples/ -CORRECT_MSG="=========================================================" WARNING_MSG="total: 0 errors, 1 warnings, 0 checks, 25 lines checked" ERROR_MSG="total: 1 errors, 0 warnings, 0 checks, 25 lines checked" CHECK_MSG="total: 0 errors, 0 warnings, 1 checks, 26 lines checked" declare -A MSG=( \ - ["correct"]=CORRECT_MSG \ ["warning"]=WARNING_MSG \ ["error"]=ERROR_MSG \ ["check"]=CHECK_MSG \ @@ -27,9 +26,8 @@ declare -A MSG=( \ function checkpatch { - res=$(execute_checkpatch "tests/samples/codestyle_$1.c" 2>&1 | tail -n 1 ) - [[ "$res" != "${!MSG[$1]}" ]] && fail "Checkpatch should output:\n${!MSG[$1]}" - true # Reset return value + res=$(execute_checkpatch "tests/samples/codestyle_$1.c" 2>&1) + assertTrue "Checkpatch should output:\n${!MSG[$1]}" '[[ $res =~ ${!MSG[$1]} ]]' } function testWarning @@ -52,4 +50,10 @@ function testCorrect checkpatch "correct" } +function testNothing +{ + res=$(execute_checkpatch "tests/samples/codestyle_nothing.c" 2>&1) + assertFail "Checkpatch should not show anything" '[[ $res =~ total ]]' +} + invoke_shunit -- 2.21.0 kw-20191112/tests/samples/print_file_author_test_dir/0000755000175000017500000000000013574463526022530 5ustar rodrigorodrigokw-20191112/tests/samples/print_file_author_test_dir/code1.c0000644000175000017500000000112213574463526023663 0ustar rodrigorodrigo// SPDX-License-Identifier: GPL-2.0 /* * codestyle.c * * Copyright (C) 2018 John Doe * * This file is used to test the print_files_authors function * at src/get_maintainer_wrapper.sh. * */ #include void ordinary_function(void) { puts("Just a function..."); } int main(int argc, char *args[]) { int i; printf("%d\n", argc); for (i = 0; i < argc; ++i) printf("%s ", args[i]); return 0; } MODULE_AUTHOR ( "John Doe , Caesar Doe " ) ORDINARY_MACRO ("Does something..."); MODULE_AUTHOR("Michael Doe ") kw-20191112/tests/samples/print_file_author_test_dir/code2.c0000644000175000017500000000072613574463526023675 0ustar rodrigorodrigo// SPDX-License-Identifier: GPL-2.0 /* * codestyle.c * * Copyright (C) 2018 Bob Hilson * * This file is used to test the print_files_authors function * at src/get_maintainer_wrapper.sh. * */ #include void ordinary_function2(void) { puts("Just a function..."); } int main(int argc, char *args[]) { int i; printf("%d\n", argc); for (i = 0; i < argc; ++i) printf("%s ", args[i]); return 0; } MODULE_AUTHOR ( "Bob Hilson " ) kw-20191112/tests/samples/codestyle_check.c0000644000175000017500000000055313574463526020415 0ustar rodrigorodrigo// SPDX-License-Identifier: GPL-2.0 /* * codestyle.c * * Copyright (C) 2018 John Doe * * This file is used for codestyle checking. * */ #include void camelCase(void) { puts("One should avoid camel case."); } int main(int argc, char *args[]) { int i; printf("%d\n", argc); for (i = 0; i < argc; ++i) printf("%s ", args[i]); return 0; } kw-20191112/tests/samples/codestyle_error.c0000644000175000017500000000055413574463526020472 0ustar rodrigorodrigo// SPDX-License-Identifier: GPL-2.0 /* * codestyle.c * * Copyright (C) 2018 John Doe * * This file is used for codestyle checking. * */ #include void camel_case(void) { puts("One should avoid camel case."); } int main(int argc, char *args[]) { int i; printf("%d\n", argc); for (i = 0; i < argc; ++i) printf("%s ", args[i]); return 0; } kw-20191112/tests/samples/codestyle_warning.c0000644000175000017500000000055313574463526021005 0ustar rodrigorodrigo// SPDX-License-Identifier: GPL-2.0 /* * codestyle.c * * Copyright (C) 2018 John Doe * * This file is used for codestyle checking. * */ #include void camel_case(void) { puts("One should avoid camel case."); } int main(int argc, char *args[]) { int i; printf("%d\n", argc); for (i = 0; i < argc; ++i) printf("%s ", args[i]); return 0; } kw-20191112/tests/samples/os/0000755000175000017500000000000013574463526015537 5ustar rodrigorodrigokw-20191112/tests/samples/os/arch/0000755000175000017500000000000013574463526016454 5ustar rodrigorodrigokw-20191112/tests/samples/os/arch/lsb-release0000644000175000017500000000013113574463526020570 0ustar rodrigorodrigoLSB_VERSION=1.4 DISTRIB_ID=Arch DISTRIB_RELEASE=rolling DISTRIB_DESCRIPTION="Arch Linux" kw-20191112/tests/samples/os/arch/os-release0000644000175000017500000000040213574463526020432 0ustar rodrigorodrigoNAME="Arch Linux" PRETTY_NAME="Arch Linux" ID=arch BUILD_ID=rolling ANSI_COLOR="0;36" HOME_URL="https://www.archlinux.org/" DOCUMENTATION_URL="https://wiki.archlinux.org/" SUPPORT_URL="https://bbs.archlinux.org/" BUG_REPORT_URL="https://bugs.archlinux.org/" kw-20191112/tests/samples/os/debian/0000755000175000017500000000000013574463526016761 5ustar rodrigorodrigokw-20191112/tests/samples/os/debian/os-release0000644000175000017500000000035413574463526020745 0ustar rodrigorodrigoPRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" kw-20191112/tests/samples/MAINTAINERS0000644000175000017500000000033613574463526016615 0ustar rodrigorodrigo# This is a sample MAINTAINERS file. It is used by the # get_maintainer_wrapper_test.sh FILESYSTEMS M: John Doe L: fs@list.org F: fs/* THE REST M: Jane Doe L: kernel@list.org F: * F: */ kw-20191112/tests/kw_dash.sh0000755000175000017500000000033213574463526015427 0ustar rodrigorodrigo#!/bin/bash . ./tests/utils --source-only function suite { suite_addTest "testDash" } function testDash { ./tests/_kw_dash.dsh if [ $? -ne 0 ]; then fail "Dash was unable to find kw" fi } invoke_shunit kw-20191112/tests/help_test.sh0000755000175000017500000000044413574463526016002 0ustar rodrigorodrigo#!/bin/bash . ./tests/utils --source-only . ./src/help.sh --source-only function suite { suite_addTest "testHelp" } function testHelp { HELP_OUTPUT=$(kworkflow-help | head -n 1) [[ $HELP_OUTPUT =~ Usage:\ kw.* ]]; assertTrue "Help text not displaying correctly." $? } invoke_shunit kw-20191112/tests/explore_test.sh0000755000175000017500000000102613574463526016525 0ustar rodrigorodrigo#!/bin/bash . ./tests/utils --source-only . ./src/explore.sh --source-only function suite { suite_addTest "testExplore" } function testExplore { local MSG_OUT="GNU" local LOG_OUT="Initial commit" assertEquals "Expected an error message." "Expected path or 'log'" "$(explore)" MSG_OUT="camel_case(void)" assertEquals "$MSG_OUT" "$(explore "camel_case" tests/samples | cut -d ' ' -f2 | head -n 1)" assertEquals "$LOG_OUT" "$(explore log LICENSE | grep "Initial commit" | awk '{print $1, $2}')" true } invoke_shunit kw-20191112/tests/get_maintainer_wrapper_test.sh0000755000175000017500000001036313574463526021601 0ustar rodrigorodrigo#!/bin/bash . ./src/get_maintainer_wrapper.sh --source-only . ./tests/utils --source-only # TODO: make execute_get_maintainer's tests cover more corner cases? function suite { suite_addTest "testPrintFileAuthorForFile" suite_addTest "testPrintFileAuthorForDir" suite_addTest "testGetMaintainers" } # The following variables hold the the lines print_files_authors should # print when given the file samples/print_file_author_test_dir directory # and samples/print_file_author_test_dir/code1.c file, respectively. CORRECT_DIR_MSG="========================================================= MODULE AUTHORS: code1.c: John Doe , Caesar Doe , Michael Doe code2.c: Bob Hilson " CORRECT_FILE_MSG="========================================================= MODULE AUTHORS: code1.c: John Doe , Caesar Doe , Michael Doe " # The following variables hold the the lines execute_get_maintainer # should print when given the path tests/.tmp and tests/.tmp/fs, # respectively. CORRECT_TMP_MSG="========================================================= HERE: Jane Doe ,kernel@list.org" CORRECT_TMP_FS_MSG="========================================================= HERE: John Doe ,Jane Doe ,fs@list.org,kernel@list.org" FAKE_KERNEL="tests/.tmp" function setupGetMaintainers { # This creates tests/.tmp which should mock a kernel tree root. A .git # dir is also created inside tests/.tmp so that get_maintainer.pl thinks # it is a git repo. This is done in order to avoid some warnings that # get_maintainer.pl prints when no .git is found. mk_fake_kernel_root "$FAKE_KERNEL" mkdir -p "$FAKE_KERNEL/.git" cp -f tests/samples/MAINTAINERS "$FAKE_KERNEL"/MAINTAINERS cp -f tests/external/get_maintainer.pl "$FAKE_KERNEL"/scripts/ } function tearDownGetMainteiners { rm -rf "$FAKE_KERNEL" } function testPrintFileAuthorForFile { local -r ret=$(print_files_authors "tests/samples/print_file_author_test_dir/code1.c") if [[ "$ret" != "$CORRECT_FILE_MSG" ]]; then local -r expected_prefixed=$(prefix_multiline "$CORRECT_FILE_MSG") local -r got_prefixed=$(prefix_multiline "$ret") fail "Expecting return:\n$expected_prefixed\nBut got:\n$got_prefixed" fi true # Reset return value } function testPrintFileAuthorForDir { local -r ret=$(print_files_authors "tests/samples/print_file_author_test_dir") if [[ "$ret" != "$CORRECT_DIR_MSG" ]]; then local -r expected_prefixed=$(prefix_multiline "$CORRECT_DIR_MSG") local -r got_prefixed=$(prefix_multiline "$ret") fail "Expecting return:\n$expected_prefixed\nBut got:\n$got_prefixed" fi true # Reset return value } function testGetMaintainers { local ret local got_prefixed local -r expected_tmp_prefixed=$(prefix_multiline "$CORRECT_TMP_MSG") local -r expected_tmp_fs_prefixed=$(prefix_multiline "$CORRECT_TMP_FS_MSG") setupGetMaintainers ret="$(execute_get_maintainer tests/.tmp)" if [[ "$ret" != "$CORRECT_TMP_MSG" ]]; then got_prefixed=$(prefix_multiline "$ret") fail "Expecting return:\n$expected_tmp_prefixed\nBut got:\n$got_prefixed\n(Calling lkr from outside lkr)" fi cd tests/.tmp ret="$(execute_get_maintainer .)" if [[ "$ret" != "$CORRECT_TMP_MSG" ]]; then got_prefixed=$(prefix_multiline "$ret") fail "Expecting return:\n$expected_tmp_prefixed\nBut got:\n$got_prefixed\n(Calling lkr from lkr)" fi ret="$(execute_get_maintainer fs)" if [[ "$ret" != "$CORRECT_TMP_FS_MSG" ]]; then got_prefixed=$(prefix_multiline "$ret") fail "Expecting return:\n$expected_tmp_fs_prefixed\nBut got:\n$got_prefixed\n(Calling lkr/fs from lkr)" fi cd fs ret="$(execute_get_maintainer ..)" if [[ "$ret" != "$CORRECT_TMP_MSG" ]]; then got_prefixed=$(prefix_multiline "$ret") fail "Expecting return:\n$expected_tmp_prefixed\nBut got:\n$got_prefixed\n(Calling lkr from lkr/fs)" fi ret="$(execute_get_maintainer .)" if [[ "$ret" != "$CORRECT_TMP_FS_MSG" ]]; then got_prefixed=$(prefix_multiline "$ret") fail "Expecting return:\n$expected_tmp_fs_prefixed\nBut got:\n$got_prefixed\n(Calling lkr/fs from lkr/fs)" fi cd ../../../ tearDownGetMainteiners } invoke_shunit kw-20191112/tests/kw_test.sh0000755000175000017500000000111313574463526015465 0ustar rodrigorodrigo#!/bin/bash . ./tests/utils --source-only . ./kw --source-only > /dev/null function suite { suite_addTest "testVariables" suite_addTest "testExported" } function testVariables { VARS=( EASY_KERNEL_WORKFLOW src_script_path external_script_path ) for v in "${VARS[@]}"; do test -z ${!v+x}; assertEquals "Variable $v should exist." $? 1 done } function testExported { VARS=( EASY_KERNEL_WORKFLOW ) for v in "${VARS[@]}"; do [[ $(declare -p $v) =~ ^declare\ -[aAilrtu]*x[aAilrtu]*\ ]] || fail "Variable $v should have been exported" done } invoke_shunit kw-20191112/tests/fish_completion_test.sh0000755000175000017500000000216213574463526020233 0ustar rodrigorodrigo#!/bin/bash . ./tests/utils --source-only function suite() { suite_addTest "testKwCompletion" } function getSortedCompletions() { local env_path=".:/bin" local env_fish_complete_path="" local completion="./src/kw.fish" local cmd=$1 local fish_cmd="set PATH $env_path; set fish_complete_path $env_fish_complete_path; source $completion; complete -C'$1 '" fish -c "$fish_cmd" | awk '{print $1}' | sort } function testKwCompletion() { local kw_options="explore e build b bi install i prepare p new n ssh s mount mo umount um vars v up u codestyle c maintainers m help h" local sorted_kw_options="$(echo $kw_options | awk '{gsub(" ", "\n"); print $0}' | sort)" local sorted_kw_fish_completions="$(getSortedCompletions 'kw')" if [[ "$sorted_kw_fish_completions" != "$sorted_kw_options" ]]; then local difference="$(diff <(echo "$sorted_kw_options") <(echo "$sorted_kw_fish_completions"))" fail "Fish suggestions and kw commands are not the same:\n$difference" fi; } invoke_shunit kw-20191112/tests/configm_test.sh0000755000175000017500000002516713574463526016505 0ustar rodrigorodrigo#!/bin/bash . ./src/config_manager.sh --source-only . ./tests/utils --source-only LS_TITLE="Name\t\tDescription" COMMAND_MSG_UNKNOWN="Unknown option" COMMAND_MSG_INVALID_ARG="Invalid argument" COMMAND_NO_SUCH_FILE="No such file or directory" readonly YES_FORCE="1" readonly NO_FORCE="0" readonly CONTENT="The content" readonly NAME_1="test_save_1" readonly NAME_2="test_save_2" readonly DESCRIPTION_1="This is the first description" readonly DESCRIPTION_2="Hi, I'm the second description" readonly LS_NO_FILES="There's no tracked .config file" function suite { suite_addTest "testExecuteConfigManagerSAVEfails" suite_addTest "testSaveConfigFileCHECK_CONFIGfails" suite_addTest "testSaveConfigFileCHECK_CONFIGS_DIRECTORY" suite_addTest "testSaveConfigFileCHECK_SAVED_CONFIG_FILE" suite_addTest "testSaveConfigFileCHECK_DESCRIPTION" suite_addTest "testSaveConfigFileCHECK_GIT_SAVE_SCHEMA" suite_addTest "testSaveConfigFileCHECK_FORCE" suite_addTest "testListConfigsCHECK_NO_CONFIGS" suite_addTest "testListConfigsOUTPUT" suite_addTest "testGetOperationWithForce" suite_addTest "testGetOperationThatShouldFail" suite_addTest "testRemoveOperationThatShouldFail" suite_addTest "testRemoveOperation" } function setupConfigm() { local -r test_path="tests/.tmp" local -r current_path=$PWD rm -rf $test_path mkdir -p $test_path cd $test_path touch .config echo $CONTENT > .config cd $current_path } function tearDownConfigm() { local -r test_path="tests/.tmp" rm -rf $test_path } function test_expected_string() { local msg="$1" local expected="$2" local target="$3" assertEquals "$msg" "$target" "$expected" } function testExecuteConfigManagerSAVEfails { local msg_prefix=" --save" ret=$(execute_config_manager --save) test_expected_string "$msg_prefix" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save --lala) test_expected_string "$msg_prefix --lala" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save -n) test_expected_string "$msg_prefix -n" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save -d) test_expected_string "$msg_prefix -d" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save -n -d) test_expected_string "$msg_prefix -n -d" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save -n -lulu) test_expected_string "$msg_prefix -n -lulu" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save -d) test_expected_string "$msg_prefix -d" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save -d "lalala and xpto") test_expected_string "$msg_prefix -d" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager --save -f) test_expected_string "$msg_prefix -f" "$COMMAND_MSG_INVALID_ARG" "$ret" } function testSaveConfigFileCHECK_CONFIGfails() { local -r test_path="tests/.tmp" local current_path=$PWD local force=0 local ret=0 # Prepare teste setupConfigm # Test without config file -> should fail cd $test_path rm -f .config ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") assertEquals "No .config file should return ENOENT" "$?" "2" # Test with different name touch .configuration ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") assertEquals "Should return ENOENT, because '.config' != '.configuration'" "$?" "2" rm .configuration cd $current_path tearDownConfigm } function testSaveConfigFileCHECK_CONFIGS_DIRECTORY() { local -r test_path="tests/.tmp" local current_path=$PWD config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it cd $test_path ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") cd $current_path # Check if all the expected files were created assertTrue "The configs dir was not created" '[[ -d $config_files_path/configs ]]' assertTrue "The repository configs does not have .git" '[[ -d $config_files_path/configs/.git ]]' assertTrue "The metadata dir is not available" '[[ -d $config_files_path/configs/metadata ]]' assertTrue "The configs dir is not available" '[[ -d $config_files_path/configs/configs ]]' tearDownConfigm } function testSaveConfigFileCHECK_SAVED_CONFIG_FILE() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it cd $test_path ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") cd $current_path assertTrue "Failed to find $NAME_1" '[[ -f $config_files_path/configs/configs/$NAME_1 ]]' assertTrue "Failed the metadata related to $NAME_1" '[[ -f $config_files_path/configs/metadata/$NAME_1 ]]' cd $test_path ret=$(save_config_file $NO_FORCE $NAME_2) cd $current_path assertTrue "Failed to find $NAME_2" '[[ -f $config_files_path/configs/configs/$NAME_2 ]]' assertTrue "Failed the metadata related to $NAME_2" '[[ -f $config_files_path/configs/metadata/$NAME_2 ]]' local tmp=$(cat $config_files_path/configs/configs/$NAME_2) assertTrue "Content in the file does not match" '[[ $tmp = $CONTENT ]]' tearDownConfigm } function testSaveConfigFileCHECK_DESCRIPTION() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it cd $test_path ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") cd $current_path local tmp=$(cat $config_files_path/configs/metadata/$NAME_1) assertTrue "The description content for $NAME_1 does not match" '[[ $tmp = $DESCRIPTION_1 ]]' cd $test_path ret=$(save_config_file $NO_FORCE $NAME_2 "$DESCRIPTION_2") cd $current_path tmp=$(cat $config_files_path/configs/metadata/$NAME_2) assertTrue "The description content for $NAME_2 does not match" '[[ $tmp = $DESCRIPTION_2 ]]' tearDownConfigm } function testSaveConfigFileCHECK_GIT_SAVE_SCHEMA() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it cd $test_path ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") ret=$(save_config_file $NO_FORCE $NAME_2 "$DESCRIPTION_2") cd "configs" ret=$(git rev-list --all --count) cd $current_path assertTrue "We expected 2 commits, but we got $ret" '[[ $ret = "2" ]]' tearDownConfigm } function testSaveConfigFileCHECK_FORCE() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it cd $test_path ret=$(save_config_file $YES_FORCE $NAME_2 "$DESCRIPTION_2") ret=$(save_config_file $YES_FORCE $NAME_2 "$DESCRIPTION_2") cd $current_path assertTrue "We expected no changes" '[[ $ret =~ Warning ]]' tearDownConfigm } function testListConfigsCHECK_NO_CONFIGS() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it ret=$(list_configs) assertTrue "We expected no changes" '[[ $ret =~ $LS_NO_FILES ]]' tearDownConfigm } function testListConfigsOUTPUT() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it cd $test_path ret=$(save_config_file $YES_FORCE $NAME_1 "$DESCRIPTION_1") ret=$(save_config_file $YES_FORCE $NAME_2 "$DESCRIPTION_2") cd $current_path # There's no configs yet, initialize it ret=$(list_configs) assertTrue "We expected 'Name' in the output, but we got $ret" '[[ $ret =~ Name ]]' assertTrue "We expected 'Description' in the output, but we got $ret" '[[ $ret =~ Description ]]' assertTrue "We expected $NAME_1 in the output, but we got $ret" '[[ $ret =~ $NAME_1 ]]' assertTrue "We expected $DESCRIPTION_1 in the output, but we got $ret" '[[ $ret =~ $DESCRIPTION_1 ]]' assertTrue "We expected $NAME_2 in the output, but we got $ret" '[[ $ret =~ $NAME_2 ]]' assertTrue "We expected $DESCRIPTION_2 in the output, but we got $ret" '[[ $ret =~ $DESCRIPTION_2 ]]' tearDownConfigm } function testGetOperationThatShouldFail() { local msg_prefix=" --get" ret=$(execute_config_manager --get) test_expected_string "$msg_prefix" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager -get) test_expected_string "$msg_prefix" "$COMMAND_MSG_UNKNOWN" "$ret" ret=$(execute_config_manager --get something_wrong) test_expected_string "$msg_prefix" "$COMMAND_NO_SUCH_FILE: something_wrong" "$ret" } function testGetOperationWithForce() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm # There's no configs yet, initialize it cd $test_path ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") ret=$(save_config_file $NO_FORCE $NAME_2 "$DESCRIPTION_2") cd $current_path # Case 1: There's no local .config file cd $test_path rm -f .config get_config $NAME_1 1 > /dev/null 2>&1 ret=$(cat .config) cd $current_path assertTrue "We expected $CONTENT, but we got $ret" '[[ $ret =~ $CONTENT ]]' # Case 2: There's a .config file cd $test_path get_config $NAME_2 1 > /dev/null 2>&1 ret=$(cat .config) cd $current_path assertTrue "We expected $CONTENT, but we got $ret" '[[ $ret =~ $CONTENT ]]' tearDownConfigm } function testRemoveOperationThatShouldFail() { local msg_prefix=" --rm" ret=$(execute_config_manager --rm) test_expected_string "$msg_prefix" "$COMMAND_MSG_INVALID_ARG" "$ret" ret=$(execute_config_manager -rm) test_expected_string "$msg_prefix" "$COMMAND_MSG_UNKNOWN" "$ret" ret=$(execute_config_manager --rm something_wrong) test_expected_string "$msg_prefix" "$COMMAND_NO_SUCH_FILE: something_wrong" "$ret" } function testRemoveOperation() { local -r test_path="tests/.tmp" local current_path=$PWD local ret=0 config_files_path=$current_path/$test_path setupConfigm cd $test_path ret=$(save_config_file $NO_FORCE $NAME_1 "$DESCRIPTION_1") ret=$(save_config_file $NO_FORCE $NAME_2 "$DESCRIPTION_2") ret=$(ls configs/configs -1 | wc -l) # Case 1: We should have two files assertTrue "We expected , 2 files but got $ret" '[[ $ret = "2" ]]' # Case 2: Remove one config file remove_config $NAME_1 1 > /dev/null 2>&1 ret=$(ls configs/configs -1 | wc -l) assertTrue "We expected , 1 files but got $ret" '[[ $ret = "1" ]]' # Case 2: Remove all config files remove_config $NAME_2 1 > /dev/null 2>&1 assertTrue "We expected no file related to config" '[[ ! -f configs/configs ]]' cd $current_path } invoke_shunit kw-20191112/tests/kwlib_test.sh0000755000175000017500000001317113574463526016163 0ustar rodrigorodrigo#!/bin/bash . ./src/get_maintainer_wrapper.sh --source-only . ./src/kwlib.sh --source-only . ./tests/utils --source-only function suite { suite_addTest "linuxRootCheckTest" suite_addTest "cmdManagerTESTMODETest" suite_addTest "cmdManagerSILENTTest" suite_addTest "cmdManagerSAY_COMPLAIN_WARNING_SUCCESS_Test" suite_addTest "detectDistroTest" suite_addTest "joinPathTest" suite_addTest "findKernelRootTest" suite_addTest "isAPatchTest" } function setupFakeOSInfo { mkdir -p tests/.tmp/detect_distro/{arch,debian}/etc cp -f tests/samples/os/arch/* tests/.tmp/detect_distro/arch/etc cp -f tests/samples/os/debian/* tests/.tmp/detect_distro/debian/etc } function setupPatch { mkdir -p "tests/.tmp" cp -f tests/samples/test.patch tests/.tmp/ } function setupFakeKernelRepo { # This creates tests/.tmp which should mock a kernel tree root. A .git # dir is also created inside tests/.tmp so that get_maintainer.pl thinks # it is a git repo. This is done in order to avoid some warnings that # get_maintainer.pl prints when no .git is found. mkdir -p "tests/.tmp" cd "tests/.tmp" touch "COPYING" touch "CREDITS" touch "Kbuild" touch "Makefile" touch "README" mkdir -p "Documentation" mkdir -p "arch" mkdir -p "include" mkdir -p "drivers" mkdir -p "fs" mkdir -p "init" mkdir -p "ipc" mkdir -p "kernel" mkdir -p "lib" mkdir -p "scripts" mkdir -p ".git" cd ../../ cp -f tests/samples/MAINTAINERS tests/.tmp/MAINTAINERS cp -f tests/external/get_maintainer.pl tests/.tmp/scripts/ } function tearDownSetup { rm -rf "tests/.tmp" } function linuxRootCheckTest { setupFakeKernelRepo is_kernel_root "tests/.tmp" [[ "$?" != 0 ]] && fail "Failed to check if a directory is a kernel root." tearDownSetup true # Reset return value } function cmdManagerSILENTTest { setupFakeKernelRepo cd "tests/.tmp" ret=$(cmd_manager SILENT ls) assertFalse "We used SILENT mode, we should not find ls" '[[ $ret =~ ls ]]' assertTrue "We expected to find MAINTAINERS" '[[ $ret =~ MAINTAINERS ]]' assertTrue "We expected to find CREDITS" '[[ $ret =~ CREDITS ]]' assertTrue "We expected to find README" '[[ $ret =~ README ]]' assertTrue "We expected to find arch" '[[ $ret =~ arch ]]' assertTrue "We expected to find scripts" '[[ $ret =~ scripts ]]' # Test command with parameters ret=$(cmd_manager SILENT pwd --help) assertTrue "We expected to find -P" '[[ $ret =~ -P ]]' assertTrue "We expected to find -L" '[[ $ret =~ -L ]]' cd ../../ tearDownSetup } # The difference between say, complain, warning, and success it is the color # because of this we test all of them together function cmdManagerSAY_COMPLAIN_WARNING_SUCCESS_Test { setupFakeKernelRepo cd "tests/.tmp" ret=$(cmd_manager ls) assertTrue "We expected to find the ls command" '[[ $ret =~ ls ]]' assertTrue "We expected to find MAINTAINERS" '[[ $ret =~ MAINTAINERS ]]' assertTrue "We expected to find arch" '[[ $ret =~ arch ]]' assertTrue "We expected to find scripts" '[[ $ret =~ scripts ]]' # TODO: There's an alternative to discover the color? ret=$(cmd_manager COMPLAIN pwd --help) assertTrue "We expected to find the ls command" '[[ $ret =~ --help ]]' assertTrue "We expected to find -P" '[[ $ret =~ -P ]]' assertTrue "We expected to find -L" '[[ $ret =~ -L ]]' ret=$(cmd_manager WARNING ls) assertTrue "We expected to find the ls command" '[[ $ret =~ ls ]]' assertTrue "We expected to find MAINTAINERS" '[[ $ret =~ MAINTAINERS ]]' assertTrue "We expected to find arch" '[[ $ret =~ arch ]]' assertTrue "We expected to find scripts" '[[ $ret =~ scripts ]]' ret=$(cmd_manager SUCCESS ls) assertTrue "We expected to find the ls command" '[[ $ret =~ ls ]]' assertTrue "We expected to find MAINTAINERS" '[[ $ret =~ MAINTAINERS ]]' assertTrue "We expected to find arch" '[[ $ret =~ arch ]]' assertTrue "We expected to find scripts" '[[ $ret =~ scripts ]]' cd ../../ tearDownSetup } function cmdManagerTESTMODETest { ret=$(cmd_manager TEST_MODE pwd) assertEquals "Expected pwd, but we got $ret" "$ret" "pwd" ret=$(cmd_manager TEST_MODE ls -lah) assertEquals "Expected ls -lah, but we got $ret" "$ret" "ls -lah" } function detectDistroTest { setupFakeOSInfo local root_path="tests/.tmp/detect_distro/arch" local ret=$(detect_distro $root_path) assertEquals "We got $ret." "$ret" "arch" root_path="tests/.tmp/detect_distro/debian" ret=$(detect_distro $root_path) assertEquals "We got $ret." "$ret" "debian" root_path="tests/.tmp/detect_distro/debian/etc/lala" ret=$(detect_distro $root_path) assertEquals "We got $ret." "$ret" "none" } function joinPathTest { local base="/lala/xpto" local ret=$(join_path "/lala" "///xpto") assertEquals "Expect /lala/xpto" "$ret" "$base" ret=$(join_path "/lala" "/xpto////") assertEquals "Expect /lala/xpto" "$ret" "$base" ret=$(join_path "/lala" "////xpto////") assertEquals "Expect /lala/xpto" "$ret" "$base" ret=$(join_path "/lala/") assertEquals "Expect /lala/" "$ret" "/lala/" } function findKernelRootTest { setupFakeKernelRepo local fake_path="tests/.tmp/lala/xpto" mkdir -p $fake_path local kernel_path=$(find_kernel_root $fake_path) assertEquals "We expected to find a kernel path" "$kernel_path" "tests/.tmp" kernel_path=$(find_kernel_root "/tmp") assertEquals "We should not find a path" "$kernel_path" "" kernel_path=$(find_kernel_root "test/") assertEquals "We should not find a path" "$kernel_path" "" tearDownSetup } function isAPatchTest { setupPatch is_a_patch "tests/.tmp/test.patch" [[ "$?" != 0 ]] && fail "Failed to check if a file is a patch." tearDownSetup true # Reset return value } invoke_shunit kw-20191112/tests/commons_test.sh0000755000175000017500000000635313574463526016532 0ustar rodrigorodrigo#!/bin/bash . ./tests/utils --source-only function suite { suite_addTest "testParseRegularConfig" suite_addTest "testParseUnsupportedFile" suite_addTest "testDefaultConfigFile" suite_addTest "testLocalConfigFile" } function setUp { mkdir -p tests/.tmp_commons_test } function tearDown { rm -rf tests/.tmp_commons_test } function testParseRegularConfig { . ./src/commons.sh --source-only parse_configuration tests/samples/kworkflow.config assertTrue "Kw failed to load a regular config file" "[ 0 -eq $? ]" } function testParseUnsupportedFile { . ./src/commons.sh --source-only parse_configuration tests/commons_test.sh assertTrue "kw loaded an unsopported file" "[ 22 -eq $? ]" } function testDefaultConfigFile { local path_repo=$PWD . ./src/commons.sh --source-only declare -A expected_configurations=( [arch]="x86_64" [virtualizer]="qemu-system-x86_64" [qemu_path_image]="/home/USERKW/p/virty.qcow2" [qemu_hw_options]="-enable-kvm -daemonize -smp 2 -m 1024" [qemu_net_options]="-net nic -net user,hostfwd=tcp::2222-:22,smb=/home/USERKW" [ssh_ip]="localhost" [ssh_port]="2222" [mount_point]="/home/USERKW/p/mount" [alert]="n" [sound_alert_command]="paplay INSTALLPATH/sounds/complete.wav &" [visual_alert_command]="notify-send -i checkbox -t 10000 \"kw\" \"Command: \\\\\"\$COMMAND\\\\\" completed!\"" ) parse_configuration $path_repo/etc/kworkflow.config # check if configurations is contained in expected_configurations for k in "${!configurations[@]}"; do if [[ ${configurations[$k]} != ${expected_configurations[$k]} ]]; then fail "Expected configuration \"${k}\" to be \"${expected_configurations[$k]}\" (found \"${configurations[$k]}\")" fi done # check if expected_configurations is contained in configurations for k in "${!expected_configurations[@]}"; do if [[ ${configurations[$k]} != ${expected_configurations[$k]} ]]; then fail "Did not expected \"${k}\" to be in configurations" fi done true # Reset return value } function testLocalConfigFile { . ./src/commons.sh --source-only declare -A expected_configurations=( [arch]="arm" [virtualizer]="libvirt" [qemu_path_image]="/home/xpto/p/virty.qcow2" [ssh_ip]="127.0.0.1" [ssh_port]="3333" [mount_point]="/home/lala" ) cp tests/samples/kworkflow.config tests/.tmp_commons_test/ pushd tests/.tmp_commons_test > /dev/null parse_configuration $PWD/kworkflow.config popd > /dev/null # check if configurations is contained in expected_configurations for k in "${!configurations[@]}"; do if [[ ${configurations[$k]} != ${expected_configurations[$k]} ]]; then fail "Expected configuration \"${k}\" to be \"${expected_configurations[$k]}\" (found \"${configurations[$k]}\")" fi done # check if expected_configurations is contained in configurations for k in "${!expected_configurations[@]}"; do if [[ ${configurations[$k]} != ${expected_configurations[$k]} ]]; then fail "Did not expected \"${k}\" to be in configurations" fi done true # Reset return value } invoke_shunit kw-20191112/tests/external/0000755000175000017500000000000013574463526015274 5ustar rodrigorodrigokw-20191112/tests/external/get_maintainer.pl0000644000175000017500000020404513574463526020624 0ustar rodrigorodrigo#!/usr/bin/env perl # SPDX-License-Identifier: GPL-2.0 # # (c) 2007, Joe Perches # created from checkpatch.pl # # Print selected MAINTAINERS information for # the files modified in a patch or for a file # # usage: perl scripts/get_maintainer.pl [OPTIONS] # perl scripts/get_maintainer.pl [OPTIONS] -f use warnings; use strict; my $P = $0; my $V = '0.26'; use Getopt::Long qw(:config no_auto_abbrev); use Cwd; use File::Find; my $cur_path = fastgetcwd() . '/'; my $lk_path = "./"; my $email = 1; my $email_usename = 1; my $email_maintainer = 1; my $email_reviewer = 1; my $email_list = 1; my $email_moderated_list = 1; my $email_subscriber_list = 0; my $email_git_penguin_chiefs = 0; my $email_git = 0; my $email_git_all_signature_types = 0; my $email_git_blame = 0; my $email_git_blame_signatures = 1; my $email_git_fallback = 1; my $email_git_min_signatures = 1; my $email_git_max_maintainers = 5; my $email_git_min_percent = 5; my $email_git_since = "1-year-ago"; my $email_hg_since = "-365"; my $interactive = 0; my $email_remove_duplicates = 1; my $email_use_mailmap = 1; my $output_multiline = 1; my $output_separator = ", "; my $output_roles = 0; my $output_rolestats = 1; my $output_section_maxlen = 50; my $scm = 0; my $tree = 1; my $web = 0; my $subsystem = 0; my $status = 0; my $letters = ""; my $keywords = 1; my $sections = 0; my $file_emails = 0; my $from_filename = 0; my $pattern_depth = 0; my $self_test = undef; my $version = 0; my $help = 0; my $find_maintainer_files = 0; my $maintainer_path; my $vcs_used = 0; my $exit = 0; my %commit_author_hash; my %commit_signer_hash; my @penguin_chief = (); push(@penguin_chief, "Linus Torvalds:torvalds\@linux-foundation.org"); #Andrew wants in on most everything - 2009/01/14 #push(@penguin_chief, "Andrew Morton:akpm\@linux-foundation.org"); my @penguin_chief_names = (); foreach my $chief (@penguin_chief) { if ($chief =~ m/^(.*):(.*)/) { my $chief_name = $1; my $chief_addr = $2; push(@penguin_chief_names, $chief_name); } } my $penguin_chiefs = "\(" . join("|", @penguin_chief_names) . "\)"; # Signature types of people who are either # a) responsible for the code in question, or # b) familiar enough with it to give relevant feedback my @signature_tags = (); push(@signature_tags, "Signed-off-by:"); push(@signature_tags, "Reviewed-by:"); push(@signature_tags, "Acked-by:"); my $signature_pattern = "\(" . join("|", @signature_tags) . "\)"; # rfc822 email address - preloaded methods go here. my $rfc822_lwsp = "(?:(?:\\r\\n)?[ \\t])"; my $rfc822_char = '[\\000-\\377]'; # VCS command support: class-like functions and strings my %VCS_cmds; my %VCS_cmds_git = ( "execute_cmd" => \&git_execute_cmd, "available" => '(which("git") ne "") && (-e ".git")', "find_signers_cmd" => "git log --no-color --follow --since=\$email_git_since " . '--numstat --no-merges ' . '--format="GitCommit: %H%n' . 'GitAuthor: %an <%ae>%n' . 'GitDate: %aD%n' . 'GitSubject: %s%n' . '%b%n"' . " -- \$file", "find_commit_signers_cmd" => "git log --no-color " . '--numstat ' . '--format="GitCommit: %H%n' . 'GitAuthor: %an <%ae>%n' . 'GitDate: %aD%n' . 'GitSubject: %s%n' . '%b%n"' . " -1 \$commit", "find_commit_author_cmd" => "git log --no-color " . '--numstat ' . '--format="GitCommit: %H%n' . 'GitAuthor: %an <%ae>%n' . 'GitDate: %aD%n' . 'GitSubject: %s%n"' . " -1 \$commit", "blame_range_cmd" => "git blame -l -L \$diff_start,+\$diff_length \$file", "blame_file_cmd" => "git blame -l \$file", "commit_pattern" => "^GitCommit: ([0-9a-f]{40,40})", "blame_commit_pattern" => "^([0-9a-f]+) ", "author_pattern" => "^GitAuthor: (.*)", "subject_pattern" => "^GitSubject: (.*)", "stat_pattern" => "^(\\d+)\\t(\\d+)\\t\$file\$", "file_exists_cmd" => "git ls-files \$file", "list_files_cmd" => "git ls-files \$file", ); my %VCS_cmds_hg = ( "execute_cmd" => \&hg_execute_cmd, "available" => '(which("hg") ne "") && (-d ".hg")', "find_signers_cmd" => "hg log --date=\$email_hg_since " . "--template='HgCommit: {node}\\n" . "HgAuthor: {author}\\n" . "HgSubject: {desc}\\n'" . " -- \$file", "find_commit_signers_cmd" => "hg log " . "--template='HgSubject: {desc}\\n'" . " -r \$commit", "find_commit_author_cmd" => "hg log " . "--template='HgCommit: {node}\\n" . "HgAuthor: {author}\\n" . "HgSubject: {desc|firstline}\\n'" . " -r \$commit", "blame_range_cmd" => "", # not supported "blame_file_cmd" => "hg blame -n \$file", "commit_pattern" => "^HgCommit: ([0-9a-f]{40,40})", "blame_commit_pattern" => "^([ 0-9a-f]+):", "author_pattern" => "^HgAuthor: (.*)", "subject_pattern" => "^HgSubject: (.*)", "stat_pattern" => "^(\\d+)\t(\\d+)\t\$file\$", "file_exists_cmd" => "hg files \$file", "list_files_cmd" => "hg manifest -R \$file", ); my $conf = which_conf(".get_maintainer.conf"); if (-f $conf) { my @conf_args; open(my $conffile, '<', "$conf") or warn "$P: Can't find a readable .get_maintainer.conf file $!\n"; while (<$conffile>) { my $line = $_; $line =~ s/\s*\n?$//g; $line =~ s/^\s*//g; $line =~ s/\s+/ /g; next if ($line =~ m/^\s*#/); next if ($line =~ m/^\s*$/); my @words = split(" ", $line); foreach my $word (@words) { last if ($word =~ m/^#/); push (@conf_args, $word); } } close($conffile); unshift(@ARGV, @conf_args) if @conf_args; } my @ignore_emails = (); my $ignore_file = which_conf(".get_maintainer.ignore"); if (-f $ignore_file) { open(my $ignore, '<', "$ignore_file") or warn "$P: Can't find a readable .get_maintainer.ignore file $!\n"; while (<$ignore>) { my $line = $_; $line =~ s/\s*\n?$//; $line =~ s/^\s*//; $line =~ s/\s+$//; $line =~ s/#.*$//; next if ($line =~ m/^\s*$/); if (rfc822_valid($line)) { push(@ignore_emails, $line); } } close($ignore); } if ($#ARGV > 0) { foreach (@ARGV) { if ($_ =~ /^-{1,2}self-test(?:=|$)/) { die "$P: using --self-test does not allow any other option or argument\n"; } } } if (!GetOptions( 'email!' => \$email, 'git!' => \$email_git, 'git-all-signature-types!' => \$email_git_all_signature_types, 'git-blame!' => \$email_git_blame, 'git-blame-signatures!' => \$email_git_blame_signatures, 'git-fallback!' => \$email_git_fallback, 'git-chief-penguins!' => \$email_git_penguin_chiefs, 'git-min-signatures=i' => \$email_git_min_signatures, 'git-max-maintainers=i' => \$email_git_max_maintainers, 'git-min-percent=i' => \$email_git_min_percent, 'git-since=s' => \$email_git_since, 'hg-since=s' => \$email_hg_since, 'i|interactive!' => \$interactive, 'remove-duplicates!' => \$email_remove_duplicates, 'mailmap!' => \$email_use_mailmap, 'm!' => \$email_maintainer, 'r!' => \$email_reviewer, 'n!' => \$email_usename, 'l!' => \$email_list, 'moderated!' => \$email_moderated_list, 's!' => \$email_subscriber_list, 'multiline!' => \$output_multiline, 'roles!' => \$output_roles, 'rolestats!' => \$output_rolestats, 'separator=s' => \$output_separator, 'subsystem!' => \$subsystem, 'status!' => \$status, 'scm!' => \$scm, 'tree!' => \$tree, 'web!' => \$web, 'letters=s' => \$letters, 'pattern-depth=i' => \$pattern_depth, 'k|keywords!' => \$keywords, 'sections!' => \$sections, 'fe|file-emails!' => \$file_emails, 'f|file' => \$from_filename, 'find-maintainer-files' => \$find_maintainer_files, 'mpath|maintainer-path=s' => \$maintainer_path, 'self-test:s' => \$self_test, 'v|version' => \$version, 'h|help|usage' => \$help, )) { die "$P: invalid argument - use --help if necessary\n"; } if ($help != 0) { usage(); exit 0; } if ($version != 0) { print("${P} ${V}\n"); exit 0; } if (defined $self_test) { read_all_maintainer_files(); self_test(); exit 0; } if (-t STDIN && !@ARGV) { # We're talking to a terminal, but have no command line arguments. die "$P: missing patchfile or -f file - use --help if necessary\n"; } $output_multiline = 0 if ($output_separator ne ", "); $output_rolestats = 1 if ($interactive); $output_roles = 1 if ($output_rolestats); if ($sections || $letters ne "") { $sections = 1; $email = 0; $email_list = 0; $scm = 0; $status = 0; $subsystem = 0; $web = 0; $keywords = 0; $interactive = 0; } else { my $selections = $email + $scm + $status + $subsystem + $web; if ($selections == 0) { die "$P: Missing required option: email, scm, status, subsystem or web\n"; } } if ($email && ($email_maintainer + $email_reviewer + $email_list + $email_subscriber_list + $email_git + $email_git_penguin_chiefs + $email_git_blame) == 0) { die "$P: Please select at least 1 email option\n"; } if ($tree && !top_of_kernel_tree($lk_path)) { die "$P: The current directory does not appear to be " . "a linux kernel source tree.\n"; } ## Read MAINTAINERS for type/value pairs my @typevalue = (); my %keyword_hash; my @mfiles = (); my @self_test_info = (); sub read_maintainer_file { my ($file) = @_; open (my $maint, '<', "$file") or die "$P: Can't open MAINTAINERS file '$file': $!\n"; my $i = 1; while (<$maint>) { my $line = $_; chomp $line; if ($line =~ m/^([A-Z]):\s*(.*)/) { my $type = $1; my $value = $2; ##Filename pattern matching if ($type eq "F" || $type eq "X") { $value =~ s@\.@\\\.@g; ##Convert . to \. $value =~ s/\*/\.\*/g; ##Convert * to .* $value =~ s/\?/\./g; ##Convert ? to . ##if pattern is a directory and it lacks a trailing slash, add one if ((-d $value)) { $value =~ s@([^/])$@$1/@; } } elsif ($type eq "K") { $keyword_hash{@typevalue} = $value; } push(@typevalue, "$type:$value"); } elsif (!(/^\s*$/ || /^\s*\#/)) { push(@typevalue, $line); } if (defined $self_test) { push(@self_test_info, {file=>$file, linenr=>$i, line=>$line}); } $i++; } close($maint); } sub find_is_maintainer_file { my ($file) = $_; return if ($file !~ m@/MAINTAINERS$@); $file = $File::Find::name; return if (! -f $file); push(@mfiles, $file); } sub find_ignore_git { return grep { $_ !~ /^\.git$/; } @_; } read_all_maintainer_files(); sub read_all_maintainer_files { my $path = "${lk_path}MAINTAINERS"; if (defined $maintainer_path) { $path = $maintainer_path; # Perl Cookbook tilde expansion if necessary $path =~ s@^~([^/]*)@ $1 ? (getpwnam($1))[7] : ( $ENV{HOME} || $ENV{LOGDIR} || (getpwuid($<))[7])@ex; } if (-d $path) { $path .= '/' if ($path !~ m@/$@); if ($find_maintainer_files) { find( { wanted => \&find_is_maintainer_file, preprocess => \&find_ignore_git, no_chdir => 1, }, "$path"); } else { opendir(DIR, "$path") or die $!; my @files = readdir(DIR); closedir(DIR); foreach my $file (@files) { push(@mfiles, "$path$file") if ($file !~ /^\./); } } } elsif (-f "$path") { push(@mfiles, "$path"); } else { die "$P: MAINTAINER file not found '$path'\n"; } die "$P: No MAINTAINER files found in '$path'\n" if (scalar(@mfiles) == 0); foreach my $file (@mfiles) { read_maintainer_file("$file"); } } # # Read mail address map # my $mailmap; read_mailmap(); sub read_mailmap { $mailmap = { names => {}, addresses => {} }; return if (!$email_use_mailmap || !(-f "${lk_path}.mailmap")); open(my $mailmap_file, '<', "${lk_path}.mailmap") or warn "$P: Can't open .mailmap: $!\n"; while (<$mailmap_file>) { s/#.*$//; #strip comments s/^\s+|\s+$//g; #trim next if (/^\s*$/); #skip empty lines #entries have one of the following formats: # name1 # # name1 # name1 name2 # (see man git-shortlog) if (/^([^<]+)<([^>]+)>$/) { my $real_name = $1; my $address = $2; $real_name =~ s/\s+$//; ($real_name, $address) = parse_email("$real_name <$address>"); $mailmap->{names}->{$address} = $real_name; } elsif (/^<([^>]+)>\s*<([^>]+)>$/) { my $real_address = $1; my $wrong_address = $2; $mailmap->{addresses}->{$wrong_address} = $real_address; } elsif (/^(.+)<([^>]+)>\s*<([^>]+)>$/) { my $real_name = $1; my $real_address = $2; my $wrong_address = $3; $real_name =~ s/\s+$//; ($real_name, $real_address) = parse_email("$real_name <$real_address>"); $mailmap->{names}->{$wrong_address} = $real_name; $mailmap->{addresses}->{$wrong_address} = $real_address; } elsif (/^(.+)<([^>]+)>\s*(.+)\s*<([^>]+)>$/) { my $real_name = $1; my $real_address = $2; my $wrong_name = $3; my $wrong_address = $4; $real_name =~ s/\s+$//; ($real_name, $real_address) = parse_email("$real_name <$real_address>"); $wrong_name =~ s/\s+$//; ($wrong_name, $wrong_address) = parse_email("$wrong_name <$wrong_address>"); my $wrong_email = format_email($wrong_name, $wrong_address, 1); $mailmap->{names}->{$wrong_email} = $real_name; $mailmap->{addresses}->{$wrong_email} = $real_address; } } close($mailmap_file); } ## use the filenames on the command line or find the filenames in the patchfiles my @files = (); my @range = (); my @keyword_tvi = (); my @file_emails = (); if (!@ARGV) { push(@ARGV, "&STDIN"); } foreach my $file (@ARGV) { if ($file ne "&STDIN") { ##if $file is a directory and it lacks a trailing slash, add one if ((-d $file)) { $file =~ s@([^/])$@$1/@; } elsif (!(-f $file)) { die "$P: file '${file}' not found\n"; } } if ($from_filename || ($file ne "&STDIN" && vcs_file_exists($file))) { $file =~ s/^\Q${cur_path}\E//; #strip any absolute path $file =~ s/^\Q${lk_path}\E//; #or the path to the lk tree push(@files, $file); if ($file ne "MAINTAINERS" && -f $file && ($keywords || $file_emails)) { open(my $f, '<', $file) or die "$P: Can't open $file: $!\n"; my $text = do { local($/) ; <$f> }; close($f); if ($keywords) { foreach my $line (keys %keyword_hash) { if ($text =~ m/$keyword_hash{$line}/x) { push(@keyword_tvi, $line); } } } if ($file_emails) { my @poss_addr = $text =~ m$[A-Za-zÀ-ÿ\"\' \,\.\+-]*\s*[\,]*\s*[\(\<\{]{0,1}[A-Za-z0-9_\.\+-]+\@[A-Za-z0-9\.-]+\.[A-Za-z0-9]+[\)\>\}]{0,1}$g; push(@file_emails, clean_file_emails(@poss_addr)); } } } else { my $file_cnt = @files; my $lastfile; open(my $patch, "< $file") or die "$P: Can't open $file: $!\n"; # We can check arbitrary information before the patch # like the commit message, mail headers, etc... # This allows us to match arbitrary keywords against any part # of a git format-patch generated file (subject tags, etc...) my $patch_prefix = ""; #Parsing the intro while (<$patch>) { my $patch_line = $_; if (m/^ mode change [0-7]+ => [0-7]+ (\S+)\s*$/) { my $filename = $1; push(@files, $filename); } elsif (m/^rename (?:from|to) (\S+)\s*$/) { my $filename = $1; push(@files, $filename); } elsif (m/^diff --git a\/(\S+) b\/(\S+)\s*$/) { my $filename1 = $1; my $filename2 = $2; push(@files, $filename1); push(@files, $filename2); } elsif (m/^\+\+\+\s+(\S+)/ or m/^---\s+(\S+)/) { my $filename = $1; $filename =~ s@^[^/]*/@@; $filename =~ s@\n@@; $lastfile = $filename; push(@files, $filename); $patch_prefix = "^[+-].*"; #Now parsing the actual patch } elsif (m/^\@\@ -(\d+),(\d+)/) { if ($email_git_blame) { push(@range, "$lastfile:$1:$2"); } } elsif ($keywords) { foreach my $line (keys %keyword_hash) { if ($patch_line =~ m/${patch_prefix}$keyword_hash{$line}/x) { push(@keyword_tvi, $line); } } } } close($patch); if ($file_cnt == @files) { warn "$P: file '${file}' doesn't appear to be a patch. " . "Add -f to options?\n"; } @files = sort_and_uniq(@files); } } @file_emails = uniq(@file_emails); my %email_hash_name; my %email_hash_address; my @email_to = (); my %hash_list_to; my @list_to = (); my @scm = (); my @web = (); my @subsystem = (); my @status = (); my %deduplicate_name_hash = (); my %deduplicate_address_hash = (); my @maintainers = get_maintainers(); if (@maintainers) { @maintainers = merge_email(@maintainers); output(@maintainers); } if ($scm) { @scm = uniq(@scm); output(@scm); } if ($status) { @status = uniq(@status); output(@status); } if ($subsystem) { @subsystem = uniq(@subsystem); output(@subsystem); } if ($web) { @web = uniq(@web); output(@web); } exit($exit); sub self_test { my @lsfiles = (); my @good_links = (); my @bad_links = (); my @section_headers = (); my $index = 0; @lsfiles = vcs_list_files($lk_path); for my $x (@self_test_info) { $index++; ## Section header duplication and missing section content if (($self_test eq "" || $self_test =~ /\bsections\b/) && $x->{line} =~ /^\S[^:]/ && defined $self_test_info[$index] && $self_test_info[$index]->{line} =~ /^([A-Z]):\s*\S/) { my $has_S = 0; my $has_F = 0; my $has_ML = 0; my $status = ""; if (grep(m@^\Q$x->{line}\E@, @section_headers)) { print("$x->{file}:$x->{linenr}: warning: duplicate section header\t$x->{line}\n"); } else { push(@section_headers, $x->{line}); } my $nextline = $index; while (defined $self_test_info[$nextline] && $self_test_info[$nextline]->{line} =~ /^([A-Z]):\s*(\S.*)/) { my $type = $1; my $value = $2; if ($type eq "S") { $has_S = 1; $status = $value; } elsif ($type eq "F" || $type eq "N") { $has_F = 1; } elsif ($type eq "M" || $type eq "R" || $type eq "L") { $has_ML = 1; } $nextline++; } if (!$has_ML && $status !~ /orphan|obsolete/i) { print("$x->{file}:$x->{linenr}: warning: section without email address\t$x->{line}\n"); } if (!$has_S) { print("$x->{file}:$x->{linenr}: warning: section without status \t$x->{line}\n"); } if (!$has_F) { print("$x->{file}:$x->{linenr}: warning: section without file pattern\t$x->{line}\n"); } } next if ($x->{line} !~ /^([A-Z]):\s*(.*)/); my $type = $1; my $value = $2; ## Filename pattern matching if (($type eq "F" || $type eq "X") && ($self_test eq "" || $self_test =~ /\bpatterns\b/)) { $value =~ s@\.@\\\.@g; ##Convert . to \. $value =~ s/\*/\.\*/g; ##Convert * to .* $value =~ s/\?/\./g; ##Convert ? to . ##if pattern is a directory and it lacks a trailing slash, add one if ((-d $value)) { $value =~ s@([^/])$@$1/@; } if (!grep(m@^$value@, @lsfiles)) { print("$x->{file}:$x->{linenr}: warning: no file matches\t$x->{line}\n"); } ## Link reachability } elsif (($type eq "W" || $type eq "Q" || $type eq "B") && $value =~ /^https?:/ && ($self_test eq "" || $self_test =~ /\blinks\b/)) { next if (grep(m@^\Q$value\E$@, @good_links)); my $isbad = 0; if (grep(m@^\Q$value\E$@, @bad_links)) { $isbad = 1; } else { my $output = `wget --spider -q --no-check-certificate --timeout 10 --tries 1 $value`; if ($? == 0) { push(@good_links, $value); } else { push(@bad_links, $value); $isbad = 1; } } if ($isbad) { print("$x->{file}:$x->{linenr}: warning: possible bad link\t$x->{line}\n"); } ## SCM reachability } elsif ($type eq "T" && ($self_test eq "" || $self_test =~ /\bscm\b/)) { next if (grep(m@^\Q$value\E$@, @good_links)); my $isbad = 0; if (grep(m@^\Q$value\E$@, @bad_links)) { $isbad = 1; } elsif ($value !~ /^(?:git|quilt|hg)\s+\S/) { print("$x->{file}:$x->{linenr}: warning: malformed entry\t$x->{line}\n"); } elsif ($value =~ /^git\s+(\S+)(\s+([^\(]+\S+))?/) { my $url = $1; my $branch = ""; $branch = $3 if $3; my $output = `git ls-remote --exit-code -h "$url" $branch > /dev/null 2>&1`; if ($? == 0) { push(@good_links, $value); } else { push(@bad_links, $value); $isbad = 1; } } elsif ($value =~ /^(?:quilt|hg)\s+(https?:\S+)/) { my $url = $1; my $output = `wget --spider -q --no-check-certificate --timeout 10 --tries 1 $url`; if ($? == 0) { push(@good_links, $value); } else { push(@bad_links, $value); $isbad = 1; } } if ($isbad) { print("$x->{file}:$x->{linenr}: warning: possible bad link\t$x->{line}\n"); } } } } sub ignore_email_address { my ($address) = @_; foreach my $ignore (@ignore_emails) { return 1 if ($ignore eq $address); } return 0; } sub range_is_maintained { my ($start, $end) = @_; for (my $i = $start; $i < $end; $i++) { my $line = $typevalue[$i]; if ($line =~ m/^([A-Z]):\s*(.*)/) { my $type = $1; my $value = $2; if ($type eq 'S') { if ($value =~ /(maintain|support)/i) { return 1; } } } } return 0; } sub range_has_maintainer { my ($start, $end) = @_; for (my $i = $start; $i < $end; $i++) { my $line = $typevalue[$i]; if ($line =~ m/^([A-Z]):\s*(.*)/) { my $type = $1; my $value = $2; if ($type eq 'M') { return 1; } } } return 0; } sub get_maintainers { %email_hash_name = (); %email_hash_address = (); %commit_author_hash = (); %commit_signer_hash = (); @email_to = (); %hash_list_to = (); @list_to = (); @scm = (); @web = (); @subsystem = (); @status = (); %deduplicate_name_hash = (); %deduplicate_address_hash = (); if ($email_git_all_signature_types) { $signature_pattern = "(.+?)[Bb][Yy]:"; } else { $signature_pattern = "\(" . join("|", @signature_tags) . "\)"; } # Find responsible parties my %exact_pattern_match_hash = (); foreach my $file (@files) { my %hash; my $tvi = find_first_section(); while ($tvi < @typevalue) { my $start = find_starting_index($tvi); my $end = find_ending_index($tvi); my $exclude = 0; my $i; #Do not match excluded file patterns for ($i = $start; $i < $end; $i++) { my $line = $typevalue[$i]; if ($line =~ m/^([A-Z]):\s*(.*)/) { my $type = $1; my $value = $2; if ($type eq 'X') { if (file_match_pattern($file, $value)) { $exclude = 1; last; } } } } if (!$exclude) { for ($i = $start; $i < $end; $i++) { my $line = $typevalue[$i]; if ($line =~ m/^([A-Z]):\s*(.*)/) { my $type = $1; my $value = $2; if ($type eq 'F') { if (file_match_pattern($file, $value)) { my $value_pd = ($value =~ tr@/@@); my $file_pd = ($file =~ tr@/@@); $value_pd++ if (substr($value,-1,1) ne "/"); $value_pd = -1 if ($value =~ /^\.\*/); if ($value_pd >= $file_pd && range_is_maintained($start, $end) && range_has_maintainer($start, $end)) { $exact_pattern_match_hash{$file} = 1; } if ($pattern_depth == 0 || (($file_pd - $value_pd) < $pattern_depth)) { $hash{$tvi} = $value_pd; } } } elsif ($type eq 'N') { if ($file =~ m/$value/x) { $hash{$tvi} = 0; } } } } } $tvi = $end + 1; } foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) { add_categories($line); if ($sections) { my $i; my $start = find_starting_index($line); my $end = find_ending_index($line); for ($i = $start; $i < $end; $i++) { my $line = $typevalue[$i]; if ($line =~ /^[FX]:/) { ##Restore file patterns $line =~ s/([^\\])\.([^\*])/$1\?$2/g; $line =~ s/([^\\])\.$/$1\?/g; ##Convert . back to ? $line =~ s/\\\./\./g; ##Convert \. to . $line =~ s/\.\*/\*/g; ##Convert .* to * } my $count = $line =~ s/^([A-Z]):/$1:\t/g; if ($letters eq "" || (!$count || $letters =~ /$1/i)) { print("$line\n"); } } print("\n"); } } } if ($keywords) { @keyword_tvi = sort_and_uniq(@keyword_tvi); foreach my $line (@keyword_tvi) { add_categories($line); } } foreach my $email (@email_to, @list_to) { $email->[0] = deduplicate_email($email->[0]); } foreach my $file (@files) { if ($email && ($email_git || ($email_git_fallback && !$exact_pattern_match_hash{$file}))) { vcs_file_signoffs($file); } if ($email && $email_git_blame) { vcs_file_blame($file); } } if ($email) { foreach my $chief (@penguin_chief) { if ($chief =~ m/^(.*):(.*)/) { my $email_address; $email_address = format_email($1, $2, $email_usename); if ($email_git_penguin_chiefs) { push(@email_to, [$email_address, 'chief penguin']); } else { @email_to = grep($_->[0] !~ /${email_address}/, @email_to); } } } foreach my $email (@file_emails) { my ($name, $address) = parse_email($email); my $tmp_email = format_email($name, $address, $email_usename); push_email_address($tmp_email, ''); add_role($tmp_email, 'in file'); } } my @to = (); if ($email || $email_list) { if ($email) { @to = (@to, @email_to); } if ($email_list) { @to = (@to, @list_to); } } if ($interactive) { @to = interactive_get_maintainers(\@to); } return @to; } sub file_match_pattern { my ($file, $pattern) = @_; if (substr($pattern, -1) eq "/") { if ($file =~ m@^$pattern@) { return 1; } } else { if ($file =~ m@^$pattern@) { my $s1 = ($file =~ tr@/@@); my $s2 = ($pattern =~ tr@/@@); if ($s1 == $s2) { return 1; } } } return 0; } sub usage { print < print email address(es) if any --git => include recent git \*-by: signers --git-all-signature-types => include signers regardless of signature type or use only ${signature_pattern} signers (default: $email_git_all_signature_types) --git-fallback => use git when no exact MAINTAINERS pattern (default: $email_git_fallback) --git-chief-penguins => include ${penguin_chiefs} --git-min-signatures => number of signatures required (default: $email_git_min_signatures) --git-max-maintainers => maximum maintainers to add (default: $email_git_max_maintainers) --git-min-percent => minimum percentage of commits required (default: $email_git_min_percent) --git-blame => use git blame to find modified commits for patch or file --git-blame-signatures => when used with --git-blame, also include all commit signers --git-since => git history to use (default: $email_git_since) --hg-since => hg history to use (default: $email_hg_since) --interactive => display a menu (mostly useful if used with the --git option) --m => include maintainer(s) if any --r => include reviewer(s) if any --n => include name 'Full Name ' --l => include list(s) if any --moderated => include moderated lists(s) if any (default: true) --s => include subscriber only list(s) if any (default: false) --remove-duplicates => minimize duplicate email names/addresses --roles => show roles (status:subsystem, git-signer, list, etc...) --rolestats => show roles and statistics (commits/total_commits, %) --file-emails => add email addresses found in -f file (default: 0 (off)) --scm => print SCM tree(s) if any --status => print status if any --subsystem => print subsystem name if any --web => print website(s) if any Output type options: --separator [, ] => separator for multiple entries on 1 line using --separator also sets --nomultiline if --separator is not [, ] --multiline => print 1 entry per line Other options: --pattern-depth => Number of pattern directory traversals (default: 0 (all)) --keywords => scan patch for keywords (default: $keywords) --sections => print all of the subsystem sections with pattern matches --letters => print all matching 'letter' types from all matching sections --mailmap => use .mailmap file (default: $email_use_mailmap) --no-tree => run without a kernel tree --self-test => show potential issues with MAINTAINERS file content --version => show version --help => show this help information Default options: [--email --tree --nogit --git-fallback --m --r --n --l --multiline --pattern-depth=0 --remove-duplicates --rolestats] Notes: Using "-f directory" may give unexpected results: Used with "--git", git signators for _all_ files in and below directory are examined as git recurses directories. Any specified X: (exclude) pattern matches are _not_ ignored. Used with "--nogit", directory is used as a pattern match, no individual file within the directory or subdirectory is matched. Used with "--git-blame", does not iterate all files in directory Using "--git-blame" is slow and may add old committers and authors that are no longer active maintainers to the output. Using "--roles" or "--rolestats" with git send-email --cc-cmd or any other automated tools that expect only ["name"] may not work because of additional output after . Using "--rolestats" and "--git-blame" shows the #/total=% commits, not the percentage of the entire file authored. # of commits is not a good measure of amount of code authored. 1 major commit may contain a thousand lines, 5 trivial commits may modify a single line. If git is not installed, but mercurial (hg) is installed and an .hg repository exists, the following options apply to mercurial: --git, --git-min-signatures, --git-max-maintainers, --git-min-percent, and --git-blame Use --hg-since not --git-since to control date selection File ".get_maintainer.conf", if it exists in the linux kernel source root directory, can change whatever get_maintainer defaults are desired. Entries in this file can be any command line argument. This file is prepended to any additional command line arguments. Multiple lines and # comments are allowed. Most options have both positive and negative forms. The negative forms for -- are --no and --no-. EOT } sub top_of_kernel_tree { my ($lk_path) = @_; if ($lk_path ne "" && substr($lk_path,length($lk_path)-1,1) ne "/") { $lk_path .= "/"; } if ( (-f "${lk_path}COPYING") && (-f "${lk_path}CREDITS") && (-f "${lk_path}Kbuild") && (-e "${lk_path}MAINTAINERS") && (-f "${lk_path}Makefile") && (-f "${lk_path}README") && (-d "${lk_path}Documentation") && (-d "${lk_path}arch") && (-d "${lk_path}include") && (-d "${lk_path}drivers") && (-d "${lk_path}fs") && (-d "${lk_path}init") && (-d "${lk_path}ipc") && (-d "${lk_path}kernel") && (-d "${lk_path}lib") && (-d "${lk_path}scripts")) { return 1; } return 0; } sub parse_email { my ($formatted_email) = @_; my $name = ""; my $address = ""; if ($formatted_email =~ /^([^<]+)<(.+\@.*)>.*$/) { $name = $1; $address = $2; } elsif ($formatted_email =~ /^\s*<(.+\@\S*)>.*$/) { $address = $1; } elsif ($formatted_email =~ /^(.+\@\S*).*$/) { $address = $1; } $name =~ s/^\s+|\s+$//g; $name =~ s/^\"|\"$//g; $address =~ s/^\s+|\s+$//g; if ($name =~ /[^\w \-]/i) { ##has "must quote" chars $name =~ s/(?"; } } else { $formatted_email = $address; } return $formatted_email; } sub find_first_section { my $index = 0; while ($index < @typevalue) { my $tv = $typevalue[$index]; if (($tv =~ m/^([A-Z]):\s*(.*)/)) { last; } $index++; } return $index; } sub find_starting_index { my ($index) = @_; while ($index > 0) { my $tv = $typevalue[$index]; if (!($tv =~ m/^([A-Z]):\s*(.*)/)) { last; } $index--; } return $index; } sub find_ending_index { my ($index) = @_; while ($index < @typevalue) { my $tv = $typevalue[$index]; if (!($tv =~ m/^([A-Z]):\s*(.*)/)) { last; } $index++; } return $index; } sub get_subsystem_name { my ($index) = @_; my $start = find_starting_index($index); my $subsystem = $typevalue[$start]; if ($output_section_maxlen && length($subsystem) > $output_section_maxlen) { $subsystem = substr($subsystem, 0, $output_section_maxlen - 3); $subsystem =~ s/\s*$//; $subsystem = $subsystem . "..."; } return $subsystem; } sub get_maintainer_role { my ($index) = @_; my $i; my $start = find_starting_index($index); my $end = find_ending_index($index); my $role = "unknown"; my $subsystem = get_subsystem_name($index); for ($i = $start + 1; $i < $end; $i++) { my $tv = $typevalue[$i]; if ($tv =~ m/^([A-Z]):\s*(.*)/) { my $ptype = $1; my $pvalue = $2; if ($ptype eq "S") { $role = $pvalue; } } } $role = lc($role); if ($role eq "supported") { $role = "supporter"; } elsif ($role eq "maintained") { $role = "maintainer"; } elsif ($role eq "odd fixes") { $role = "odd fixer"; } elsif ($role eq "orphan") { $role = "orphan minder"; } elsif ($role eq "obsolete") { $role = "obsolete minder"; } elsif ($role eq "buried alive in reporters") { $role = "chief penguin"; } return $role . ":" . $subsystem; } sub get_list_role { my ($index) = @_; my $subsystem = get_subsystem_name($index); if ($subsystem eq "THE REST") { $subsystem = ""; } return $subsystem; } sub add_categories { my ($index) = @_; my $i; my $start = find_starting_index($index); my $end = find_ending_index($index); push(@subsystem, $typevalue[$start]); for ($i = $start + 1; $i < $end; $i++) { my $tv = $typevalue[$i]; if ($tv =~ m/^([A-Z]):\s*(.*)/) { my $ptype = $1; my $pvalue = $2; if ($ptype eq "L") { my $list_address = $pvalue; my $list_additional = ""; my $list_role = get_list_role($i); if ($list_role ne "") { $list_role = ":" . $list_role; } if ($list_address =~ m/([^\s]+)\s+(.*)$/) { $list_address = $1; $list_additional = $2; } if ($list_additional =~ m/subscribers-only/) { if ($email_subscriber_list) { if (!$hash_list_to{lc($list_address)}) { $hash_list_to{lc($list_address)} = 1; push(@list_to, [$list_address, "subscriber list${list_role}"]); } } } else { if ($email_list) { if (!$hash_list_to{lc($list_address)}) { if ($list_additional =~ m/moderated/) { if ($email_moderated_list) { $hash_list_to{lc($list_address)} = 1; push(@list_to, [$list_address, "moderated list${list_role}"]); } } else { $hash_list_to{lc($list_address)} = 1; push(@list_to, [$list_address, "open list${list_role}"]); } } } } } elsif ($ptype eq "M") { my ($name, $address) = parse_email($pvalue); if ($name eq "") { if ($i > 0) { my $tv = $typevalue[$i - 1]; if ($tv =~ m/^([A-Z]):\s*(.*)/) { if ($1 eq "P") { $name = $2; $pvalue = format_email($name, $address, $email_usename); } } } } if ($email_maintainer) { my $role = get_maintainer_role($i); push_email_addresses($pvalue, $role); } } elsif ($ptype eq "R") { my ($name, $address) = parse_email($pvalue); if ($name eq "") { if ($i > 0) { my $tv = $typevalue[$i - 1]; if ($tv =~ m/^([A-Z]):\s*(.*)/) { if ($1 eq "P") { $name = $2; $pvalue = format_email($name, $address, $email_usename); } } } } if ($email_reviewer) { my $subsystem = get_subsystem_name($i); push_email_addresses($pvalue, "reviewer:$subsystem"); } } elsif ($ptype eq "T") { push(@scm, $pvalue); } elsif ($ptype eq "W") { push(@web, $pvalue); } elsif ($ptype eq "S") { push(@status, $pvalue); } } } } sub email_inuse { my ($name, $address) = @_; return 1 if (($name eq "") && ($address eq "")); return 1 if (($name ne "") && exists($email_hash_name{lc($name)})); return 1 if (($address ne "") && exists($email_hash_address{lc($address)})); return 0; } sub push_email_address { my ($line, $role) = @_; my ($name, $address) = parse_email($line); if ($address eq "") { return 0; } if (!$email_remove_duplicates) { push(@email_to, [format_email($name, $address, $email_usename), $role]); } elsif (!email_inuse($name, $address)) { push(@email_to, [format_email($name, $address, $email_usename), $role]); $email_hash_name{lc($name)}++ if ($name ne ""); $email_hash_address{lc($address)}++; } return 1; } sub push_email_addresses { my ($address, $role) = @_; my @address_list = (); if (rfc822_valid($address)) { push_email_address($address, $role); } elsif (@address_list = rfc822_validlist($address)) { my $array_count = shift(@address_list); while (my $entry = shift(@address_list)) { push_email_address($entry, $role); } } else { if (!push_email_address($address, $role)) { warn("Invalid MAINTAINERS address: '" . $address . "'\n"); } } } sub add_role { my ($line, $role) = @_; my ($name, $address) = parse_email($line); my $email = format_email($name, $address, $email_usename); foreach my $entry (@email_to) { if ($email_remove_duplicates) { my ($entry_name, $entry_address) = parse_email($entry->[0]); if (($name eq $entry_name || $address eq $entry_address) && ($role eq "" || !($entry->[1] =~ m/$role/)) ) { if ($entry->[1] eq "") { $entry->[1] = "$role"; } else { $entry->[1] = "$entry->[1],$role"; } } } else { if ($email eq $entry->[0] && ($role eq "" || !($entry->[1] =~ m/$role/)) ) { if ($entry->[1] eq "") { $entry->[1] = "$role"; } else { $entry->[1] = "$entry->[1],$role"; } } } } } sub which { my ($bin) = @_; foreach my $path (split(/:/, $ENV{PATH})) { if (-e "$path/$bin") { return "$path/$bin"; } } return ""; } sub which_conf { my ($conf) = @_; foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { if (-e "$path/$conf") { return "$path/$conf"; } } return ""; } sub mailmap_email { my ($line) = @_; my ($name, $address) = parse_email($line); my $email = format_email($name, $address, 1); my $real_name = $name; my $real_address = $address; if (exists $mailmap->{names}->{$email} || exists $mailmap->{addresses}->{$email}) { if (exists $mailmap->{names}->{$email}) { $real_name = $mailmap->{names}->{$email}; } if (exists $mailmap->{addresses}->{$email}) { $real_address = $mailmap->{addresses}->{$email}; } } else { if (exists $mailmap->{names}->{$address}) { $real_name = $mailmap->{names}->{$address}; } if (exists $mailmap->{addresses}->{$address}) { $real_address = $mailmap->{addresses}->{$address}; } } return format_email($real_name, $real_address, 1); } sub mailmap { my (@addresses) = @_; my @mapped_emails = (); foreach my $line (@addresses) { push(@mapped_emails, mailmap_email($line)); } merge_by_realname(@mapped_emails) if ($email_use_mailmap); return @mapped_emails; } sub merge_by_realname { my %address_map; my (@emails) = @_; foreach my $email (@emails) { my ($name, $address) = parse_email($email); if (exists $address_map{$name}) { $address = $address_map{$name}; $email = format_email($name, $address, 1); } else { $address_map{$name} = $address; } } } sub git_execute_cmd { my ($cmd) = @_; my @lines = (); my $output = `$cmd`; $output =~ s/^\s*//gm; @lines = split("\n", $output); return @lines; } sub hg_execute_cmd { my ($cmd) = @_; my @lines = (); my $output = `$cmd`; @lines = split("\n", $output); return @lines; } sub extract_formatted_signatures { my (@signature_lines) = @_; my @type = @signature_lines; s/\s*(.*):.*/$1/ for (@type); # cut -f2- -d":" s/\s*.*:\s*(.+)\s*/$1/ for (@signature_lines); ## Reformat email addresses (with names) to avoid badly written signatures foreach my $signer (@signature_lines) { $signer = deduplicate_email($signer); } return (\@type, \@signature_lines); } sub vcs_find_signers { my ($cmd, $file) = @_; my $commits; my @lines = (); my @signatures = (); my @authors = (); my @stats = (); @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); my $pattern = $VCS_cmds{"commit_pattern"}; my $author_pattern = $VCS_cmds{"author_pattern"}; my $stat_pattern = $VCS_cmds{"stat_pattern"}; $stat_pattern =~ s/(\$\w+)/$1/eeg; #interpolate $stat_pattern $commits = grep(/$pattern/, @lines); # of commits @authors = grep(/$author_pattern/, @lines); @signatures = grep(/^[ \t]*${signature_pattern}.*\@.*$/, @lines); @stats = grep(/$stat_pattern/, @lines); # print("stats: <@stats>\n"); return (0, \@signatures, \@authors, \@stats) if !@signatures; save_commits_by_author(@lines) if ($interactive); save_commits_by_signer(@lines) if ($interactive); if (!$email_git_penguin_chiefs) { @signatures = grep(!/${penguin_chiefs}/i, @signatures); } my ($author_ref, $authors_ref) = extract_formatted_signatures(@authors); my ($types_ref, $signers_ref) = extract_formatted_signatures(@signatures); return ($commits, $signers_ref, $authors_ref, \@stats); } sub vcs_find_author { my ($cmd) = @_; my @lines = (); @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); if (!$email_git_penguin_chiefs) { @lines = grep(!/${penguin_chiefs}/i, @lines); } return @lines if !@lines; my @authors = (); foreach my $line (@lines) { if ($line =~ m/$VCS_cmds{"author_pattern"}/) { my $author = $1; my ($name, $address) = parse_email($author); $author = format_email($name, $address, 1); push(@authors, $author); } } save_commits_by_author(@lines) if ($interactive); save_commits_by_signer(@lines) if ($interactive); return @authors; } sub vcs_save_commits { my ($cmd) = @_; my @lines = (); my @commits = (); @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); foreach my $line (@lines) { if ($line =~ m/$VCS_cmds{"blame_commit_pattern"}/) { push(@commits, $1); } } return @commits; } sub vcs_blame { my ($file) = @_; my $cmd; my @commits = (); return @commits if (!(-f $file)); if (@range && $VCS_cmds{"blame_range_cmd"} eq "") { my @all_commits = (); $cmd = $VCS_cmds{"blame_file_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd @all_commits = vcs_save_commits($cmd); foreach my $file_range_diff (@range) { next if (!($file_range_diff =~ m/(.+):(.+):(.+)/)); my $diff_file = $1; my $diff_start = $2; my $diff_length = $3; next if ("$file" ne "$diff_file"); for (my $i = $diff_start; $i < $diff_start + $diff_length; $i++) { push(@commits, $all_commits[$i]); } } } elsif (@range) { foreach my $file_range_diff (@range) { next if (!($file_range_diff =~ m/(.+):(.+):(.+)/)); my $diff_file = $1; my $diff_start = $2; my $diff_length = $3; next if ("$file" ne "$diff_file"); $cmd = $VCS_cmds{"blame_range_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd push(@commits, vcs_save_commits($cmd)); } } else { $cmd = $VCS_cmds{"blame_file_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd @commits = vcs_save_commits($cmd); } foreach my $commit (@commits) { $commit =~ s/^\^//g; } return @commits; } my $printed_novcs = 0; sub vcs_exists { %VCS_cmds = %VCS_cmds_git; return 1 if eval $VCS_cmds{"available"}; %VCS_cmds = %VCS_cmds_hg; return 2 if eval $VCS_cmds{"available"}; %VCS_cmds = (); if (!$printed_novcs) { warn("$P: No supported VCS found. Add --nogit to options?\n"); warn("Using a git repository produces better results.\n"); warn("Try Linus Torvalds' latest git repository using:\n"); warn("git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git\n"); $printed_novcs = 1; } return 0; } sub vcs_is_git { vcs_exists(); return $vcs_used == 1; } sub vcs_is_hg { return $vcs_used == 2; } sub interactive_get_maintainers { my ($list_ref) = @_; my @list = @$list_ref; vcs_exists(); my %selected; my %authored; my %signed; my $count = 0; my $maintained = 0; foreach my $entry (@list) { $maintained = 1 if ($entry->[1] =~ /^(maintainer|supporter)/i); $selected{$count} = 1; $authored{$count} = 0; $signed{$count} = 0; $count++; } #menu loop my $done = 0; my $print_options = 0; my $redraw = 1; while (!$done) { $count = 0; if ($redraw) { printf STDERR "\n%1s %2s %-65s", "*", "#", "email/list and role:stats"; if ($email_git || ($email_git_fallback && !$maintained) || $email_git_blame) { print STDERR "auth sign"; } print STDERR "\n"; foreach my $entry (@list) { my $email = $entry->[0]; my $role = $entry->[1]; my $sel = ""; $sel = "*" if ($selected{$count}); my $commit_author = $commit_author_hash{$email}; my $commit_signer = $commit_signer_hash{$email}; my $authored = 0; my $signed = 0; $authored++ for (@{$commit_author}); $signed++ for (@{$commit_signer}); printf STDERR "%1s %2d %-65s", $sel, $count + 1, $email; printf STDERR "%4d %4d", $authored, $signed if ($authored > 0 || $signed > 0); printf STDERR "\n %s\n", $role; if ($authored{$count}) { my $commit_author = $commit_author_hash{$email}; foreach my $ref (@{$commit_author}) { print STDERR " Author: @{$ref}[1]\n"; } } if ($signed{$count}) { my $commit_signer = $commit_signer_hash{$email}; foreach my $ref (@{$commit_signer}) { print STDERR " @{$ref}[2]: @{$ref}[1]\n"; } } $count++; } } my $date_ref = \$email_git_since; $date_ref = \$email_hg_since if (vcs_is_hg()); if ($print_options) { $print_options = 0; if (vcs_exists()) { print STDERR <; chomp($input); $redraw = 1; my $rerun = 0; my @wish = split(/[, ]+/, $input); foreach my $nr (@wish) { $nr = lc($nr); my $sel = substr($nr, 0, 1); my $str = substr($nr, 1); my $val = 0; $val = $1 if $str =~ /^(\d+)$/; if ($sel eq "y") { $interactive = 0; $done = 1; $output_rolestats = 0; $output_roles = 0; last; } elsif ($nr =~ /^\d+$/ && $nr > 0 && $nr <= $count) { $selected{$nr - 1} = !$selected{$nr - 1}; } elsif ($sel eq "*" || $sel eq '^') { my $toggle = 0; $toggle = 1 if ($sel eq '*'); for (my $i = 0; $i < $count; $i++) { $selected{$i} = $toggle; } } elsif ($sel eq "0") { for (my $i = 0; $i < $count; $i++) { $selected{$i} = !$selected{$i}; } } elsif ($sel eq "t") { if (lc($str) eq "m") { for (my $i = 0; $i < $count; $i++) { $selected{$i} = !$selected{$i} if ($list[$i]->[1] =~ /^(maintainer|supporter)/i); } } elsif (lc($str) eq "g") { for (my $i = 0; $i < $count; $i++) { $selected{$i} = !$selected{$i} if ($list[$i]->[1] =~ /^(author|commit|signer)/i); } } elsif (lc($str) eq "l") { for (my $i = 0; $i < $count; $i++) { $selected{$i} = !$selected{$i} if ($list[$i]->[1] =~ /^(open list)/i); } } elsif (lc($str) eq "s") { for (my $i = 0; $i < $count; $i++) { $selected{$i} = !$selected{$i} if ($list[$i]->[1] =~ /^(subscriber list)/i); } } } elsif ($sel eq "a") { if ($val > 0 && $val <= $count) { $authored{$val - 1} = !$authored{$val - 1}; } elsif ($str eq '*' || $str eq '^') { my $toggle = 0; $toggle = 1 if ($str eq '*'); for (my $i = 0; $i < $count; $i++) { $authored{$i} = $toggle; } } } elsif ($sel eq "s") { if ($val > 0 && $val <= $count) { $signed{$val - 1} = !$signed{$val - 1}; } elsif ($str eq '*' || $str eq '^') { my $toggle = 0; $toggle = 1 if ($str eq '*'); for (my $i = 0; $i < $count; $i++) { $signed{$i} = $toggle; } } } elsif ($sel eq "o") { $print_options = 1; $redraw = 1; } elsif ($sel eq "g") { if ($str eq "f") { bool_invert(\$email_git_fallback); } else { bool_invert(\$email_git); } $rerun = 1; } elsif ($sel eq "b") { if ($str eq "s") { bool_invert(\$email_git_blame_signatures); } else { bool_invert(\$email_git_blame); } $rerun = 1; } elsif ($sel eq "c") { if ($val > 0) { $email_git_min_signatures = $val; $rerun = 1; } } elsif ($sel eq "x") { if ($val > 0) { $email_git_max_maintainers = $val; $rerun = 1; } } elsif ($sel eq "%") { if ($str ne "" && $val >= 0) { $email_git_min_percent = $val; $rerun = 1; } } elsif ($sel eq "d") { if (vcs_is_git()) { $email_git_since = $str; } elsif (vcs_is_hg()) { $email_hg_since = $str; } $rerun = 1; } elsif ($sel eq "t") { bool_invert(\$email_git_all_signature_types); $rerun = 1; } elsif ($sel eq "f") { bool_invert(\$file_emails); $rerun = 1; } elsif ($sel eq "r") { bool_invert(\$email_remove_duplicates); $rerun = 1; } elsif ($sel eq "m") { bool_invert(\$email_use_mailmap); read_mailmap(); $rerun = 1; } elsif ($sel eq "k") { bool_invert(\$keywords); $rerun = 1; } elsif ($sel eq "p") { if ($str ne "" && $val >= 0) { $pattern_depth = $val; $rerun = 1; } } elsif ($sel eq "h" || $sel eq "?") { print STDERR <[0]; $address = $deduplicate_name_hash{lc($name)}->[1]; $matched = 1; } elsif ($deduplicate_address_hash{lc($address)}) { $name = $deduplicate_address_hash{lc($address)}->[0]; $address = $deduplicate_address_hash{lc($address)}->[1]; $matched = 1; } if (!$matched) { $deduplicate_name_hash{lc($name)} = [ $name, $address ]; $deduplicate_address_hash{lc($address)} = [ $name, $address ]; } $email = format_email($name, $address, 1); $email = mailmap_email($email); return $email; } sub save_commits_by_author { my (@lines) = @_; my @authors = (); my @commits = (); my @subjects = (); foreach my $line (@lines) { if ($line =~ m/$VCS_cmds{"author_pattern"}/) { my $author = $1; $author = deduplicate_email($author); push(@authors, $author); } push(@commits, $1) if ($line =~ m/$VCS_cmds{"commit_pattern"}/); push(@subjects, $1) if ($line =~ m/$VCS_cmds{"subject_pattern"}/); } for (my $i = 0; $i < @authors; $i++) { my $exists = 0; foreach my $ref(@{$commit_author_hash{$authors[$i]}}) { if (@{$ref}[0] eq $commits[$i] && @{$ref}[1] eq $subjects[$i]) { $exists = 1; last; } } if (!$exists) { push(@{$commit_author_hash{$authors[$i]}}, [ ($commits[$i], $subjects[$i]) ]); } } } sub save_commits_by_signer { my (@lines) = @_; my $commit = ""; my $subject = ""; foreach my $line (@lines) { $commit = $1 if ($line =~ m/$VCS_cmds{"commit_pattern"}/); $subject = $1 if ($line =~ m/$VCS_cmds{"subject_pattern"}/); if ($line =~ /^[ \t]*${signature_pattern}.*\@.*$/) { my @signatures = ($line); my ($types_ref, $signers_ref) = extract_formatted_signatures(@signatures); my @types = @$types_ref; my @signers = @$signers_ref; my $type = $types[0]; my $signer = $signers[0]; $signer = deduplicate_email($signer); my $exists = 0; foreach my $ref(@{$commit_signer_hash{$signer}}) { if (@{$ref}[0] eq $commit && @{$ref}[1] eq $subject && @{$ref}[2] eq $type) { $exists = 1; last; } } if (!$exists) { push(@{$commit_signer_hash{$signer}}, [ ($commit, $subject, $type) ]); } } } } sub vcs_assign { my ($role, $divisor, @lines) = @_; my %hash; my $count = 0; return if (@lines <= 0); if ($divisor <= 0) { warn("Bad divisor in " . (caller(0))[3] . ": $divisor\n"); $divisor = 1; } @lines = mailmap(@lines); return if (@lines <= 0); @lines = sort(@lines); # uniq -c $hash{$_}++ for @lines; # sort -rn foreach my $line (sort {$hash{$b} <=> $hash{$a}} keys %hash) { my $sign_offs = $hash{$line}; my $percent = $sign_offs * 100 / $divisor; $percent = 100 if ($percent > 100); next if (ignore_email_address($line)); $count++; last if ($sign_offs < $email_git_min_signatures || $count > $email_git_max_maintainers || $percent < $email_git_min_percent); push_email_address($line, ''); if ($output_rolestats) { my $fmt_percent = sprintf("%.0f", $percent); add_role($line, "$role:$sign_offs/$divisor=$fmt_percent%"); } else { add_role($line, $role); } } } sub vcs_file_signoffs { my ($file) = @_; my $authors_ref; my $signers_ref; my $stats_ref; my @authors = (); my @signers = (); my @stats = (); my $commits; $vcs_used = vcs_exists(); return if (!$vcs_used); my $cmd = $VCS_cmds{"find_signers_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; # interpolate $cmd ($commits, $signers_ref, $authors_ref, $stats_ref) = vcs_find_signers($cmd, $file); @signers = @{$signers_ref} if defined $signers_ref; @authors = @{$authors_ref} if defined $authors_ref; @stats = @{$stats_ref} if defined $stats_ref; # print("commits: <$commits>\nsigners:<@signers>\nauthors: <@authors>\nstats: <@stats>\n"); foreach my $signer (@signers) { $signer = deduplicate_email($signer); } vcs_assign("commit_signer", $commits, @signers); vcs_assign("authored", $commits, @authors); if ($#authors == $#stats) { my $stat_pattern = $VCS_cmds{"stat_pattern"}; $stat_pattern =~ s/(\$\w+)/$1/eeg; #interpolate $stat_pattern my $added = 0; my $deleted = 0; for (my $i = 0; $i <= $#stats; $i++) { if ($stats[$i] =~ /$stat_pattern/) { $added += $1; $deleted += $2; } } my @tmp_authors = uniq(@authors); foreach my $author (@tmp_authors) { $author = deduplicate_email($author); } @tmp_authors = uniq(@tmp_authors); my @list_added = (); my @list_deleted = (); foreach my $author (@tmp_authors) { my $auth_added = 0; my $auth_deleted = 0; for (my $i = 0; $i <= $#stats; $i++) { if ($author eq deduplicate_email($authors[$i]) && $stats[$i] =~ /$stat_pattern/) { $auth_added += $1; $auth_deleted += $2; } } for (my $i = 0; $i < $auth_added; $i++) { push(@list_added, $author); } for (my $i = 0; $i < $auth_deleted; $i++) { push(@list_deleted, $author); } } vcs_assign("added_lines", $added, @list_added); vcs_assign("removed_lines", $deleted, @list_deleted); } } sub vcs_file_blame { my ($file) = @_; my @signers = (); my @all_commits = (); my @commits = (); my $total_commits; my $total_lines; $vcs_used = vcs_exists(); return if (!$vcs_used); @all_commits = vcs_blame($file); @commits = uniq(@all_commits); $total_commits = @commits; $total_lines = @all_commits; if ($email_git_blame_signatures) { if (vcs_is_hg()) { my $commit_count; my $commit_authors_ref; my $commit_signers_ref; my $stats_ref; my @commit_authors = (); my @commit_signers = (); my $commit = join(" -r ", @commits); my $cmd; $cmd = $VCS_cmds{"find_commit_signers_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd ($commit_count, $commit_signers_ref, $commit_authors_ref, $stats_ref) = vcs_find_signers($cmd, $file); @commit_authors = @{$commit_authors_ref} if defined $commit_authors_ref; @commit_signers = @{$commit_signers_ref} if defined $commit_signers_ref; push(@signers, @commit_signers); } else { foreach my $commit (@commits) { my $commit_count; my $commit_authors_ref; my $commit_signers_ref; my $stats_ref; my @commit_authors = (); my @commit_signers = (); my $cmd; $cmd = $VCS_cmds{"find_commit_signers_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd ($commit_count, $commit_signers_ref, $commit_authors_ref, $stats_ref) = vcs_find_signers($cmd, $file); @commit_authors = @{$commit_authors_ref} if defined $commit_authors_ref; @commit_signers = @{$commit_signers_ref} if defined $commit_signers_ref; push(@signers, @commit_signers); } } } if ($from_filename) { if ($output_rolestats) { my @blame_signers; if (vcs_is_hg()) {{ # Double brace for last exit my $commit_count; my @commit_signers = (); @commits = uniq(@commits); @commits = sort(@commits); my $commit = join(" -r ", @commits); my $cmd; $cmd = $VCS_cmds{"find_commit_author_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd my @lines = (); @lines = &{$VCS_cmds{"execute_cmd"}}($cmd); if (!$email_git_penguin_chiefs) { @lines = grep(!/${penguin_chiefs}/i, @lines); } last if !@lines; my @authors = (); foreach my $line (@lines) { if ($line =~ m/$VCS_cmds{"author_pattern"}/) { my $author = $1; $author = deduplicate_email($author); push(@authors, $author); } } save_commits_by_author(@lines) if ($interactive); save_commits_by_signer(@lines) if ($interactive); push(@signers, @authors); }} else { foreach my $commit (@commits) { my $i; my $cmd = $VCS_cmds{"find_commit_author_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd my @author = vcs_find_author($cmd); next if !@author; my $formatted_author = deduplicate_email($author[0]); my $count = grep(/$commit/, @all_commits); for ($i = 0; $i < $count ; $i++) { push(@blame_signers, $formatted_author); } } } if (@blame_signers) { vcs_assign("authored lines", $total_lines, @blame_signers); } } foreach my $signer (@signers) { $signer = deduplicate_email($signer); } vcs_assign("commits", $total_commits, @signers); } else { foreach my $signer (@signers) { $signer = deduplicate_email($signer); } vcs_assign("modified commits", $total_commits, @signers); } } sub vcs_file_exists { my ($file) = @_; my $exists; my $vcs_used = vcs_exists(); return 0 if (!$vcs_used); my $cmd = $VCS_cmds{"file_exists_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; # interpolate $cmd $cmd .= " 2>&1"; $exists = &{$VCS_cmds{"execute_cmd"}}($cmd); return 0 if ($? != 0); return $exists; } sub vcs_list_files { my ($file) = @_; my @lsfiles = (); my $vcs_used = vcs_exists(); return 0 if (!$vcs_used); my $cmd = $VCS_cmds{"list_files_cmd"}; $cmd =~ s/(\$\w+)/$1/eeg; # interpolate $cmd @lsfiles = &{$VCS_cmds{"execute_cmd"}}($cmd); return () if ($? != 0); return @lsfiles; } sub uniq { my (@parms) = @_; my %saw; @parms = grep(!$saw{$_}++, @parms); return @parms; } sub sort_and_uniq { my (@parms) = @_; my %saw; @parms = sort @parms; @parms = grep(!$saw{$_}++, @parms); return @parms; } sub clean_file_emails { my (@file_emails) = @_; my @fmt_emails = (); foreach my $email (@file_emails) { $email =~ s/[\(\<\{]{0,1}([A-Za-z0-9_\.\+-]+\@[A-Za-z0-9\.-]+)[\)\>\}]{0,1}/\<$1\>/g; my ($name, $address) = parse_email($email); if ($name eq '"[,\.]"') { $name = ""; } my @nw = split(/[^A-Za-zÀ-ÿ\'\,\.\+-]/, $name); if (@nw > 2) { my $first = $nw[@nw - 3]; my $middle = $nw[@nw - 2]; my $last = $nw[@nw - 1]; if (((length($first) == 1 && $first =~ m/[A-Za-z]/) || (length($first) == 2 && substr($first, -1) eq ".")) || (length($middle) == 1 || (length($middle) == 2 && substr($middle, -1) eq "."))) { $name = "$first $middle $last"; } else { $name = "$middle $last"; } } if (substr($name, -1) =~ /[,\.]/) { $name = substr($name, 0, length($name) - 1); } elsif (substr($name, -2) =~ /[,\.]"/) { $name = substr($name, 0, length($name) - 2) . '"'; } if (substr($name, 0, 1) =~ /[,\.]/) { $name = substr($name, 1, length($name) - 1); } elsif (substr($name, 0, 2) =~ /"[,\.]/) { $name = '"' . substr($name, 2, length($name) - 2); } my $fmt_email = format_email($name, $address, $email_usename); push(@fmt_emails, $fmt_email); } return @fmt_emails; } sub merge_email { my @lines; my %saw; for (@_) { my ($address, $role) = @$_; if (!$saw{$address}) { if ($output_roles) { push(@lines, "$address ($role)"); } else { push(@lines, $address); } $saw{$address} = 1; } } return @lines; } sub output { my (@parms) = @_; if ($output_multiline) { foreach my $line (@parms) { print("${line}\n"); } } else { print(join($output_separator, @parms)); print("\n"); } } my $rfc822re; sub make_rfc822re { # Basic lexical tokens are specials, domain_literal, quoted_string, atom, and # comment. We must allow for rfc822_lwsp (or comments) after each of these. # This regexp will only work on addresses which have had comments stripped # and replaced with rfc822_lwsp. my $specials = '()<>@,;:\\\\".\\[\\]'; my $controls = '\\000-\\037\\177'; my $dtext = "[^\\[\\]\\r\\\\]"; my $domain_literal = "\\[(?:$dtext|\\\\.)*\\]$rfc822_lwsp*"; my $quoted_string = "\"(?:[^\\\"\\r\\\\]|\\\\.|$rfc822_lwsp)*\"$rfc822_lwsp*"; # Use zero-width assertion to spot the limit of an atom. A simple # $rfc822_lwsp* causes the regexp engine to hang occasionally. my $atom = "[^$specials $controls]+(?:$rfc822_lwsp+|\\Z|(?=[\\[\"$specials]))"; my $word = "(?:$atom|$quoted_string)"; my $localpart = "$word(?:\\.$rfc822_lwsp*$word)*"; my $sub_domain = "(?:$atom|$domain_literal)"; my $domain = "$sub_domain(?:\\.$rfc822_lwsp*$sub_domain)*"; my $addr_spec = "$localpart\@$rfc822_lwsp*$domain"; my $phrase = "$word*"; my $route = "(?:\@$domain(?:,\@$rfc822_lwsp*$domain)*:$rfc822_lwsp*)"; my $route_addr = "\\<$rfc822_lwsp*$route?$addr_spec\\>$rfc822_lwsp*"; my $mailbox = "(?:$addr_spec|$phrase$route_addr)"; my $group = "$phrase:$rfc822_lwsp*(?:$mailbox(?:,\\s*$mailbox)*)?;\\s*"; my $address = "(?:$mailbox|$group)"; return "$rfc822_lwsp*$address"; } sub rfc822_strip_comments { my $s = shift; # Recursively remove comments, and replace with a single space. The simpler # regexps in the Email Addressing FAQ are imperfect - they will miss escaped # chars in atoms, for example. while ($s =~ s/^((?:[^"\\]|\\.)* (?:"(?:[^"\\]|\\.)*"(?:[^"\\]|\\.)*)*) \((?:[^()\\]|\\.)*\)/$1 /osx) {} return $s; } # valid: returns true if the parameter is an RFC822 valid address # sub rfc822_valid { my $s = rfc822_strip_comments(shift); if (!$rfc822re) { $rfc822re = make_rfc822re(); } return $s =~ m/^$rfc822re$/so && $s =~ m/^$rfc822_char*$/; } # validlist: In scalar context, returns true if the parameter is an RFC822 # valid list of addresses. # # In list context, returns an empty list on failure (an invalid # address was found); otherwise a list whose first element is the # number of addresses found and whose remaining elements are the # addresses. This is needed to disambiguate failure (invalid) # from success with no addresses found, because an empty string is # a valid list. sub rfc822_validlist { my $s = rfc822_strip_comments(shift); if (!$rfc822re) { $rfc822re = make_rfc822re(); } # * null list items are valid according to the RFC # * the '1' business is to aid in distinguishing failure from no results my @r; if ($s =~ m/^(?:$rfc822re)?(?:,(?:$rfc822re)?)*$/so && $s =~ m/^$rfc822_char*$/) { while ($s =~ m/(?:^|,$rfc822_lwsp*)($rfc822re)/gos) { push(@r, $1); } return wantarray ? (scalar(@r), @r) : 1; } return wantarray ? () : 0; } kw-20191112/tests/external/checkpatch.pl0000644000175000017500000061670213574463526017742 0ustar rodrigorodrigo#!/usr/bin/env perl # SPDX-License-Identifier: GPL-2.0 # # (c) 2001, Dave Jones. (the file handling bit) # (c) 2005, Joel Schopp (the ugly bit) # (c) 2007,2008, Andy Whitcroft (new conditions, test suite) # (c) 2008-2010 Andy Whitcroft # (c) 2010-2018 Joe Perches use strict; use warnings; use POSIX; use File::Basename; use Cwd 'abs_path'; use Term::ANSIColor qw(:constants); use Encode qw(decode encode); my $P = $0; my $D = dirname(abs_path($P)); my $V = '0.32'; use Getopt::Long qw(:config no_auto_abbrev); my $quiet = 0; my $tree = 1; my $chk_signoff = 1; my $chk_patch = 1; my $tst_only; my $emacs = 0; my $terse = 0; my $showfile = 0; my $file = 0; my $git = 0; my %git_commits = (); my $check = 0; my $check_orig = 0; my $summary = 1; my $mailback = 0; my $summary_file = 0; my $show_types = 0; my $list_types = 0; my $fix = 0; my $fix_inplace = 0; my $root; my %debug; my %camelcase = (); my %use_type = (); my @use = (); my %ignore_type = (); my @ignore = (); my $help = 0; my $configuration_file = ".checkpatch.conf"; my $max_line_length = 80; my $ignore_perl_version = 0; my $minimum_perl_version = 5.10.0; my $min_conf_desc_length = 4; my $spelling_file = "$D/spelling.txt"; my $codespell = 0; my $codespellfile = "/usr/share/codespell/dictionary.txt"; my $conststructsfile = "$D/const_structs.checkpatch"; my $typedefsfile = ""; my $color = "auto"; my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE # git output parsing needs US English output, so first set backtick child process LANGUAGE my $git_command ='export LANGUAGE=en_US.UTF-8; git'; sub help { my ($exitcode) = @_; print << "EOM"; Usage: $P [OPTION]... [FILE]... Version: $V Options: -q, --quiet quiet --no-tree run without a kernel tree --no-signoff do not check for 'Signed-off-by' line --patch treat FILE as patchfile (default) --emacs emacs compile window format --terse one line per report --showfile emit diffed file position, not input file position -g, --git treat FILE as a single commit or git revision range single git commit with: ^ ~n multiple git commits with: .. ... - git merges are ignored -f, --file treat FILE as regular source file --subjective, --strict enable more subjective tests --list-types list the possible message types --types TYPE(,TYPE2...) show only these comma separated message types --ignore TYPE(,TYPE2...) ignore various comma separated message types --show-types show the specific message type in the output --max-line-length=n set the maximum line length, if exceeded, warn --min-conf-desc-length=n set the min description length, if shorter, warn --root=PATH PATH to the kernel tree root --no-summary suppress the per-file summary --mailback only produce a report in case of warnings/errors --summary-file include the filename in summary --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of 'values', 'possible', 'type', and 'attr' (default is all off) --test-only=WORD report only warnings/errors containing WORD literally --fix EXPERIMENTAL - may create horrible results If correctable single-line errors exist, create ".EXPERIMENTAL-checkpatch-fixes" with potential errors corrected to the preferred checkpatch style --fix-inplace EXPERIMENTAL - may create horrible results Is the same as --fix, but overwrites the input file. It's your fault if there's no backup or git --ignore-perl-version override checking of perl version. expect runtime errors. --codespell Use the codespell dictionary for spelling/typos (default:/usr/share/codespell/dictionary.txt) --codespellfile Use this codespell dictionary --typedefsfile Read additional types from this file --color[=WHEN] Use colors 'always', 'never', or only when output is a terminal ('auto'). Default is 'auto'. -h, --help, --version display this help and exit When FILE is - read standard input. EOM exit($exitcode); } sub uniq { my %seen; return grep { !$seen{$_}++ } @_; } sub list_types { my ($exitcode) = @_; my $count = 0; local $/ = undef; open(my $script, '<', abs_path($P)) or die "$P: Can't read '$P' $!\n"; my $text = <$script>; close($script); my @types = (); # Also catch when type or level is passed through a variable for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) { push (@types, $_); } @types = sort(uniq(@types)); print("#\tMessage type\n\n"); foreach my $type (@types) { print(++$count . "\t" . $type . "\n"); } exit($exitcode); } my $conf = which_conf($configuration_file); if (-f $conf) { my @conf_args; open(my $conffile, '<', "$conf") or warn "$P: Can't find a readable $configuration_file file $!\n"; while (<$conffile>) { my $line = $_; $line =~ s/\s*\n?$//g; $line =~ s/^\s*//g; $line =~ s/\s+/ /g; next if ($line =~ m/^\s*#/); next if ($line =~ m/^\s*$/); my @words = split(" ", $line); foreach my $word (@words) { last if ($word =~ m/^#/); push (@conf_args, $word); } } close($conffile); unshift(@ARGV, @conf_args) if @conf_args; } # Perl's Getopt::Long allows options to take optional arguments after a space. # Prevent --color by itself from consuming other arguments foreach (@ARGV) { if ($_ eq "--color" || $_ eq "-color") { $_ = "--color=$color"; } } GetOptions( 'q|quiet+' => \$quiet, 'tree!' => \$tree, 'signoff!' => \$chk_signoff, 'patch!' => \$chk_patch, 'emacs!' => \$emacs, 'terse!' => \$terse, 'showfile!' => \$showfile, 'f|file!' => \$file, 'g|git!' => \$git, 'subjective!' => \$check, 'strict!' => \$check, 'ignore=s' => \@ignore, 'types=s' => \@use, 'show-types!' => \$show_types, 'list-types!' => \$list_types, 'max-line-length=i' => \$max_line_length, 'min-conf-desc-length=i' => \$min_conf_desc_length, 'root=s' => \$root, 'summary!' => \$summary, 'mailback!' => \$mailback, 'summary-file!' => \$summary_file, 'fix!' => \$fix, 'fix-inplace!' => \$fix_inplace, 'ignore-perl-version!' => \$ignore_perl_version, 'debug=s' => \%debug, 'test-only=s' => \$tst_only, 'codespell!' => \$codespell, 'codespellfile=s' => \$codespellfile, 'typedefsfile=s' => \$typedefsfile, 'color=s' => \$color, 'no-color' => \$color, #keep old behaviors of -nocolor 'nocolor' => \$color, #keep old behaviors of -nocolor 'h|help' => \$help, 'version' => \$help ) or help(1); help(0) if ($help); list_types(0) if ($list_types); $fix = 1 if ($fix_inplace); $check_orig = $check; my $exit = 0; my $perl_version_ok = 1; if ($^V && $^V lt $minimum_perl_version) { $perl_version_ok = 0; printf "$P: requires at least perl version %vd\n", $minimum_perl_version; exit(1) if (!$ignore_perl_version); } #if no filenames are given, push '-' to read patch from stdin if ($#ARGV < 0) { push(@ARGV, '-'); } if ($color =~ /^[01]$/) { $color = !$color; } elsif ($color =~ /^always$/i) { $color = 1; } elsif ($color =~ /^never$/i) { $color = 0; } elsif ($color =~ /^auto$/i) { $color = (-t STDOUT); } else { die "Invalid color mode: $color\n"; } sub hash_save_array_words { my ($hashRef, $arrayRef) = @_; my @array = split(/,/, join(',', @$arrayRef)); foreach my $word (@array) { $word =~ s/\s*\n?$//g; $word =~ s/^\s*//g; $word =~ s/\s+/ /g; $word =~ tr/[a-z]/[A-Z]/; next if ($word =~ m/^\s*#/); next if ($word =~ m/^\s*$/); $hashRef->{$word}++; } } sub hash_show_words { my ($hashRef, $prefix) = @_; if (keys %$hashRef) { print "\nNOTE: $prefix message types:"; foreach my $word (sort keys %$hashRef) { print " $word"; } print "\n"; } } hash_save_array_words(\%ignore_type, \@ignore); hash_save_array_words(\%use_type, \@use); my $dbg_values = 0; my $dbg_possible = 0; my $dbg_type = 0; my $dbg_attr = 0; for my $key (keys %debug) { ## no critic eval "\${dbg_$key} = '$debug{$key}';"; die "$@" if ($@); } my $rpt_cleaners = 0; if ($terse) { $emacs = 1; $quiet++; } if ($tree) { if (defined $root) { if (!top_of_kernel_tree($root)) { die "$P: $root: --root does not point at a valid tree\n"; } } else { if (top_of_kernel_tree('.')) { $root = '.'; } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && top_of_kernel_tree($1)) { $root = $1; } } if (!defined $root) { print "Must be run from the top-level dir. of a kernel tree\n"; exit(2); } } my $emitted_corrupt = 0; our $Ident = qr{ [A-Za-z_][A-Za-z\d_]* (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* }x; our $Storage = qr{extern|static|asmlinkage}; our $Sparse = qr{ __user| __kernel| __force| __iomem| __must_check| __kprobes| __ref| __refconst| __refdata| __rcu| __private }x; our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)}; our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)}; our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)}; our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)}; our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit}; # Notes to $Attribute: # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check our $Attribute = qr{ const| __percpu| __nocast| __safe| __bitwise| __packed__| __packed2__| __naked| __maybe_unused| __always_unused| __noreturn| __used| __cold| __pure| __noclone| __deprecated| __read_mostly| __ro_after_init| __kprobes| $InitAttribute| ____cacheline_aligned| ____cacheline_aligned_in_smp| ____cacheline_internodealigned_in_smp| __weak }x; our $Modifier; our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__}; our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; our $Lval = qr{$Ident(?:$Member)*}; our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u}; our $Binary = qr{(?i)0b[01]+$Int_type?}; our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?}; our $Int = qr{[0-9]+$Int_type?}; our $Octal = qr{0[0-7]+$Int_type?}; our $String = qr{"[X\t]*"}; our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?}; our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?}; our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?}; our $Float = qr{$Float_hex|$Float_dec|$Float_int}; our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int}; our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=}; our $Compare = qr{<=|>=|==|!=|<|(?}; our $Arithmetic = qr{\+|-|\*|\/|%}; our $Operators = qr{ <=|>=|==|!=| =>|->|<<|>>|<|>|!|~| &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic }x; our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x; our $BasicType; our $NonptrType; our $NonptrTypeMisordered; our $NonptrTypeWithAttr; our $Type; our $TypeMisordered; our $Declare; our $DeclareMisordered; our $NON_ASCII_UTF8 = qr{ [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 }x; our $UTF8 = qr{ [\x09\x0A\x0D\x20-\x7E] # ASCII | $NON_ASCII_UTF8 }x; our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t}; our $typeOtherOSTypedefs = qr{(?x: u_(?:char|short|int|long) | # bsd u(?:nchar|short|int|long) # sysv )}; our $typeKernelTypedefs = qr{(?x: (?:__)?(?:u|s|be|le)(?:8|16|32|64)| atomic_t )}; our $typeTypedefs = qr{(?x: $typeC99Typedefs\b| $typeOtherOSTypedefs\b| $typeKernelTypedefs\b )}; our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b}; our $logFunctions = qr{(?x: printk(?:_ratelimited|_once|_deferred_once|_deferred|)| (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)| TP_printk| WARN(?:_RATELIMIT|_ONCE|)| panic| MODULE_[A-Z_]+| seq_vprintf|seq_printf|seq_puts )}; our $allocFunctions = qr{(?x: (?:(?:devm_)? (?:kv|k|v)[czm]alloc(?:_node|_array)? | kstrdup(?:_const)? | kmemdup(?:_nul)?) | (?:\w+)?alloc_skb(?:ip_align)? | # dev_alloc_skb/netdev_alloc_skb, et al dma_alloc_coherent )}; our $signature_tags = qr{(?xi: Signed-off-by:| Co-developed-by:| Acked-by:| Tested-by:| Reviewed-by:| Reported-by:| Suggested-by:| To:| Cc: )}; our @typeListMisordered = ( qr{char\s+(?:un)?signed}, qr{int\s+(?:(?:un)?signed\s+)?short\s}, qr{int\s+short(?:\s+(?:un)?signed)}, qr{short\s+int(?:\s+(?:un)?signed)}, qr{(?:un)?signed\s+int\s+short}, qr{short\s+(?:un)?signed}, qr{long\s+int\s+(?:un)?signed}, qr{int\s+long\s+(?:un)?signed}, qr{long\s+(?:un)?signed\s+int}, qr{int\s+(?:un)?signed\s+long}, qr{int\s+(?:un)?signed}, qr{int\s+long\s+long\s+(?:un)?signed}, qr{long\s+long\s+int\s+(?:un)?signed}, qr{long\s+long\s+(?:un)?signed\s+int}, qr{long\s+long\s+(?:un)?signed}, qr{long\s+(?:un)?signed}, ); our @typeList = ( qr{void}, qr{(?:(?:un)?signed\s+)?char}, qr{(?:(?:un)?signed\s+)?short\s+int}, qr{(?:(?:un)?signed\s+)?short}, qr{(?:(?:un)?signed\s+)?int}, qr{(?:(?:un)?signed\s+)?long\s+int}, qr{(?:(?:un)?signed\s+)?long\s+long\s+int}, qr{(?:(?:un)?signed\s+)?long\s+long}, qr{(?:(?:un)?signed\s+)?long}, qr{(?:un)?signed}, qr{float}, qr{double}, qr{bool}, qr{struct\s+$Ident}, qr{union\s+$Ident}, qr{enum\s+$Ident}, qr{${Ident}_t}, qr{${Ident}_handler}, qr{${Ident}_handler_fn}, @typeListMisordered, ); our $C90_int_types = qr{(?x: long\s+long\s+int\s+(?:un)?signed| long\s+long\s+(?:un)?signed\s+int| long\s+long\s+(?:un)?signed| (?:(?:un)?signed\s+)?long\s+long\s+int| (?:(?:un)?signed\s+)?long\s+long| int\s+long\s+long\s+(?:un)?signed| int\s+(?:(?:un)?signed\s+)?long\s+long| long\s+int\s+(?:un)?signed| long\s+(?:un)?signed\s+int| long\s+(?:un)?signed| (?:(?:un)?signed\s+)?long\s+int| (?:(?:un)?signed\s+)?long| int\s+long\s+(?:un)?signed| int\s+(?:(?:un)?signed\s+)?long| int\s+(?:un)?signed| (?:(?:un)?signed\s+)?int )}; our @typeListFile = (); our @typeListWithAttr = ( @typeList, qr{struct\s+$InitAttribute\s+$Ident}, qr{union\s+$InitAttribute\s+$Ident}, ); our @modifierList = ( qr{fastcall}, ); our @modifierListFile = (); our @mode_permission_funcs = ( ["module_param", 3], ["module_param_(?:array|named|string)", 4], ["module_param_array_named", 5], ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2], ["proc_create(?:_data|)", 2], ["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2], ["IIO_DEV_ATTR_[A-Z_]+", 1], ["SENSOR_(?:DEVICE_|)ATTR_2", 2], ["SENSOR_TEMPLATE(?:_2|)", 3], ["__ATTR", 2], ); #Create a search pattern for all these functions to speed up a loop below our $mode_perms_search = ""; foreach my $entry (@mode_permission_funcs) { $mode_perms_search .= '|' if ($mode_perms_search ne ""); $mode_perms_search .= $entry->[0]; } $mode_perms_search = "(?:${mode_perms_search})"; our %deprecated_apis = ( "synchronize_rcu_bh" => "synchronize_rcu", "synchronize_rcu_bh_expedited" => "synchronize_rcu_expedited", "call_rcu_bh" => "call_rcu", "rcu_barrier_bh" => "rcu_barrier", "synchronize_sched" => "synchronize_rcu", "synchronize_sched_expedited" => "synchronize_rcu_expedited", "call_rcu_sched" => "call_rcu", "rcu_barrier_sched" => "rcu_barrier", "get_state_synchronize_sched" => "get_state_synchronize_rcu", "cond_synchronize_sched" => "cond_synchronize_rcu", ); #Create a search pattern for all these strings to speed up a loop below our $deprecated_apis_search = ""; foreach my $entry (keys %deprecated_apis) { $deprecated_apis_search .= '|' if ($deprecated_apis_search ne ""); $deprecated_apis_search .= $entry; } $deprecated_apis_search = "(?:${deprecated_apis_search})"; our $mode_perms_world_writable = qr{ S_IWUGO | S_IWOTH | S_IRWXUGO | S_IALLUGO | 0[0-7][0-7][2367] }x; our %mode_permission_string_types = ( "S_IRWXU" => 0700, "S_IRUSR" => 0400, "S_IWUSR" => 0200, "S_IXUSR" => 0100, "S_IRWXG" => 0070, "S_IRGRP" => 0040, "S_IWGRP" => 0020, "S_IXGRP" => 0010, "S_IRWXO" => 0007, "S_IROTH" => 0004, "S_IWOTH" => 0002, "S_IXOTH" => 0001, "S_IRWXUGO" => 0777, "S_IRUGO" => 0444, "S_IWUGO" => 0222, "S_IXUGO" => 0111, ); #Create a search pattern for all these strings to speed up a loop below our $mode_perms_string_search = ""; foreach my $entry (keys %mode_permission_string_types) { $mode_perms_string_search .= '|' if ($mode_perms_string_search ne ""); $mode_perms_string_search .= $entry; } our $single_mode_perms_string_search = "(?:${mode_perms_string_search})"; our $multi_mode_perms_string_search = qr{ ${single_mode_perms_string_search} (?:\s*\|\s*${single_mode_perms_string_search})* }x; sub perms_to_octal { my ($string) = @_; return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/); my $val = ""; my $oval = ""; my $to = 0; my $curpos = 0; my $lastpos = 0; while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) { $curpos = pos($string); my $match = $2; my $omatch = $1; last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos)); $lastpos = $curpos; $to |= $mode_permission_string_types{$match}; $val .= '\s*\|\s*' if ($val ne ""); $val .= $match; $oval .= $omatch; } $oval =~ s/^\s*\|\s*//; $oval =~ s/\s*\|\s*$//; return sprintf("%04o", $to); } our $allowed_asm_includes = qr{(?x: irq| memory| time| reboot )}; # memory.h: ARM has a custom one # Load common spelling mistakes and build regular expression list. my $misspellings; my %spelling_fix; if (open(my $spelling, '<', $spelling_file)) { while (<$spelling>) { my $line = $_; $line =~ s/\s*\n?$//g; $line =~ s/^\s*//g; next if ($line =~ m/^\s*#/); next if ($line =~ m/^\s*$/); my ($suspect, $fix) = split(/\|\|/, $line); $spelling_fix{$suspect} = $fix; } close($spelling); } else { warn "No typos will be found - file '$spelling_file': $!\n"; } if ($codespell) { if (open(my $spelling, '<', $codespellfile)) { while (<$spelling>) { my $line = $_; $line =~ s/\s*\n?$//g; $line =~ s/^\s*//g; next if ($line =~ m/^\s*#/); next if ($line =~ m/^\s*$/); next if ($line =~ m/, disabled/i); $line =~ s/,.*$//; my ($suspect, $fix) = split(/->/, $line); $spelling_fix{$suspect} = $fix; } close($spelling); } else { warn "No codespell typos will be found - file '$codespellfile': $!\n"; } } $misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix; sub read_words { my ($wordsRef, $file) = @_; if (open(my $words, '<', $file)) { while (<$words>) { my $line = $_; $line =~ s/\s*\n?$//g; $line =~ s/^\s*//g; next if ($line =~ m/^\s*#/); next if ($line =~ m/^\s*$/); if ($line =~ /\s/) { print("$file: '$line' invalid - ignored\n"); next; } $$wordsRef .= '|' if ($$wordsRef ne ""); $$wordsRef .= $line; } close($file); return 1; } return 0; } my $const_structs = ""; read_words(\$const_structs, $conststructsfile) or warn "No structs that should be const will be found - file '$conststructsfile': $!\n"; my $typeOtherTypedefs = ""; if (length($typedefsfile)) { read_words(\$typeOtherTypedefs, $typedefsfile) or warn "No additional types will be considered - file '$typedefsfile': $!\n"; } $typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne ""); sub build_types { my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)"; my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)"; my $Misordered = "(?x: \n" . join("|\n ", @typeListMisordered) . "\n)"; my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)"; $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; $BasicType = qr{ (?:$typeTypedefs\b)| (?:${all}\b) }x; $NonptrType = qr{ (?:$Modifier\s+|const\s+)* (?: (?:typeof|__typeof__)\s*\([^\)]*\)| (?:$typeTypedefs\b)| (?:${all}\b) ) (?:\s+$Modifier|\s+const)* }x; $NonptrTypeMisordered = qr{ (?:$Modifier\s+|const\s+)* (?: (?:${Misordered}\b) ) (?:\s+$Modifier|\s+const)* }x; $NonptrTypeWithAttr = qr{ (?:$Modifier\s+|const\s+)* (?: (?:typeof|__typeof__)\s*\([^\)]*\)| (?:$typeTypedefs\b)| (?:${allWithAttr}\b) ) (?:\s+$Modifier|\s+const)* }x; $Type = qr{ $NonptrType (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)? (?:\s+$Inline|\s+$Modifier)* }x; $TypeMisordered = qr{ $NonptrTypeMisordered (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)? (?:\s+$Inline|\s+$Modifier)* }x; $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type}; $DeclareMisordered = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered}; } build_types(); our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*}; # Using $balanced_parens, $LvalOrFunc, or $FuncArg # requires at least perl version v5.10.0 # Any use must be runtime checked with $^V our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/; our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*}; our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)}; our $declaration_macros = qr{(?x: (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(| (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(| (?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(| (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\( )}; sub deparenthesize { my ($string) = @_; return "" if (!defined($string)); while ($string =~ /^\s*\(.*\)\s*$/) { $string =~ s@^\s*\(\s*@@; $string =~ s@\s*\)\s*$@@; } $string =~ s@\s+@ @g; return $string; } sub seed_camelcase_file { my ($file) = @_; return if (!(-f $file)); local $/; open(my $include_file, '<', "$file") or warn "$P: Can't read '$file' $!\n"; my $text = <$include_file>; close($include_file); my @lines = split('\n', $text); foreach my $line (@lines) { next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/); if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) { $camelcase{$1} = 1; } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) { $camelcase{$1} = 1; } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) { $camelcase{$1} = 1; } } } sub is_maintained_obsolete { my ($filename) = @_; return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl")); my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`; return $status =~ /obsolete/i; } sub is_SPDX_License_valid { my ($license) = @_; return 1 if (!$tree || which("python") eq "" || !(-e "$root/scripts/spdxcheck.py") || !(-e "$root/.git")); my $root_path = abs_path($root); my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`; return 0 if ($status ne ""); return 1; } my $camelcase_seeded = 0; sub seed_camelcase_includes { return if ($camelcase_seeded); my $files; my $camelcase_cache = ""; my @include_files = (); $camelcase_seeded = 1; if (-e ".git") { my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`; chomp $git_last_include_commit; $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit"; } else { my $last_mod_date = 0; $files = `find $root/include -name "*.h"`; @include_files = split('\n', $files); foreach my $file (@include_files) { my $date = POSIX::strftime("%Y%m%d%H%M", localtime((stat $file)[9])); $last_mod_date = $date if ($last_mod_date < $date); } $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date"; } if ($camelcase_cache ne "" && -f $camelcase_cache) { open(my $camelcase_file, '<', "$camelcase_cache") or warn "$P: Can't read '$camelcase_cache' $!\n"; while (<$camelcase_file>) { chomp; $camelcase{$_} = 1; } close($camelcase_file); return; } if (-e ".git") { $files = `${git_command} ls-files "include/*.h"`; @include_files = split('\n', $files); } foreach my $file (@include_files) { seed_camelcase_file($file); } if ($camelcase_cache ne "") { unlink glob ".checkpatch-camelcase.*"; open(my $camelcase_file, '>', "$camelcase_cache") or warn "$P: Can't write '$camelcase_cache' $!\n"; foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) { print $camelcase_file ("$_\n"); } close($camelcase_file); } } sub git_commit_info { my ($commit, $id, $desc) = @_; return ($id, $desc) if ((which("git") eq "") || !(-e ".git")); my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`; $output =~ s/^\s*//gm; my @lines = split("\n", $output); return ($id, $desc) if ($#lines < 0); if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) { # Maybe one day convert this block of bash into something that returns # all matching commit ids, but it's very slow... # # echo "checking commits $1..." # git rev-list --remotes | grep -i "^$1" | # while read line ; do # git log --format='%H %s' -1 $line | # echo "commit $(cut -c 1-12,41-)" # done } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) { $id = undef; } else { $id = substr($lines[0], 0, 12); $desc = substr($lines[0], 41); } return ($id, $desc); } $chk_signoff = 0 if ($file); my @rawlines = (); my @lines = (); my @fixed = (); my @fixed_inserted = (); my @fixed_deleted = (); my $fixlinenr = -1; # If input is git commits, extract all commits from the commit expressions. # For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'. die "$P: No git repository found\n" if ($git && !-e ".git"); if ($git) { my @commits = (); foreach my $commit_expr (@ARGV) { my $git_range; if ($commit_expr =~ m/^(.*)-(\d+)$/) { $git_range = "-$2 $1"; } elsif ($commit_expr =~ m/\.\./) { $git_range = "$commit_expr"; } else { $git_range = "-1 $commit_expr"; } my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`; foreach my $line (split(/\n/, $lines)) { $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/; next if (!defined($1) || !defined($2)); my $sha1 = $1; my $subject = $2; unshift(@commits, $sha1); $git_commits{$sha1} = $subject; } } die "$P: no git commits after extraction!\n" if (@commits == 0); @ARGV = @commits; } my $vname; $allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"}; for my $filename (@ARGV) { my $FILE; if ($git) { open($FILE, '-|', "git format-patch -M --stdout -1 $filename") || die "$P: $filename: git format-patch failed - $!\n"; } elsif ($file) { open($FILE, '-|', "diff -u /dev/null $filename") || die "$P: $filename: diff failed - $!\n"; } elsif ($filename eq '-') { open($FILE, '<&STDIN'); } else { open($FILE, '<', "$filename") || die "$P: $filename: open failed - $!\n"; } if ($filename eq '-') { $vname = 'Your patch'; } elsif ($git) { $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")'; } else { $vname = $filename; } while (<$FILE>) { chomp; push(@rawlines, $_); } close($FILE); if ($#ARGV > 0 && $quiet == 0) { print '-' x length($vname) . "\n"; print "$vname\n"; print '-' x length($vname) . "\n"; } if (!process($filename)) { $exit = 1; } @rawlines = (); @lines = (); @fixed = (); @fixed_inserted = (); @fixed_deleted = (); $fixlinenr = -1; @modifierListFile = (); @typeListFile = (); build_types(); } if (!$quiet) { hash_show_words(\%use_type, "Used"); hash_show_words(\%ignore_type, "Ignored"); if (!$perl_version_ok) { print << "EOM" NOTE: perl $^V is not modern enough to detect all possible issues. An upgrade to at least perl $minimum_perl_version is suggested. EOM } if ($exit) { print << "EOM" NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS. EOM } } exit($exit); sub top_of_kernel_tree { my ($root) = @_; my @tree_check = ( "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile", "README", "Documentation", "arch", "include", "drivers", "fs", "init", "ipc", "kernel", "lib", "scripts", ); foreach my $check (@tree_check) { if (! -e $root . '/' . $check) { return 0; } } return 1; } sub parse_email { my ($formatted_email) = @_; my $name = ""; my $address = ""; my $comment = ""; if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) { $name = $1; $address = $2; $comment = $3 if defined $3; } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) { $address = $1; $comment = $2 if defined $2; } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) { $address = $1; $comment = $2 if defined $2; $formatted_email =~ s/\Q$address\E.*$//; $name = $formatted_email; $name = trim($name); $name =~ s/^\"|\"$//g; # If there's a name left after stripping spaces and # leading quotes, and the address doesn't have both # leading and trailing angle brackets, the address # is invalid. ie: # "joe smith joe@smith.com" bad # "joe smith ]+>$/) { $name = ""; $address = ""; $comment = ""; } } $name = trim($name); $name =~ s/^\"|\"$//g; $address = trim($address); $address =~ s/^\<|\>$//g; if ($name =~ /[^\w \-]/i) { ##has "must quote" chars $name =~ s/(?"; } return $formatted_email; } sub which { my ($bin) = @_; foreach my $path (split(/:/, $ENV{PATH})) { if (-e "$path/$bin") { return "$path/$bin"; } } return ""; } sub which_conf { my ($conf) = @_; foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { if (-e "$path/$conf") { return "$path/$conf"; } } return ""; } sub expand_tabs { my ($str) = @_; my $res = ''; my $n = 0; for my $c (split(//, $str)) { if ($c eq "\t") { $res .= ' '; $n++; for (; ($n % 8) != 0; $n++) { $res .= ' '; } next; } $res .= $c; $n++; } return $res; } sub copy_spacing { (my $res = shift) =~ tr/\t/ /c; return $res; } sub line_stats { my ($line) = @_; # Drop the diff line leader and expand tabs $line =~ s/^.//; $line = expand_tabs($line); # Pick the indent from the front of the line. my ($white) = ($line =~ /^(\s*)/); return (length($line), length($white)); } my $sanitise_quote = ''; sub sanitise_line_reset { my ($in_comment) = @_; if ($in_comment) { $sanitise_quote = '*/'; } else { $sanitise_quote = ''; } } sub sanitise_line { my ($line) = @_; my $res = ''; my $l = ''; my $qlen = 0; my $off = 0; my $c; # Always copy over the diff marker. $res = substr($line, 0, 1); for ($off = 1; $off < length($line); $off++) { $c = substr($line, $off, 1); # Comments we are whacking completely including the begin # and end, all to $;. if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { $sanitise_quote = '*/'; substr($res, $off, 2, "$;$;"); $off++; next; } if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') { $sanitise_quote = ''; substr($res, $off, 2, "$;$;"); $off++; next; } if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') { $sanitise_quote = '//'; substr($res, $off, 2, $sanitise_quote); $off++; next; } # A \ in a string means ignore the next character. if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && $c eq "\\") { substr($res, $off, 2, 'XX'); $off++; next; } # Regular quotes. if ($c eq "'" || $c eq '"') { if ($sanitise_quote eq '') { $sanitise_quote = $c; substr($res, $off, 1, $c); next; } elsif ($sanitise_quote eq $c) { $sanitise_quote = ''; } } #print "c<$c> SQ<$sanitise_quote>\n"; if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { substr($res, $off, 1, $;); } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") { substr($res, $off, 1, $;); } elsif ($off != 0 && $sanitise_quote && $c ne "\t") { substr($res, $off, 1, 'X'); } else { substr($res, $off, 1, $c); } } if ($sanitise_quote eq '//') { $sanitise_quote = ''; } # The pathname on a #include may be surrounded by '<' and '>'. if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) { my $clean = 'X' x length($1); $res =~ s@\<.*\>@<$clean>@; # The whole of a #error is a string. } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) { my $clean = 'X' x length($1); $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@; } if ($allow_c99_comments && $res =~ m@(//.*$)@) { my $match = $1; $res =~ s/\Q$match\E/"$;" x length($match)/e; } return $res; } sub get_quoted_string { my ($line, $rawline) = @_; return "" if (!defined($line) || !defined($rawline)); return "" if ($line !~ m/($String)/g); return substr($rawline, $-[0], $+[0] - $-[0]); } sub ctx_statement_block { my ($linenr, $remain, $off) = @_; my $line = $linenr - 1; my $blk = ''; my $soff = $off; my $coff = $off - 1; my $coff_set = 0; my $loff = 0; my $type = ''; my $level = 0; my @stack = (); my $p; my $c; my $len = 0; my $remainder; while (1) { @stack = (['', 0]) if ($#stack == -1); #warn "CSB: blk<$blk> remain<$remain>\n"; # If we are about to drop off the end, pull in more # context. if ($off >= $len) { for (; $remain > 0; $line++) { last if (!defined $lines[$line]); next if ($lines[$line] =~ /^-/); $remain--; $loff = $len; $blk .= $lines[$line] . "\n"; $len = length($blk); $line++; last; } # Bail if there is no further context. #warn "CSB: blk<$blk> off<$off> len<$len>\n"; if ($off >= $len) { last; } if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) { $level++; $type = '#'; } } $p = $c; $c = substr($blk, $off, 1); $remainder = substr($blk, $off); #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n"; # Handle nested #if/#else. if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) { push(@stack, [ $type, $level ]); } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) { ($type, $level) = @{$stack[$#stack - 1]}; } elsif ($remainder =~ /^#\s*endif\b/) { ($type, $level) = @{pop(@stack)}; } # Statement ends at the ';' or a close '}' at the # outermost level. if ($level == 0 && $c eq ';') { last; } # An else is really a conditional as long as its not else if if ($level == 0 && $coff_set == 0 && (!defined($p) || $p =~ /(?:\s|\}|\+)/) && $remainder =~ /^(else)(?:\s|{)/ && $remainder !~ /^else\s+if\b/) { $coff = $off + length($1) - 1; $coff_set = 1; #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n"; #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n"; } if (($type eq '' || $type eq '(') && $c eq '(') { $level++; $type = '('; } if ($type eq '(' && $c eq ')') { $level--; $type = ($level != 0)? '(' : ''; if ($level == 0 && $coff < $soff) { $coff = $off; $coff_set = 1; #warn "CSB: mark coff<$coff>\n"; } } if (($type eq '' || $type eq '{') && $c eq '{') { $level++; $type = '{'; } if ($type eq '{' && $c eq '}') { $level--; $type = ($level != 0)? '{' : ''; if ($level == 0) { if (substr($blk, $off + 1, 1) eq ';') { $off++; } last; } } # Preprocessor commands end at the newline unless escaped. if ($type eq '#' && $c eq "\n" && $p ne "\\") { $level--; $type = ''; $off++; last; } $off++; } # We are truly at the end, so shuffle to the next line. if ($off == $len) { $loff = $len + 1; $line++; $remain--; } my $statement = substr($blk, $soff, $off - $soff + 1); my $condition = substr($blk, $soff, $coff - $soff + 1); #warn "STATEMENT<$statement>\n"; #warn "CONDITION<$condition>\n"; #print "coff<$coff> soff<$off> loff<$loff>\n"; return ($statement, $condition, $line, $remain + 1, $off - $loff + 1, $level); } sub statement_lines { my ($stmt) = @_; # Strip the diff line prefixes and rip blank lines at start and end. $stmt =~ s/(^|\n)./$1/g; $stmt =~ s/^\s*//; $stmt =~ s/\s*$//; my @stmt_lines = ($stmt =~ /\n/g); return $#stmt_lines + 2; } sub statement_rawlines { my ($stmt) = @_; my @stmt_lines = ($stmt =~ /\n/g); return $#stmt_lines + 2; } sub statement_block_size { my ($stmt) = @_; $stmt =~ s/(^|\n)./$1/g; $stmt =~ s/^\s*{//; $stmt =~ s/}\s*$//; $stmt =~ s/^\s*//; $stmt =~ s/\s*$//; my @stmt_lines = ($stmt =~ /\n/g); my @stmt_statements = ($stmt =~ /;/g); my $stmt_lines = $#stmt_lines + 2; my $stmt_statements = $#stmt_statements + 1; if ($stmt_lines > $stmt_statements) { return $stmt_lines; } else { return $stmt_statements; } } sub ctx_statement_full { my ($linenr, $remain, $off) = @_; my ($statement, $condition, $level); my (@chunks); # Grab the first conditional/block pair. ($statement, $condition, $linenr, $remain, $off, $level) = ctx_statement_block($linenr, $remain, $off); #print "F: c<$condition> s<$statement> remain<$remain>\n"; push(@chunks, [ $condition, $statement ]); if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { return ($level, $linenr, @chunks); } # Pull in the following conditional/block pairs and see if they # could continue the statement. for (;;) { ($statement, $condition, $linenr, $remain, $off, $level) = ctx_statement_block($linenr, $remain, $off); #print "C: c<$condition> s<$statement> remain<$remain>\n"; last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s)); #print "C: push\n"; push(@chunks, [ $condition, $statement ]); } return ($level, $linenr, @chunks); } sub ctx_block_get { my ($linenr, $remain, $outer, $open, $close, $off) = @_; my $line; my $start = $linenr - 1; my $blk = ''; my @o; my @c; my @res = (); my $level = 0; my @stack = ($level); for ($line = $start; $remain > 0; $line++) { next if ($rawlines[$line] =~ /^-/); $remain--; $blk .= $rawlines[$line]; # Handle nested #if/#else. if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) { push(@stack, $level); } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) { $level = $stack[$#stack - 1]; } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) { $level = pop(@stack); } foreach my $c (split(//, $lines[$line])) { ##print "C<$c>L<$level><$open$close>O<$off>\n"; if ($off > 0) { $off--; next; } if ($c eq $close && $level > 0) { $level--; last if ($level == 0); } elsif ($c eq $open) { $level++; } } if (!$outer || $level <= 1) { push(@res, $rawlines[$line]); } last if ($level == 0); } return ($level, @res); } sub ctx_block_outer { my ($linenr, $remain) = @_; my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0); return @r; } sub ctx_block { my ($linenr, $remain) = @_; my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0); return @r; } sub ctx_statement { my ($linenr, $remain, $off) = @_; my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off); return @r; } sub ctx_block_level { my ($linenr, $remain) = @_; return ctx_block_get($linenr, $remain, 0, '{', '}', 0); } sub ctx_statement_level { my ($linenr, $remain, $off) = @_; return ctx_block_get($linenr, $remain, 0, '(', ')', $off); } sub ctx_locate_comment { my ($first_line, $end_line) = @_; # Catch a comment on the end of the line itself. my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); return $current_comment if (defined $current_comment); # Look through the context and try and figure out if there is a # comment. my $in_comment = 0; $current_comment = ''; for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { my $line = $rawlines[$linenr - 1]; #warn " $line\n"; if ($linenr == $first_line and $line =~ m@^.\s*\*@) { $in_comment = 1; } if ($line =~ m@/\*@) { $in_comment = 1; } if (!$in_comment && $current_comment ne '') { $current_comment = ''; } $current_comment .= $line . "\n" if ($in_comment); if ($line =~ m@\*/@) { $in_comment = 0; } } chomp($current_comment); return($current_comment); } sub ctx_has_comment { my ($first_line, $end_line) = @_; my $cmt = ctx_locate_comment($first_line, $end_line); ##print "LINE: $rawlines[$end_line - 1 ]\n"; ##print "CMMT: $cmt\n"; return ($cmt ne ''); } sub raw_line { my ($linenr, $cnt) = @_; my $offset = $linenr - 1; $cnt++; my $line; while ($cnt) { $line = $rawlines[$offset++]; next if (defined($line) && $line =~ /^-/); $cnt--; } return $line; } sub get_stat_real { my ($linenr, $lc) = @_; my $stat_real = raw_line($linenr, 0); for (my $count = $linenr + 1; $count <= $lc; $count++) { $stat_real = $stat_real . "\n" . raw_line($count, 0); } return $stat_real; } sub get_stat_here { my ($linenr, $cnt, $here) = @_; my $herectx = $here . "\n"; for (my $n = 0; $n < $cnt; $n++) { $herectx .= raw_line($linenr, $n) . "\n"; } return $herectx; } sub cat_vet { my ($vet) = @_; my ($res, $coded); $res = ''; while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { $res .= $1; if ($2 ne '') { $coded = sprintf("^%c", unpack('C', $2) + 64); $res .= $coded; } } $res =~ s/$/\$/; return $res; } my $av_preprocessor = 0; my $av_pending; my @av_paren_type; my $av_pend_colon; sub annotate_reset { $av_preprocessor = 0; $av_pending = '_'; @av_paren_type = ('E'); $av_pend_colon = 'O'; } sub annotate_values { my ($stream, $type) = @_; my $res; my $var = '_' x length($stream); my $cur = $stream; print "$stream\n" if ($dbg_values > 1); while (length($cur)) { @av_paren_type = ('E') if ($#av_paren_type < 0); print " <" . join('', @av_paren_type) . "> <$type> <$av_pending>" if ($dbg_values > 1); if ($cur =~ /^(\s+)/o) { print "WS($1)\n" if ($dbg_values > 1); if ($1 =~ /\n/ && $av_preprocessor) { $type = pop(@av_paren_type); $av_preprocessor = 0; } } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') { print "CAST($1)\n" if ($dbg_values > 1); push(@av_paren_type, $type); $type = 'c'; } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) { print "DECLARE($1)\n" if ($dbg_values > 1); $type = 'T'; } elsif ($cur =~ /^($Modifier)\s*/) { print "MODIFIER($1)\n" if ($dbg_values > 1); $type = 'T'; } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { print "DEFINE($1,$2)\n" if ($dbg_values > 1); $av_preprocessor = 1; push(@av_paren_type, $type); if ($2 ne '') { $av_pending = 'N'; } $type = 'E'; } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) { print "UNDEF($1)\n" if ($dbg_values > 1); $av_preprocessor = 1; push(@av_paren_type, $type); } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) { print "PRE_START($1)\n" if ($dbg_values > 1); $av_preprocessor = 1; push(@av_paren_type, $type); push(@av_paren_type, $type); $type = 'E'; } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) { print "PRE_RESTART($1)\n" if ($dbg_values > 1); $av_preprocessor = 1; push(@av_paren_type, $av_paren_type[$#av_paren_type]); $type = 'E'; } elsif ($cur =~ /^(\#\s*(?:endif))/o) { print "PRE_END($1)\n" if ($dbg_values > 1); $av_preprocessor = 1; # Assume all arms of the conditional end as this # one does, and continue as if the #endif was not here. pop(@av_paren_type); push(@av_paren_type, $type); $type = 'E'; } elsif ($cur =~ /^(\\\n)/o) { print "PRECONT($1)\n" if ($dbg_values > 1); } elsif ($cur =~ /^(__attribute__)\s*\(?/o) { print "ATTR($1)\n" if ($dbg_values > 1); $av_pending = $type; $type = 'N'; } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { print "SIZEOF($1)\n" if ($dbg_values > 1); if (defined $2) { $av_pending = 'V'; } $type = 'N'; } elsif ($cur =~ /^(if|while|for)\b/o) { print "COND($1)\n" if ($dbg_values > 1); $av_pending = 'E'; $type = 'N'; } elsif ($cur =~/^(case)/o) { print "CASE($1)\n" if ($dbg_values > 1); $av_pend_colon = 'C'; $type = 'N'; } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) { print "KEYWORD($1)\n" if ($dbg_values > 1); $type = 'N'; } elsif ($cur =~ /^(\()/o) { print "PAREN('$1')\n" if ($dbg_values > 1); push(@av_paren_type, $av_pending); $av_pending = '_'; $type = 'N'; } elsif ($cur =~ /^(\))/o) { my $new_type = pop(@av_paren_type); if ($new_type ne '_') { $type = $new_type; print "PAREN('$1') -> $type\n" if ($dbg_values > 1); } else { print "PAREN('$1')\n" if ($dbg_values > 1); } } elsif ($cur =~ /^($Ident)\s*\(/o) { print "FUNC($1)\n" if ($dbg_values > 1); $type = 'V'; $av_pending = 'V'; } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) { if (defined $2 && $type eq 'C' || $type eq 'T') { $av_pend_colon = 'B'; } elsif ($type eq 'E') { $av_pend_colon = 'L'; } print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1); $type = 'V'; } elsif ($cur =~ /^($Ident|$Constant)/o) { print "IDENT($1)\n" if ($dbg_values > 1); $type = 'V'; } elsif ($cur =~ /^($Assignment)/o) { print "ASSIGN($1)\n" if ($dbg_values > 1); $type = 'N'; } elsif ($cur =~/^(;|{|})/) { print "END($1)\n" if ($dbg_values > 1); $type = 'E'; $av_pend_colon = 'O'; } elsif ($cur =~/^(,)/) { print "COMMA($1)\n" if ($dbg_values > 1); $type = 'C'; } elsif ($cur =~ /^(\?)/o) { print "QUESTION($1)\n" if ($dbg_values > 1); $type = 'N'; } elsif ($cur =~ /^(:)/o) { print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1); substr($var, length($res), 1, $av_pend_colon); if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { $type = 'E'; } else { $type = 'N'; } $av_pend_colon = 'O'; } elsif ($cur =~ /^(\[)/o) { print "CLOSE($1)\n" if ($dbg_values > 1); $type = 'N'; } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) { my $variant; print "OPV($1)\n" if ($dbg_values > 1); if ($type eq 'V') { $variant = 'B'; } else { $variant = 'U'; } substr($var, length($res), 1, $variant); $type = 'N'; } elsif ($cur =~ /^($Operators)/o) { print "OP($1)\n" if ($dbg_values > 1); if ($1 ne '++' && $1 ne '--') { $type = 'N'; } } elsif ($cur =~ /(^.)/o) { print "C($1)\n" if ($dbg_values > 1); } if (defined $1) { $cur = substr($cur, length($1)); $res .= $type x length($1); } } return ($res, $var); } sub possible { my ($possible, $line) = @_; my $notPermitted = qr{(?: ^(?: $Modifier| $Storage| $Type| DEFINE_\S+ )$| ^(?: goto| return| case| else| asm|__asm__| do| \#| \#\#| )(?:\s|$)| ^(?:typedef|struct|enum)\b )}x; warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); if ($possible !~ $notPermitted) { # Check for modifiers. $possible =~ s/\s*$Storage\s*//g; $possible =~ s/\s*$Sparse\s*//g; if ($possible =~ /^\s*$/) { } elsif ($possible =~ /\s/) { $possible =~ s/\s*$Type\s*//g; for my $modifier (split(' ', $possible)) { if ($modifier !~ $notPermitted) { warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); push(@modifierListFile, $modifier); } } } else { warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); push(@typeListFile, $possible); } build_types(); } else { warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1); } } my $prefix = ''; sub show_type { my ($type) = @_; $type =~ tr/[a-z]/[A-Z]/; return defined $use_type{$type} if (scalar keys %use_type > 0); return !defined $ignore_type{$type}; } sub report { my ($level, $type, $msg) = @_; if (!show_type($type) || (defined $tst_only && $msg !~ /\Q$tst_only\E/)) { return 0; } my $output = ''; if ($color) { if ($level eq 'ERROR') { $output .= RED; } elsif ($level eq 'WARNING') { $output .= YELLOW; } else { $output .= GREEN; } } $output .= $prefix . $level . ':'; if ($show_types) { $output .= BLUE if ($color); $output .= "$type:"; } $output .= RESET if ($color); $output .= ' ' . $msg . "\n"; if ($showfile) { my @lines = split("\n", $output, -1); splice(@lines, 1, 1); $output = join("\n", @lines); } $output = (split('\n', $output))[0] . "\n" if ($terse); push(our @report, $output); return 1; } sub report_dump { our @report; } sub fixup_current_range { my ($lineRef, $offset, $length) = @_; if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) { my $o = $1; my $l = $2; my $no = $o + $offset; my $nl = $l + $length; $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/; } } sub fix_inserted_deleted_lines { my ($linesRef, $insertedRef, $deletedRef) = @_; my $range_last_linenr = 0; my $delta_offset = 0; my $old_linenr = 0; my $new_linenr = 0; my $next_insert = 0; my $next_delete = 0; my @lines = (); my $inserted = @{$insertedRef}[$next_insert++]; my $deleted = @{$deletedRef}[$next_delete++]; foreach my $old_line (@{$linesRef}) { my $save_line = 1; my $line = $old_line; #don't modify the array if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) { #new filename $delta_offset = 0; } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) { #new hunk $range_last_linenr = $new_linenr; fixup_current_range(\$line, $delta_offset, 0); } while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) { $deleted = @{$deletedRef}[$next_delete++]; $save_line = 0; fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1); } while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) { push(@lines, ${$inserted}{'LINE'}); $inserted = @{$insertedRef}[$next_insert++]; $new_linenr++; fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1); } if ($save_line) { push(@lines, $line); $new_linenr++; } $old_linenr++; } return @lines; } sub fix_insert_line { my ($linenr, $line) = @_; my $inserted = { LINENR => $linenr, LINE => $line, }; push(@fixed_inserted, $inserted); } sub fix_delete_line { my ($linenr, $line) = @_; my $deleted = { LINENR => $linenr, LINE => $line, }; push(@fixed_deleted, $deleted); } sub ERROR { my ($type, $msg) = @_; if (report("ERROR", $type, $msg)) { our $clean = 0; our $cnt_error++; return 1; } return 0; } sub WARN { my ($type, $msg) = @_; if (report("WARNING", $type, $msg)) { our $clean = 0; our $cnt_warn++; return 1; } return 0; } sub CHK { my ($type, $msg) = @_; if ($check && report("CHECK", $type, $msg)) { our $clean = 0; our $cnt_chk++; return 1; } return 0; } sub check_absolute_file { my ($absolute, $herecurr) = @_; my $file = $absolute; ##print "absolute<$absolute>\n"; # See if any suffix of this path is a path within the tree. while ($file =~ s@^[^/]*/@@) { if (-f "$root/$file") { ##print "file<$file>\n"; last; } } if (! -f _) { return 0; } # It is, so see if the prefix is acceptable. my $prefix = $absolute; substr($prefix, -length($file)) = ''; ##print "prefix<$prefix>\n"; if ($prefix ne ".../") { WARN("USE_RELATIVE_PATH", "use relative pathname instead of absolute in changelog text\n" . $herecurr); } } sub trim { my ($string) = @_; $string =~ s/^\s+|\s+$//g; return $string; } sub ltrim { my ($string) = @_; $string =~ s/^\s+//; return $string; } sub rtrim { my ($string) = @_; $string =~ s/\s+$//; return $string; } sub string_find_replace { my ($string, $find, $replace) = @_; $string =~ s/$find/$replace/g; return $string; } sub tabify { my ($leading) = @_; my $source_indent = 8; my $max_spaces_before_tab = $source_indent - 1; my $spaces_to_tab = " " x $source_indent; #convert leading spaces to tabs 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g; #Remove spaces before a tab 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g; return "$leading"; } sub pos_last_openparen { my ($line) = @_; my $pos = 0; my $opens = $line =~ tr/\(/\(/; my $closes = $line =~ tr/\)/\)/; my $last_openparen = 0; if (($opens == 0) || ($closes >= $opens)) { return -1; } my $len = length($line); for ($pos = 0; $pos < $len; $pos++) { my $string = substr($line, $pos); if ($string =~ /^($FuncArg|$balanced_parens)/) { $pos += length($1) - 1; } elsif (substr($line, $pos, 1) eq '(') { $last_openparen = $pos; } elsif (index($string, '(') == -1) { last; } } return length(expand_tabs(substr($line, 0, $last_openparen))) + 1; } sub process { my $filename = shift; my $linenr=0; my $prevline=""; my $prevrawline=""; my $stashline=""; my $stashrawline=""; my $length; my $indent; my $previndent=0; my $stashindent=0; our $clean = 1; my $signoff = 0; my $author = ''; my $authorsignoff = 0; my $is_patch = 0; my $is_binding_patch = -1; my $in_header_lines = $file ? 0 : 1; my $in_commit_log = 0; #Scanning lines before patch my $has_commit_log = 0; #Encountered lines before patch my $commit_log_lines = 0; #Number of commit log lines my $commit_log_possible_stack_dump = 0; my $commit_log_long_line = 0; my $commit_log_has_diff = 0; my $reported_maintainer_file = 0; my $non_utf8_charset = 0; my $last_blank_line = 0; my $last_coalesced_string_linenr = -1; our @report = (); our $cnt_lines = 0; our $cnt_error = 0; our $cnt_warn = 0; our $cnt_chk = 0; # Trace the real file/line as we go. my $realfile = ''; my $realline = 0; my $realcnt = 0; my $here = ''; my $context_function; #undef'd unless there's a known function my $in_comment = 0; my $comment_edge = 0; my $first_line = 0; my $p1_prefix = ''; my $prev_values = 'E'; # suppression flags my %suppress_ifbraces; my %suppress_whiletrailers; my %suppress_export; my $suppress_statement = 0; my %signatures = (); # Pre-scan the patch sanitizing the lines. # Pre-scan the patch looking for any __setup documentation. # my @setup_docs = (); my $setup_docs = 0; my $camelcase_file_seeded = 0; my $checklicenseline = 1; sanitise_line_reset(); my $line; foreach my $rawline (@rawlines) { $linenr++; $line = $rawline; push(@fixed, $rawline) if ($fix); if ($rawline=~/^\+\+\+\s+(\S+)/) { $setup_docs = 0; if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) { $setup_docs = 1; } #next; } if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { $realline=$1-1; if (defined $2) { $realcnt=$3+1; } else { $realcnt=1+1; } $in_comment = 0; # Guestimate if this is a continuing comment. Run # the context looking for a comment "edge". If this # edge is a close comment then we must be in a comment # at context start. my $edge; my $cnt = $realcnt; for (my $ln = $linenr + 1; $cnt > 0; $ln++) { next if (defined $rawlines[$ln - 1] && $rawlines[$ln - 1] =~ /^-/); $cnt--; #print "RAW<$rawlines[$ln - 1]>\n"; last if (!defined $rawlines[$ln - 1]); if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ && $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) { ($edge) = $1; last; } } if (defined $edge && $edge eq '*/') { $in_comment = 1; } # Guestimate if this is a continuing comment. If this # is the start of a diff block and this line starts # ' *' then it is very likely a comment. if (!defined $edge && $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@) { $in_comment = 1; } ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; sanitise_line_reset($in_comment); } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { # Standardise the strings and chars within the input to # simplify matching -- only bother with positive lines. $line = sanitise_line($rawline); } push(@lines, $line); if ($realcnt > 1) { $realcnt-- if ($line =~ /^(?:\+| |$)/); } else { $realcnt = 0; } #print "==>$rawline\n"; #print "-->$line\n"; if ($setup_docs && $line =~ /^\+/) { push(@setup_docs, $line); } } $prefix = ''; $realcnt = 0; $linenr = 0; $fixlinenr = -1; foreach my $line (@lines) { $linenr++; $fixlinenr++; my $sline = $line; #copy of $line $sline =~ s/$;/ /g; #with comments as spaces my $rawline = $rawlines[$linenr - 1]; # check if it's a mode change, rename or start of a patch if (!$in_commit_log && ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ || ($line =~ /^rename (?:from|to) \S+\s*$/ || $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) { $is_patch = 1; } #extract the line range in the file after the patch is applied if (!$in_commit_log && $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) { my $context = $4; $is_patch = 1; $first_line = $linenr + 1; $realline=$1-1; if (defined $2) { $realcnt=$3+1; } else { $realcnt=1+1; } annotate_reset(); $prev_values = 'E'; %suppress_ifbraces = (); %suppress_whiletrailers = (); %suppress_export = (); $suppress_statement = 0; if ($context =~ /\b(\w+)\s*\(/) { $context_function = $1; } else { undef $context_function; } next; # track the line number as we move through the hunk, note that # new versions of GNU diff omit the leading space on completely # blank context lines so we need to count that too. } elsif ($line =~ /^( |\+|$)/) { $realline++; $realcnt-- if ($realcnt != 0); # Measure the line length and indent. ($length, $indent) = line_stats($rawline); # Track the previous line. ($prevline, $stashline) = ($stashline, $line); ($previndent, $stashindent) = ($stashindent, $indent); ($prevrawline, $stashrawline) = ($stashrawline, $rawline); #warn "line<$line>\n"; } elsif ($realcnt == 1) { $realcnt--; } my $hunk_line = ($realcnt != 0); $here = "#$linenr: " if (!$file); $here = "#$realline: " if ($file); my $found_file = 0; # extract the filename as it passes if ($line =~ /^diff --git.*?(\S+)$/) { $realfile = $1; $realfile =~ s@^([^/]*)/@@ if (!$file); $in_commit_log = 0; $found_file = 1; } elsif ($line =~ /^\+\+\+\s+(\S+)/) { $realfile = $1; $realfile =~ s@^([^/]*)/@@ if (!$file); $in_commit_log = 0; $p1_prefix = $1; if (!$file && $tree && $p1_prefix ne '' && -e "$root/$p1_prefix") { WARN("PATCH_PREFIX", "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n"); } if ($realfile =~ m@^include/asm/@) { ERROR("MODIFIED_INCLUDE_ASM", "do not modify files in include/asm, change architecture specific files in include/asm-\n" . "$here$rawline\n"); } $found_file = 1; } #make up the handle for any error we report on this line if ($showfile) { $prefix = "$realfile:$realline: " } elsif ($emacs) { if ($file) { $prefix = "$filename:$realline: "; } else { $prefix = "$filename:$linenr: "; } } if ($found_file) { if (is_maintained_obsolete($realfile)) { WARN("OBSOLETE", "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy. No unnecessary modifications please.\n"); } if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) { $check = 1; } else { $check = $check_orig; } $checklicenseline = 1; if ($realfile !~ /^MAINTAINERS/) { my $last_binding_patch = $is_binding_patch; $is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@; if (($last_binding_patch != -1) && ($last_binding_patch ^ $is_binding_patch)) { WARN("DT_SPLIT_BINDING_PATCH", "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.txt\n"); } } next; } $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); my $hereline = "$here\n$rawline\n"; my $herecurr = "$here\n$rawline\n"; my $hereprev = "$here\n$prevrawline\n$rawline\n"; $cnt_lines++ if ($realcnt != 0); # Verify the existence of a commit log if appropriate # 2 is used because a $signature is counted in $commit_log_lines if ($in_commit_log) { if ($line !~ /^\s*$/) { $commit_log_lines++; #could be a $signature } } elsif ($has_commit_log && $commit_log_lines < 2) { WARN("COMMIT_MESSAGE", "Missing commit description - Add an appropriate one\n"); $commit_log_lines = 2; #warn only once } # Check if the commit log has what seems like a diff which can confuse patch if ($in_commit_log && !$commit_log_has_diff && (($line =~ m@^\s+diff\b.*a/[\w/]+@ && $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) || $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ || $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) { ERROR("DIFF_IN_COMMIT_MSG", "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr); $commit_log_has_diff = 1; } # Check for incorrect file permissions if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) { my $permhere = $here . "FILE: $realfile\n"; if ($realfile !~ m@scripts/@ && $realfile !~ /\.(py|pl|awk|sh)$/) { ERROR("EXECUTE_PERMISSIONS", "do not set execute permissions for source files\n" . $permhere); } } # Check the patch for a From: if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) { $author = $1; $author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i); $author =~ s/"//g; } # Check the patch for a signoff: if ($line =~ /^\s*signed-off-by:/i) { $signoff++; $in_commit_log = 0; if ($author ne '') { my $l = $line; $l =~ s/"//g; if ($l =~ /^\s*signed-off-by:\s*\Q$author\E/i) { $authorsignoff = 1; } } } # Check if MAINTAINERS is being updated. If so, there's probably no need to # emit the "does MAINTAINERS need updating?" message on file add/move/delete if ($line =~ /^\s*MAINTAINERS\s*\|/) { $reported_maintainer_file = 1; } # Check signature styles if (!$in_header_lines && $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) { my $space_before = $1; my $sign_off = $2; my $space_after = $3; my $email = $4; my $ucfirst_sign_off = ucfirst(lc($sign_off)); if ($sign_off !~ /$signature_tags/) { WARN("BAD_SIGN_OFF", "Non-standard signature: $sign_off\n" . $herecurr); } if (defined $space_before && $space_before ne "") { if (WARN("BAD_SIGN_OFF", "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) && $fix) { $fixed[$fixlinenr] = "$ucfirst_sign_off $email"; } } if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) { if (WARN("BAD_SIGN_OFF", "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) && $fix) { $fixed[$fixlinenr] = "$ucfirst_sign_off $email"; } } if (!defined $space_after || $space_after ne " ") { if (WARN("BAD_SIGN_OFF", "Use a single space after $ucfirst_sign_off\n" . $herecurr) && $fix) { $fixed[$fixlinenr] = "$ucfirst_sign_off $email"; } } my ($email_name, $email_address, $comment) = parse_email($email); my $suggested_email = format_email(($email_name, $email_address)); if ($suggested_email eq "") { ERROR("BAD_SIGN_OFF", "Unrecognized email address: '$email'\n" . $herecurr); } else { my $dequoted = $suggested_email; $dequoted =~ s/^"//; $dequoted =~ s/" $comment" ne $email && "$suggested_email$comment" ne $email) { WARN("BAD_SIGN_OFF", "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr); } } # Check for duplicate signatures my $sig_nospace = $line; $sig_nospace =~ s/\s//g; $sig_nospace = lc($sig_nospace); if (defined $signatures{$sig_nospace}) { WARN("BAD_SIGN_OFF", "Duplicate signature\n" . $herecurr); } else { $signatures{$sig_nospace} = 1; } # Check Co-developed-by: immediately followed by Signed-off-by: with same name and email if ($sign_off =~ /^co-developed-by:$/i) { if ($email eq $author) { WARN("BAD_SIGN_OFF", "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . "$here\n" . $rawline); } if (!defined $lines[$linenr]) { WARN("BAD_SIGN_OFF", "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline); } elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) { WARN("BAD_SIGN_OFF", "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]); } elsif ($1 ne $email) { WARN("BAD_SIGN_OFF", "Co-developed-by and Signed-off-by: name/email do not match \n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]); } } } # Check email subject for common tools that don't need to be mentioned if ($in_header_lines && $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) { WARN("EMAIL_SUBJECT", "A patch subject line should describe the change not the tool that found it\n" . $herecurr); } # Check for unwanted Gerrit info if ($in_commit_log && $line =~ /^\s*change-id:/i) { ERROR("GERRIT_CHANGE_ID", "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr); } # Check if the commit log is in a possible stack dump if ($in_commit_log && !$commit_log_possible_stack_dump && ($line =~ /^\s*(?:WARNING:|BUG:)/ || $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ || # timestamp $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) || $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ || $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) { # stack dump address styles $commit_log_possible_stack_dump = 1; } # Check for line lengths > 75 in commit log, warn once if ($in_commit_log && !$commit_log_long_line && length($line) > 75 && !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ || # file delta changes $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ || # filename then : $line =~ /^\s*(?:Fixes:|Link:)/i || # A Fixes: or Link: line $commit_log_possible_stack_dump)) { WARN("COMMIT_LOG_LONG_LINE", "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr); $commit_log_long_line = 1; } # Reset possible stack dump if a blank line is found if ($in_commit_log && $commit_log_possible_stack_dump && $line =~ /^\s*$/) { $commit_log_possible_stack_dump = 0; } # Check for git id commit length and improperly formed commit descriptions if ($in_commit_log && !$commit_log_possible_stack_dump && $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i && $line !~ /^This reverts commit [0-9a-f]{7,40}/ && ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i || ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i && $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i && $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) { my $init_char = "c"; my $orig_commit = ""; my $short = 1; my $long = 0; my $case = 1; my $space = 1; my $hasdesc = 0; my $hasparens = 0; my $id = '0123456789ab'; my $orig_desc = "commit description"; my $description = ""; if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) { $init_char = $1; $orig_commit = lc($2); } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) { $orig_commit = lc($1); } $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i); $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i); $space = 0 if ($line =~ /\bcommit [0-9a-f]/i); $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/); if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) { $orig_desc = $1; $hasparens = 1; } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i && defined $rawlines[$linenr] && $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) { $orig_desc = $1; $hasparens = 1; } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i && defined $rawlines[$linenr] && $rawlines[$linenr] =~ /^\s*[^"]+"\)/) { $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i; $orig_desc = $1; $rawlines[$linenr] =~ /^\s*([^"]+)"\)/; $orig_desc .= " " . $1; $hasparens = 1; } ($id, $description) = git_commit_info($orig_commit, $id, $orig_desc); if (defined($id) && ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) { ERROR("GIT_COMMIT_ID", "Please use git commit description style 'commit <12+ chars of sha1> (\"\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr); } } # Check for added, moved or deleted files if (!$reported_maintainer_file && !$in_commit_log && ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ || $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ || ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ && (defined($1) || defined($2))))) { $is_patch = 1; $reported_maintainer_file = 1; WARN("FILE_PATH_CHANGES", "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr); } # Check for wrappage within a valid hunk of the file if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { ERROR("CORRUPTED_PATCH", "patch seems to be corrupt (line wrapped?)\n" . $herecurr) if (!$emitted_corrupt++); } # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php if (($realfile =~ /^$/ || $line =~ /^\+/) && $rawline !~ m/^$UTF8*$/) { my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); my $blank = copy_spacing($rawline); my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; my $hereptr = "$hereline$ptr\n"; CHK("INVALID_UTF8", "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr); } # Check if it's the start of a commit log # (not a header line and we haven't seen the patch filename) if ($in_header_lines && $realfile =~ /^$/ && !($rawline =~ /^\s+(?:\S|$)/ || $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) { $in_header_lines = 0; $in_commit_log = 1; $has_commit_log = 1; } # Check if there is UTF-8 in a commit log when a mail header has explicitly # declined it, i.e defined some charset where it is missing. if ($in_header_lines && $rawline =~ /^Content-Type:.+charset="(.+)".*$/ && $1 !~ /utf-8/i) { $non_utf8_charset = 1; } if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ && $rawline =~ /$NON_ASCII_UTF8/) { WARN("UTF8_BEFORE_PATCH", "8-bit UTF-8 used in possible commit log\n" . $herecurr); } # Check for absolute kernel paths in commit message if ($tree && $in_commit_log) { while ($line =~ m{(?:^|\s)(/\S*)}g) { my $file = $1; if ($file =~ m{^(.*?)(?::\d+)+:?$} && check_absolute_file($1, $herecurr)) { # } else { check_absolute_file($file, $herecurr); } } } # Check for various typo / spelling mistakes if (defined($misspellings) && ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) { while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) { my $typo = $1; my $typo_fix = $spelling_fix{lc($typo)}; $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/); $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/); my $msg_level = \&WARN; $msg_level = \&CHK if ($file); if (&{$msg_level}("TYPO_SPELLING", "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/; } } } # check for invalid commit id if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) { my $id; my $description; ($id, $description) = git_commit_info($2, undef, undef); if (!defined($id)) { WARN("UNKNOWN_COMMIT_ID", "Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr); } } # ignore non-hunk lines and lines being removed next if (!$hunk_line || $line =~ /^-/); #trailing whitespace if ($line =~ /^\+.*\015/) { my $herevet = "$here\n" . cat_vet($rawline) . "\n"; if (ERROR("DOS_LINE_ENDINGS", "DOS line endings\n" . $herevet) && $fix) { $fixed[$fixlinenr] =~ s/[\s\015]+$//; } } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) { my $herevet = "$here\n" . cat_vet($rawline) . "\n"; if (ERROR("TRAILING_WHITESPACE", "trailing whitespace\n" . $herevet) && $fix) { $fixed[$fixlinenr] =~ s/\s+$//; } $rpt_cleaners = 1; } # Check for FSF mailing addresses. if ($rawline =~ /\bwrite to the Free/i || $rawline =~ /\b675\s+Mass\s+Ave/i || $rawline =~ /\b59\s+Temple\s+Pl/i || $rawline =~ /\b51\s+Franklin\s+St/i) { my $herevet = "$here\n" . cat_vet($rawline) . "\n"; my $msg_level = \&ERROR; $msg_level = \&CHK if ($file); &{$msg_level}("FSF_MAILING_ADDRESS", "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet) } # check for Kconfig help text having a real description # Only applies when adding the entry originally, after that we do not have # sufficient context to determine whether it is indeed long enough. if ($realfile =~ /Kconfig/ && # 'choice' is usually the last thing on the line (though # Kconfig supports named choices), so use a word boundary # (\b) rather than a whitespace character (\s) $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) { my $length = 0; my $cnt = $realcnt; my $ln = $linenr + 1; my $f; my $is_start = 0; my $is_end = 0; for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) { $f = $lines[$ln - 1]; $cnt-- if ($lines[$ln - 1] !~ /^-/); $is_end = $lines[$ln - 1] =~ /^\+/; next if ($f =~ /^-/); last if (!$file && $f =~ /^\@\@/); if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) { $is_start = 1; } elsif ($lines[$ln - 1] =~ /^\+\s*(?:help|---help---)\s*$/) { if ($lines[$ln - 1] =~ "---help---") { WARN("CONFIG_DESCRIPTION", "prefer 'help' over '---help---' for new help texts\n" . $herecurr); } $length = -1; } $f =~ s/^.//; $f =~ s/#.*//; $f =~ s/^\s+//; next if ($f =~ /^$/); # This only checks context lines in the patch # and so hopefully shouldn't trigger false # positives, even though some of these are # common words in help texts if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice| if|endif|menu|endmenu|source)\b/x) { $is_end = 1; last; } $length++; } if ($is_start && $is_end && $length < $min_conf_desc_length) { WARN("CONFIG_DESCRIPTION", "please write a paragraph that describes the config symbol fully\n" . $herecurr); } #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; } # check for MAINTAINERS entries that don't have the right form if ($realfile =~ /^MAINTAINERS$/ && $rawline =~ /^\+[A-Z]:/ && $rawline !~ /^\+[A-Z]:\t\S/) { if (WARN("MAINTAINERS_STYLE", "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/; } } # discourage the use of boolean for type definition attributes of Kconfig options if ($realfile =~ /Kconfig/ && $line =~ /^\+\s*\bboolean\b/) { WARN("CONFIG_TYPE_BOOLEAN", "Use of boolean is deprecated, please use bool instead.\n" . $herecurr); } if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) && ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) { my $flag = $1; my $replacement = { 'EXTRA_AFLAGS' => 'asflags-y', 'EXTRA_CFLAGS' => 'ccflags-y', 'EXTRA_CPPFLAGS' => 'cppflags-y', 'EXTRA_LDFLAGS' => 'ldflags-y', }; WARN("DEPRECATED_VARIABLE", "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag}); } # check for DT compatible documentation if (defined $root && (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) || ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) { my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; my $dt_path = $root . "/Documentation/devicetree/bindings/"; my $vp_file = $dt_path . "vendor-prefixes.yaml"; foreach my $compat (@compats) { my $compat2 = $compat; $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/; my $compat3 = $compat; $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/; `grep -Erq "$compat|$compat2|$compat3" $dt_path`; if ( $? >> 8 ) { WARN("UNDOCUMENTED_DT_STRING", "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr); } next if $compat !~ /^([a-zA-Z0-9\-]+)\,/; my $vendor = $1; `grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`; if ( $? >> 8 ) { WARN("UNDOCUMENTED_DT_STRING", "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr); } } } # check for using SPDX license tag at beginning of files if ($realline == $checklicenseline) { if ($rawline =~ /^[ \+]\s*\#\!\s*\//) { $checklicenseline = 2; } elsif ($rawline =~ /^\+/) { my $comment = ""; if ($realfile =~ /\.(h|s|S)$/) { $comment = '/*'; } elsif ($realfile =~ /\.(c|dts|dtsi)$/) { $comment = '//'; } elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) { $comment = '#'; } elsif ($realfile =~ /\.rst$/) { $comment = '..'; } # check SPDX comment style for .[chsS] files if ($realfile =~ /\.[chsS]$/ && $rawline =~ /SPDX-License-Identifier:/ && $rawline !~ m@^\+\s*\Q$comment\E\s*@) { WARN("SPDX_LICENSE_TAG", "Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr); } if ($comment !~ /^$/ && $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) { WARN("SPDX_LICENSE_TAG", "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr); } elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) { my $spdx_license = $1; if (!is_SPDX_License_valid($spdx_license)) { WARN("SPDX_LICENSE_TAG", "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr); } } } } # check we are in a valid source file if not then ignore this hunk next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/); # check for using SPDX-License-Identifier on the wrong line number if ($realline != $checklicenseline && $rawline =~ /\bSPDX-License-Identifier:/ && substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) { WARN("SPDX_LICENSE_TAG", "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr); } # line length limit (with some exclusions) # # There are a few types of lines that may extend beyond $max_line_length: # logging functions like pr_info that end in a string # lines with a single string # #defines that are a single string # lines with an RFC3986 like URL # # There are 3 different line length message types: # LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length # LONG_LINE_STRING a string starts before but extends beyond $max_line_length # LONG_LINE all other lines longer than $max_line_length # # if LONG_LINE is ignored, the other 2 types are also ignored # if ($line =~ /^\+/ && $length > $max_line_length) { my $msg_type = "LONG_LINE"; # Check the allowed long line types first # logging functions that end in a string that starts # before $max_line_length if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ && length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { $msg_type = ""; # lines with only strings (w/ possible termination) # #defines with only strings } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ || $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) { $msg_type = ""; # More special cases } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ || $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) { $msg_type = ""; # URL ($rawline is used in case the URL is in a comment) } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) { $msg_type = ""; # Otherwise set the alternate message types # a comment starts before $max_line_length } elsif ($line =~ /($;[\s$;]*)$/ && length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { $msg_type = "LONG_LINE_COMMENT" # a quoted string starts before $max_line_length } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ && length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { $msg_type = "LONG_LINE_STRING" } if ($msg_type ne "" && (show_type("LONG_LINE") || show_type($msg_type))) { WARN($msg_type, "line over $max_line_length characters\n" . $herecurr); } } # check for adding lines without a newline. if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { WARN("MISSING_EOF_NEWLINE", "adding a line without newline at end of file\n" . $herecurr); } # check we are in a valid source file C or perl if not then ignore this hunk next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/); # at the beginning of a line any tabs must come first and anything # more than 8 must use tabs. if ($rawline =~ /^\+\s* \t\s*\S/ || $rawline =~ /^\+\s* \s*/) { my $herevet = "$here\n" . cat_vet($rawline) . "\n"; $rpt_cleaners = 1; if (ERROR("CODE_INDENT", "code indent should use tabs where possible\n" . $herevet) && $fix) { $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; } } # check for space before tabs. if ($rawline =~ /^\+/ && $rawline =~ / \t/) { my $herevet = "$here\n" . cat_vet($rawline) . "\n"; if (WARN("SPACE_BEFORE_TAB", "please, no space before tabs\n" . $herevet) && $fix) { while ($fixed[$fixlinenr] =~ s/(^\+.*) {8,8}\t/$1\t\t/) {} while ($fixed[$fixlinenr] =~ s/(^\+.*) +\t/$1\t/) {} } } # check for assignments on the start of a line if ($sline =~ /^\+\s+($Assignment)[^=]/) { CHK("ASSIGNMENT_CONTINUATIONS", "Assignment operator '$1' should be on the previous line\n" . $hereprev); } # check for && or || at the start of a line if ($rawline =~ /^\+\s*(&&|\|\|)/) { CHK("LOGICAL_CONTINUATIONS", "Logical continuations should be on the previous line\n" . $hereprev); } # check indentation starts on a tab stop if ($perl_version_ok && $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) { my $indent = length($1); if ($indent % 8) { if (WARN("TABSTOP", "Statements should start on a tabstop\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e; } } } # check multi-line statement indentation matches previous line if ($perl_version_ok && $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) { $prevline =~ /^\+(\t*)(.*)$/; my $oldindent = $1; my $rest = $2; my $pos = pos_last_openparen($rest); if ($pos >= 0) { $line =~ /^(\+| )([ \t]*)/; my $newindent = $2; my $goodtabindent = $oldindent . "\t" x ($pos / 8) . " " x ($pos % 8); my $goodspaceindent = $oldindent . " " x $pos; if ($newindent ne $goodtabindent && $newindent ne $goodspaceindent) { if (CHK("PARENTHESIS_ALIGNMENT", "Alignment should match open parenthesis\n" . $hereprev) && $fix && $line =~ /^\+/) { $fixed[$fixlinenr] =~ s/^\+[ \t]*/\+$goodtabindent/; } } } } # check for space after cast like "(int) foo" or "(struct foo) bar" # avoid checking a few false positives: # "sizeof(<type>)" or "__alignof__(<type>)" # function pointer declarations like "(*foo)(int) = bar;" # structure definitions like "(struct foo) { 0 };" # multiline macros that define functions # known attributes or the __attribute__ keyword if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ && (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) { if (CHK("SPACING", "No space is necessary after a cast\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(\(\s*$Type\s*\))[ \t]+/$1/; } } # Block comment styles # Networking with an initial /* if ($realfile =~ m@^(drivers/net/|net/)@ && $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ && $rawline =~ /^\+[ \t]*\*/ && $realline > 2) { WARN("NETWORKING_BLOCK_COMMENT_STYLE", "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev); } # Block comments use * on subsequent lines if ($prevline =~ /$;[ \t]*$/ && #ends in comment $prevrawline =~ /^\+.*?\/\*/ && #starting /* $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */ $rawline =~ /^\+/ && #line is new $rawline !~ /^\+[ \t]*\*/) { #no leading * WARN("BLOCK_COMMENT_STYLE", "Block comments use * on subsequent lines\n" . $hereprev); } # Block comments use */ on trailing lines if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */ $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/ $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/ $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */ WARN("BLOCK_COMMENT_STYLE", "Block comments use a trailing */ on a separate line\n" . $herecurr); } # Block comment * alignment if ($prevline =~ /$;[ \t]*$/ && #ends in comment $line =~ /^\+[ \t]*$;/ && #leading comment $rawline =~ /^\+[ \t]*\*/ && #leading * (($prevrawline =~ /^\+.*?\/\*/ && #leading /* $prevrawline !~ /\*\/[ \t]*$/) || #no trailing */ $prevrawline =~ /^\+[ \t]*\*/)) { #leading * my $oldindent; $prevrawline =~ m@^\+([ \t]*/?)\*@; if (defined($1)) { $oldindent = expand_tabs($1); } else { $prevrawline =~ m@^\+(.*/?)\*@; $oldindent = expand_tabs($1); } $rawline =~ m@^\+([ \t]*)\*@; my $newindent = $1; $newindent = expand_tabs($newindent); if (length($oldindent) ne length($newindent)) { WARN("BLOCK_COMMENT_STYLE", "Block comments should align the * on each line\n" . $hereprev); } } # check for missing blank lines after struct/union declarations # with exceptions for various attributes and macros if ($prevline =~ /^[\+ ]};?\s*$/ && $line =~ /^\+/ && !($line =~ /^\+\s*$/ || $line =~ /^\+\s*EXPORT_SYMBOL/ || $line =~ /^\+\s*MODULE_/i || $line =~ /^\+\s*\#\s*(?:end|elif|else)/ || $line =~ /^\+[a-z_]*init/ || $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ || $line =~ /^\+\s*DECLARE/ || $line =~ /^\+\s*builtin_[\w_]*driver/ || $line =~ /^\+\s*__setup/)) { if (CHK("LINE_SPACING", "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) && $fix) { fix_insert_line($fixlinenr, "\+"); } } # check for multiple consecutive blank lines if ($prevline =~ /^[\+ ]\s*$/ && $line =~ /^\+\s*$/ && $last_blank_line != ($linenr - 1)) { if (CHK("LINE_SPACING", "Please don't use multiple blank lines\n" . $hereprev) && $fix) { fix_delete_line($fixlinenr, $rawline); } $last_blank_line = $linenr; } # check for missing blank lines after declarations if ($sline =~ /^\+\s+\S/ && #Not at char 1 # actual declarations ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ || # function pointer declarations $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ || # foo bar; where foo is some local typedef or #define $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ || # known declaration macros $prevline =~ /^\+\s+$declaration_macros/) && # for "else if" which can look like "$Ident $Ident" !($prevline =~ /^\+\s+$c90_Keywords\b/ || # other possible extensions of declaration lines $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ || # not starting a section or a macro "\" extended line $prevline =~ /(?:\{\s*|\\)$/) && # looks like a declaration !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ || # function pointer declarations $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ || # foo bar; where foo is some local typedef or #define $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ || # known declaration macros $sline =~ /^\+\s+$declaration_macros/ || # start of struct or union or enum $sline =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ || # start or end of block or continuation of declaration $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ || # bitfield continuation $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ || # other possible extensions of declaration lines $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) && # indentation of previous and current line are the same (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) { if (WARN("LINE_SPACING", "Missing a blank line after declarations\n" . $hereprev) && $fix) { fix_insert_line($fixlinenr, "\+"); } } # check for spaces at the beginning of a line. # Exceptions: # 1) within comments # 2) indented preprocessor commands # 3) hanging labels if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) { my $herevet = "$here\n" . cat_vet($rawline) . "\n"; if (WARN("LEADING_SPACE", "please, no spaces at the start of a line\n" . $herevet) && $fix) { $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; } } # check we are in a valid C source file if not then ignore this hunk next if ($realfile !~ /\.(h|c)$/); # check for unusual line ending [ or ( if ($line =~ /^\+.*([\[\(])\s*$/) { CHK("OPEN_ENDED_LINE", "Lines should not end with a '$1'\n" . $herecurr); } # check if this appears to be the start function declaration, save the name if ($sline =~ /^\+\{\s*$/ && $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) { $context_function = $1; } # check if this appears to be the end of function declaration if ($sline =~ /^\+\}\s*$/) { undef $context_function; } # check indentation of any line with a bare else # (but not if it is a multiple line "if (foo) return bar; else return baz;") # if the previous line is a break or return and is indented 1 tab more... if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) { my $tabs = length($1) + 1; if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ || ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ && defined $lines[$linenr] && $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) { WARN("UNNECESSARY_ELSE", "else is not generally useful after a break or return\n" . $hereprev); } } # check indentation of a line with a break; # if the previous line is a goto or return and is indented the same # of tabs if ($sline =~ /^\+([\t]+)break\s*;\s*$/) { my $tabs = $1; if ($prevline =~ /^\+$tabs(?:goto|return)\b/) { WARN("UNNECESSARY_BREAK", "break is not useful after a goto or return\n" . $hereprev); } } # check for RCS/CVS revision markers if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { WARN("CVS_KEYWORD", "CVS style keyword markers, these will _not_ be updated\n". $herecurr); } # check for old HOTPLUG __dev<foo> section markings if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) { WARN("HOTPLUG_SECTION", "Using $1 is unnecessary\n" . $herecurr); } # Check for potential 'bare' types my ($stat, $cond, $line_nr_next, $remain_next, $off_next, $realline_next); #print "LINE<$line>\n"; if ($linenr > $suppress_statement && $realcnt && $sline =~ /.\s*\S/) { ($stat, $cond, $line_nr_next, $remain_next, $off_next) = ctx_statement_block($linenr, $realcnt, 0); $stat =~ s/\n./\n /g; $cond =~ s/\n./\n /g; #print "linenr<$linenr> <$stat>\n"; # If this statement has no statement boundaries within # it there is no point in retrying a statement scan # until we hit end of it. my $frag = $stat; $frag =~ s/;+\s*$//; if ($frag !~ /(?:{|;)/) { #print "skip<$line_nr_next>\n"; $suppress_statement = $line_nr_next; } # Find the real next line. $realline_next = $line_nr_next; if (defined $realline_next && (!defined $lines[$realline_next - 1] || substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { $realline_next++; } my $s = $stat; $s =~ s/{.*$//s; # Ignore goto labels. if ($s =~ /$Ident:\*$/s) { # Ignore functions being called } elsif ($s =~ /^.\s*$Ident\s*\(/s) { } elsif ($s =~ /^.\s*else\b/s) { # declarations always start with types } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) { my $type = $1; $type =~ s/\s+/ /g; possible($type, "A:" . $s); # definitions in global scope can only start with types } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) { possible($1, "B:" . $s); } # any (foo ... *) is a pointer cast, and foo is a type while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) { possible($1, "C:" . $s); } # Check for any sort of function declaration. # int foo(something bar, other baz); # void (*store_gdt)(x86_descr_ptr *); if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { my ($name_len) = length($1); my $ctx = $s; substr($ctx, 0, $name_len + 1, ''); $ctx =~ s/\)[^\)]*$//; for my $arg (split(/\s*,\s*/, $ctx)) { if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) { possible($1, "D:" . $s); } } } } # # Checks which may be anchored in the context. # # Check for switch () and associated case and default # statements should be at the same indent. if ($line=~/\bswitch\s*\(.*\)/) { my $err = ''; my $sep = ''; my @ctx = ctx_block_outer($linenr, $realcnt); shift(@ctx); for my $ctx (@ctx) { my ($clen, $cindent) = line_stats($ctx); if ($ctx =~ /^\+\s*(case\s+|default:)/ && $indent != $cindent) { $err .= "$sep$ctx\n"; $sep = ''; } else { $sep = "[...]\n"; } } if ($err ne '') { ERROR("SWITCH_CASE_INDENT_LEVEL", "switch and case should be at the same indent\n$hereline$err"); } } # if/while/etc brace do not go on next line, unless defining a do while loop, # or if that brace on the next line is for something else if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) { my $pre_ctx = "$1$2"; my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); if ($line =~ /^\+\t{6,}/) { WARN("DEEP_INDENTATION", "Too many leading tabs - consider code refactoring\n" . $herecurr); } my $ctx_cnt = $realcnt - $#ctx - 1; my $ctx = join("\n", @ctx); my $ctx_ln = $linenr; my $ctx_skip = $realcnt; while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && defined $lines[$ctx_ln - 1] && $lines[$ctx_ln - 1] =~ /^-/)) { ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n"; $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); $ctx_ln++; } #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { ERROR("OPEN_BRACE", "that open brace { should be on the previous line\n" . "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); } if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && $ctx =~ /\)\s*\;\s*$/ && defined $lines[$ctx_ln - 1]) { my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); if ($nindent > $indent) { WARN("TRAILING_SEMICOLON", "trailing semicolon indicates no statements, indent implies otherwise\n" . "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); } } } # Check relative indent for conditionals and blocks. if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { ($stat, $cond, $line_nr_next, $remain_next, $off_next) = ctx_statement_block($linenr, $realcnt, 0) if (!defined $stat); my ($s, $c) = ($stat, $cond); substr($s, 0, length($c), ''); # remove inline comments $s =~ s/$;/ /g; $c =~ s/$;/ /g; # Find out how long the conditional actually is. my @newlines = ($c =~ /\n/gs); my $cond_lines = 1 + $#newlines; # Make sure we remove the line prefixes as we have # none on the first line, and are going to readd them # where necessary. $s =~ s/\n./\n/gs; while ($s =~ /\n\s+\\\n/) { $cond_lines += $s =~ s/\n\s+\\\n/\n/g; } # We want to check the first line inside the block # starting at the end of the conditional, so remove: # 1) any blank line termination # 2) any opening brace { on end of the line # 3) any do (...) { my $continuation = 0; my $check = 0; $s =~ s/^.*\bdo\b//; $s =~ s/^\s*{//; if ($s =~ s/^\s*\\//) { $continuation = 1; } if ($s =~ s/^\s*?\n//) { $check = 1; $cond_lines++; } # Also ignore a loop construct at the end of a # preprocessor statement. if (($prevline =~ /^.\s*#\s*define\s/ || $prevline =~ /\\\s*$/) && $continuation == 0) { $check = 0; } my $cond_ptr = -1; $continuation = 0; while ($cond_ptr != $cond_lines) { $cond_ptr = $cond_lines; # If we see an #else/#elif then the code # is not linear. if ($s =~ /^\s*\#\s*(?:else|elif)/) { $check = 0; } # Ignore: # 1) blank lines, they should be at 0, # 2) preprocessor lines, and # 3) labels. if ($continuation || $s =~ /^\s*?\n/ || $s =~ /^\s*#\s*?/ || $s =~ /^\s*$Ident\s*:/) { $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0; if ($s =~ s/^.*?\n//) { $cond_lines++; } } } my (undef, $sindent) = line_stats("+" . $s); my $stat_real = raw_line($linenr, $cond_lines); # Check if either of these lines are modified, else # this is not this patch's fault. if (!defined($stat_real) || $stat !~ /^\+/ && $stat_real !~ /^\+/) { $check = 0; } if (defined($stat_real) && $cond_lines > 1) { $stat_real = "[...]\n$stat_real"; } #print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n"; if ($check && $s ne '' && (($sindent % 8) != 0 || ($sindent < $indent) || ($sindent == $indent && ($s !~ /^\s*(?:\}|\{|else\b)/)) || ($sindent > $indent + 8))) { WARN("SUSPECT_CODE_INDENT", "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n"); } } # Track the 'values' across context and added lines. my $opline = $line; $opline =~ s/^./ /; my ($curr_values, $curr_vars) = annotate_values($opline . "\n", $prev_values); $curr_values = $prev_values . $curr_values; if ($dbg_values) { my $outline = $opline; $outline =~ s/\t/ /g; print "$linenr > .$outline\n"; print "$linenr > $curr_values\n"; print "$linenr > $curr_vars\n"; } $prev_values = substr($curr_values, -1); #ignore lines not being added next if ($line =~ /^[^\+]/); # check for dereferences that span multiple lines if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ && $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) { $prevline =~ /($Lval\s*(?:\.|->))\s*$/; my $ref = $1; $line =~ /^.\s*($Lval)/; $ref .= $1; $ref =~ s/\s//g; WARN("MULTILINE_DEREFERENCE", "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev); } # check for declarations of signed or unsigned without int while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) { my $type = $1; my $var = $2; $var = "" if (!defined $var); if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) { my $sign = $1; my $pointer = $2; $pointer = "" if (!defined $pointer); if (WARN("UNSPECIFIED_INT", "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) && $fix) { my $decl = trim($sign) . " int "; my $comp_pointer = $pointer; $comp_pointer =~ s/\s//g; $decl .= $comp_pointer; $decl = rtrim($decl) if ($var eq ""); $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@; } } } # TEST: allow direct testing of the type matcher. if ($dbg_type) { if ($line =~ /^.\s*$Declare\s*$/) { ERROR("TEST_TYPE", "TEST: is type\n" . $herecurr); } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { ERROR("TEST_NOT_TYPE", "TEST: is not type ($1 is)\n". $herecurr); } next; } # TEST: allow direct testing of the attribute matcher. if ($dbg_attr) { if ($line =~ /^.\s*$Modifier\s*$/) { ERROR("TEST_ATTR", "TEST: is attr\n" . $herecurr); } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) { ERROR("TEST_NOT_ATTR", "TEST: is not attr ($1 is)\n". $herecurr); } next; } # check for initialisation to aggregates open brace on the next line if ($line =~ /^.\s*{/ && $prevline =~ /(?:^|[^=])=\s*$/) { if (ERROR("OPEN_BRACE", "that open brace { should be on the previous line\n" . $hereprev) && $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { fix_delete_line($fixlinenr - 1, $prevrawline); fix_delete_line($fixlinenr, $rawline); my $fixedline = $prevrawline; $fixedline =~ s/\s*=\s*$/ = {/; fix_insert_line($fixlinenr, $fixedline); $fixedline = $line; $fixedline =~ s/^(.\s*)\{\s*/$1/; fix_insert_line($fixlinenr, $fixedline); } } # # Checks which are anchored on the added line. # # check for malformed paths in #include statements (uses RAW line) if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) { my $path = $1; if ($path =~ m{//}) { ERROR("MALFORMED_INCLUDE", "malformed #include filename\n" . $herecurr); } if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) { ERROR("UAPI_INCLUDE", "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr); } } # no C99 // comments if ($line =~ m{//}) { if (ERROR("C99_COMMENTS", "do not use C99 // comments\n" . $herecurr) && $fix) { my $line = $fixed[$fixlinenr]; if ($line =~ /\/\/(.*)$/) { my $comment = trim($1); $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@; } } } # Remove C99 comments. $line =~ s@//.*@@; $opline =~ s@//.*@@; # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider # the whole statement. #print "APW <$lines[$realline_next - 1]>\n"; if (defined $realline_next && exists $lines[$realline_next - 1] && !defined $suppress_export{$realline_next} && ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { # Handle definitions which produce identifiers with # a prefix: # XXX(foo); # EXPORT_SYMBOL(something_foo); my $name = $1; if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ && $name =~ /^${Ident}_$2/) { #print "FOO C name<$name>\n"; $suppress_export{$realline_next} = 1; } elsif ($stat !~ /(?: \n.}\s*$| ^.DEFINE_$Ident\(\Q$name\E\)| ^.DECLARE_$Ident\(\Q$name\E\)| ^.LIST_HEAD\(\Q$name\E\)| ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() )/x) { #print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; $suppress_export{$realline_next} = 2; } else { $suppress_export{$realline_next} = 1; } } if (!defined $suppress_export{$linenr} && $prevline =~ /^.\s*$/ && ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { #print "FOO B <$lines[$linenr - 1]>\n"; $suppress_export{$linenr} = 2; } if (defined $suppress_export{$linenr} && $suppress_export{$linenr} == 2) { WARN("EXPORT_SYMBOL", "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); } # check for global initialisers. if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) { if (ERROR("GLOBAL_INITIALISERS", "do not initialise globals to $1\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/; } } # check for static initialisers. if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) { if (ERROR("INITIALISED_STATIC", "do not initialise statics to $1\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/; } } # check for misordered declarations of char/short/int/long with signed/unsigned while ($sline =~ m{(\b$TypeMisordered\b)}g) { my $tmp = trim($1); WARN("MISORDERED_TYPE", "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr); } # check for unnecessary <signed> int declarations of short/long/long long while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) { my $type = trim($1); next if ($type !~ /\bint\b/); next if ($type !~ /\b(?:short|long\s+long|long)\b/); my $new_type = $type; $new_type =~ s/\b\s*int\s*\b/ /; $new_type =~ s/\b\s*(?:un)?signed\b\s*/ /; $new_type =~ s/^const\s+//; $new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/); $new_type = "const $new_type" if ($type =~ /^const\b/); $new_type =~ s/\s+/ /g; $new_type = trim($new_type); if (WARN("UNNECESSARY_INT", "Prefer '$new_type' over '$type' as the int is unnecessary\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/; } } # check for static const char * arrays. if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) { WARN("STATIC_CONST_CHAR_ARRAY", "static const char * array should probably be static const char * const\n" . $herecurr); } # check for initialized const char arrays that should be static const if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) { if (WARN("STATIC_CONST_CHAR_ARRAY", "const array should probably be static const\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/; } } # check for static char foo[] = "bar" declarations. if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) { WARN("STATIC_CONST_CHAR_ARRAY", "static char array declaration should probably be static const char\n" . $herecurr); } # check for const <foo> const where <foo> is not a pointer or array type if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) { my $found = $1; if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) { WARN("CONST_CONST", "'const $found const *' should probably be 'const $found * const'\n" . $herecurr); } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) { WARN("CONST_CONST", "'const $found const' should probably be 'const $found'\n" . $herecurr); } } # check for non-global char *foo[] = {"bar", ...} declarations. if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) { WARN("STATIC_CONST_CHAR_ARRAY", "char * array declaration might be better as static const\n" . $herecurr); } # check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo) if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) { my $array = $1; if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) { my $array_div = $1; if (WARN("ARRAY_SIZE", "Prefer ARRAY_SIZE($array)\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/; } } } # check for function declarations without arguments like "int foo()" if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) { if (ERROR("FUNCTION_WITHOUT_ARGS", "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/; } } # check for new typedefs, only function parameters and sparse annotations # make sense. if ($line =~ /\btypedef\s/ && $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ && $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ && $line !~ /\b$typeTypedefs\b/ && $line !~ /\b__bitwise\b/) { WARN("NEW_TYPEDEFS", "do not add new typedefs\n" . $herecurr); } # * goes on variable not on type # (char*[ const]) while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) { #print "AA<$1>\n"; my ($ident, $from, $to) = ($1, $2, $2); # Should start with a space. $to =~ s/^(\S)/ $1/; # Should not end with a space. $to =~ s/\s+$//; # '*'s should not have spaces between. while ($to =~ s/\*\s+\*/\*\*/) { } ## print "1: from<$from> to<$to> ident<$ident>\n"; if ($from ne $to) { if (ERROR("POINTER_LOCATION", "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) && $fix) { my $sub_from = $ident; my $sub_to = $ident; $sub_to =~ s/\Q$from\E/$to/; $fixed[$fixlinenr] =~ s@\Q$sub_from\E@$sub_to@; } } } while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) { #print "BB<$1>\n"; my ($match, $from, $to, $ident) = ($1, $2, $2, $3); # Should start with a space. $to =~ s/^(\S)/ $1/; # Should not end with a space. $to =~ s/\s+$//; # '*'s should not have spaces between. while ($to =~ s/\*\s+\*/\*\*/) { } # Modifiers should have spaces. $to =~ s/(\b$Modifier$)/$1 /; ## print "2: from<$from> to<$to> ident<$ident>\n"; if ($from ne $to && $ident !~ /^$Modifier$/) { if (ERROR("POINTER_LOCATION", "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) && $fix) { my $sub_from = $match; my $sub_to = $match; $sub_to =~ s/\Q$from\E/$to/; $fixed[$fixlinenr] =~ s@\Q$sub_from\E@$sub_to@; } } } # avoid BUG() or BUG_ON() if ($line =~ /\b(?:BUG|BUG_ON)\b/) { my $msg_level = \&WARN; $msg_level = \&CHK if ($file); &{$msg_level}("AVOID_BUG", "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr); } # avoid LINUX_VERSION_CODE if ($line =~ /\bLINUX_VERSION_CODE\b/) { WARN("LINUX_VERSION_CODE", "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr); } # check for uses of printk_ratelimit if ($line =~ /\bprintk_ratelimit\s*\(/) { WARN("PRINTK_RATELIMITED", "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr); } # printk should use KERN_* levels if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) { WARN("PRINTK_WITHOUT_KERN_LEVEL", "printk() should include KERN_<LEVEL> facility level\n" . $herecurr); } if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) { my $orig = $1; my $level = lc($orig); $level = "warn" if ($level eq "warning"); my $level2 = $level; $level2 = "dbg" if ($level eq "debug"); WARN("PREFER_PR_LEVEL", "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr); } if ($line =~ /\bpr_warning\s*\(/) { if (WARN("PREFER_PR_LEVEL", "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\bpr_warning\b/pr_warn/; } } if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) { my $orig = $1; my $level = lc($orig); $level = "warn" if ($level eq "warning"); $level = "dbg" if ($level eq "debug"); WARN("PREFER_DEV_LEVEL", "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr); } # ENOSYS means "bad syscall nr" and nothing else. This will have a small # number of false positives, but assembly files are not checked, so at # least the arch entry code will not trigger this warning. if ($line =~ /\bENOSYS\b/) { WARN("ENOSYS", "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr); } # function brace can't be on same line, except for #defines of do while, # or if closed on same line if ($perl_version_ok && $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ && $sline !~ /\#\s*define\b.*do\s*\{/ && $sline !~ /}/) { if (ERROR("OPEN_BRACE", "open brace '{' following function definitions go on the next line\n" . $herecurr) && $fix) { fix_delete_line($fixlinenr, $rawline); my $fixed_line = $rawline; $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/; my $line1 = $1; my $line2 = $2; fix_insert_line($fixlinenr, ltrim($line1)); fix_insert_line($fixlinenr, "\+{"); if ($line2 !~ /^\s*$/) { fix_insert_line($fixlinenr, "\+\t" . trim($line2)); } } } # open braces for enum, union and struct go on the same line. if ($line =~ /^.\s*{/ && $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { if (ERROR("OPEN_BRACE", "open brace '{' following $1 go on the same line\n" . $hereprev) && $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { fix_delete_line($fixlinenr - 1, $prevrawline); fix_delete_line($fixlinenr, $rawline); my $fixedline = rtrim($prevrawline) . " {"; fix_insert_line($fixlinenr, $fixedline); $fixedline = $rawline; $fixedline =~ s/^(.\s*)\{\s*/$1\t/; if ($fixedline !~ /^\+\s*$/) { fix_insert_line($fixlinenr, $fixedline); } } } # missing space after union, struct or enum definition if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) { if (WARN("SPACING", "missing space after $1 definition\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/; } } # Function pointer declarations # check spacing between type, funcptr, and args # canonical declaration is "type (*funcptr)(args...)" if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) { my $declare = $1; my $pre_pointer_space = $2; my $post_pointer_space = $3; my $funcname = $4; my $post_funcname_space = $5; my $pre_args_space = $6; # the $Declare variable will capture all spaces after the type # so check it for a missing trailing missing space but pointer return types # don't need a space so don't warn for those. my $post_declare_space = ""; if ($declare =~ /(\s+)$/) { $post_declare_space = $1; $declare = rtrim($declare); } if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) { WARN("SPACING", "missing space after return type\n" . $herecurr); $post_declare_space = " "; } # unnecessary space "type (*funcptr)(args...)" # This test is not currently implemented because these declarations are # equivalent to # int foo(int bar, ...) # and this is form shouldn't/doesn't generate a checkpatch warning. # # elsif ($declare =~ /\s{2,}$/) { # WARN("SPACING", # "Multiple spaces after return type\n" . $herecurr); # } # unnecessary space "type ( *funcptr)(args...)" if (defined $pre_pointer_space && $pre_pointer_space =~ /^\s/) { WARN("SPACING", "Unnecessary space after function pointer open parenthesis\n" . $herecurr); } # unnecessary space "type (* funcptr)(args...)" if (defined $post_pointer_space && $post_pointer_space =~ /^\s/) { WARN("SPACING", "Unnecessary space before function pointer name\n" . $herecurr); } # unnecessary space "type (*funcptr )(args...)" if (defined $post_funcname_space && $post_funcname_space =~ /^\s/) { WARN("SPACING", "Unnecessary space after function pointer name\n" . $herecurr); } # unnecessary space "type (*funcptr) (args...)" if (defined $pre_args_space && $pre_args_space =~ /^\s/) { WARN("SPACING", "Unnecessary space before function pointer arguments\n" . $herecurr); } if (show_type("SPACING") && $fix) { $fixed[$fixlinenr] =~ s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex; } } # check for spacing round square brackets; allowed: # 1. with a type on the left -- int [] a; # 2. at the beginning of a line for slice initialisers -- [0...10] = 5, # 3. inside a curly brace -- = { [0...10] = 5 } while ($line =~ /(.*?\s)\[/g) { my ($where, $prefix) = ($-[1], $1); if ($prefix !~ /$Type\s+$/ && ($where != 0 || $prefix !~ /^.\s+$/) && $prefix !~ /[{,:]\s+$/) { if (ERROR("BRACKET_SPACE", "space prohibited before open square bracket '['\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/^(\+.*?)\s+\[/$1\[/; } } } # check for spaces between functions and their parentheses. while ($line =~ /($Ident)\s+\(/g) { my $name = $1; my $ctx_before = substr($line, 0, $-[1]); my $ctx = "$ctx_before$name"; # Ignore those directives where spaces _are_ permitted. if ($name =~ /^(?: if|for|while|switch|return|case| volatile|__volatile__| __attribute__|format|__extension__| asm|__asm__)$/x) { # cpp #define statements have non-optional spaces, ie # if there is a space between the name and the open # parenthesis it is simply not a parameter group. } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) { # cpp #elif statement condition may start with a ( } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) { # If this whole things ends with a type its most # likely a typedef for a function. } elsif ($ctx =~ /$Type$/) { } else { if (WARN("SPACING", "space prohibited between function name and open parenthesis '('\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b$name\s+\(/$name\(/; } } } # Check operator spacing. if (!($line=~/\#\s*include/)) { my $fixed_line = ""; my $line_fixed = 0; my $ops = qr{ <<=|>>=|<=|>=|==|!=| \+=|-=|\*=|\/=|%=|\^=|\|=|&=| =>|->|<<|>>|<|>|=|!|~| &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| \?:|\?|: }x; my @elements = split(/($ops|;)/, $opline); ## print("element count: <" . $#elements . ">\n"); ## foreach my $el (@elements) { ## print("el: <$el>\n"); ## } my @fix_elements = (); my $off = 0; foreach my $el (@elements) { push(@fix_elements, substr($rawline, $off, length($el))); $off += length($el); } $off = 0; my $blank = copy_spacing($opline); my $last_after = -1; for (my $n = 0; $n < $#elements; $n += 2) { my $good = $fix_elements[$n] . $fix_elements[$n + 1]; ## print("n: <$n> good: <$good>\n"); $off += length($elements[$n]); # Pick up the preceding and succeeding characters. my $ca = substr($opline, 0, $off); my $cc = ''; if (length($opline) >= ($off + length($elements[$n + 1]))) { $cc = substr($opline, $off + length($elements[$n + 1])); } my $cb = "$ca$;$cc"; my $a = ''; $a = 'V' if ($elements[$n] ne ''); $a = 'W' if ($elements[$n] =~ /\s$/); $a = 'C' if ($elements[$n] =~ /$;$/); $a = 'B' if ($elements[$n] =~ /(\[|\()$/); $a = 'O' if ($elements[$n] eq ''); $a = 'E' if ($ca =~ /^\s*$/); my $op = $elements[$n + 1]; my $c = ''; if (defined $elements[$n + 2]) { $c = 'V' if ($elements[$n + 2] ne ''); $c = 'W' if ($elements[$n + 2] =~ /^\s/); $c = 'C' if ($elements[$n + 2] =~ /^$;/); $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); $c = 'O' if ($elements[$n + 2] eq ''); $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/); } else { $c = 'E'; } my $ctx = "${a}x${c}"; my $at = "(ctx:$ctx)"; my $ptr = substr($blank, 0, $off) . "^"; my $hereptr = "$hereline$ptr\n"; # Pull out the value of this operator. my $op_type = substr($curr_values, $off + 1, 1); # Get the full operator variant. my $opv = $op . substr($curr_vars, $off, 1); # Ignore operators passed as parameters. if ($op_type ne 'V' && $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) { # # Ignore comments # } elsif ($op =~ /^$;+$/) { # ; should have either the end of line or a space or \ after it } elsif ($op eq ';') { if ($ctx !~ /.x[WEBC]/ && $cc !~ /^\\/ && $cc !~ /^;/) { if (ERROR("SPACING", "space required after that '$op' $at\n" . $hereptr)) { $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; $line_fixed = 1; } } # // is a comment } elsif ($op eq '//') { # : when part of a bitfield } elsif ($opv eq ':B') { # skip the bitfield test for now # No spaces for: # -> } elsif ($op eq '->') { if ($ctx =~ /Wx.|.xW/) { if (ERROR("SPACING", "spaces prohibited around that '$op' $at\n" . $hereptr)) { $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); if (defined $fix_elements[$n + 2]) { $fix_elements[$n + 2] =~ s/^\s+//; } $line_fixed = 1; } } # , must not have a space before and must have a space on the right. } elsif ($op eq ',') { my $rtrim_before = 0; my $space_after = 0; if ($ctx =~ /Wx./) { if (ERROR("SPACING", "space prohibited before that '$op' $at\n" . $hereptr)) { $line_fixed = 1; $rtrim_before = 1; } } if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { if (ERROR("SPACING", "space required after that '$op' $at\n" . $hereptr)) { $line_fixed = 1; $last_after = $n; $space_after = 1; } } if ($rtrim_before || $space_after) { if ($rtrim_before) { $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); } else { $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); } if ($space_after) { $good .= " "; } } # '*' as part of a type definition -- reported already. } elsif ($opv eq '*_') { #warn "'*' is part of type\n"; # unary operators should have a space before and # none after. May be left adjacent to another # unary operator, or a cast } elsif ($op eq '!' || $op eq '~' || $opv eq '*U' || $opv eq '-U' || $opv eq '&U' || $opv eq '&&U') { if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { if (ERROR("SPACING", "space required before that '$op' $at\n" . $hereptr)) { if ($n != $last_after + 2) { $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]); $line_fixed = 1; } } } if ($op eq '*' && $cc =~/\s*$Modifier\b/) { # A unary '*' may be const } elsif ($ctx =~ /.xW/) { if (ERROR("SPACING", "space prohibited after that '$op' $at\n" . $hereptr)) { $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]); if (defined $fix_elements[$n + 2]) { $fix_elements[$n + 2] =~ s/^\s+//; } $line_fixed = 1; } } # unary ++ and unary -- are allowed no space on one side. } elsif ($op eq '++' or $op eq '--') { if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { if (ERROR("SPACING", "space required one side of that '$op' $at\n" . $hereptr)) { $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; $line_fixed = 1; } } if ($ctx =~ /Wx[BE]/ || ($ctx =~ /Wx./ && $cc =~ /^;/)) { if (ERROR("SPACING", "space prohibited before that '$op' $at\n" . $hereptr)) { $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); $line_fixed = 1; } } if ($ctx =~ /ExW/) { if (ERROR("SPACING", "space prohibited after that '$op' $at\n" . $hereptr)) { $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); if (defined $fix_elements[$n + 2]) { $fix_elements[$n + 2] =~ s/^\s+//; } $line_fixed = 1; } } # << and >> may either have or not have spaces both sides } elsif ($op eq '<<' or $op eq '>>' or $op eq '&' or $op eq '^' or $op eq '|' or $op eq '+' or $op eq '-' or $op eq '*' or $op eq '/' or $op eq '%') { if ($check) { if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) { if (CHK("SPACING", "spaces preferred around that '$op' $at\n" . $hereptr)) { $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; $fix_elements[$n + 2] =~ s/^\s+//; $line_fixed = 1; } } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) { if (CHK("SPACING", "space preferred before that '$op' $at\n" . $hereptr)) { $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]); $line_fixed = 1; } } } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { if (ERROR("SPACING", "need consistent spacing around '$op' $at\n" . $hereptr)) { $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; if (defined $fix_elements[$n + 2]) { $fix_elements[$n + 2] =~ s/^\s+//; } $line_fixed = 1; } } # A colon needs no spaces before when it is # terminating a case value or a label. } elsif ($opv eq ':C' || $opv eq ':L') { if ($ctx =~ /Wx./) { if (ERROR("SPACING", "space prohibited before that '$op' $at\n" . $hereptr)) { $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); $line_fixed = 1; } } # All the others need spaces both sides. } elsif ($ctx !~ /[EWC]x[CWE]/) { my $ok = 0; # Ignore email addresses <foo@bar> if (($op eq '<' && $cc =~ /^\S+\@\S+>/) || ($op eq '>' && $ca =~ /<\S+\@\S+$/)) { $ok = 1; } # for asm volatile statements # ignore a colon with another # colon immediately before or after if (($op eq ':') && ($ca =~ /:$/ || $cc =~ /^:/)) { $ok = 1; } # messages are ERROR, but ?: are CHK if ($ok == 0) { my $msg_level = \&ERROR; $msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/); if (&{$msg_level}("SPACING", "spaces required around that '$op' $at\n" . $hereptr)) { $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; if (defined $fix_elements[$n + 2]) { $fix_elements[$n + 2] =~ s/^\s+//; } $line_fixed = 1; } } } $off += length($elements[$n + 1]); ## print("n: <$n> GOOD: <$good>\n"); $fixed_line = $fixed_line . $good; } if (($#elements % 2) == 0) { $fixed_line = $fixed_line . $fix_elements[$#elements]; } if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) { $fixed[$fixlinenr] = $fixed_line; } } # check for whitespace before a non-naked semicolon if ($line =~ /^\+.*\S\s+;\s*$/) { if (WARN("SPACING", "space prohibited before semicolon\n" . $herecurr) && $fix) { 1 while $fixed[$fixlinenr] =~ s/^(\+.*\S)\s+;/$1;/; } } # check for multiple assignments if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) { CHK("MULTIPLE_ASSIGNMENTS", "multiple assignments should be avoided\n" . $herecurr); } ## # check for multiple declarations, allowing for a function declaration ## # continuation. ## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ && ## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) { ## ## # Remove any bracketed sections to ensure we do not ## # falsly report the parameters of functions. ## my $ln = $line; ## while ($ln =~ s/\([^\(\)]*\)//g) { ## } ## if ($ln =~ /,/) { ## WARN("MULTIPLE_DECLARATION", ## "declaring multiple variables together should be avoided\n" . $herecurr); ## } ## } #need space before brace following if, while, etc if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) || $line =~ /\b(?:else|do)\{/) { if (ERROR("SPACING", "space required before the open brace '{'\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/; } } ## # check for blank lines before declarations ## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ && ## $prevrawline =~ /^.\s*$/) { ## WARN("SPACING", ## "No blank lines before declarations\n" . $hereprev); ## } ## # closing brace should have a space following it when it has anything # on the line if ($line =~ /}(?!(?:,|;|\)|\}))\S/) { if (ERROR("SPACING", "space required after that close brace '}'\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/}((?!(?:,|;|\)))\S)/} $1/; } } # check spacing on square brackets if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { if (ERROR("SPACING", "space prohibited after that open square bracket '['\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\[\s+/\[/; } } if ($line =~ /\s\]/) { if (ERROR("SPACING", "space prohibited before that close square bracket ']'\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\s+\]/\]/; } } # check spacing on parentheses if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && $line !~ /for\s*\(\s+;/) { if (ERROR("SPACING", "space prohibited after that open parenthesis '('\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\(\s+/\(/; } } if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && $line !~ /for\s*\(.*;\s+\)/ && $line !~ /:\s+\)/) { if (ERROR("SPACING", "space prohibited before that close parenthesis ')'\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\s+\)/\)/; } } # check unnecessary parentheses around addressof/dereference single $Lvals # ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) { my $var = $1; if (CHK("UNNECESSARY_PARENTHESES", "Unnecessary parentheses around $var\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/; } } # check for unnecessary parentheses around function pointer uses # ie: (foo->bar)(); should be foo->bar(); # but not "if (foo->bar) (" to avoid some false positives if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) { my $var = $2; if (CHK("UNNECESSARY_PARENTHESES", "Unnecessary parentheses around function pointer $var\n" . $herecurr) && $fix) { my $var2 = deparenthesize($var); $var2 =~ s/\s//g; $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/; } } # check for unnecessary parentheses around comparisons in if uses # when !drivers/staging or command-line uses --strict if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) && $perl_version_ok && defined($stat) && $stat =~ /(^.\s*if\s*($balanced_parens))/) { my $if_stat = $1; my $test = substr($2, 1, -1); my $herectx; while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) { my $match = $1; # avoid parentheses around potential macro args next if ($match =~ /^\s*\w+\s*$/); if (!defined($herectx)) { $herectx = $here . "\n"; my $cnt = statement_rawlines($if_stat); for (my $n = 0; $n < $cnt; $n++) { my $rl = raw_line($linenr, $n); $herectx .= $rl . "\n"; last if $rl =~ /^[ \+].*\{/; } } CHK("UNNECESSARY_PARENTHESES", "Unnecessary parentheses around '$match'\n" . $herectx); } } #goto labels aren't indented, allow a single space however if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { if (WARN("INDENTED_LABEL", "labels should not be indented\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/^(.)\s+/$1/; } } # return is not a function if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) { my $spacing = $1; if ($perl_version_ok && $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) { my $value = $1; $value = deparenthesize($value); if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) { ERROR("RETURN_PARENTHESES", "return is not a function, parentheses are not required\n" . $herecurr); } } elsif ($spacing !~ /\s+/) { ERROR("SPACING", "space required before the open parenthesis '('\n" . $herecurr); } } # unnecessary return in a void function # at end-of-function, with the previous line a single leading tab, then return; # and the line before that not a goto label target like "out:" if ($sline =~ /^[ \+]}\s*$/ && $prevline =~ /^\+\treturn\s*;\s*$/ && $linenr >= 3 && $lines[$linenr - 3] =~ /^[ +]/ && $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) { WARN("RETURN_VOID", "void function return statements are not generally useful\n" . $hereprev); } # if statements using unnecessary parentheses - ie: if ((foo == bar)) if ($perl_version_ok && $line =~ /\bif\s*((?:\(\s*){2,})/) { my $openparens = $1; my $count = $openparens =~ tr@\(@\(@; my $msg = ""; if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) { my $comp = $4; #Not $1 because of $LvalOrFunc $msg = " - maybe == should be = ?" if ($comp eq "=="); WARN("UNNECESSARY_PARENTHESES", "Unnecessary parentheses$msg\n" . $herecurr); } } # comparisons with a constant or upper case identifier on the left # avoid cases like "foo + BAR < baz" # only fix matches surrounded by parentheses to avoid incorrect # conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5" if ($perl_version_ok && $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) { my $lead = $1; my $const = $2; my $comp = $3; my $to = $4; my $newcomp = $comp; if ($lead !~ /(?:$Operators|\.)\s*$/ && $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ && WARN("CONSTANT_COMPARISON", "Comparisons should place the constant on the right side of the test\n" . $herecurr) && $fix) { if ($comp eq "<") { $newcomp = ">"; } elsif ($comp eq "<=") { $newcomp = ">="; } elsif ($comp eq ">") { $newcomp = "<"; } elsif ($comp eq ">=") { $newcomp = "<="; } $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/; } } # Return of what appears to be an errno should normally be negative if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) { my $name = $1; if ($name ne 'EOF' && $name ne 'ERROR') { WARN("USE_NEGATIVE_ERRNO", "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr); } } # Need a space before open parenthesis after if, while etc if ($line =~ /\b(if|while|for|switch)\(/) { if (ERROR("SPACING", "space required before the open parenthesis '('\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b(if|while|for|switch)\(/$1 \(/; } } # Check for illegal assignment in if conditional -- and check for trailing # statements after the conditional. if ($line =~ /do\s*(?!{)/) { ($stat, $cond, $line_nr_next, $remain_next, $off_next) = ctx_statement_block($linenr, $realcnt, 0) if (!defined $stat); my ($stat_next) = ctx_statement_block($line_nr_next, $remain_next, $off_next); $stat_next =~ s/\n./\n /g; ##print "stat<$stat> stat_next<$stat_next>\n"; if ($stat_next =~ /^\s*while\b/) { # If the statement carries leading newlines, # then count those as offsets. my ($whitespace) = ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s); my $offset = statement_rawlines($whitespace) - 1; $suppress_whiletrailers{$line_nr_next + $offset} = 1; } } if (!defined $suppress_whiletrailers{$linenr} && defined($stat) && defined($cond) && $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { my ($s, $c) = ($stat, $cond); if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) { ERROR("ASSIGN_IN_IF", "do not use assignment in if condition\n" . $herecurr); } # Find out what is on the end of the line after the # conditional. substr($s, 0, length($c), ''); $s =~ s/\n.*//g; $s =~ s/$;//g; # Remove any comments if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && $c !~ /}\s*while\s*/) { # Find out how long the conditional actually is. my @newlines = ($c =~ /\n/gs); my $cond_lines = 1 + $#newlines; my $stat_real = ''; $stat_real = raw_line($linenr, $cond_lines) . "\n" if ($cond_lines); if (defined($stat_real) && $cond_lines > 1) { $stat_real = "[...]\n$stat_real"; } ERROR("TRAILING_STATEMENTS", "trailing statements should be on next line\n" . $herecurr . $stat_real); } } # Check for bitwise tests written as boolean if ($line =~ / (?: (?:\[|\(|\&\&|\|\|) \s*0[xX][0-9]+\s* (?:\&\&|\|\|) | (?:\&\&|\|\|) \s*0[xX][0-9]+\s* (?:\&\&|\|\||\)|\]) )/x) { WARN("HEXADECIMAL_BOOLEAN_TEST", "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr); } # if and else should not have general statements after it if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) { my $s = $1; $s =~ s/$;//g; # Remove any comments if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) { ERROR("TRAILING_STATEMENTS", "trailing statements should be on next line\n" . $herecurr); } } # if should not continue a brace if ($line =~ /}\s*if\b/) { ERROR("TRAILING_STATEMENTS", "trailing statements should be on next line (or did you mean 'else if'?)\n" . $herecurr); } # case and default should not have general statements after them if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && $line !~ /\G(?: (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$| \s*return\s+ )/xg) { ERROR("TRAILING_STATEMENTS", "trailing statements should be on next line\n" . $herecurr); } # Check for }<nl>else {, these must be at the same # indent level to be relevant to each other. if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ && $previndent == $indent) { if (ERROR("ELSE_AFTER_BRACE", "else should follow close brace '}'\n" . $hereprev) && $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { fix_delete_line($fixlinenr - 1, $prevrawline); fix_delete_line($fixlinenr, $rawline); my $fixedline = $prevrawline; $fixedline =~ s/}\s*$//; if ($fixedline !~ /^\+\s*$/) { fix_insert_line($fixlinenr, $fixedline); } $fixedline = $rawline; $fixedline =~ s/^(.\s*)else/$1} else/; fix_insert_line($fixlinenr, $fixedline); } } if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ && $previndent == $indent) { my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); # Find out what is on the end of the line after the # conditional. substr($s, 0, length($c), ''); $s =~ s/\n.*//g; if ($s =~ /^\s*;/) { if (ERROR("WHILE_AFTER_BRACE", "while should follow close brace '}'\n" . $hereprev) && $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { fix_delete_line($fixlinenr - 1, $prevrawline); fix_delete_line($fixlinenr, $rawline); my $fixedline = $prevrawline; my $trailing = $rawline; $trailing =~ s/^\+//; $trailing = trim($trailing); $fixedline =~ s/}\s*$/} $trailing/; fix_insert_line($fixlinenr, $fixedline); } } } #Specific variable tests while ($line =~ m{($Constant|$Lval)}g) { my $var = $1; #CamelCase if ($var !~ /^$Constant$/ && $var =~ /[A-Z][a-z]|[a-z][A-Z]/ && #Ignore Page<foo> variants $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ && #Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show) $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ && #Ignore some three character SI units explicitly, like MiB and KHz $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) { while ($var =~ m{($Ident)}g) { my $word = $1; next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/); if ($check) { seed_camelcase_includes(); if (!$file && !$camelcase_file_seeded) { seed_camelcase_file($realfile); $camelcase_file_seeded = 1; } } if (!defined $camelcase{$word}) { $camelcase{$word} = 1; CHK("CAMELCASE", "Avoid CamelCase: <$word>\n" . $herecurr); } } } } #no spaces allowed after \ in define if ($line =~ /\#\s*define.*\\\s+$/) { if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION", "Whitespace after \\ makes next lines useless\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\s+$//; } } # warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes # itself <asm/foo.h> (uses RAW line) if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) { my $file = "$1.h"; my $checkfile = "include/linux/$file"; if (-f "$root/$checkfile" && $realfile ne $checkfile && $1 !~ /$allowed_asm_includes/) { my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`; if ($asminclude > 0) { if ($realfile =~ m{^arch/}) { CHK("ARCH_INCLUDE_LINUX", "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr); } else { WARN("INCLUDE_LINUX", "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr); } } } } # multi-statement macros should be enclosed in a do while loop, grab the # first statement and ensure its the whole macro if its not enclosed # in a known good container if ($realfile !~ m@/vmlinux.lds.h$@ && $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { my $ln = $linenr; my $cnt = $realcnt; my ($off, $dstat, $dcond, $rest); my $ctx = ''; my $has_flow_statement = 0; my $has_arg_concat = 0; ($dstat, $dcond, $ln, $cnt, $off) = ctx_statement_block($linenr, $realcnt, 0); $ctx = $dstat; #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/); $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/); $dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//; my $define_args = $1; my $define_stmt = $dstat; my @def_args = (); if (defined $define_args && $define_args ne "") { $define_args = substr($define_args, 1, length($define_args) - 2); $define_args =~ s/\s*//g; $define_args =~ s/\\\+?//g; @def_args = split(",", $define_args); } $dstat =~ s/$;//g; $dstat =~ s/\\\n.//g; $dstat =~ s/^\s*//s; $dstat =~ s/\s*$//s; # Flatten any parentheses and braces while ($dstat =~ s/\([^\(\)]*\)/1/ || $dstat =~ s/\{[^\{\}]*\}/1/ || $dstat =~ s/.\[[^\[\]]*\]/1/) { } # Flatten any obvious string concatentation. while ($dstat =~ s/($String)\s*$Ident/$1/ || $dstat =~ s/$Ident\s*($String)/$1/) { } # Make asm volatile uses seem like a generic function $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g; my $exceptions = qr{ $Declare| module_param_named| MODULE_PARM_DESC| DECLARE_PER_CPU| DEFINE_PER_CPU| __typeof__\(| union| struct| \.$Ident\s*=\s*| ^\"|\"$| ^\[ }x; #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n"; $ctx =~ s/\n*$//; my $stmt_cnt = statement_rawlines($ctx); my $herectx = get_stat_here($linenr, $stmt_cnt, $here); if ($dstat ne '' && $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(), $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo(); $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants $dstat !~ /$exceptions/ && $dstat !~ /^\.$Ident\s*=/ && # .foo = $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...) $dstat !~ /^for\s*$Constant$/ && # for (...) $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar() $dstat !~ /^do\s*{/ && # do {... $dstat !~ /^\(\{/ && # ({... $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/) { if ($dstat =~ /^\s*if\b/) { ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx"); } elsif ($dstat =~ /;/) { ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); } else { ERROR("COMPLEX_MACRO", "Macros with complex values should be enclosed in parentheses\n" . "$herectx"); } } # Make $define_stmt single line, comment-free, etc my @stmt_array = split('\n', $define_stmt); my $first = 1; $define_stmt = ""; foreach my $l (@stmt_array) { $l =~ s/\\$//; if ($first) { $define_stmt = $l; $first = 0; } elsif ($l =~ /^[\+ ]/) { $define_stmt .= substr($l, 1); } } $define_stmt =~ s/$;//g; $define_stmt =~ s/\s+/ /g; $define_stmt = trim($define_stmt); # check if any macro arguments are reused (ignore '...' and 'type') foreach my $arg (@def_args) { next if ($arg =~ /\.\.\./); next if ($arg =~ /^type$/i); my $tmp_stmt = $define_stmt; $tmp_stmt =~ s/\b(sizeof|typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g; $tmp_stmt =~ s/\#+\s*$arg\b//g; $tmp_stmt =~ s/\b$arg\s*\#\#//g; my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g; if ($use_cnt > 1) { CHK("MACRO_ARG_REUSE", "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx"); } # check if any macro arguments may have other precedence issues if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m && ((defined($1) && $1 ne ',') || (defined($2) && $2 ne ','))) { CHK("MACRO_ARG_PRECEDENCE", "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx"); } } # check for macros with flow control, but without ## concatenation # ## concatenation is commonly a macro that defines a function so ignore those if ($has_flow_statement && !$has_arg_concat) { my $cnt = statement_rawlines($ctx); my $herectx = get_stat_here($linenr, $cnt, $here); WARN("MACRO_WITH_FLOW_CONTROL", "Macros with flow control statements should be avoided\n" . "$herectx"); } # check for line continuations outside of #defines, preprocessor #, and asm } else { if ($prevline !~ /^..*\\$/ && $line !~ /^\+\s*\#.*\\$/ && # preprocessor $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm $line =~ /^\+.*\\$/) { WARN("LINE_CONTINUATIONS", "Avoid unnecessary line continuations\n" . $herecurr); } } # do {} while (0) macro tests: # single-statement macros do not need to be enclosed in do while (0) loop, # macro should not end with a semicolon if ($perl_version_ok && $realfile !~ m@/vmlinux.lds.h$@ && $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) { my $ln = $linenr; my $cnt = $realcnt; my ($off, $dstat, $dcond, $rest); my $ctx = ''; ($dstat, $dcond, $ln, $cnt, $off) = ctx_statement_block($linenr, $realcnt, 0); $ctx = $dstat; $dstat =~ s/\\\n.//g; $dstat =~ s/$;/ /g; if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) { my $stmts = $2; my $semis = $3; $ctx =~ s/\n*$//; my $cnt = statement_rawlines($ctx); my $herectx = get_stat_here($linenr, $cnt, $here); if (($stmts =~ tr/;/;/) == 1 && $stmts !~ /^\s*(if|while|for|switch)\b/) { WARN("SINGLE_STATEMENT_DO_WHILE_MACRO", "Single statement macros should not use a do {} while (0) loop\n" . "$herectx"); } if (defined $semis && $semis ne "") { WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON", "do {} while (0) macros should not be semicolon terminated\n" . "$herectx"); } } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) { $ctx =~ s/\n*$//; my $cnt = statement_rawlines($ctx); my $herectx = get_stat_here($linenr, $cnt, $here); WARN("TRAILING_SEMICOLON", "macros should not use a trailing semicolon\n" . "$herectx"); } } # check for redundant bracing round if etc if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { my ($level, $endln, @chunks) = ctx_statement_full($linenr, $realcnt, 1); #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; if ($#chunks > 0 && $level == 0) { my @allowed = (); my $allow = 0; my $seen = 0; my $herectx = $here . "\n"; my $ln = $linenr - 1; for my $chunk (@chunks) { my ($cond, $block) = @{$chunk}; # If the condition carries leading newlines, then count those as offsets. my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s); my $offset = statement_rawlines($whitespace) - 1; $allowed[$allow] = 0; #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n"; # We have looked at and allowed this specific line. $suppress_ifbraces{$ln + $offset} = 1; $herectx .= "$rawlines[$ln + $offset]\n[...]\n"; $ln += statement_rawlines($block) - 1; substr($block, 0, length($cond), ''); $seen++ if ($block =~ /^\s*{/); #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n"; if (statement_lines($cond) > 1) { #print "APW: ALLOWED: cond<$cond>\n"; $allowed[$allow] = 1; } if ($block =~/\b(?:if|for|while)\b/) { #print "APW: ALLOWED: block<$block>\n"; $allowed[$allow] = 1; } if (statement_block_size($block) > 1) { #print "APW: ALLOWED: lines block<$block>\n"; $allowed[$allow] = 1; } $allow++; } if ($seen) { my $sum_allowed = 0; foreach (@allowed) { $sum_allowed += $_; } if ($sum_allowed == 0) { WARN("BRACES", "braces {} are not necessary for any arm of this statement\n" . $herectx); } elsif ($sum_allowed != $allow && $seen != $allow) { CHK("BRACES", "braces {} should be used on all arms of this statement\n" . $herectx); } } } } if (!defined $suppress_ifbraces{$linenr - 1} && $line =~ /\b(if|while|for|else)\b/) { my $allowed = 0; # Check the pre-context. if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { #print "APW: ALLOWED: pre<$1>\n"; $allowed = 1; } my ($level, $endln, @chunks) = ctx_statement_full($linenr, $realcnt, $-[0]); # Check the condition. my ($cond, $block) = @{$chunks[0]}; #print "CHECKING<$linenr> cond<$cond> block<$block>\n"; if (defined $cond) { substr($block, 0, length($cond), ''); } if (statement_lines($cond) > 1) { #print "APW: ALLOWED: cond<$cond>\n"; $allowed = 1; } if ($block =~/\b(?:if|for|while)\b/) { #print "APW: ALLOWED: block<$block>\n"; $allowed = 1; } if (statement_block_size($block) > 1) { #print "APW: ALLOWED: lines block<$block>\n"; $allowed = 1; } # Check the post-context. if (defined $chunks[1]) { my ($cond, $block) = @{$chunks[1]}; if (defined $cond) { substr($block, 0, length($cond), ''); } if ($block =~ /^\s*\{/) { #print "APW: ALLOWED: chunk-1 block<$block>\n"; $allowed = 1; } } if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { my $cnt = statement_rawlines($block); my $herectx = get_stat_here($linenr, $cnt, $here); WARN("BRACES", "braces {} are not necessary for single statement blocks\n" . $herectx); } } # check for single line unbalanced braces if ($sline =~ /^.\s*\}\s*else\s*$/ || $sline =~ /^.\s*else\s*\{\s*$/) { CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr); } # check for unnecessary blank lines around braces if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) { if (CHK("BRACES", "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) && $fix && $prevrawline =~ /^\+/) { fix_delete_line($fixlinenr - 1, $prevrawline); } } if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) { if (CHK("BRACES", "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) && $fix) { fix_delete_line($fixlinenr, $rawline); } } # no volatiles please my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b}; if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) { WARN("VOLATILE", "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr); } # Check for user-visible strings broken across lines, which breaks the ability # to grep for the string. Make exceptions when the previous string ends in a # newline (multiple lines in one string constant) or '\t', '\r', ';', or '{' # (common in inline assembly) or is a octal \123 or hexadecimal \xaf value if ($line =~ /^\+\s*$String/ && $prevline =~ /"\s*$/ && $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) { if (WARN("SPLIT_STRING", "quoted string split across lines\n" . $hereprev) && $fix && $prevrawline =~ /^\+.*"\s*$/ && $last_coalesced_string_linenr != $linenr - 1) { my $extracted_string = get_quoted_string($line, $rawline); my $comma_close = ""; if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) { $comma_close = $1; } fix_delete_line($fixlinenr - 1, $prevrawline); fix_delete_line($fixlinenr, $rawline); my $fixedline = $prevrawline; $fixedline =~ s/"\s*$//; $fixedline .= substr($extracted_string, 1) . trim($comma_close); fix_insert_line($fixlinenr - 1, $fixedline); $fixedline = $rawline; $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//; if ($fixedline !~ /\+\s*$/) { fix_insert_line($fixlinenr, $fixedline); } $last_coalesced_string_linenr = $linenr; } } # check for missing a space in a string concatenation if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) { WARN('MISSING_SPACE', "break quoted strings at a space character\n" . $hereprev); } # check for an embedded function name in a string when the function is known # This does not work very well for -f --file checking as it depends on patch # context providing the function name or a single line form for in-file # function declarations if ($line =~ /^\+.*$String/ && defined($context_function) && get_quoted_string($line, $rawline) =~ /\b$context_function\b/ && length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) { WARN("EMBEDDED_FUNCTION_NAME", "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr); } # check for spaces before a quoted newline if ($rawline =~ /^.*\".*\s\\n/) { if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE", "unnecessary whitespace before a quoted newline\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/; } } # concatenated string without spaces between elements if ($line =~ /$String[A-Za-z0-9_]/ || $line =~ /[A-Za-z0-9_]$String/) { if (CHK("CONCATENATED_STRING", "Concatenated strings should use spaces between elements\n" . $herecurr) && $fix) { while ($line =~ /($String)/g) { my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]); $fixed[$fixlinenr] =~ s/\Q$extracted_string\E([A-Za-z0-9_])/$extracted_string $1/; $fixed[$fixlinenr] =~ s/([A-Za-z0-9_])\Q$extracted_string\E/$1 $extracted_string/; } } } # uncoalesced string fragments if ($line =~ /$String\s*"/) { if (WARN("STRING_FRAGMENTS", "Consecutive strings are generally better as a single string\n" . $herecurr) && $fix) { while ($line =~ /($String)(?=\s*")/g) { my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]); $fixed[$fixlinenr] =~ s/\Q$extracted_string\E\s*"/substr($extracted_string, 0, -1)/e; } } } # check for non-standard and hex prefixed decimal printf formats my $show_L = 1; #don't show the same defect twice my $show_Z = 1; while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { my $string = substr($rawline, $-[1], $+[1] - $-[1]); $string =~ s/%%/__/g; # check for %L if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) { WARN("PRINTF_L", "\%L$1 is non-standard C, use %ll$1\n" . $herecurr); $show_L = 0; } # check for %Z if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) { WARN("PRINTF_Z", "%Z$1 is non-standard C, use %z$1\n" . $herecurr); $show_Z = 0; } # check for 0x<decimal> if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) { ERROR("PRINTF_0XDECIMAL", "Prefixing 0x with decimal output is defective\n" . $herecurr); } } # check for line continuations in quoted strings with odd counts of " if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) { WARN("LINE_CONTINUATIONS", "Avoid line continuations in quoted strings\n" . $herecurr); } # warn about #if 0 if ($line =~ /^.\s*\#\s*if\s+0\b/) { WARN("IF_0", "Consider removing the code enclosed by this #if 0 and its #endif\n" . $herecurr); } # warn about #if 1 if ($line =~ /^.\s*\#\s*if\s+1\b/) { WARN("IF_1", "Consider removing the #if 1 and its #endif\n" . $herecurr); } # check for needless "if (<foo>) fn(<foo>)" uses if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) { my $tested = quotemeta($1); my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;'; if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) { my $func = $1; if (WARN('NEEDLESS_IF', "$func(NULL) is safe and this check is probably not required\n" . $hereprev) && $fix) { my $do_fix = 1; my $leading_tabs = ""; my $new_leading_tabs = ""; if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) { $leading_tabs = $1; } else { $do_fix = 0; } if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) { $new_leading_tabs = $1; if (length($leading_tabs) + 1 ne length($new_leading_tabs)) { $do_fix = 0; } } else { $do_fix = 0; } if ($do_fix) { fix_delete_line($fixlinenr - 1, $prevrawline); $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/; } } } } # check for unnecessary "Out of Memory" messages if ($line =~ /^\+.*\b$logFunctions\s*\(/ && $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ && (defined $1 || defined $3) && $linenr > 3) { my $testval = $2; my $testline = $lines[$linenr - 3]; my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0); # print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n"); if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ && $s !~ /\b__GFP_NOWARN\b/ ) { WARN("OOM_MESSAGE", "Possible unnecessary 'out of memory' message\n" . $hereprev); } } # check for logging functions with KERN_<LEVEL> if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ && $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) { my $level = $1; if (WARN("UNNECESSARY_KERN_LEVEL", "Possible unnecessary $level\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\s*$level\s*//; } } # check for logging continuations if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) { WARN("LOGGING_CONTINUATION", "Avoid logging continuation uses where feasible\n" . $herecurr); } # check for mask then right shift without a parentheses if ($perl_version_ok && $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ && $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so WARN("MASK_THEN_SHIFT", "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr); } # check for pointer comparisons to NULL if ($perl_version_ok) { while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) { my $val = $1; my $equal = "!"; $equal = "" if ($4 eq "!="); if (CHK("COMPARISON_TO_NULL", "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/; } } } # check for bad placement of section $InitAttribute (e.g.: __initdata) if ($line =~ /(\b$InitAttribute\b)/) { my $attr = $1; if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) { my $ptr = $1; my $var = $2; if ((($ptr =~ /\b(union|struct)\s+$attr\b/ && ERROR("MISPLACED_INIT", "$attr should be placed after $var\n" . $herecurr)) || ($ptr !~ /\b(union|struct)\s+$attr\b/ && WARN("MISPLACED_INIT", "$attr should be placed after $var\n" . $herecurr))) && $fix) { $fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e; } } } # check for $InitAttributeData (ie: __initdata) with const if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) { my $attr = $1; $attr =~ /($InitAttributePrefix)(.*)/; my $attr_prefix = $1; my $attr_type = $2; if (ERROR("INIT_ATTRIBUTE", "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/$InitAttributeData/${attr_prefix}initconst/; } } # check for $InitAttributeConst (ie: __initconst) without const if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) { my $attr = $1; if (ERROR("INIT_ATTRIBUTE", "Use of $attr requires a separate use of const\n" . $herecurr) && $fix) { my $lead = $fixed[$fixlinenr] =~ /(^\+\s*(?:static\s+))/; $lead = rtrim($1); $lead = "$lead " if ($lead !~ /^\+$/); $lead = "${lead}const "; $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/; } } # check for __read_mostly with const non-pointer (should just be const) if ($line =~ /\b__read_mostly\b/ && $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) { if (ERROR("CONST_READ_MOSTLY", "Invalid use of __read_mostly with const type\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//; } } # don't use __constant_<foo> functions outside of include/uapi/ if ($realfile !~ m@^include/uapi/@ && $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) { my $constant_func = $1; my $func = $constant_func; $func =~ s/^__constant_//; if (WARN("CONSTANT_CONVERSION", "$constant_func should be $func\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g; } } # prefer usleep_range over udelay if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) { my $delay = $1; # ignore udelay's < 10, however if (! ($delay < 10) ) { CHK("USLEEP_RANGE", "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr); } if ($delay > 2000) { WARN("LONG_UDELAY", "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr); } } # warn about unexpectedly long msleep's if ($line =~ /\bmsleep\s*\((\d+)\);/) { if ($1 < 20) { WARN("MSLEEP", "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr); } } # check for comparisons of jiffies if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) { WARN("JIFFIES_COMPARISON", "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr); } # check for comparisons of get_jiffies_64() if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) { WARN("JIFFIES_COMPARISON", "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr); } # warn about #ifdefs in C files # if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { # print "#ifdef in C files should be avoided\n"; # print "$herecurr"; # $clean = 0; # } # warn about spacing in #ifdefs if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) { if (ERROR("SPACING", "exactly one space required after that #$1\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /; } } # check for spinlock_t definitions without a comment. if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { my $which = $1; if (!ctx_has_comment($first_line, $linenr)) { CHK("UNCOMMENTED_DEFINITION", "$1 definition without comment\n" . $herecurr); } } # check for memory barriers without a comment. my $barriers = qr{ mb| rmb| wmb| read_barrier_depends }x; my $barrier_stems = qr{ mb__before_atomic| mb__after_atomic| store_release| load_acquire| store_mb| (?:$barriers) }x; my $all_barriers = qr{ (?:$barriers)| smp_(?:$barrier_stems)| virt_(?:$barrier_stems) }x; if ($line =~ /\b(?:$all_barriers)\s*\(/) { if (!ctx_has_comment($first_line, $linenr)) { WARN("MEMORY_BARRIER", "memory barrier without comment\n" . $herecurr); } } my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x; if ($realfile !~ m@^include/asm-generic/@ && $realfile !~ m@/barrier\.h$@ && $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ && $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) { WARN("MEMORY_BARRIER", "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr); } # check for waitqueue_active without a comment. if ($line =~ /\bwaitqueue_active\s*\(/) { if (!ctx_has_comment($first_line, $linenr)) { WARN("WAITQUEUE_ACTIVE", "waitqueue_active without comment\n" . $herecurr); } } # check for smp_read_barrier_depends and read_barrier_depends if (!$file && $line =~ /\b(smp_|)read_barrier_depends\s*\(/) { WARN("READ_BARRIER_DEPENDS", "$1read_barrier_depends should only be used in READ_ONCE or DEC Alpha code\n" . $herecurr); } # check of hardware specific defines if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) { CHK("ARCH_DEFINES", "architecture specific defines should be avoided\n" . $herecurr); } # check that the storage class is not after a type if ($line =~ /\b($Type)\s+($Storage)\b/) { WARN("STORAGE_CLASS", "storage class '$2' should be located before type '$1'\n" . $herecurr); } # Check that the storage class is at the beginning of a declaration if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage/ && $line =~ /^.\s*(.+?)\$Storage\s/ && $1 !~ /[\,\)]\s*$/) { WARN("STORAGE_CLASS", "storage class should be at the beginning of the declaration\n" . $herecurr); } # check the location of the inline attribute, that it is between # storage class and type. if ($line =~ /\b$Type\s+$Inline\b/ || $line =~ /\b$Inline\s+$Storage\b/) { ERROR("INLINE_LOCATION", "inline keyword should sit between storage class and type\n" . $herecurr); } # Check for __inline__ and __inline, prefer inline if ($realfile !~ m@\binclude/uapi/@ && $line =~ /\b(__inline__|__inline)\b/) { if (WARN("INLINE", "plain inline is preferred over $1\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/; } } # Check for __attribute__ packed, prefer __packed if ($realfile !~ m@\binclude/uapi/@ && $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) { WARN("PREFER_PACKED", "__packed is preferred over __attribute__((packed))\n" . $herecurr); } # Check for __attribute__ aligned, prefer __aligned if ($realfile !~ m@\binclude/uapi/@ && $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) { WARN("PREFER_ALIGNED", "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr); } # Check for __attribute__ section, prefer __section if ($realfile !~ m@\binclude/uapi/@ && $line =~ /\b__attribute__\s*\(\s*\(.*_*section_*\s*\(\s*("[^"]*")/) { my $old = substr($rawline, $-[1], $+[1] - $-[1]); my $new = substr($old, 1, -1); if (WARN("PREFER_SECTION", "__section($new) is preferred over __attribute__((section($old)))\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*_*section_*\s*\(\s*\Q$old\E\s*\)\s*\)\s*\)/__section($new)/; } } # Check for __attribute__ format(printf, prefer __printf if ($realfile !~ m@\binclude/uapi/@ && $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) { if (WARN("PREFER_PRINTF", "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex; } } # Check for __attribute__ format(scanf, prefer __scanf if ($realfile !~ m@\binclude/uapi/@ && $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) { if (WARN("PREFER_SCANF", "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex; } } # Check for __attribute__ weak, or __weak declarations (may have link issues) if ($perl_version_ok && $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ && ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ || $line =~ /\b__weak\b/)) { ERROR("WEAK_DECLARATION", "Using weak declarations can have unintended link defects\n" . $herecurr); } # check for c99 types like uint8_t used outside of uapi/ and tools/ if ($realfile !~ m@\binclude/uapi/@ && $realfile !~ m@\btools/@ && $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) { my $type = $1; if ($type =~ /\b($typeC99Typedefs)\b/) { $type = $1; my $kernel_type = 'u'; $kernel_type = 's' if ($type =~ /^_*[si]/); $type =~ /(\d+)/; $kernel_type .= $1; if (CHK("PREFER_KERNEL_TYPES", "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/; } } } # check for cast of C90 native int or longer types constants if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) { my $cast = $1; my $const = $2; if (WARN("TYPECAST_INT_CONSTANT", "Unnecessary typecast of c90 int constant\n" . $herecurr) && $fix) { my $suffix = ""; my $newconst = $const; $newconst =~ s/${Int_type}$//; $suffix .= 'U' if ($cast =~ /\bunsigned\b/); if ($cast =~ /\blong\s+long\b/) { $suffix .= 'LL'; } elsif ($cast =~ /\blong\b/) { $suffix .= 'L'; } $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/; } } # check for sizeof(&) if ($line =~ /\bsizeof\s*\(\s*\&/) { WARN("SIZEOF_ADDRESS", "sizeof(& should be avoided\n" . $herecurr); } # check for sizeof without parenthesis if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) { if (WARN("SIZEOF_PARENTHESIS", "sizeof $1 should be sizeof($1)\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex; } } # check for struct spinlock declarations if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) { WARN("USE_SPINLOCK_T", "struct spinlock should be spinlock_t\n" . $herecurr); } # check for seq_printf uses that could be seq_puts if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) { my $fmt = get_quoted_string($line, $rawline); $fmt =~ s/%%//g; if ($fmt !~ /%/) { if (WARN("PREFER_SEQ_PUTS", "Prefer seq_puts to seq_printf\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/; } } } # check for vsprintf extension %p<foo> misuses if ($perl_version_ok && defined $stat && $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s && $1 !~ /^_*volatile_*$/) { my $stat_real; my $lc = $stat =~ tr@\n@@; $lc = $lc + $linenr; for (my $count = $linenr; $count <= $lc; $count++) { my $specifier; my $extension; my $bad_specifier = ""; my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0)); $fmt =~ s/%%//g; while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) { $specifier = $1; $extension = $2; if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOxt]/) { $bad_specifier = $specifier; last; } if ($extension eq "x" && !defined($stat_real)) { if (!defined($stat_real)) { $stat_real = get_stat_real($linenr, $lc); } WARN("VSPRINTF_SPECIFIER_PX", "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n"); } } if ($bad_specifier ne "") { my $stat_real = get_stat_real($linenr, $lc); my $ext_type = "Invalid"; my $use = ""; if ($bad_specifier =~ /p[Ff]/) { $ext_type = "Deprecated"; $use = " - use %pS instead"; $use =~ s/pS/ps/ if ($bad_specifier =~ /pf/); } WARN("VSPRINTF_POINTER_EXTENSION", "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n"); } } } # Check for misused memsets if ($perl_version_ok && defined $stat && $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) { my $ms_addr = $2; my $ms_val = $7; my $ms_size = $12; if ($ms_size =~ /^(0x|)0$/i) { ERROR("MEMSET", "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n"); } elsif ($ms_size =~ /^(0x|)1$/i) { WARN("MEMSET", "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n"); } } # Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar) # if ($perl_version_ok && # defined $stat && # $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { # if (WARN("PREFER_ETHER_ADDR_COPY", # "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") && # $fix) { # $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/; # } # } # Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar) # if ($perl_version_ok && # defined $stat && # $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { # WARN("PREFER_ETHER_ADDR_EQUAL", # "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n") # } # check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr # check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr # if ($perl_version_ok && # defined $stat && # $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { # # my $ms_val = $7; # # if ($ms_val =~ /^(?:0x|)0+$/i) { # if (WARN("PREFER_ETH_ZERO_ADDR", # "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") && # $fix) { # $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/; # } # } elsif ($ms_val =~ /^(?:0xff|255)$/i) { # if (WARN("PREFER_ETH_BROADCAST_ADDR", # "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") && # $fix) { # $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/; # } # } # } # typecasts on min/max could be min_t/max_t if ($perl_version_ok && defined $stat && $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) { if (defined $2 || defined $7) { my $call = $1; my $cast1 = deparenthesize($2); my $arg1 = $3; my $cast2 = deparenthesize($7); my $arg2 = $8; my $cast; if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) { $cast = "$cast1 or $cast2"; } elsif ($cast1 ne "") { $cast = $cast1; } else { $cast = $cast2; } WARN("MINMAX", "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n"); } } # check usleep_range arguments if ($perl_version_ok && defined $stat && $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) { my $min = $1; my $max = $7; if ($min eq $max) { WARN("USLEEP_RANGE", "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n"); } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && $min > $max) { WARN("USLEEP_RANGE", "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n"); } } # check for naked sscanf if ($perl_version_ok && defined $stat && $line =~ /\bsscanf\b/ && ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ && $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ && $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) { my $lc = $stat =~ tr@\n@@; $lc = $lc + $linenr; my $stat_real = get_stat_real($linenr, $lc); WARN("NAKED_SSCANF", "unchecked sscanf return value\n" . "$here\n$stat_real\n"); } # check for simple sscanf that should be kstrto<foo> if ($perl_version_ok && defined $stat && $line =~ /\bsscanf\b/) { my $lc = $stat =~ tr@\n@@; $lc = $lc + $linenr; my $stat_real = get_stat_real($linenr, $lc); if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) { my $format = $6; my $count = $format =~ tr@%@%@; if ($count == 1 && $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) { WARN("SSCANF_TO_KSTRTO", "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n"); } } } # check for new externs in .h files. if ($realfile =~ /\.h$/ && $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) { if (CHK("AVOID_EXTERNS", "extern prototypes should be avoided in .h files\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/; } } # check for new externs in .c files. if ($realfile =~ /\.c$/ && defined $stat && $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s) { my $function_name = $1; my $paren_space = $2; my $s = $stat; if (defined $cond) { substr($s, 0, length($cond), ''); } if ($s =~ /^\s*;/ && $function_name ne 'uninitialized_var') { WARN("AVOID_EXTERNS", "externs should be avoided in .c files\n" . $herecurr); } if ($paren_space =~ /\n/) { WARN("FUNCTION_ARGUMENTS", "arguments for function declarations should follow identifier\n" . $herecurr); } } elsif ($realfile =~ /\.c$/ && defined $stat && $stat =~ /^.\s*extern\s+/) { WARN("AVOID_EXTERNS", "externs should be avoided in .c files\n" . $herecurr); } # check for function declarations that have arguments without identifier names if (defined $stat && $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s && $1 ne "void") { my $args = trim($1); while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) { my $arg = trim($1); if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) { WARN("FUNCTION_ARGUMENTS", "function definition argument '$arg' should also have an identifier name\n" . $herecurr); } } } # check for function definitions if ($perl_version_ok && defined $stat && $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) { $context_function = $1; # check for multiline function definition with misplaced open brace my $ok = 0; my $cnt = statement_rawlines($stat); my $herectx = $here . "\n"; for (my $n = 0; $n < $cnt; $n++) { my $rl = raw_line($linenr, $n); $herectx .= $rl . "\n"; $ok = 1 if ($rl =~ /^[ \+]\{/); $ok = 1 if ($rl =~ /\{/ && $n == 0); last if $rl =~ /^[ \+].*\{/; } if (!$ok) { ERROR("OPEN_BRACE", "open brace '{' following function definitions go on the next line\n" . $herectx); } } # checks for new __setup's if ($rawline =~ /\b__setup\("([^"]*)"/) { my $name = $1; if (!grep(/$name/, @setup_docs)) { CHK("UNDOCUMENTED_SETUP", "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr); } } # check for pointless casting of alloc functions if ($line =~ /\*\s*\)\s*$allocFunctions\b/) { WARN("UNNECESSARY_CASTS", "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr); } # alloc style # p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...) if ($perl_version_ok && $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) { CHK("ALLOC_SIZEOF_STRUCT", "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr); } # check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc if ($perl_version_ok && defined $stat && $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) { my $oldfunc = $3; my $a1 = $4; my $a2 = $10; my $newfunc = "kmalloc_array"; $newfunc = "kcalloc" if ($oldfunc eq "kzalloc"); my $r1 = $a1; my $r2 = $a2; if ($a1 =~ /^sizeof\s*\S/) { $r1 = $a2; $r2 = $a1; } if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ && !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) { my $cnt = statement_rawlines($stat); my $herectx = get_stat_here($linenr, $cnt, $here); if (WARN("ALLOC_WITH_MULTIPLY", "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) && $cnt == 1 && $fix) { $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e; } } } # check for krealloc arg reuse if ($perl_version_ok && $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ && $1 eq $3) { WARN("KREALLOC_ARG_REUSE", "Reusing the krealloc arg is almost always a bug\n" . $herecurr); } # check for alloc argument mismatch if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) { WARN("ALLOC_ARRAY_ARGS", "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr); } # check for multiple semicolons if ($line =~ /;\s*;\s*$/) { if (WARN("ONE_SEMICOLON", "Statements terminations use 1 semicolon\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g; } } # check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi if ($realfile !~ m@^include/uapi/@ && $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) { my $ull = ""; $ull = "_ULL" if (defined($1) && $1 =~ /ll/i); if (CHK("BIT_MACRO", "Prefer using the BIT$ull macro\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/; } } # check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) { my $config = $1; if (WARN("PREFER_IS_ENABLED", "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) && $fix) { $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)"; } } # check for case / default statements not preceded by break/fallthrough/switch if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) { my $has_break = 0; my $has_statement = 0; my $count = 0; my $prevline = $linenr; while ($prevline > 1 && ($file || $count < 3) && !$has_break) { $prevline--; my $rline = $rawlines[$prevline - 1]; my $fline = $lines[$prevline - 1]; last if ($fline =~ /^\@\@/); next if ($fline =~ /^\-/); next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/); $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i); next if ($fline =~ /^.[\s$;]*$/); $has_statement = 1; $count++; $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|exit\s*\(\b|return\b|goto\b|continue\b)/); } if (!$has_break && $has_statement) { WARN("MISSING_BREAK", "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr); } } # check for switch/default statements without a break; if ($perl_version_ok && defined $stat && $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) { my $cnt = statement_rawlines($stat); my $herectx = get_stat_here($linenr, $cnt, $here); WARN("DEFAULT_NO_BREAK", "switch default: should use break\n" . $herectx); } # check for gcc specific __FUNCTION__ if ($line =~ /\b__FUNCTION__\b/) { if (WARN("USE_FUNC", "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g; } } # check for uses of __DATE__, __TIME__, __TIMESTAMP__ while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) { ERROR("DATE_TIME", "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr); } # check for use of yield() if ($line =~ /\byield\s*\(\s*\)/) { WARN("YIELD", "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr); } # check for comparisons against true and false if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) { my $lead = $1; my $arg = $2; my $test = $3; my $otype = $4; my $trail = $5; my $op = "!"; ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i); my $type = lc($otype); if ($type =~ /^(?:true|false)$/) { if (("$test" eq "==" && "$type" eq "true") || ("$test" eq "!=" && "$type" eq "false")) { $op = ""; } CHK("BOOL_COMPARISON", "Using comparison to $otype is error prone\n" . $herecurr); ## maybe suggesting a correct construct would better ## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr); } } # check for semaphores initialized locked if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) { WARN("CONSIDER_COMPLETION", "consider using a completion\n" . $herecurr); } # recommend kstrto* over simple_strto* and strict_strto* if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) { WARN("CONSIDER_KSTRTO", "$1 is obsolete, use k$3 instead\n" . $herecurr); } # check for __initcall(), use device_initcall() explicitly or more appropriate function please if ($line =~ /^.\s*__initcall\s*\(/) { WARN("USE_DEVICE_INITCALL", "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr); } # check for spin_is_locked(), suggest lockdep instead if ($line =~ /\bspin_is_locked\(/) { WARN("USE_LOCKDEP", "Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked\n" . $herecurr); } # check for deprecated apis if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) { my $deprecated_api = $1; my $new_api = $deprecated_apis{$deprecated_api}; WARN("DEPRECATED_API", "Deprecated use of '$deprecated_api', prefer '$new_api' instead\n" . $herecurr); } # check for various structs that are normally const (ops, kgdb, device_tree) # and avoid what seem like struct definitions 'struct foo {' if ($line !~ /\bconst\b/ && $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) { WARN("CONST_STRUCT", "struct $1 should normally be const\n" . $herecurr); } # use of NR_CPUS is usually wrong # ignore definitions of NR_CPUS and usage to define arrays as likely right if ($line =~ /\bNR_CPUS\b/ && $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ && $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ && $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) { WARN("NR_CPUS", "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); } # Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong. if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) { ERROR("DEFINE_ARCH_HAS", "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr); } # likely/unlikely comparisons similar to "(likely(foo) > 0)" if ($perl_version_ok && $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) { WARN("LIKELY_MISUSE", "Using $1 should generally have parentheses around the comparison\n" . $herecurr); } # nested likely/unlikely calls if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) { WARN("LIKELY_MISUSE", "nested (un)?likely() calls, $1 already uses unlikely() internally\n" . $herecurr); } # whine mightly about in_atomic if ($line =~ /\bin_atomic\s*\(/) { if ($realfile =~ m@^drivers/@) { ERROR("IN_ATOMIC", "do not use in_atomic in drivers\n" . $herecurr); } elsif ($realfile !~ m@^kernel/@) { WARN("IN_ATOMIC", "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr); } } # check for mutex_trylock_recursive usage if ($line =~ /mutex_trylock_recursive/) { ERROR("LOCKING", "recursive locking is bad, do not use this ever.\n" . $herecurr); } # check for lockdep_set_novalidate_class if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || $line =~ /__lockdep_no_validate__\s*\)/ ) { if ($realfile !~ m@^kernel/lockdep@ && $realfile !~ m@^include/linux/lockdep@ && $realfile !~ m@^drivers/base/core@) { ERROR("LOCKDEP", "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr); } } if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ || $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) { WARN("EXPORTED_WORLD_WRITABLE", "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); } # check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO> # and whether or not function naming is typical and if # DEVICE_ATTR permissions uses are unusual too if ($perl_version_ok && defined $stat && $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) { my $var = $1; my $perms = $2; my $show = $3; my $store = $4; my $octal_perms = perms_to_octal($perms); if ($show =~ /^${var}_show$/ && $store =~ /^${var}_store$/ && $octal_perms eq "0644") { if (WARN("DEVICE_ATTR_RW", "Use DEVICE_ATTR_RW\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/; } } elsif ($show =~ /^${var}_show$/ && $store =~ /^NULL$/ && $octal_perms eq "0444") { if (WARN("DEVICE_ATTR_RO", "Use DEVICE_ATTR_RO\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/; } } elsif ($show =~ /^NULL$/ && $store =~ /^${var}_store$/ && $octal_perms eq "0200") { if (WARN("DEVICE_ATTR_WO", "Use DEVICE_ATTR_WO\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/; } } elsif ($octal_perms eq "0644" || $octal_perms eq "0444" || $octal_perms eq "0200") { my $newshow = "$show"; $newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show"); my $newstore = $store; $newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store"); my $rename = ""; if ($show ne $newshow) { $rename .= " '$show' to '$newshow'"; } if ($store ne $newstore) { $rename .= " '$store' to '$newstore'"; } WARN("DEVICE_ATTR_FUNCTIONS", "Consider renaming function(s)$rename\n" . $herecurr); } else { WARN("DEVICE_ATTR_PERMS", "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr); } } # Mode permission misuses where it seems decimal should be octal # This uses a shortcut match to avoid unnecessary uses of a slow foreach loop # o Ignore module_param*(...) uses with a decimal 0 permission as that has a # specific definition of not visible in sysfs. # o Ignore proc_create*(...) uses with a decimal 0 permission as that means # use the default permissions if ($perl_version_ok && defined $stat && $line =~ /$mode_perms_search/) { foreach my $entry (@mode_permission_funcs) { my $func = $entry->[0]; my $arg_pos = $entry->[1]; my $lc = $stat =~ tr@\n@@; $lc = $lc + $linenr; my $stat_real = get_stat_real($linenr, $lc); my $skip_args = ""; if ($arg_pos > 1) { $arg_pos--; $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}"; } my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]"; if ($stat =~ /$test/) { my $val = $1; $val = $6 if ($skip_args ne ""); if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") && (($val =~ /^$Int$/ && $val !~ /^$Octal$/) || ($val =~ /^$Octal$/ && length($val) ne 4))) { ERROR("NON_OCTAL_PERMISSIONS", "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real); } if ($val =~ /^$Octal$/ && (oct($val) & 02)) { ERROR("EXPORTED_WORLD_WRITABLE", "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real); } } } } # check for uses of S_<PERMS> that could be octal for readability while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) { my $oval = $1; my $octal = perms_to_octal($oval); if (WARN("SYMBOLIC_PERMS", "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) && $fix) { $fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/; } } # validate content of MODULE_LICENSE against list from include/linux/module.h if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) { my $extracted_string = get_quoted_string($line, $rawline); my $valid_licenses = qr{ GPL| GPL\ v2| GPL\ and\ additional\ rights| Dual\ BSD/GPL| Dual\ MIT/GPL| Dual\ MPL/GPL| Proprietary }x; if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) { WARN("MODULE_LICENSE", "unknown module license " . $extracted_string . "\n" . $herecurr); } } # check for sysctl duplicate constants if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) { WARN("DUPLICATED_SYSCTL_CONST", "duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr); } } # If we have no input at all, then there is nothing to report on # so just keep quiet. if ($#rawlines == -1) { exit(0); } # In mailback mode only produce a report in the negative, for # things that appear to be patches. if ($mailback && ($clean == 1 || !$is_patch)) { exit(0); } # This is not a patch, and we are are in 'no-patch' mode so # just keep quiet. if (!$chk_patch && !$is_patch) { exit(0); } if (!$is_patch && $filename !~ /cover-letter\.patch$/) { ERROR("NOT_UNIFIED_DIFF", "Does not appear to be a unified-diff format patch\n"); } if ($is_patch && $has_commit_log && $chk_signoff) { if ($signoff == 0) { ERROR("MISSING_SIGN_OFF", "Missing Signed-off-by: line(s)\n"); } elsif (!$authorsignoff) { WARN("NO_AUTHOR_SIGN_OFF", "Missing Signed-off-by: line by nominal patch author '$author'\n"); } } print report_dump(); if ($summary && !($clean == 1 && $quiet == 1)) { print "$filename " if ($summary_file); print "total: $cnt_error errors, $cnt_warn warnings, " . (($check)? "$cnt_chk checks, " : "") . "$cnt_lines lines checked\n"; } if ($quiet == 0) { # If there were any defects found and not already fixing them if (!$clean and !$fix) { print << "EOM" NOTE: For some of the reported defects, checkpatch may be able to mechanically convert to the typical style using --fix or --fix-inplace. EOM } # If there were whitespace errors which cleanpatch can fix # then suggest that. if ($rpt_cleaners) { $rpt_cleaners = 0; print << "EOM" NOTE: Whitespace errors detected. You may wish to use scripts/cleanpatch or scripts/cleanfile EOM } } if ($clean == 0 && $fix && ("@rawlines" ne "@fixed" || $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) { my $newfile = $filename; $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace); my $linecount = 0; my $f; @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted); open($f, '>', $newfile) or die "$P: Can't open $newfile for write\n"; foreach my $fixed_line (@fixed) { $linecount++; if ($file) { if ($linecount > 3) { $fixed_line =~ s/^\+//; print $f $fixed_line . "\n"; } } else { print $f $fixed_line . "\n"; } } close($f); if (!$quiet) { print << "EOM"; Wrote EXPERIMENTAL --fix correction(s) to '$newfile' Do _NOT_ trust the results written to this file. Do _NOT_ submit these changes without inspecting them for correctness. This EXPERIMENTAL file is simply a convenience to help rewrite patches. No warranties, expressed or implied... EOM } } if ($quiet == 0) { print "\n"; if ($clean == 1) { print "$vname has no obvious style problems and is ready for submission.\n"; } else { print "$vname has style problems, please review.\n"; } } return $clean; } ��������������������������������������������������������������kw-20191112/tests/external/const_structs.checkpatch�������������������������������������������������0000644�0001750�0001750�00000001704�13574463526�022232� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������acpi_dock_ops address_space_operations backlight_ops block_device_operations clk_ops comedi_lrange component_ops dentry_operations dev_pm_ops dma_map_ops driver_info drm_connector_funcs drm_encoder_funcs drm_encoder_helper_funcs ethtool_ops extent_io_ops file_lock_operations file_operations hv_ops ide_dma_ops ide_port_ops inode_operations intel_dvo_dev_ops irq_domain_ops item_operations iwl_cfg iwl_ops kgdb_arch kgdb_io kset_uevent_ops lock_manager_operations machine_desc microcode_ops mlxsw_reg_info mtrr_ops neigh_ops net_device_ops nlmsvc_binding nvkm_device_chip of_device_id pci_raw_ops pipe_buf_operations platform_hibernation_ops platform_suspend_ops proto_ops regmap_access_table rpc_pipe_ops rtc_class_ops sd_desc seq_operations sirfsoc_padmux snd_ac97_build_ops snd_soc_component_driver soc_pcmcia_socket_ops stacktrace_ops sysfs_ops tty_operations uart_ops usb_mon_operations v4l2_ctrl_ops v4l2_ioctl_ops vm_operations_struct wacom_features wd_ops ������������������������������������������������������������kw-20191112/tests/external/spelling.txt�������������������������������������������������������������0000644�0001750�0001750�00000071416�13574463526�017663� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Originally from Debian's Lintian tool. Various false positives have been # removed, and various additions have been made as they've been discovered # in the kernel source. # # License: GPLv2 # # The format of each line is: # mistake||correction # abandonning||abandoning abigious||ambiguous abitrate||arbitrate abnornally||abnormally abnrormal||abnormal abord||abort aboslute||absolute abov||above abreviated||abbreviated absense||absence absolut||absolute absoulte||absolute acccess||access acceess||access acceleratoin||acceleration accelleration||acceleration accesing||accessing accesnt||accent accessable||accessible accesss||access accidentaly||accidentally accidentually||accidentally acclerated||accelerated accoding||according accomodate||accommodate accomodates||accommodates accordign||according accoring||according accout||account accquire||acquire accquired||acquired accross||across acessable||accessible acess||access acessing||accessing achitecture||architecture acient||ancient acitions||actions acitve||active acknowldegement||acknowledgment acknowledgement||acknowledgment ackowledge||acknowledge ackowledged||acknowledged acording||according activete||activate actived||activated actualy||actually acumulating||accumulating acumulative||accumulative acumulator||accumulator adapater||adapter addional||additional additionaly||additionally additonal||additional addres||address adddress||address addreses||addresses addresss||address addrress||address aditional||additional aditionally||additionally aditionaly||additionally adminstrative||administrative adress||address adresses||addresses adrresses||addresses advertisment||advertisement adviced||advised afecting||affecting againt||against agaist||against aggreataon||aggregation aggreation||aggregation albumns||albums alegorical||allegorical algined||aligned algorith||algorithm algorithmical||algorithmically algoritm||algorithm algoritms||algorithms algorrithm||algorithm algorritm||algorithm aligment||alignment alignement||alignment allign||align alligned||aligned alllocate||allocate alloated||allocated allocatote||allocate allocatrd||allocated allocte||allocate allpication||application alocate||allocate alogirhtms||algorithms alogrithm||algorithm alot||a lot alow||allow alows||allows alredy||already altough||although alue||value ambigious||ambiguous amoung||among amout||amount amplifer||amplifier amplifyer||amplifier an union||a union an user||a user an userspace||a userspace an one||a one analysator||analyzer ang||and anniversery||anniversary annoucement||announcement anomolies||anomalies anomoly||anomaly anway||anyway aplication||application appearence||appearance applicaion||application appliction||application applictions||applications applys||applies appplications||applications appropiate||appropriate appropriatly||appropriately approriate||appropriate approriately||appropriately apropriate||appropriate aquainted||acquainted aquired||acquired aquisition||acquisition arbitary||arbitrary architechture||architecture arguement||argument arguements||arguments aritmetic||arithmetic arne't||aren't arraival||arrival artifical||artificial artillary||artillery asign||assign asser||assert assertation||assertion assertting||asserting assiged||assigned assigment||assignment assigments||assignments assistent||assistant assocation||association associcated||associated assotiated||associated asssert||assert assum||assume assumtpion||assumption asuming||assuming asycronous||asynchronous asynchnous||asynchronous asynchromous||asynchronous asymetric||asymmetric asymmeric||asymmetric atomatically||automatically atomicly||atomically atempt||attempt attachement||attachment attched||attached attemps||attempts attemping||attempting attepmpt||attempt attnetion||attention attruibutes||attributes authentification||authentication automaticaly||automatically automaticly||automatically automatize||automate automatized||automated automatizes||automates autonymous||autonomous auxillary||auxiliary auxilliary||auxiliary avaiable||available avaible||available availabe||available availabled||available availablity||availability availaible||available availale||available availavility||availability availble||available availiable||available availible||available avalable||available avaliable||available aysnc||async backgroud||background backword||backward backwords||backwards bahavior||behavior bakup||backup baloon||balloon baloons||balloons bandwith||bandwidth banlance||balance batery||battery beacuse||because becasue||because becomming||becoming becuase||because beeing||being befor||before begining||beginning beter||better betweeen||between bianries||binaries bitmast||bitmask boardcast||broadcast borad||board boundry||boundary brievely||briefly brigde||bridge broadcase||broadcast broadcat||broadcast bufufer||buffer cacluated||calculated caculate||calculate caculation||calculation cadidate||candidate calender||calendar calescing||coalescing calle||called callibration||calibration calucate||calculate calulate||calculate cancelation||cancellation cancle||cancel capabilites||capabilities capabilties||capabilities capabilty||capability capabitilies||capabilities capablity||capability capatibilities||capabilities capapbilities||capabilities caputure||capture carefuly||carefully cariage||carriage catagory||category cehck||check challange||challenge challanges||challenges chache||cache chanell||channel changable||changeable chanined||chained channle||channel channnel||channel charachter||character charachters||characters charactor||character charater||character charaters||characters charcter||character chcek||check chck||check checksumed||checksummed checksuming||checksumming childern||children childs||children chiled||child chked||checked chnage||change chnages||changes chnnel||channel choosen||chosen chouse||chose circumvernt||circumvent claread||cleared clared||cleared closeing||closing clustred||clustered coexistance||coexistence colescing||coalescing collapsable||collapsible colorfull||colorful comand||command comit||commit commerical||commercial comming||coming comminucation||communication commited||committed commiting||committing committ||commit commoditiy||commodity comsume||consume comsumer||consumer comsuming||consuming compability||compatibility compaibility||compatibility comparsion||comparison compatability||compatibility compatable||compatible compatibiliy||compatibility compatibilty||compatibility compatiblity||compatibility competion||completion compilant||compliant compleatly||completely completition||completion completly||completely complient||compliant componnents||components compoment||component comppatible||compatible compres||compress compresion||compression comression||compression comunication||communication conbination||combination conditionaly||conditionally conected||connected conector||connector connecetd||connected configuartion||configuration configuation||configuration configued||configured configuratoin||configuration configuraton||configuration configuretion||configuration configutation||configuration conider||consider conjuction||conjunction connectinos||connections connnection||connection connnections||connections consistancy||consistency consistant||consistent containes||contains containts||contains contaisn||contains contant||contact contence||contents continious||continuous continous||continuous continously||continuously continueing||continuing contraints||constraints contruct||construct contol||control contoller||controller controled||controlled controler||controller controll||control contruction||construction contry||country conuntry||country convertion||conversion convertor||converter convienient||convenient convinient||convenient corected||corrected correponding||corresponding correponds||corresponds correspoding||corresponding cotrol||control cound||could couter||counter coutner||counter cryptocraphic||cryptographic cunter||counter curently||currently cylic||cyclic dafault||default deafult||default deamon||daemon decompres||decompress decsribed||described decription||description dectected||detected defailt||default deferal||deferral deffered||deferred defferred||deferred definate||definite definately||definitely defintion||definition defintions||definitions defualt||default defult||default deintializing||deinitializing deintialize||deinitialize deintialized||deinitialized deivce||device delared||declared delare||declare delares||declares delaring||declaring delemiter||delimiter demodualtor||demodulator demension||dimension dependancies||dependencies dependancy||dependency dependant||dependent depreacted||deprecated depreacte||deprecate desactivate||deactivate desciptor||descriptor desciptors||descriptors descripto||descriptor descripton||description descrition||description descritptor||descriptor desctiptor||descriptor desriptor||descriptor desriptors||descriptors desination||destination destionation||destination destoried||destroyed destory||destroy destoryed||destroyed destorys||destroys destroied||destroyed detabase||database deteced||detected develope||develop developement||development developped||developed developpement||development developper||developer developpment||development deveolpment||development devided||divided deviece||device diable||disable dicline||decline dictionnary||dictionary didnt||didn't diferent||different differrence||difference diffrent||different differenciate||differentiate diffrentiate||differentiate difinition||definition dimention||dimension dimesions||dimensions dispalying||displaying diplay||display directon||direction direectly||directly diregard||disregard disassocation||disassociation disapear||disappear disapeared||disappeared disappared||disappeared disbale||disable disbaled||disabled disble||disable disbled||disabled disconnet||disconnect discontinous||discontinuous disharge||discharge disnabled||disabled dispertion||dispersion dissapears||disappears dissconect||disconnect distiction||distinction divisable||divisible divsiors||divisors docuentation||documentation documantation||documentation documentaion||documentation documment||document doesnt||doesn't donwload||download donwloading||downloading dorp||drop dosen||doesn downlad||download downlads||downloads droped||dropped droput||dropout druing||during dynmaic||dynamic eanable||enable easilly||easily ecspecially||especially edditable||editable editting||editing efective||effective effectivness||effectiveness efficently||efficiently ehther||ether eigth||eight elementry||elementary eletronic||electronic embeded||embedded enabledi||enabled enble||enable enchanced||enhanced encorporating||incorporating encrupted||encrypted encrypiton||encryption encryptio||encryption endianess||endianness enhaced||enhanced enlightnment||enlightenment enqueing||enqueuing entires||entries entites||entities entrys||entries enocded||encoded enterily||entirely enviroiment||environment enviroment||environment environement||environment environent||environment eqivalent||equivalent equiped||equipped equivelant||equivalent equivilant||equivalent eror||error errorr||error estbalishment||establishment etsablishment||establishment etsbalishment||establishment excecutable||executable exceded||exceeded excellant||excellent execeeded||exceeded execeeds||exceeds exeed||exceed existance||existence existant||existent exixt||exist exlcude||exclude exlcusive||exclusive exmaple||example expecially||especially experies||expires explicite||explicit explicitely||explicitly explict||explicit explictely||explicitly explictly||explicitly expresion||expression exprimental||experimental extened||extended extensability||extensibility extention||extension extenstion||extension extracter||extractor faied||failed faield||failed falied||failed faild||failed failded||failed failer||failure faill||fail failied||failed faillure||failure failue||failure failuer||failure failng||failing faireness||fairness falied||failed faliure||failure fallbck||fallback familar||familiar fatser||faster feauture||feature feautures||features fetaure||feature fetaures||features fileystem||filesystem fimware||firmware firmare||firmware firmaware||firmware firware||firmware finanize||finalize findn||find finilizes||finalizes finsih||finish flusing||flushing folloing||following followign||following followings||following follwing||following fonud||found forseeable||foreseeable forse||force fortan||fortran forwardig||forwarding frambuffer||framebuffer framming||framing framwork||framework frequncy||frequency frome||from fucntion||function fuction||function fuctions||functions funcation||function funcion||function functionallity||functionality functionaly||functionally functionnality||functionality functonality||functionality funtion||function funtions||functions furthur||further futhermore||furthermore futrue||future gatable||gateable gateing||gating gauage||gauge gaurenteed||guaranteed generiously||generously genereate||generate genereted||generated genric||generic globel||global grabing||grabbing grahical||graphical grahpical||graphical grapic||graphic grranted||granted guage||gauge guarenteed||guaranteed guarentee||guarantee halfs||halves hander||handler handfull||handful hanlde||handle hanled||handled happend||happened harware||hardware heirarchically||hierarchically helpfull||helpful hybernate||hibernate hierachy||hierarchy hierarchie||hierarchy homogenous||homogeneous howver||however hsould||should hypervior||hypervisor hypter||hyper identidier||identifier iligal||illegal illigal||illegal illgal||illegal iomaped||iomapped imblance||imbalance immeadiately||immediately immedaite||immediate immedate||immediate immediatelly||immediately immediatly||immediately immidiate||immediate immutible||immutable impelentation||implementation impementated||implemented implemantation||implementation implemenation||implementation implementaiton||implementation implementated||implemented implemention||implementation implementd||implemented implemetation||implementation implemntation||implementation implentation||implementation implmentation||implementation implmenting||implementing incative||inactive incomming||incoming incompatabilities||incompatibilities incompatable||incompatible incompatble||incompatible inconsistant||inconsistent increas||increase incremeted||incremented incrment||increment inculde||include indendation||indentation indended||intended independant||independent independantly||independently independed||independent indiate||indicate indicat||indicate inexpect||inexpected inferface||interface infomation||information informatiom||information informations||information informtion||information infromation||information ingore||ignore inital||initial initalized||initialized initalised||initialized initalise||initialize initalize||initialize initation||initiation initators||initiators initialiazation||initialization initializiation||initialization initialze||initialize initialzed||initialized initialzing||initializing initilization||initialization initilize||initialize inofficial||unofficial inrerface||interface insititute||institute instace||instance instal||install instanciate||instantiate instanciated||instantiated insufficent||insufficient inteface||interface integreated||integrated integrety||integrity integrey||integrity intendet||intended intented||intended interanl||internal interchangable||interchangeable interferring||interfering interger||integer intermittant||intermittent internel||internal interoprability||interoperability interuupt||interrupt interupt||interrupt interupts||interrupts interrface||interface interrrupt||interrupt interrup||interrupt interrups||interrupts interruptted||interrupted interupted||interrupted interupt||interrupt intial||initial intialisation||initialisation intialised||initialised intialise||initialise intialization||initialization intialized||initialized intialize||initialize intregral||integral intrerrupt||interrupt intrrupt||interrupt intterrupt||interrupt intuative||intuitive inavlid||invalid invaid||invalid invaild||invalid invailid||invalid invald||invalid invalde||invalid invalide||invalid invalidiate||invalidate invalud||invalid invididual||individual invokation||invocation invokations||invocations ireelevant||irrelevant irrelevent||irrelevant isnt||isn't isssue||issue iternations||iterations itertation||iteration itslef||itself jave||java jeffies||jiffies juse||just jus||just kown||known langage||language langauage||language langauge||language langugage||language lauch||launch layed||laid legnth||length leightweight||lightweight lengh||length lenght||length lenth||length lesstiff||lesstif libaries||libraries libary||library librairies||libraries libraris||libraries licenceing||licencing logaritmic||logarithmic loggging||logging loggin||login logile||logfile loobpack||loopback loosing||losing losted||lost machinary||machinery maibox||mailbox maintainance||maintenance maintainence||maintenance maintan||maintain makeing||making mailformed||malformed malplaced||misplaced malplace||misplace managable||manageable managment||management mangement||management manoeuvering||maneuvering manufaucturing||manufacturing mappping||mapping matchs||matches mathimatical||mathematical mathimatic||mathematic mathimatics||mathematics maximium||maximum maxium||maximum mechamism||mechanism meetign||meeting memeory||memory memmber||member memoery||memory ment||meant mergable||mergeable mesage||message messags||messages messgaes||messages messsage||message messsages||messages micropone||microphone microprocesspr||microprocessor migrateable||migratable milliseonds||milliseconds minium||minimum minimam||minimum miniumum||minimum minumum||minimum misalinged||misaligned miscelleneous||miscellaneous misformed||malformed mispelled||misspelled mispelt||misspelt mising||missing mismactch||mismatch missign||missing missmanaged||mismanaged missmatch||mismatch miximum||maximum mmnemonic||mnemonic mnay||many modfiy||modify modulues||modules momery||memory memomry||memory monochorome||monochrome monochromo||monochrome monocrome||monochrome mopdule||module mroe||more mulitplied||multiplied multidimensionnal||multidimensional multipe||multiple multple||multiple mumber||number muticast||multicast mutilcast||multicast mutiple||multiple mutli||multi nams||names navagating||navigating nead||need neccecary||necessary neccesary||necessary neccessary||necessary necesary||necessary neded||needed negaive||negative negoitation||negotiation negotation||negotiation nerver||never nescessary||necessary nessessary||necessary noticable||noticeable notications||notifications notifcations||notifications notifed||notified notity||notify numebr||number numner||number obtaion||obtain obusing||abusing occassionally||occasionally occationally||occasionally occurance||occurrence occurances||occurrences occured||occurred occurence||occurrence occure||occurred occured||occurred occuring||occurring offser||offset offet||offset offloded||offloaded offseting||offsetting omited||omitted omiting||omitting omitt||omit ommiting||omitting ommitted||omitted onself||oneself ony||only operatione||operation opertaions||operations optionnal||optional optmizations||optimizations orientatied||orientated orientied||oriented orignal||original originial||original otherise||otherwise ouput||output oustanding||outstanding overaall||overall overhread||overhead overlaping||overlapping overide||override overrided||overridden overriden||overridden overun||overrun overwritting||overwriting overwriten||overwritten pacakge||package pachage||package packacge||package packege||package packge||package packtes||packets pakage||package paket||packet pallette||palette paln||plan paramameters||parameters paramaters||parameters paramater||parameter parametes||parameters parametised||parametrised paramter||parameter paramters||parameters parmaters||parameters particuarly||particularly particularily||particularly partion||partition partions||partitions partiton||partition pased||passed passin||passing pathes||paths pecularities||peculiarities peformance||performance peforming||performing peice||piece pendantic||pedantic peprocessor||preprocessor perfoming||performing peripherial||peripheral permissons||permissions peroid||period persistance||persistence persistant||persistent phoneticly||phonetically plalform||platform platfoem||platform platfrom||platform plattform||platform pleaes||please ploting||plotting plugable||pluggable poinnter||pointer pointeur||pointer poiter||pointer posible||possible positon||position possibilites||possibilities powerfull||powerful pramater||parameter preamle||preamble preample||preamble preapre||prepare preceeded||preceded preceeding||preceding preceed||precede precendence||precedence precission||precision preemptable||preemptible prefered||preferred prefferably||preferably premption||preemption prepaired||prepared preperation||preparation pressre||pressure primative||primitive princliple||principle priorty||priority privilaged||privileged privilage||privilege priviledge||privilege priviledges||privileges probaly||probably procceed||proceed proccesors||processors procesed||processed proces||process procesing||processing processessing||processing processess||processes processpr||processor processsed||processed processsing||processing procteted||protected prodecure||procedure progams||programs progess||progress programers||programmers programm||program programms||programs progresss||progress prohibitted||prohibited prohibitting||prohibiting promiscous||promiscuous promps||prompts pronnounced||pronounced prononciation||pronunciation pronouce||pronounce pronunce||pronounce propery||property propigate||propagate propigation||propagation propogate||propagate prosess||process protable||portable protcol||protocol protecion||protection protedcted||protected protocoll||protocol promixity||proximity psudo||pseudo psuedo||pseudo psychadelic||psychedelic pwoer||power queing||queuing quering||querying randomally||randomly raoming||roaming reasearcher||researcher reasearchers||researchers reasearch||research recepient||recipient recevied||received receving||receiving recieved||received recieve||receive reciever||receiver recieves||receives recogniced||recognised recognizeable||recognizable recommanded||recommended recyle||recycle redircet||redirect redirectrion||redirection redundacy||redundancy reename||rename refcounf||refcount refence||reference refered||referred referenace||reference refering||referring refernces||references refernnce||reference refrence||reference registed||registered registerd||registered registeration||registration registeresd||registered registerred||registered registes||registers registraration||registration regsiter||register regster||register regualar||regular reguator||regulator regulamentations||regulations reigstration||registration releated||related relevent||relevant reloade||reload remoote||remote remore||remote removeable||removable repectively||respectively replacable||replaceable replacments||replacements replys||replies reponse||response representaion||representation reqeust||request requestied||requested requiere||require requirment||requirement requred||required requried||required requst||request reregisteration||reregistration reseting||resetting reseved||reserved reseverd||reserved resizeable||resizable resouce||resource resouces||resources resoures||resources responce||response resrouce||resource ressizes||resizes ressource||resource ressources||resources restesting||retesting resumbmitting||resubmitting retransmited||retransmitted retreived||retrieved retreive||retrieve retreiving||retrieving retrive||retrieve retrived||retrieved retuned||returned reudce||reduce reuest||request reuqest||request reutnred||returned revsion||revision rmeoved||removed rmeove||remove rmeoves||removes rountine||routine routins||routines rquest||request runing||running runned||ran runnning||running runtine||runtime sacrifying||sacrificing safly||safely safty||safety savable||saveable scaleing||scaling scaned||scanned scaning||scanning scarch||search seach||search searchs||searches secquence||sequence secund||second segement||segment semaphone||semaphore senario||scenario senarios||scenarios sentivite||sensitive separatly||separately sepcify||specify seperated||separated seperately||separately seperate||separate seperatly||separately seperator||separator sepperate||separate seqeunce||sequence seqeuncer||sequencer seqeuencer||sequencer sequece||sequence sequencial||sequential serveral||several servive||service setts||sets settting||setting shotdown||shutdown shoud||should shouldnt||shouldn't shoule||should shrinked||shrunk siginificantly||significantly signabl||signal similary||similarly similiar||similar simlar||similar simliar||similar simpified||simplified singaled||signaled singal||signal singed||signed sleeped||slept sliped||slipped softwares||software speach||speech specfic||specific specfield||specified speciefied||specified specifc||specific specifed||specified specificatin||specification specificaton||specification specifing||specifying specifiying||specifying speficied||specified speicify||specify speling||spelling spinlcok||spinlock spinock||spinlock splitted||split spreaded||spread spurrious||spurious sructure||structure stablilization||stabilization staically||statically staion||station standardss||standards standartization||standardization standart||standard standy||standby stardard||standard staticly||statically statuss||status stoped||stopped stoping||stopping stoppped||stopped straming||streaming struc||struct structres||structures stuct||struct strucuture||structure stucture||structure sturcture||structure subdirectoires||subdirectories suble||subtle substract||subtract submition||submission suceed||succeed succesfully||successfully succesful||successful successed||succeeded successfull||successful successfuly||successfully sucessfully||successfully sucess||success superflous||superfluous superseeded||superseded suplied||supplied suported||supported suport||support supportet||supported suppored||supported supportin||supporting suppoted||supported suppported||supported suppport||support supress||suppress surpressed||suppressed surpresses||suppresses susbsystem||subsystem suspeneded||suspended suspsend||suspend suspicously||suspiciously swaping||swapping switchs||switches swith||switch swithable||switchable swithc||switch swithced||switched swithcing||switching swithed||switched swithing||switching swtich||switch symetric||symmetric synax||syntax synchonized||synchronized synchronuously||synchronously syncronize||synchronize syncronized||synchronized syncronizing||synchronizing syncronus||synchronous syste||system sytem||system sythesis||synthesis taht||that tansmit||transmit targetted||targeted targetting||targeting taskelt||tasklet teh||the temorary||temporary temproarily||temporarily thead||thread therfore||therefore thier||their threds||threads threshhold||threshold thresold||threshold throught||through trackling||tracking troughput||throughput thses||these tiggers||triggers tiggered||triggered tipically||typically timeing||timing timout||timeout tmis||this toogle||toggle torerable||tolerable traking||tracking tramsmitted||transmitted tramsmit||transmit tranasction||transaction tranfer||transfer transcevier||transceiver transciever||transceiver transferd||transferred transfered||transferred transfering||transferring transision||transition transmittd||transmitted transormed||transformed trasfer||transfer trasmission||transmission treshold||threshold trigerred||triggered trigerring||triggering trun||turn tunning||tuning ture||true tyep||type udpate||update uesd||used uknown||unknown usupported||unsupported uncommited||uncommitted unconditionaly||unconditionally underun||underrun unecessary||unnecessary unexecpted||unexpected unexepected||unexpected unexpcted||unexpected unexpectd||unexpected unexpeted||unexpected unexpexted||unexpected unfortunatelly||unfortunately unifiy||unify uniterrupted||uninterrupted unintialized||uninitialized unitialized||uninitialized unkmown||unknown unknonw||unknown unknow||unknown unkown||unknown unamed||unnamed uneeded||unneeded unneded||unneeded unneccecary||unnecessary unneccesary||unnecessary unneccessary||unnecessary unnecesary||unnecessary unneedingly||unnecessarily unnsupported||unsupported unmached||unmatched unregester||unregister unresgister||unregister unrgesiter||unregister unsinged||unsigned unstabel||unstable unsolicitied||unsolicited unsuccessfull||unsuccessful unsuported||unsupported untill||until unuseful||useless unvalid||invalid upate||update upsupported||unsupported usefule||useful usefull||useful usege||usage usera||users usualy||usually usupported||unsupported utilites||utilities utillities||utilities utilties||utilities utiltity||utility utitity||utility utitlty||utility vaid||valid vaild||valid valide||valid variantions||variations varible||variable varient||variant vaule||value verbse||verbose verisons||versions verison||version verson||version vicefersa||vice-versa virtal||virtual virtaul||virtual virtiual||virtual visiters||visitors vitual||virtual vunerable||vulnerable wakeus||wakeups wathdog||watchdog wating||waiting wiat||wait wether||whether whataver||whatever whcih||which whenver||whenever wheter||whether whe||when wierd||weird wiil||will wirte||write withing||within wnat||want workarould||workaround writeing||writing writting||writing wtih||with zombe||zombie zomebie||zombie ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/tests/utils�����������������������������������������������������������������������������0000755�0001750�0001750�00000002404�13574463526�014540� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash function init_env { unset -v src_script_path external_script_path EASY_KERNEL_WORKFLOW external_script_path="tests/external" src_script_path="./src" export src_script_path external_script_path EASY_KERNEL_WORKFLOW } # Receives a string with one or more lines and print each of # then prefixed by "> " function prefix_multiline { echo "$@" | sed -E "s/^/> /g" } # Receives a path and creates a fake kernel root in it. The goal is to make this # path recognizable by src/kwlib.sh:is_kernel_root(). function mk_fake_kernel_root { local -r path="$1" mkdir -p "$path" touch "$path/COPYING" touch "$path/CREDITS" touch "$path/Kbuild" touch "$path/Makefile" touch "$path/README" touch "$path/MAINTAINERS" mkdir -p "$path/Documentation" mkdir -p "$path/arch" mkdir -p "$path/include" mkdir -p "$path/drivers" mkdir -p "$path/fs" mkdir -p "$path/init" mkdir -p "$path/ipc" mkdir -p "$path/kernel" mkdir -p "$path/lib" mkdir -p "$path/scripts" } function invoke_shunit { command -v shunit2 > /dev/null if [[ "$?" -eq 0 ]]; then . shunit2 elif [[ -f ./tests/shunit2 ]]; then . ./tests/shunit2 else echo -e "Can't find shunit2.\nDo you have it installed (or downloaded it to ./tests/shunit2)?" return 1 fi } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/tests/ssh_test.sh�����������������������������������������������������������������������0000755�0001750�0001750�00000005431�13574463526�015650� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash # # NOTE: We're not testing the ssh command here, just the kw ssh operation # . ./src/vm.sh --source-only . ./tests/utils --source-only INVALID_ARG="Invalid arguments" NO_SUCH_FILE="No such file" TEST_PATH="tests/.tmp" SSH_OK="ssh -p 3333 127.0.0.1" function suite { suite_addTest "vmSshFailsTest" suite_addTest "vmSshTest" suite_addTest "vmSshCommandTest" suite_addTest "vmSshScriptTest" } function setupSsh { local -r current_path=$PWD rm -rf $TEST_PATH mkdir -p $TEST_PATH cp -f tests/samples/kworkflow.config $TEST_PATH cp -f tests/samples/dmesg $TEST_PATH cd $TEST_PATH load_configuration cd $current_path } function tearDownSsh { rm -rf $TEST_PATH } function vmSshFailsTest { setupSsh local args="--lala" local ret=$(vm_ssh $args) assertTrue "We expected a substring \"$INVALID_ARG: $args\", but we got \"$ret\"" '[[ $ret =~ "$INVALID_ARG: $args" ]]' args="-m" ret=$(vm_ssh $args) assertTrue "We expected a substring \"$INVALID_ARG: $args\", but we got \"$ret\"" '[[ $ret =~ "$INVALID_ARG: $args" ]]' args="-d=" ret=$(vm_ssh $args) assertTrue "We expected a substring \"$INVALID_ARG: $args\", but we got \"$ret\"" '[[ $ret =~ "$INVALID_ARG: $args" ]]' args="-c" ret=$(vm_ssh $args) assertTrue "We expected a substring \"$INVALID_ARG: $args\", but we got \"$ret\"" '[[ $ret =~ "$INVALID_ARG: $args" ]]' args="-s" ret=$(vm_ssh $args) assertTrue "We expected a substring \"$INVALID_ARG: $args\", but we got \"$ret\"" '[[ $ret =~ "$INVALID_ARG: $args" ]]' args="-s=" ret=$(vm_ssh $args) assertTrue "We expected a substring \"$NO_SUCH_FILE\", but we got \"$ret\"" '[[ $ret =~ "$NO_SUCH_FILE" ]]' args="--script=" ret=$(vm_ssh $args) assertTrue "We expected a substring \"$NO_SUCH_FILE\", but we got \"$ret\"" '[[ $ret =~ "$NO_SUCH_FILE" ]]' tearDownSsh } function vmSshTest { setupSsh ret=$(vm_ssh 2>&1) assertTrue "We expected a substring \"$SSH_OK\", but we got \"$ret\"" '[[ $ret =~ "$SSH_OK" ]]' tearDownSsh } function vmSshCommandTest { setupSsh ret=$(vm_ssh -c="pwd" 2>&1) msg="$SSH_OK pwd" assertTrue "We expected a substring \"$msg\", but we got \"$ret\"" '[[ $ret =~ "$msg" ]]' ret=$(vm_ssh --command="ls /etc/" 2>&1) msg="$SSH_OK ls /etc/" assertTrue "We expected a substring \"$msg\", but we got \"$ret\"" '[[ $ret =~ "$msg" ]]' tearDownSsh } function vmSshScriptTest { setupSsh ret=$(vm_ssh -s="/not/a/valid/path/xpto" 2>&1) msg="$NO_SUCH_FILE: \"/not/a/valid/path/xpto\"" assertTrue "We expected a substring \"$msg\", but we got \"$ret\"" '[[ $ret =~ "$msg" ]]' ret=$(vm_ssh -s="$TEST_PATH/dmesg" 2>&1) msg="$SSH_OK \"bash -s\" -- < $TEST_PATH/dmesg" assertTrue "We expected a substring \"$msg\", but we got \"$ret\"" '[[ $ret =~ "$msg" ]]' tearDownSsh } invoke_shunit ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/tests/_kw_dash.dsh����������������������������������������������������������������������0000755�0001750�0001750�00000000040�13574463526�015726� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/dash ./kw h > /dev/null ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.gitignore������������������������������������������������������������������������������0000644�0001750�0001750�00000000207�13574463524�014275� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Tests tests/shunit2 .checkpatch-camelcase.git. .checkpatch-camelcase.date.* tests/external tests/.tmp_commons_test tests/.tmp build/ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/setup.sh��������������������������������������������������������������������������������0000755�0001750�0001750�00000010177�13574463525�014014� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash set -e declare -r APPLICATIONNAME="kw" declare -r SRCDIR="src" declare -r DEPLOY_DIR="deploy_rules" declare -r CONFIG_DIR="etc" declare -r INSTALLTO="$HOME/.config/$APPLICATIONNAME" declare -r SOUNDS="sounds" declare -r BASH_AUTOCOMPLETE="bash_autocomplete" declare -r DOCUMENTATION="documentation" declare -r FISH_CONFIG_PATH="$HOME/.config/fish" declare -r FISH_COMPLETION_PATH="$FISH_CONFIG_PATH/completions" declare -r CONFIGS_PATH="configs" . src/kwio.sh --source-only function usage() { say "usage: ./setup.sh option" say "" say "Where option may be one of the following:" say "--help | -h Display this usage message" say "--install | -i Install $APPLICATIONNAME" say "--uninstall | -u Uninstall $APPLICATIONNAME" say "--completely-remove Remove $APPLICATIONNAME and all files under its responsibility" say "--html Build $APPLICATIONNAME's documentation as HTML pages into ./build" } function confirm_complete_removal() { warning "This operation will completely remove all files related to kw," warning "including the kernel '.config' files under its controls." if [[ $(ask_yN "Do you want to proceed?") =~ "0" ]]; then exit 0 fi } function clean_legacy() { say "Removing ..." local trash=$(mktemp -d) local completely_remove=$1 local toDelete="$APPLICATIONNAME" eval "sed -i '/$toDelete/d' $HOME/.bashrc" if [[ $completely_remove =~ "-d" ]]; then mv "$INSTALLTO" "$trash" return 0 fi # Remove files if [ -d "$INSTALLTO" ]; then # If we have configs, we should keep it if [ -d "$INSTALLTO/$CONFIGS_PATH" ]; then for content in "$INSTALLTO"/*; do if [[ $content =~ "configs" ]]; then continue fi mv "$content" "$trash" done else mv "$INSTALLTO" "$trash" fi fi } function setup_config_file() { say "Setting up global configuration file" local config_files_path="$INSTALLTO/$CONFIG_DIR" for file in "$config_files_path"/*.config; do # FIXME: The following sed command assumes users won't # have files containing ",". sed -i -e "s/USERKW/$USER/g" -e "s,INSTALLPATH,$INSTALLTO,g" \ -e "/^#?.*/d" "$file" done } function synchronize_fish() { local kw_fish_path="set -gx PATH $PATH:$HOME/.config/kw" say "Fish detected. Setting up fish support." mkdir -p "$FISH_COMPLETION_PATH" rsync -vr $SRCDIR/kw.fish "$FISH_COMPLETION_PATH"/kw.fish if ! grep -F "$kw_fish_path" "$FISH_CONFIG_PATH"/config.fish; then echo "$kw_fish_path" >> "$FISH_CONFIG_PATH"/config.fish fi } # Synchronize .vim and .vimrc with repository. function synchronize_files() { say "Installing ..." mkdir -p "$INSTALLTO" # Copy the script cp $APPLICATIONNAME "$INSTALLTO" rsync -vr $SRCDIR "$INSTALLTO" rsync -vr $DEPLOY_DIR "$INSTALLTO" rsync -vr $SOUNDS "$INSTALLTO" rsync -vr $DOCUMENTATION "$INSTALLTO" # Configuration rsync -vr $CONFIG_DIR "$INSTALLTO" setup_config_file if [ -f "$HOME/.bashrc" ]; then # Add to bashrc echo "# $APPLICATIONNAME" >> "$HOME/.bashrc" echo "PATH=\$PATH:$INSTALLTO" >> "$HOME/.bashrc" echo "source $INSTALLTO/$SRCDIR/$BASH_AUTOCOMPLETE.sh" >> "$HOME/.bashrc" else warning "Unable to find a shell." fi if command -v fish &> /dev/null; then synchronize_fish fi say "$SEPARATOR" say "$APPLICATIONNAME installed into $INSTALLTO" say "$SEPARATOR" } function install_home() { # First clean old installation clean_legacy # Synchronize of vimfiles synchronize_files } # Options case $1 in --install | -i) install_home ;; --uninstall | -u) clean_legacy ;; # ATTENTION: This option is dangerous because it completely removes all files # related to kw, e.g., '.config' file under kw controls. For this reason, we do # not want to add a short version, and the user has to be sure about this # operation. --completely-remove) confirm_complete_removal clean_legacy "-d" ;; --help | -h) usage ;; --html) sphinx-build -b html documentation/ build ;; *) complain "Invalid number of arguments" exit 1 ;; esac �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/README.md�������������������������������������������������������������������������������0000644�0001750�0001750�00000002510�13574463525�013564� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Kworkflow # About This set of scripts have a simple mission: reduces the environment and setup overhead for developing for GNU/Linux. Kw is composed of different scripts unified in a single interface after the installation, kw commands become available in the command line interface. Kworkflow stands for Kernel Workflow. # Install Take a look at [Install and Uninstall](documentation/content/installanduninstall.rst). # How to If you want to know more about kw's usage and its commands, take a look at [Kw man](documentation/man/kw.rst) or, with kw installed, run `kw man`. # Tests If you want to know more about kw's tests take a look at [kw tests](documentation/content/tests.rst). # Generate Sphinx Documentation If you want to generate the Sphinx documentation, you can use: ``` ./setup.sh --html ``` Finally, you can use your browser to look the index.html page. For example: ``` firefox build/index.html ``` # Contributing We are happy that you want to help us! If you are looking for a good starting point, check [those issues](https://github.com/rodrigosiqueira/kworkflow/labels/good%20first%20issue) and don't forget to read our [Contribuitor's Guide](https://siqueira.tech/doc/kw/content/howtocontribute.html) (or [howtocontribute file](documentation/content/howtocontribute.rst)). # License Kworkflow is under GPL-2.0+ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/sounds/���������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�013623� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/sounds/complete.wav���������������������������������������������������������������������0000644�0001750�0001750�00000377474�13574463526�016200� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF4�WAVEfmt �����D��X���data6���"-2,1( 6֭~*�0 ##.20.(V"։Hҟv#`.20'^*mmJ8ߔ/z#.2U0*'WΕ͵Mr$.20&(qot: i$/2/#&Xn&͉ W^Z%I/2i/%Y%Ԩk%y/2/%euXpC&;&/2.$T=H*͒v5&/2e.#S։0'0q2.e#fDߐ&Niq'.0V2-"EJDG'O092T-C"X�ÉlA ;(s02,!q<s !(01,"!.L݄кؽ( (01*, |8-CS>bY <X)01+}\͢н  )0|1[+\AڳO U*0O1*gP}ۙ 7\\ X*11*' cd·Pg*10* :'۱w*.10)I 4 ?1a\-Ut?+>1|07)M JY·+@1G0( Ubٸnvݹp +J1 0I(- َЍ?cNG ,N1/'ny :+jЭΜӖ�j!\,N1/Y'AI'߿�!,L1G/&+  -aԵsg.[",H1/^&Y3}H#"-@1.%3C'fD#M-91o.b%:hoϐw#-+1%.$@/ϛ-6$$-1-Y$^3ּh֦;$- 1-#HէB$.06-L#!>U՟2EDAh_%C.0,"qQՒmгy%l.0,="KXՏϣ))&.0.,! QԅЛسWK&.0+$!X�c}ԊQ&.r0w+ I=Ԋ[ђ ;D'.M0+ ovԉϣڑkM '/)0*wEӍу3 R'2/0S*D8ݎӗ. O(G//)MXӢw҃vE ^(]//) 5 #Ӱ1 (p//)(= oEһӁ fB)}/Q/( di6)//G( 0EuۗϷӌ Bf)/.'b3 n ޶{*/.f' #GcԚ[[f*/w.&. 1N/л$R*/8.&+ Mհ߫UN */- &|{lt:T� #+/-%W46ё]7!_+/t-%hئѷ/Y '!+/.-$l،БL"+/,!$zC[6x zcU",/,#d5^ "8,{/S,eXReנNy\#_,q/,"ZKEє15e#,Y/+""W6ќ "$,C/c+!L\. `T3$,+/+!zet(7y`$ -/* 0%nِJC%,-._* ]W�Ax"Ѭ^,S%I-.*R \%j-.) v$.Fd P&-.M)ilUw!>(qW j&-l.(4Ѳ<ܛ�? &-B.(OLF;ӵ8 nG'-.'(v WݟID4[| '--'/ )rtSѓ԰u n'--W'&  Ci/ ((--& } b-ձ޶ZWfq(.X-&z yIӔ3X(.-&, ӨոV(.,%M nfۨ,9U*<).,6%0ۇхֿ@;y).r,$1*QdG�Z).3,T$I%7O ).+#K+/Jғ^( $* .+i#R9Dp Y*.j+"GӗTwpG^!*-!+w" ;Ҽ8!*-*!>jKٓ+"*-*!!ӄ c4U"+->*!C1X\Qٳ"<+-) Lؾ҄YA}hQ#c+-) m׸һT#+-K)h�hׯ0iy$+h-(R�Wױ-Ԣ]]$+H-(u)<׭mܓE $+,-C( ֳҪԄ'  %�,-'ia8ֹA [%,,'Ft-lY5 %1,,/'V dDuy %C,,& xe�Ҹ\ފ A&Z,a,q&<b #) }&d,9,& 2N7޹ONG &v,,%# ݒӠ^o j'|,+<%z =wiJv`',+$  RI/B Q',n+e$w1 , QӎL-_',3+#k�k��21(,*#Sx!ԇ?Ll�R(,*#IԨӗ DV (,{*"+>#pۮ[u(,>*6" ەHGs(y,)!`,ڃԧi)? #)m,)Q!glv@  M)d,g) 7>`qkx)f!~)P,$)^ <v?VԞb!);,(LJ2ےd%!).,(n6lB�՚D"),<(pe-:7ۮ0x"*+'r�5ni<G|"4*+'9R�Y3ԧ2'#V*+H'my5FYz#r*+&>B8ֶ)N 0#*+&mioE:\" $*]+A& #Cԝ֓j{ ,f$*;+%f. 5~Oߧ $*+% zW%z; $**%%U OdnH@ C%**$W ]Y$uԵgd %**_$E y։�g v%*^*# "֞J\*  &+,*#/ qHޱֶԗ$YH& +)/#݌Ub&+)"CYmp=V�2&+)\"JSՒK�6& +M)! #w9*:.' +)!llL;P"Lea'+(!Y mՖu'*( G4b ՔVUY/'*O(0 պQ'* ('< ~լ_Fg(*'KY:&G B(*y'5ھDlmvr j(*0'^l#ڹq] (*&[zڲդ7}pR!(*&kD�m;ڰ֞?!(i*D&O�ڭޒ+j!(M*%tX٬JmjJ").*%ٱՂުba") *M%w }DPcٴF7 "4))$S 0ٻذ" T,#K))$z N4A!V0 x#\))D$( (ՄؓG 9#i)y)#s 0pk $w)O)# otf E$) ))#l_ *]Y $)(" W7֡a'5 $)(g"a, &m+`%)(�",A<MPd:%)V(!N�3[֋#2r%)(7!du޺yCs�%)' =qA#ޣז/ۿ0/%)'a 5݋׷օ:a &)r'+RSu۾,_<?&)1' Dc0:!i&)&k3lQ(׋ܷ\C|&r)&BR:&e)k&<>v7}Aݾ?3&R)&&d"6.קף=G 'B)%Y "<+'.)%GxuI aHDm1 N')E%r�<�1 k'($'N�`~Iq)Sq '($קؐ#%!'(\$[an!'($s O `1@ !'(# N|,Tr ~"'a(\#N dP5ג:^Z F"'8( # L8%>٢ _"(("- :Kp "('R" QW_} : #('! ,lנ& K#'('!t ZdH #+(d':!mٔ4E v#2(/' Mge3M٫׀In#4(&z .۾b=2$2(& )E~5� a$5(&L�kܫ%$/(X&J3ؾ"%e$-(&xn!AݟJ$%(%zpbg/%%(%jG?0ޯ؉ؿݑitJ% (c%ݤد Q"r%'!%6Z"{lݙmސ"%'$lݎmx%'$YFp4݂7$ߍ�%'N$j0܁aه 4%'$x0�fzؗߏ |i&'#F�hxDO0&'n#`S}٩Bb I&d' # &$|6 dN `&G'" `HۃmpbB v&%'"/t ۊئx  &'." zbۓ=  !&&!@W 9m۠۫& ]!&&! YqJۧe !&&*!K; !ۺءۂ37 a!&c&  A|6 "&9&y O" .YET -R"& & .u "&%QE ټ9Wq "&%by}'ݭ��U"&s%V2h=Qh�'#&@%\eO[ٞݓY#& %;R{T:y}j#&$A&ښ?z 4#&$nQozھّ"#&[$ !P g!K s$&$Hc8-$&#< ?1ڏ]3e L$&#8}[Wnos$&X#erbلEMNx$o&#2`Z%ٰڡW $U&"�GfY$>&"+B�`O]8$*&9" K۵Gx$&!9 .cZ}1%%! <+ٵxDz(%%S!S p % =%%! (BB T H%% i {5cܧ5. ? X%g%` m }ڡE +u k%=%  avK/  s%%^ i9@#L  ~%$b1dKb. P)!~%$H^5GڨݷQ ]!%$S^'{& !%e$L!5QYq:ގ\ n!%0$ێځ�!%#%%G~v۫s`#&"%#45{Q"{%#0DpdPr"|"t%Y#p<`۷+"h%!# 4CpQ-8|2t"`%"qo4DP["R%"F.@9xۮ=\!#?%j"a/ۢk7#/%&"s0DM,[ F?T#%! SO"ۭr#%!.�P*PQ#$W!7 E�1"Ueu/#$!) \#ۄT#$ ] 8|#ۺ h>_##$|  j#^%}Sf#$-  ,2,*dH/#e$ w 6`<W $B$ "?ۚݠZW &$!$C. IQ \_$# )XfWc ($#H 8ulRJ /$#IJY}ې8Nu  9$}#Z:ݒޛD ? 9$S#yiZݩR{ 4p :$'#Dpݽ^o�,  ?$"u ۣP�  =$"|4C> 8$"3 fC ;X"!5$Y"e-܀#L!/$"|aMWv:w! $!n!$!V7Iܑom[U! $u!U|ܷ+!#5!#Q%xqS_1x!# j d"# )-G6oe5ݺ7f ="#y  �`=c`rRR"#4 W6 <�N_ܑh jo"# bC"~#7 <_\j m"c#^ g(s Z"F#7 :z[qXru""#F _6tܓ/t "#8 9߀ޏw} 7""4g (ސf I"": :tޛ<S~m ""O*ެy߳Z Q"o"C:<޻ܸW "E"zlzN #"6:BRO9~H ^T"!C 8{IC� �#!Q:ID#�* �#! + @� f"^!<j7UzEHO ",!gݗ7~* " 7b݅S}XL " *Vݥ.2]v " =nU~'t "P k,0< " 9<n "*;ju, "L ;g޺gn!"[: �./TݐW$V&!u" ?�$ݽd`4=!]"D F޷;!V!B" C4N�g!+"JTN hLk_Y{! " G{݀:!!Y GNݳ!!s U-w{* } !!)c ( E!!F^GbZ6a 7t!e!mݙ !C!>khyR !!wRh ? ! tDzQ@ <! L~Kb0ޑ�G i! JI|,~� <!g ? ;\�# !6 N #G"~\Ft ! _" ߛޣ , !h߷fiu2!Cz74{S!ia~X< u!/UU)PxV!2*�AI! mff#nml!t7 2�Qޏߵ4"\!A �`޹a4f� F!P 9�)8Vi% 0!Q XV, !b JK;A V#> = nUK\R (v Xujޞ _  m=dpp m_ kFZ x " :#:t,L ? d {Dr xs A &#q߯jW (   K ! % W2q3$$> x G2Fbs 0 [D2[ߡ& ^ zoqBv�J h PUJ,tY�  e:9Id~f  iet:ߨj P a+dV  ez4/N>| T gYU:-_o  (Bt_ W :�cb>!}X 0 cߋWD s #g ߲3' <=3 7GS �k{z  9�n<H� l !!.n]Z}/ UW5= S߈8Bv<k1m i<jA y ]Lq2 W:Zf*Ge6LKqAfBN]&ec tl#~(082 vViDB< ewH9WV. {IkiI! .~p g~}t YT[$z#p� {4)_t"ao�E wn(bcU 8u3=CT L l<E<n cznWg8*, 0]D6�gR+<nD2TRM s&WlD* k~53 *GorK&kO `\6} �\|f5K &x 7�->'Ec @v(p V*ig+J @- L�k� vae8 i)TT '{7k|wd*) ;qEI>v$A3E5Z\t^ON*8"F U L PJ=y aXew%%qb_ _p0m2#@ bGni Q-hvJc YfNAg,^q�n ~e%bF� ,aX s[s:I8 pWUd U RcX.)  Om >oM-yQ D-B?h AAK` I8  ]Ml:iGZmg+ 1l~ nJ *- 0IDm *wj :{ �6]'{i 8�U5$#1x )FT%0: ^X&wRZ{hJb 2*Yi 2:/($sq~:#{-VM@f>* 16<O'@DLW*wZe< a+UzPhB:NmcP! MBp" RAxzP %x) KQ0`H :Wm T� dRLd\5aLZti� (S!"'�i nO^M"@ L2+Ql# C; c] 8<pm bXT<4 {02D \*JWF68 N&I FEvR eB <;F 6 pv5 o As�yWz w/v3N@  �R-]D  5�'1%SCZG UZ4J)T  d2up|c{ 8= )U D?=Qj,KwDOI%OHWQ&*Q+8jQW5ASTcv~8+t&^9o= I l(_F@%+. XGb?-/ *K!YS{U SJp*s/e��K +zGN1#g� rH&Iu2z~�� H:;57[ D io j%H =BwQ kdew� {8w( O1[<kf 8-K CRX#+x U#4 3Fxb2 4o? hACh r s c.94  �a4&^XO �p83ivf#M 3�M4"H$N 6EB ] kZ8n;[y $ :ZF ?@@tn_^:RgJDE&Q KO^v>gu.7q1XD6Q[7 SJhm/ "!< oBmj@jHHVUQ;3 DKOg9- <lKy ?#2o| ~MPGcsd�F I. wc!� G= xu3/ HB7 }gjKL ? LE08^ ,:h~  R9n\P M-]$ IUK :f%- &+TCq8  lk ;vpy  = Y{g2E  �"|=2F7 nL �:38u O=U 3�k1y0  28$mS3 jr4^~g g24D0eqp<4ocH"s.GS?v,\pkz6JX#9?S>R/`F:?#&^[I@vsl0M!/k"wCTGL ^?SlOwn+9 UEO6J(l� Sd s]� O@o Ot$�< WM{ 8Tbj L9 6Z!b{ 3Ch , PZD9 L> *vE-< Gf6xe m1>EU *O_ y8_ `. # _0AX}  Oa:*N %BL �q&{ Z �&lg b .� <M9 -a8 m](!$  u'G~F!l*oRQQ'z"sN0E3{6W.]!h27$Df%m-?TqfHR I:R5:E0Q<[*"YwS]h^3J\<Pj?sq`E0Jw5Fe @hd |}"> 2a~AK !inU]� sbX %\\dw� \6 p*S/ 3]M kF/q %TT; H<*H `nM g3_($ II U&5<q >ks yZP8 3B* g:.f 8 :(E @ FPV m �*  T �f|x C  ; /�:`2 [= 1''xwvc,wrO c0/1%CMu BL'uNPg">k-NWXH(6,]l1/kOr]l> h?K^Xo5bR9J=Nou Ukx< gSblMB |r vqq ^}! +u\k� v ]KDN$pZ�5 'w|I AX� FvV , Y4A  H`t1 NM(xb% |l  q fJ6 o�$%% _  >TKB^nj !U  .S UJn= �H0 >D= 3\gXo 2 � N<, $= �y5v +r-�jnEs N7'Q vK[:]3/>E U*&~()i7r `R/L r?tsB $x!+%dSFboSKmwmo*%<p !NT "+[ 9 vl:85qH? 8t.ZFdzVE #TKQI  +6dn>[ 1z\'vIZ�;W (�, rv[ Oi�| `p -zT 8 0TOd  'hZ F~c~ +U |x$- @ NB   l T&e2 `t *?Qw 1UHa7 �Sv[  ;GD�Sy,nb kV6+�i6jEI h$Bl0  rJ}'U_ l+; 9KW L C|FTC;c e2-� e.  S| y r niL(aK~:\ <#Qzd [\@cJ ,-!-X:, GV,\Ol3Y a2 _ >�Djz# P S� Q}_Z�Q dQTp`�$ v -AJj Ci> hrQ tJj k3 % UzC< * E CD p4x7  7U4 RpN2 gez�k1);N un\|�N3N _/GE(� j+  RIu2n >uT @/|Z10U  f~9%X#]  I s 2v  gCX[1kJ f DR8= ' ^0{m  zQ.' <V %G b" 4b}R iafn^ eB 1| G! ��#~{ AV oeVO�@F2 .3�D E1A�x  R%F: &Q Nh'k[ <` UM~W Q^' o+, >c8v O<zz" kz* dqc)e p(*  3�}O ed Fv�{P, u'�P}0g C}Nt R}NTF mr9_|}n%* ` =~_\s N <I?'\ ;t y/q �)i2 ,SWM ( > t" A, I ,8}KB mg Dm_(| $ !n t lu4f" D _/Hm h {T ?"Q�R� _ #N�A uwP,�75"p (]:z ~i6�|L9: n 3d cd4I}  ??\I/? { b <QW]2q` |W �Mv`e ZTK 3 fI8E? , @�"uEx? Oju�@B& |+#� cG[+   eUMCKt!5 l 3E/hr "Cr BtJK -5 EMl/[ 77s >JWj\> _;a ` \V EJq ^> K5d3 _l4 O 3 KcpH{W T : 9}<1 Wp }w_ jg [+ 4fR% 5Zs \Z\6��f OY= OnI� nSd TqD)�*Pi L;,w�-[PJ Fk-+Q*'mM(l u5(a mJ8N + QB x!/ 7/4'Pe ?�0}O`J7d+ j)}V:(g ahv !Y�cJ | " 11 o�!0*lY D g%�jO Lo `) -Z0 ^+]? Se K 5)@ tpl J$wrv wC| ?  A vZz _3 M  w'!Kv"fAO w - b,Q ` R3 3LaF UlD< ([ R53 S02G@Xm n }"X1  WdZ�� I B |>3s'E�cv r 3J ,j� = i� { o! t< [/&?cZ0TnQ\&3r8iyY?x:seI6 Or/@"*V~H [k �! n] �q30O &zVb bl�`?L`,J MJ`) #�# dq0 p7@ j - L y TQev#GW  ?  *UbV  ,JA x ~9Ss ;K @:u$2^_ X!R <R% s uX  sl^\.#: ~ -)7tal jj` U M>" 3$ 5 Xd,%obJ�  "8N�V' *a wKs�R A|' CbX1~ UJE[BiPtX  j�"yF | ` e zyB@ #F 4YJm>dI%N �~y+ p _�z b  e�z|R*  !�b\#0n t (ZJz1Oo vu= X20I: "cS Ve_/n EX' p)n aE =c 2Y PA*  GYxs(; ! 5&lj (a U d )5o H;9 + 4 F[D|" )- x$`% B. ~z{weN ], <DZiC� l1jSH D5a� )S$ UT#�H (7 uN 7d $ 3yF]N(  QIE<0N c  <<.-1s  0 i1Ukm j  (c1gO  X�OE0|+ d �Z/-X3 $Bd b�//So: 1-3  �*Lq R: ]i+ oI !/. 7 O \4 <;| [Z T1+d}E= bj% \09Dl hC I@_9 ot \pG|3{ )sb bJ&o6 DwOG ^STZs* ^{; vjF[@] r!y b:M4g*} |I " &+o!j% !c ]<&��]  ' aW?�  eq !~�, x 'A^�W um y] �< vwC ;h,=u %n_ vLb} 8fC <|0EZ K^' [�Oi T\ P$ 8K> eRQ �#Aw~b rK& �M<{S = ^�Q  3 [ �ph7, )c K|eiI >Y rnWS|   ! a:Z ! e'I C )1 Z ` "EBL7 }S m_]t|g f r.,6> ? 2V <  u.Gu ~ t v2i j ? {<^h@ S  >.$��l &<r n3=�V <'D M>W~� R ]K-O;-� f )Dp [`a� w  Ci 3+1  yLlcS k yht 8 CN10 m c J �`q|A<\0 - �6X}lw] } Y]�M>~ L  �-{>C  ~w-Jd z {5k! } d se|hM:N \i 4-DEbj} LGR S"+ #:$! ^d '* ~ - F@v, $. BJ2 Z :3 P p| uqJF U3g  Op%u h8A XX-hL ~9 "}Xh 6 yRP4U;�% 5 F$Ibu�NJ 3s ht?�r /[q 198� ,AG |1 ;' %) knc*3+ud  7{CG'*Z\I  C\. Ay! " (S& C 0 f �daFc <> R�w,  D Y�x`@ Wb  �OQ<l ^@ )gJ) h! q�` o U 5t2 u $ 7n#j 5 } �Q^& / H R   oN+05o8z g v TK@/K` p S Z N'17eC j3 & "@v ] _GT H q1SBF 4 7r\Byi ! `<goT��  p +mp;� K zQ|6q� /$ WO5R�A < ` t+2�s% R [)\jD g $Qh u{~ r |cP 7|8 uI$ �WR%Ke n+ K� -KM2 g �n mg a Q�[!( Q q �E2.H J J tX5KfHb >  ?(j!cN?s~ 1w xJ w.~r %W <#T 9 H  ^ ef|  . .6RHB �  ] ym   ,~#! .  ]'S\ D i lS=G{" Y �B @M#]Q? k  S&w) u !y �6�N e qu/p�v H s>m])� 7 Eye-`�2 ] NP|_<b 4 &eYJ;H  `OSZ]}  w*2UgB:;  H�Pysn[  �RLKu  f �!cIPu %j ; Q�;E  /K  o�H22I 60 @ITf} A fIz" K {-MQJ P ] BS"t6 Z 2 liyS3*VQ \t  <Ig[GXi `fw w,X`b?| iSW qJ Kf{hL gG2 z;>m+5 i7 Lc 1v%c\ m# 2&X| j   j lsx6A � i  =E`c5�m n ` ]Z E<&k� ! h 8 .%+[Z�/ 2 d  v�P > e v(m Q _~ C{@<Q \ ]c gUXj-j m SO x 9-^ w N8 M �  C & �= B  �Pu,^"9+% 8 rL�$c?P0jW> * C�~JP`|] $ X:du  Z 5*w v - }j 2 X  vI> 7>1e 7 = [ngH  l  Qw' 'wMa[04R1 B5@0ag� B x   # ND! X X foC l u 6 p�� g } `  @yW*&3�7 M G"n5We�f ; AA� " JA�  lzVi� \ [wiYsd2-( ; (H6AotOQ_?E  +lpfg �bi �>dC l|�ep"  k s <J�QfJT   L O �"d{7 ) 3 & f6^ 2  d�Z# 5 zug{T3 ? u HSuVm&BEP ? m "I8|o?sse E a ZluSx M O ,^{i @ S ? h R3; d V . K T_JXj<& U " * &,{;pS U  ~S3 V  U-n, W (Y&� Y ]r=W1�,  V ,E&6B^�3H $ R `  Ri�[l - T ? umk� @ N  EI�� L J y l#A& X G a >YtQ j = N 2 ;, v 6 : �hS 1  c d�z%!x3 *  < 7w�uf7>3M #  G�QXK]c>h  �T5AXk  -8m; v$~g9 � I(^ h TYS# L -))Q 2 Y}Kz  /asC b Dt/ 4o'?-E aB)x$US 7F�Urg  } o"[*'y k a zJ'xMV� ^ ; G#5t/� K  Z<\� ; a/yJ�( & 4fU �M*  Q~b9�vD \m<yn:gd q ,K&wy6^E L �V,vQs ( \�)uo   .��p 8  t�oQb  x D�m-'  \ �qUS # C t|Zlo- . , LR5Jn&E 4 |  (" 0qH9Z ; q `|wpj�7s ; j 5nx6**^ H X d{KVZz I L mkV^} O < dAEMw N 0 n ;~@K O % M Pp6;�x O  0 $R2[-'  U   ?$ZU: T ^&��|Y Q u/f�-�y' P LuHY�7 N #P1�A P x "O87�P K T {gaa�@_ D 3 Q~c g D p  z!7 x ; ^ N�x}|g: ~ : D "�Q[kQ 1 2 �*9[!!@i *  p��K2Im$}   eD�8A/rB  ?�+SK>e  Obkh %a t =M el>u s 4Of V fx4 412 8 BL/bNE " $M%nX � W p Pe e45|x ;(` ~u =) | XG&XO p o 5v1n+�u# Z T ]7?U�< L 4 laNzFf.�] 9  >E5yMZ�v ( k% tZ�   kAki. @mo,S �j}#Vw w�vg;D, X�Pg[d] " 2j�'let$ ) uA��Nd; / R�/g&$S 5 d "gRCi = O ze%4qmx G 9 kjl J] I ~  ekHak )s P q  A}B"UlE U d VFs0e T ] (v<uF@ W Q Z3zY,f$ ] B B)l;XB� ] 4 un.cc a % h gNJ} `  J CV$+)+ d  3 / J�; a  i+�GL \ .R�nZ ] R� b ] Z#�s W ]]5h;�: Q ~37 KsO�O M ] -^k?#l I =�M\(EC H g #�<�Krb C R �u0s ; ? qe�R  6 ' G=�+) *   �4 ' dK&?9  ^LVFcB](  >3jajE1  ox|~eB \GUU 1#.i n   w V F6D ? kk`f $ I�< %i\pV1 @7e\z zL EHp&��h (0n>-(� { !f"VUP�@ l o a+nt�e Y cJxw]5� H G#SNXA@� 9 '+(UK`� " qQV(  �QNbA; -1 �7Moee*E9 h�J|OXC Be�q~M2lnL q:�RsJO/R Q�/eKhRX 4TNv- ] IMTFb k =N{kj Y bue1S(p > 8PN%VCr * (b5X.[ s {  l@Z)T| z l K  `,Iw?% | a +f?feD4  T wjRfF } I QltcV ~ : *Gzx �f | . y$}0q ~  `~dT'�6} ~  E[A{"|J�L | ,4)dBr�6f x k Qg�Y| t ?nB�{ o !B-� n �!(3 m �� AZ0 e }b�}�WR b b=�`u$v [ s D_�JH3 T b #7�v0�jX) J O �TrB F 8 / > R @ ! .f-g 5  c9Px / :}J-u " kX\D=  J/m`^  *pox}$;  PYnJV /Fei'j l^1\H V9}T c AW L3  'c1G/S�  @ @�Mw'�  &;jJ�%  �`5,p� 2  [D.=�.0? y 7+/Z �IJI  j d-p/�gaQ  Z h{�Az(+S�r_ J NV�m";(t$e 5 43�Z&?AHl ' �K#Nfkv  [�>#Y�~ � 8�u0#g �w^##t*6 YC *PZ d<, %E rq g=(b(;  L&vN_3 )^*m}A o<*O [2*b C7Pn -hc:u0| GH}>$F x �o#*jC(87A` o Rm ZJ;T[gs \ -GHSLq~ T (5Y`#� H !bsF� 7 smk� ' mMw�  R*g|.�"  ;i zQ%J�: K�[6?p�Z' �-�>ay8  �=Q x� Ya [�1~u 5�O" ~ |�b=( x {_au~b!0 m l@@bqk>:2 h U(@^]\%T6 _ E$HR~Gn; V /d0Jd> L A?.B A  8=2 B 9 u-M0UC 0 xK%_Hv%I ! V-soc@6F  7[|`!CE  z>B2OE  }[! �_JYH h6 $�{caI MuB�vnG :ch f�vH %yCR&%�A ]CCE�= =�5]i�9  �yo'-�,6 ��[T�BC6 z�6CZ*f, lt�%mL& ZoS�� k'" HS~2�(0< 88]�6-SN &>BLu\ Qni �gb|Kj.6j1v{*LPHdEijvz(N\:WY ?r)Z;9+Bv|g`u Imi 3iVj�= L;b !�Zw)%a$ /F�p9zoQV00J"a�E%oN3V4GbD�]*^/T<[`�r4R�MIl�>C�xMP�G7r�tgOWI!^�Xz]Jc;YCt�6fPGrDMV(~I�#HHF{'$^l`Y1�95KCD}j>�#-G_fo $G}pJ*"tIA.zqN[=oqWSt4JuVQ=OT/Yc;a1$V-FkLbzPBZKfart8"p^lrh(cg\Qk.U<o= Fy,rR4>y\p{`Q �5/\e?V ~vg$=�S#AB%;�?^�m#%$\�w �-_��@~J��R}4��ew�t# uouj�W >0( hTO�9!Y6S: e8/�v7sYkXa�`~Jvn[Ju]Wm6mrOZp%`!FLQX&=:9{xI' -2)fYdH59/6/*L7M?FWMR+'' -5Suhr&%/ /c;12 *s(P=1!BbJ0 WyU.hvs��^2Fvng$�f1r0SV[ B8�5w+_94qF]\�F|+GW=zw�d)3�A.�y(�*!��"�#�&� /<�$!zh�@Y 0mNg�t Sr+'@_/L�W'kLBRS)�?5{h]*^Cy�"@|>r-gIX}MvWl1_cSo.i|;yELa+c5"/Dr '}R>(W =rV BQp(|gju~(�jQr < Y5l$%�UEf~g+B�d-Gcd0\;� x$~*Ha7yW�%*o-ZA-t�=4c�rwXGA$�W;T�^iVNS=�rHL}�I^Q[`X�L<a�4QS]zk �T/H~�!CSg#�X,a� <Or>_pG�t.P|[5dT%�^%OuShC �CRk+o*&Q):qU @Ew�R =QWwjS"Vj`P|Y;m#~n5fi\N< yGX^e[%l0Fayw<q_lf:gWiMST'k rb9;<jW'## t)'O tz7DAWG^�-5>sXw:�?0Zg+R�O ?x@l�b�%R�6p| r� p�K}X�z�czx:�j�vxa#y�R5� qJ ^�?U k5E�2to'i '�xl@_ �bf^\GZ'4y#V-T9L(O~mJNd &LlSCa|;,C^:>u-P(0=Ll/!E^:.6<kS)._sD00'Y<#?y(K5$>uH?W6 %{fUYa6b[b.sn4 {KN p Dt8`7= `�3I(,4z�2/#�H4�4h_K�0�Rum�)1ve�<�5.aM�#�(G-Q3� �=W):��2�Ue$$t� I�lq!Y�pf~=�^1}q%�O"D)4_ �zA-TCMTe.7gXe DiL?{p~8Q5 M�#6W n _4 Wv{oL5?\s�vb@+CmX $g)ie1>|[-EP#krW=dm/U_~PUy�89MlSf�@p8cK#{1�I^r#WH'L�ROV�eLE.g�U;@�K=D4~�aw'+�62C;� dg�!*?B0,�ob�BGBB�/,qRs�=QP\�D8yHW� 9]^'v�YG{:=�:en?pP.&�;nU)a�t<vmDrjcA{Y}tUiT?pa;W?= J#=5B"7 +"A>&z@Rb IqJN &%/M4;;SIQ(HzyTZi<]tk`ZoQog\F^ kzeEy-xc�zU;]cj&1�N&J�Sk9F� B5�v>tCd�:�^,{L y�.�Is_&� &�2im?�'�^}&W� * k�Q;n�"/W�GS�44=�Ac�M<|%�;|['?}oe �12o3Bz[O(J>HsI7"_IJo1$su�yYIk! ]g*cMc HZ $DlQ[{7H3\xQVzh!;E+sROmP 0XAXCa8!mTUBJx''zqW6@h 2".V0.{Q;6?Y%g7LMNXR X�`]V�: d-�xjV (�xtC�wU�f�[�S�tS%s�N�\C):�M�C5<S�F{�3 Rg�Fi�e��DtN�{�=bx;�~�(<R`$�t5;@K �q*E4-4g :^,!_$Uj(v X5i|  lwO"I6|' \eL1VN. LQC9g6a; >m@pAFwJzE  0Y*g6L]N"CX3XrT}m-J2eb nS@*n fVA�0+~o@,($��4u1�L(�.�\9�?�sC �+#Y�V �y>9m�c �okSM�ow�V^ec�~eu�GKzx�Ve�-@��FqN�.)�u4\7� 2��i!J� :-^1 �A>'V KK.5ESZBG:]j*WW+iw,>jj!q>TwpwSis^}e }bIy}hvH;vX]5)}r""CI!sl&(13 dk) 3\d09  R_7!�.=�F_82 +�B K�?Z>E B�RNu�2ZCV8R�j#Vxd�+TM�iMg�|/]mW�|UP{`�?afC�lRXt�Kf[4s�Wv S\+�UkP&k^�FcPd7�flCXI�1XShG�os:@:�MPrT�|u02� :Rwe�y  �.Qp�y R~  X!4$P9/L.ZGH\AU_\mVzWum`i|zYoUzei]EcSVax2P>Ff r;*7hp#%m*cq:`l�vN� V_�|xY&'�) LR�r}"m7<�<EA�j-JQ�L;5�_<ac�_ 1'�TIsz�l!'x�}MQ�~&eo�hBb�&1~Q[�V;i�06{ <I�B3{�;8z,0�5p/�E>t�#b)�T;w�V "[BpK0gCl<C&(sEg1 S<9wL^t#iLQJ\e{c_.OTQ xq<POCzJNL4fnYPE UXw 'dN@r@Gd6oL=`)5V"FO1Y E.R�R)K66e��UA�)Ds&�R4�H5'�M � VL8�$P�a^K�7I�nqa�CIp�{s�SNX��eAMh�|{�uG3Y�ir�A&A�Zi �?3�Ee�: �2[/�"6 �#R@�17vMU 8 -lgI_3=&\\BtB-F#PO=V=M=C8 jO Xs.}85+#{bac"h0,04v#k] \o +;B0r NCb)GO>{@0Q"Q\L7?pVq�^* *eb~d�Xn'�w �Hx:�|�;K%��+^6� w�nL�d� [�+V�� n�:Cw� �J /e� �ZR�|�f B�h+�y/�Y"<�v�H %K�f �8 -Y�yT*: r$�mGB7b:v C,K!Z'yq M7^1OpkUEqA*@ mbi^SQ/7]Veg_d7)HzN_npp=7hD\{yF"X8Z*KB-W3U�5(Q*@Y�$rO ;�N_�fK(K�Wg{�W J(_$�dih�LH-r4�po^�8B6E�uxE�1B9Y�x8�"D: g�"|'s�BA}�-|`� @G,�=swN�=N<�Ogl>�|<WP�Y_\,�kAX[�jTQ�[@^%i�wO@ �M?f0z�B2>@n90�7&0:yD=1 DxXU'~ B]`(q>is5_GzEJ~AU:|Mc -kkL s^eR} N\P1 &�<SV>+~�,K\L�&0|n�>[a�33s^� y6ap"�<:nN�j/}c�1�G@hD�W,wmD�PE],�O"wp#X�_EWx ~�Bws /d� dOQjl�4sz>s�oQFa_�, v}!N�'wU;VM� v.Z�2V4G<�s6l�B\-7*�~tDy�La)&�nvP�]b �`pU)�keRsb5�qdBwsK�m~6v}Y km*sjny^vy(otM z8mt;Dqk0Prgw%eqa i2qq]�UCqUp�EzTrM_�5ve�pJV�*n q�qC~G�c"�p;v3�]#-� o4i&�xU)0?�*j1Y�nL.CR�5k&R|�eC8Qb�=h!Af�TADZm�F"e7Y�K8Pj� R#g .I�?1Yy�\&c:�7)b�$f(a*�*&i�2m,^�$x$�Dp4W�u2�M|2Xb ?�T1T~VT�f5QpO e�q4P[< p };HM/�<A@ &9A/2=:!*F>4 } 8Q?/r�lFc@'b�`Yr>%wW�P'g=mH�A*"s�>d7�/5.�@W-�%A8�> O�HG2�:?�SR=�<7�xZaL�6'p�~qdn]�5f�uipyl�&8U�kbxx�,3B�]_��4/5�TW� ?/&�IT!�B-�AK/�(K%�4H;�2U%ys0>H�?Z#gg#= Y�He][7h�Ui OP5v�_s=? - ou25(!{| ('*0* tt$3=4pa%? PE cW�uA[TYH�cK'j_Q;�WP6wkE.�GYB�w <�5cL� 1�,iZ� $� �ph.� � m8�z�|G�o� Y�`� g��T�v� C��1�o�$�j{ '��^x'5� (x�Wp )G�,eNm 1S�":[|Bi 9_�/;|Kp8f =m�8Cu=b1a C�FIlx1W)ZF (MSbl$LWO9YXWbAWVCgZQS0Ra%T(p`IE�,Pf2b6yg>:�xMm>nBm3/�n HvI{Lo($�`F~R\x"�LC!_k|�AB"h �u�4@%t��)=))��<08�u�:2I�m�:5U�\�;9c�P�:>o�<�7D�~3�7I%�z%�9K/�vv�{4U>�jd�q3[L� dZk7_X� YHc7d j�Rv;~]:j(t�Ne3vP8t7�+"D[$lG:v*=�7(;Q^@?y6I�>14B T6<;ZI5)8�H0}@GhQ;#*�<)zAOv(\@!�0"vGa}1hC�q'rKk@oJ �eoNvJzN�SsI{XT�MlQ�bX�?�jU�p^�/lV$�b~�$g[2�bzr�f_@�jse� gbT�fhX�ch_�nfL�fjm�n\>�fm w�t\+�cs.�qMn"�`|�9�yJc�a E�xAzU�fU�|9pHb#"d�6a<d+0p�-Y,}h7;}�"O qgAG�C}hiKS�4 rajT`�&  +�fZl_j�2!�YTnix 9�PJos?z�GCo{'Is�y:>u1R%t�k25w:^%j�^(.y�Eh)g�T'| �Wg7g�G$�Zy0Y�9 %�k|8Wx�/�3�u<Nn�"?�@L^� J�G}GP�  Y�E?C�g�I|9u<�,o�Nx3yl-�$:{�Lz*p^#�*B�Ny"eU�3!Q�Rs\F�<,_�UqP<D8l�UpE0NDw�Zi 9#WO�[f.bZ�Yf& kf�Yb�~ru� ]\�|v|�Y]�qq`S�cl &^P�\c/^L�~P^'3\G�qGW+B�`A�h;R��9G\>�[3K �DP \;�S%I�NY \4�C!= $�Z_\/t�762�bhZ*h�+3>�pjU&]�-$I�ytV vM�&*W�z UoqD� #2$e� Vgf6��<4m�$R \\(�D"?z�"TTP�K/I�*LJC�U7Y�,I<:�]Be�.F4, dOo�/E-lZ|�/D!wc�1Ap�/@�{�0=��54��43��5,�w 4*�p 7#�hy4"�w^r"!0"�oQp�'06�eGj& �465�UAd)�@:1|�K7^5#�IC5yp�@.[4.�UH2p~g�4%U@9�_P1dzR�1RFD�iV-[lL�HN#U�ma.S`A� EX!3]�yf,IV4� @].<i�l)?K)��=b:Hs�q):< �6lDS~�v%-5�2vKa�}"$(�0}Vm�% ,az�  *n� 'u� �! � � � �� �� �#��'��-�w0�{s9 z�rhBo�oYE �( f~�`T M�2 ct�VJR !�;& W|h�LBy ]+�E- Pp^�?<t^:�L4 HeS�61rf&&B�W: AXK�(.hm2-P�^C5R;�""i� s:=U�lF.F1�b }BHb�qP%<&�]MQo�yV2�^�Z[y�X%�T`h�_ �Tkt�dN#x{�jM(�m�H*�u�D0�|�D5�}�; 7��; =��=G�y�7 J�n�1N�g�6T�d�2Y]�x|2a�S�qq-c �L|z�gg+o �$Btn�^_*r# �, =ic�UU(!y))�66^Z�HQ)#3%4�>-UO�>K,#94:�K%IG�3C)*H8L�M'@;�*:'.RBV�W,6/�$.$1US[�b3 ,&�-|'5bZg�j8!� %z%;nbu�o@�w(9pr{�zD�t'@}{�G s$G�L�r#L�U|�e,K�Zz�h)Q�]u�e+U�bq�`,[�bm�^/^�hb�Z0e�n[�Z/m�sR�W3n�tL�V4u�xE�R9x�}=}�~U7��7r�sT8$ � /mp�ryN=0�)ai�gqLA7� !Wa�YnN@=('�&MV�SbHHJ.4�,CM�F`OEP;;�8 8E�:[NIYDF�? 08�5OJOeLQ�G%.�-FHSmWZ�P#�"BHYz^e�X~�9JYir�Z)w �6K[vx�f*q�� ,J`|�s+l�'Kc�w2j�Il�{:a�Ir�8^�Op�@T� Kz�DO�L}�HI�~P�MA�N �Q:�yS�U9�xV�Y0|�tW$�Z(v�uW-��]"l�sZ2 �`dv�n_@��aYo�tq]B �g Rc�nnbN%�j F\�bocV/(�m~@P�\ujh^82�nu2J�PqlifC9�)uu,=�IjklnMC�/sm!5�@ckowVL�8vh+�7\ks~bR�E|f �/Ujxi^�I{`�%Okytg�O z[ �Hjn�Y ~W��Bjx�aQ�;l�dJ�5i�jD�0m�t@�,n �{$:�$m�(4�$s�./�s�2'�m"�1}#|�z1�5zq� v4�9yj�{>�=r_�|C�Bq Z{�zJ��BmRr�}U ��GjJi�{\%��Hg@a�rc0�Nc6X�if?�P].N�`qD,�QY&E�YxN5�TT8�UzV@�!V~Q3�Hx]J�(W}M )�?rnK�6]yJ�9krY�7Y|B��.gyb�Bbt@��&ak�F]y5��Yv�Laq9�Q |�T_s.�N�Zbo+� H�bdm%�C�h ei!�=*�nck�;-�rcg{�47�ydd q�-?�i] f�(D�h\a� K�hWV�O� hUQ�Y�'cVJt�_"�&hMAl�e,��,dM;b�o2��-dI0]�xw9��/eD)R�r~C$��-h<J�jK*�9`<F�^V4� 5b79�Y];�9a12�OfF�8`/�(�HkQ�:^,��D|zS�*=]$��7yZ�4CY!��1si�4@W ��*np�<ER�)a$w�CBT�_,�G?W �[0�SCS�V:�XFMt�T=�\HIm�ND�dGIe�HJ�iFGb�DS�qIBW�>[�vFBQ�=\�{J:H�7h�K7Aw�1n"� H68r�+t+�� F63g�*|4��H/,\�':��E.$U�#�D��D*L�{ P��B&I�n T*��C" ;�k_0��C5�ae:�D�.�Zo?�">�"�U yF�A��M %{U�!> ��C+X�!#=� �:2a�)(9��4�8e�3)8~�+9s�4+3x�&v@u�@.1o�qF~�D+3m�kQ�G+0c�eS�J,+Y� e]�O'/X��`a�W*+N��Ve�]+'G�Un�_*%A�Pv�j, 9{�Jz)�i'#3r�H-�t,*j�E 8�v(%a�A; ��~)]�:H��.R�>L��- N�}4"Y��*D�w3Z(��'�:�r1'f.��'�4�i,/m7��'�,�b'7u@��'�&�Y#<E�"��S">L�  ��O!CW�$|� �EI]�"t��ANd�!l�:Sl�$ e�2Vs�+ c�*\}�. Y�#d�6O�~ j�<K�v r �BD� x w�C?�q z�L 5�i "�P /}�g+�U'x�_3�\!n�^"9�ae�Y&?��e`�T*G��lW�R�,O��oQ�M3V��u�F�M4[ ��z�=�H>h$��| �8�wD�Bm-���4�m@Fv3�� |�'�l@�J}9��x�!�c>M@��s��\9SJ�� n��W: VS�g� �O5 ^[�a��H0 c^�Y�B1ic�V�:,�np�N�5-sr�$E�.'�x {�'B�)(�*>� $!�56�&�'!�4/�"'&�;(}�~!,-�A x� x!37�Cr�u5;�Lj��s 6B�R a�n =H��YX�j AR��YQ�jAW��\�N�hId��[�C�bKe��f~�:�`Rl$��jw�9�{[Us*��ns�.�xW]}0��sm�*�lR];��yg��oUdA��{^��aMjF��Z��_N"nK��U� �XIxS��N��QI%y\�G�MJ.z`� D�HG. i� ?�=A-n�4�9>3v�0�5@7 �+�.=9%�#&�'=?.�( |� :A1�,{�9D8�0t�5!F?�6 i�5"JD�:a� 5"NL�?�[�2$RR���Cy�Q�2$X[��Hv�L�/)X_ ��Jr�I�z0)_h��Ok�=�u2*bm��Rf�8�s1,fr#��Xc�4�o00hx*��]]�)�m1.r.��bU�!�{m-5q9��fR��ui/4{:��fN��kd06~C��hH��hf-;G��lE� �^b.=L��o?��X[3<T��s7�T]0A^��y0�S^/Eb�y/�FX2Ej�(�H[.M"n� "�;T5J'u��8W0R/~��5T2U5�x�-P7U;�~ o�'O6ZC�"|j�#P4aK�%w�d�P6cM�,r�^�O7gV�.n�W�J=fX��8j�P�M9pd��9a�F�FAmd��>a�@�I@rj��A\�@�GEss��@R�4�IA��FP�.�IB$��GL�+�IF.��MG�"�EJ0��O@��|CP;��V=��pxHM;��X;��nzESH��^3� �gtIRO��a.��arITR��c)�]tEZW��g%�XpG\#^��g�SnI\&a��g�MlJ^,k��o�InFg6q��r{ �?gLf:v�tuy�=gLh=y� uor�:hKmH�up�m�2dNnK�{h�c�*cOsS�~h�a�)cOwY�|b�Z�#`Qz_�]�V�"eOc��"U�N�dPj��)O�C�^Uq ��)P�B�aSv��2M�>�^X��/F�5�_X��5B�-�Z`$��9<�&�\_+��=5� �Zc.��?4��~\d9��D-��y[g>��J)��u\gE��J!��o]jE��J|��icfL��Ny�d^n(T��Uq�^^q/Z��Yp �]\v4`��Xo �U]w7d��[h}�P_y>j��_e�z�O}dvAl��^b�t�I}a~Hs��b^�m�E~`Qz�bY�c�:wfS}�gX�a�7yd\�jR�Z�4yea� jL�S�/xfh�mK�P�)tki��oE�G�#skr��nC�C� smu ��t=�>�soy�� u5�4�ul��"x3�4�yk��$y|1�+�sr "��)xz+�%� uq '��,zv(�!�st0��4ws#��rw4��1}q��p|:��7}o��|ux!=��7n��xq(D��<~d��pw{+I��=g �mt3Q��Cc�lq;W��F]�cr@[��HY�{�\sA\��GV�w�[uJe��KT�t�UxNi��MN�k�QvQm��PG�b�Ls\x��WG�a�Exb|��U}E�\�Aa~��V{A�V�?zk��\~9�O�:{n�[y7�I�5s�� Yu4�G�3v�� [q1�@�/~ ��]n.�:�'��^o(�8�)��ck$�-���dg!�)�#��ef�&�$��i~b� �!*��"e_��%1��$h}_ ��'4��%j|Z �� 1?��+i{Y��~3@��-jzS��{4B��.lxS��r<L��2lvQ��r?P��5jyG�y�kGT��7luG�w�fPZ��8nsE�r�bSa��<lt>�j�\We��<pn?�i�\\i��?no9�^�Ubn��@qj8�\�Qdq��Dln0�X�Pkw��Fog1�R�Jpz��Fnh*�K�Dv��Job+�H�? x���Lmc$�B�; ���Mma�:�9 ���Ok`�9�8��Pl\�0�.��OnX�+�+��SkV�*�)#�� TlR�#�&*)��QlP ��".)��WhO��2.��WhL��41��ViH���::��WgG���=<��YeD���@>��[dA��{DF��#Wf;�{�zJJ��"Zc8�s�q PS��)Wd5�n�jXX��)[_4�i�hZY��+Y`/�c�da`��.Z^+�_�`ge��.]Y+�[�^jf��0Z\$�W�^jm��3\V$�R�Wrp��5[U�L�Q ws��2^T�G�O}z��7\P�D�I��~��9[O�<�C���<YP�:�F ���;ZL �5�=" ���=[H �/�:'���=[E�)�5*���@XF��"�4.���@Z@���/3"���CW?���,7'��BW>���&:+��BX8���&A2�� CX3�� � G:��BX1�~� �"H;��DU0�}��O?�� IR-�w�TF��FR+�p�|WJ��FQ)�q�|\N��JL)�j�taU��EO#�g�saS��KI#�c�p gY��ME!�\�iqd��$EJ�X�ep`��KF�R�auf�� KD�P�c|o��'GE�I�Zp��&IB �D�Yt��'J> �B�U!�t��'H@�7�N(���-G<�5�K' ���,I9��0�H, ���1D:��-�H0���/E7��%�@8���0E4��#�>3���-I/���9>"���.G.���7B$���2F*���2D&���4C+���3E+���2E%�� �.M1���5B%�{��/Q5���5A!�u��&U:��3B�r�(Z@��1D�k�$bG��4@�j� cH��6=�f� gK��<7�b�{kN�� 6<�]�ymR��6:�Y�rtW�� ;5 �S�oy_��66 �O�j}`��75�F�e!f��73�D�d %m��51��A�a*q��7.��<�Z .s��50��6�[/�u��<&��4�W8 �u��<%��2�X9�}��4)��(�K?���6%��%�K@���6"��!�IF���6���EH��� 6���BN&���!4���?N&���&/���=Q,���"2�{� �:Y2���"2�s��6\1���$1�r�2\6���'-�m�0e>���%. �f�/g@���&- �a�-lB���'+ �d�)rJ���%+�`�%qK���&*�W�~#yQ��%*��R�y#${R���*%��N�x&V���*"��K�q(^��&&��D�o0`��'"��@�j0d�� $#��=�h3g��(��5�c4m�� $��5�b;�q�� %��0�^D �n��(��+�] G�u�� %��'�X F�x�� &��$�V J�}�� '���SN���$���PR���"���L Y$���% �y��J Y&���# �t��I\)���! �s� �D`,����n��?b,����k��>�g6����i�<n;�����`�: o?�����_�4!tB�����^�1%xD�����\�0){G�����Q�.,|I�����P�-.Q�����L�}-3U�����D�{(6Z�����F�x(<Z�����>�v#:^�����;�q$Aa��� ��5�i'Bg�����3�j!Dm��� ��-�j J �j�����&�a K �q�����&�`P�r�� ��!�]S�y���~��ZW�y�����z��XZ����z��U\�����s��Ta#�����n��Qd$�����j� �Ni'�����h��M"m/�����c��H$q0�����_�D'u7�����[�F1r7��� ��V�E/{>��� ��R�D7{>��� ��S�?3F�����Q�;9I��� ��M�9:L��� ��B�; ;O�����B�7CP�����<�|4 EX��� ��<�|0 JX��� ��6�w1 N\�����1�v,Ic������-�q,�T�_������*�o*�T �d������&�k,[ �i������%�m&Z�m�����}��f'�]�n��� ��v��c%#]�x������w��e��"e�u�����o��b��%h�z�����q��]-g#�z�����k� �Y *n$������f� �Y-q'������a��U ,w.������_��V3x3�������\�P 5|6�������X�P;|6�������V�N =9�������R�K ><�������L�JA@�������J�GDC�������C�BEI�������D�@II�������>�ALP�������;�A OS�������7�;OV�������8�6TV�������/�|: U]������~�2�}6#X�_�������%�t9 "_ �_������|�$�r7 $b �e������}��p3-^ �h������w��m4 ,d�j������r��l0 .h�p������o��k- /m�q������l��i* 7j�u������j��f*1v!�u������f� �c+ 6u �z������]� �c';v%�|������]��a%:+�}������Y��^' =,�������V�Y( ?0�������R�Z$ A4�������P�U& A6�������L�Q% C;�������H�O% I<�������F�P!!KB�������E�PPF�������A�K!$RD�������<�O#UI�������7�J%YL�������4�D"+WQ�������1�F)_U������~�-�E/^��V������~�(�B.c�Y������y�%�A,j�Y������s�%�}A-m �\������r� �|=3l�`������o��v?5o�c������l��u;9q�e������f��s;9v�i������d��p::z�k������e� �l9>{�o������`� �m4C|�t������[��j4!B%�t������V��i4#C'�w������V��i/!I*�{������O�a4"M.�z������S�b/$N-�������J�`0)N5�������L�Y4,P4�������C�_+ (U;�������E�V0.U=�������>�T10X<�������=�V,0\C�������9�U)"-bF�������4�V(!2aI������{�4�S) 6aM������{�,�O,:eN������y�)�P'$6iQ������v�&�O'$9l�W������s�#�O$(7s �T������o�!�H+!An �X������i��G*"Br �[������f��D+#Dt �c������g��|H%*A{�d������b��{F&*C�b������a��zA*(H�g������Y��y@*)J�j������Y� �uA'-J�m������T� �sA&.N!�n������S��r=*-P)�l������L��n@'.U%�t������Q�k=*.X)�w������J�i>(1Y-�w������E�k9*3X0�{������D�j8+4[3�{������@�e;(7^6�}������?�d8+8`9������~�?�`;(;a;������~�9�`9*;e?������}�4�_5/8lA������w�1�`4.=kG������y�,�Z7,AlF������u�*�X8+DlI������p�*�X50@u�L������l�&�X40Du�O������o� �U7-Hv�Q������i��T42F} �T������h��T33H�S������_��O70N}�Z������^��R32R| �_������]��R34P�\������[��O36Q�_������X��L47S�a������V� �zO19V�i������R��xO0<V�i������R��zH5:Z$�h������I��yG6:]$�m������K�uI4<_(�o������E�sH4>`+�p������E�nJ2B`/�r������@�nH2Da1�u������:�qC7@i2�w�����|�;�lE6Ci6�y�����|�5�iF4Gj8�|�����u�7�gE6Gm<�|�����s�2�hC7Hp>�~�����o�/�h@;FvB�~�����o�,�eA9LsC������m�)�e@;KxF������i�&�bA:OxG������e�&�a@;O}�I������g��^B:S}�O������b��`>>Q �N������`��]??S�M������]��\A<Z �V������Y��ZB<Z�T������S��X@>]�\������T��X>CZ�]������Q� �WA?a�]������O� �W?D_�_������K��Z;Ga�c������H��S@Ed �d������F��SADh"�f������F�}T>Je(�e�����|�D�wV=Jk)�i�����{�A�yQAIo)�m�����y�?�qW<Nn+�p�����x�9�wPALq,�s�����q�;�uNDKu0�t�����v�1�sOBOu6�r�����q�1�qP@Ts:�u�����o�,�tIGO|8�z�����k�+�sIHO;�{�����i�*�pKFT~?�{�����g�'�kNCX~A�}�����f�#�gODX�B������^�#�kJGY�H������[�"�fME]�H������[��gLG^�L������Z��cMH^ �M������[��dNEd �O������T��fFP^ �T������R��cKKc�R������O��eFQa�T������L� �eGOg�X������J� �bIOi�[������F� �`JPj�[������B��[NNm!�\�����z�E���]LQm#�_�����z�@���ZNPr$�a�����w�>�]IVp$�f�����w�:�ZLVr(�h�����s�8�[KWu.�f�����n�9�}\JZu.�j�����n�5�z[MV~1�i�����k�3�x\J\{0�p�����g�0�|VQW4�o�����g�-�wYM^~9�o�����f�'�zWM`<�p�����b�(�uZKc>�q�����^�&�wTQ`<�w�����_�"�rXOb�=�y�����^��pXPd�A�z�����]��rUSb�D�x�����Y��oWRf�F�{�����V��qSVd �I�|�����S��mVTi �J������O��lWRn�L������O��jXRo�N������I��kVUq�P�����|�I� �hWVp�W�~����z�F� �iUYq�S�����v�F��jS[r�T�����u�D��fYU{�\�����u�?��kQ_t!�Y�����r�=�fU_u"�]�����n�=�lPbx(�Y�����r�5�dW^~#�c�����i�7�fTa~(�a�����h�6�dWa,�c�����e�3�dVd.�e�����g�.�dXc.�h�����e�*�_\b6�f�����`�+�bYf0�n�����]�+�}cYf5�k�����[�&�_[g5�q�����[�#�{cYi<�k�����[��|`\h�:�q�����W��ybYp�>�r�����U��ybZn�?�r�����R��vb[q�E�r�����P��y_]r �B�y����|�N��sb]s �H�v����{�K��u_`r�E�z����y�I��sb]x�M�v����t�I� �t^bv�L�{����s�G� �pb_z�L�}����s�A� �obaz�O�}����s�>� �obb|�O�����o�>��q_d~�R�����k�=���q_e�U�����l�8���nae�X�����n�3���mcc"�X�����j�3�kdd#�Z�����f�2�mai'�[�����`�4�n_m*�]�����b�/�mbi(�b�����^�,�hej/�^�����]�(�n_p1�`�����]�'�jcp2�b�����[�"�icq3�f�����X�!�kcr5�f����}�Z��jdr7�g����~�S��lbu��:�f����|�P��ihq@�e����{�O��git�?�k����|�K��giv �<�o����y�I��jfz �A�m����u�H��emv �A�q����p�I��fkz �D�q����o�H� �{ji}�E�t����n�F� �|hk~�E�u����q�=� �|gm�H�w����m�?��{jj�J�w����i�>��wmh�M�v����h�<��zkk�P�t����c�:���yin�O�y����g�4���xip�P�|����d�2���tlo�U�y����^�4�ygt$�S�~����_�1�wjr#�W�|����]�.�snp&�W�~����\�+�vju*�W����|�]�(�vls)�[�����W�'�tlu.�Z�����T�&�tmu*�a�}���z�V� �vi|.�a����x�S�!�umx3�^����|�M� �tl}4�b����w�N��tm~5�d����u�L��sn}�7�d����s�K��pr|�<�c����p�K��pq �7�j����s�B��xl �:�j����q�A��vm �?�h����l�D��rq�D�h����i�B� �qt�>�n����h�@� �up�@�p����j�;� �qv�F�l����f�:��tr�G�o����e�8��qv�L�m����d�4��tt�I�q����`�6���sv�H�t���}�`�2�sv�N�r����\�1�q{�O�s���~�Z�0�tw�P�s���}�W�/�}ux�T�s���x�\�'�r|%�Q�v���y�W�'�}t|%�S�y���x�S�)�r&�U�y���s�U�"�q(�Y�u���t�R�"�}u*�Y�x���u�M�#�{v,�Z�z���p�O��yx/�Z�z���q�K��xz3�Z�{���m�L��{x�2�[����j�J��{x�5�\�~���m�D��zz�6�_�}���k�C��y|�8�_�~���l�?��yz�9�b�}���g�A��yz�=�_���~�h�=��w~ �<�d�~���c�=� �|z �?�b����_�>� �~z�>�f���~�`�:��x~�>�h���~�_�6� �z�A�i���{�]�7��}|�D�h���y�]�3��y�E�i���x�\�0��w�F�j���y�Y�/��z�F�n���u�X�.�|�K�k���y�Q�1�{�L�m���s�U�*�{�M�m���o�W�$�z"�M�o���p�S�$�z#�O�n��~�t�L�'�{$�O�r���m�O�"�~*�M�u���m�M��(�S�q���l�J� �+�S�s���j�J��z-�S�u��~�i�H��.�U�s��x�n�@��1�V�t��z�i�B���0�Y�u��}�d�C���3�Y�u��{�d�?���4�Z�w�~�|�a�@���7�Z�v��u�g�7���:�Y�z�}�z�^�;���:�]�x�~�x�^�9� � �<�]�x��v�\�9��} �<�_�x�~�v�[�6���<�b�w��t�Y�5���=�c�w��q�Z�1���?�d�v��q�X�0���B�b�z�{�t�R�1����@�f�w�~�p�S�.��F�d�y�|�p�P�-��D�e�{�z�o�O�+��F�g�x�|�m�O�'��I�f�z�{�j�O�%��H�i�y�z�j�M�"�$�H�j�x�{�g�M� �$�K�i�z�w�j�H� �&�L�j�y�w�h�G� �(�J�o�u�z�e�F��*�L�m�w�z�a�H��(�Q�i�}�r�g�@��,�P�l�z�t�d�>��,�S�k�{�s�a�?���-�T�l�|�o�e�7���0�T�m�y�s�^�<���1�T�o�x�r�]�:���4�T�p�w�s�Y�;� ��5�V�o�y�n�]�4�� �2�\�k�|�l�[�3� � �6�Y�p�v�q�T�7�� �9�W�s�t�p�T�4�� �<�X�r�v�m�T�1���:�\�p�u�o�N�5��<�[�s�r�p�M�1��9�`�n�y�f�T�(���>�^�q�u�i�O�)����?�`�p�v�g�M�)��A�_�r�s�h�K�&��@�b�p�t�g�H�'��A�b�r�q�g�G�%��F�_�t�q�d�H� ��G�a�r�s�b�F���I�a�r�r�a�D��"�E�f�q�p�b�A��#�I�d�r�o�`�A��'�H�e�r�n�`�>��'�J�f�q�o�]�>��)�J�g�r�m�[�>����*�L�g�p�o�Y�=���(�Q�d�s�l�X�<���-�N�i�n�o�U�;���1�K�m�k�p�U�4���-�S�f�p�l�T�6���2�Q�h�p�j�T�4� ��5�N�k�p�h�T�0� ��/�V�g�q�g�R�0� � �4�T�i�p�g�O�1���6�T�j�o�f�O�-���8�U�i�p�d�O�*���9�V�j�m�f�K�,���9�W�j�n�c�L�'���=�U�l�m�b�J�'��>�V�m�l�`�K�#����@�U�n�j�c�E�%��<�[�i�o�]�G�!��@�[�j�l�^�D�"��=�_�f�p�Y�F���A�\�l�h�`�=�!��B�\�j�m�W�D���E�\�k�j�Y�@��!�D�^�i�k�X�>��#�D�`�h�k�V�=��"�I�\�l�g�W�;��'�E�b�g�i�T�;���%�I�_�j�g�T�9���)�H�`�k�d�U�6���%�N�\�n�a�V�3���-�G�e�g�f�P�3���-�L�`�k�b�Q�1���-�M�a�j�a�Q�/� ��/�N�`�k�a�M�1�� �1�L�d�h�`�N�,� ��5�K�e�g�a�L�*���0�P�c�h�_�K�)���4�O�d�g�_�I�)���5�P�d�g�^�G�(���5�R�c�h�[�I�#���8�P�g�c�_�C�&��2�X�`�g�\�B�&��6�X�_�i�X�D�!��7�V�c�e�Z�A� ��?�Q�f�d�X�B���>�S�e�e�U�B���>�T�f�b�X�<���?�U�f�a�W�<���=�Y�b�d�S�=���C�T�g�_�U�9���A�Y�b�c�R�7��"�A�Y�d�`�S�5��"�D�X�d�`�Q�4���$�B�\�_�e�K�7���&�D�Z�b�a�M�2���&�F�X�g�[�O�1���'�G�Y�d�]�M�/� ��'�I�X�e�]�J�0� ��+�E�_�_�_�H�/���-�H�[�c�[�I�,� ��/�G�]�a�]�E�,�� �,�K�[�c�Y�G�(�� �0�J�[�d�V�I�$�� �0�L�[�b�Y�B�*����0�N�Z�d�T�F�"���1�L�^�_�W�C�"���5�L�]�`�W�?�$��6�L�]�a�S�A�!��4�P�[�`�V�:�%��8�K�b�[�U�=���:�M�^�_�R�<���;�N�^�^�P�<���7�R�]�]�R�8���:�Q�]�]�P�8��"�5�V�Z�_�M�8���=�S�[�_�K�7���=�S�\�\�M�3���>�R�^�[�L�3�����@�R�^�Z�J�4��"�?�T�]�X�M�-��&�>�U�\�Z�H�0���!�C�R�`�T�L�,����(�?�W�[�Y�F�,���%�F�P�a�S�H�+� ��)�A�W�Z�W�G�'�� �'�D�V�[�W�C�)� ��$�I�Q�_�U�A�*�� �*�E�V�[�T�C�%�� �/�C�Y�X�V�?�&�� �0�D�W�\�Q�@�%���*�I�V�Y�T�=�#���0�E�Z�W�S�>����/�J�T�\�O�>����4�E�[�U�T�8� ��2�I�W�Z�L�>���3�I�X�W�P�8���4�J�W�X�M�8���3�K�W�Y�K�7���:�F�[�U�M�5���6�K�X�V�L�3���9�J�Y�V�I�4���9�M�U�X�G�4���;�J�Z�S�I�1���8�M�X�T�H�/���9�P�U�V�E�.����<�L�Y�R�G�,��� �<�N�X�Q�G�*��'�8�R�U�S�D�)���%�;�P�W�O�G�%���&�<�Q�U�R�B�(� ��%�=�R�T�S�>�(� ��&�@�O�V�Q�=�)���+�<�S�T�P�?�$�� �)�?�R�S�R�:�'�� �)�?�S�S�O�<�$�� �+�A�Q�U�N�:�#���(�E�N�W�L�9�#��+�C�Q�S�N�8����+�E�P�T�L�7� ��.�D�P�U�H�:����0�B�S�S�I�6���/�F�P�S�J�4���1�D�S�P�L�0���1�D�U�N�K�0���6�C�T�P�G�2���2�G�Q�Q�F�2���3�H�P�R�E�/���5�G�Q�Q�C�/���7�F�R�P�C�.���7�F�S�N�C�,���7�H�Q�O�A�,���8�G�T�K�C�)����!�4�M�N�O�@�(����;�H�R�L�?�)� ��#�6�M�M�P�;�)� ��"�9�K�P�K�?�#��� �=�H�R�K�<�$� ��&�7�N�N�L�;�#�� �"�=�I�R�I�;�"���'�;�K�P�I�:�!���)�:�M�N�J�8�!���)�<�L�N�J�6� �� �+�;�M�N�H�6� ��'�@�J�P�E�8����+�>�K�P�D�6�� �-�=�N�K�I�/���)�B�I�Q�B�4���*�C�I�P�B�3���/�?�L�L�E�0���-�C�I�O�A�1���.�B�K�M�A�0���.�A�N�J�B�-���/�C�K�L�@�,���0�C�K�M�>�,����6�>�P�G�B�(���2�C�L�J�=�+���3�C�K�K�;�+� ���5�B�N�G�=�(� ���1�H�I�J�:�(� ���7�E�I�K�8�'� ���7�C�N�D�<�#� ���8�C�L�G�8�&�� ��7�G�H�J�4�%���$�3�J�F�I�6�!���!�8�F�J�F�5�!���%�6�G�J�C�9�� � �!�=�B�L�E�2� �� �"�;�E�J�C�5��� �$�<�C�M�@�5����$�;�F�K�?�5��� �'�;�F�I�B�0���&�>�C�M�<�4����*�:�H�G�A�.���*�:�I�F�A�.�����)�>�E�I�>�.���(�?�F�G�?�+���+�=�G�H�;�-���)�B�B�I�<�*���-�>�F�G�;�*���.�<�J�C�=�(���-�A�D�H�8�*���-�@�F�E�;�$����0�>�H�B�<�"���1�>�H�C�7�(� ��/�?�H�A�:�"� ����.�C�C�F�3�'����/�A�G�@�9� � ���1�A�E�C�5� � ���1�B�D�C�3�!��� �2�B�D�D�0�!����3�B�D�B�0�!��� �4�A�F�>�4��� � �6�@�F�>�2����#�5�@�G�<�3��� �$�4�C�C�?�/����(�2�D�B�?�.�� �'�4�D�B�=�/���� �&�6�C�B�>�+���"�9�A�E�:�-����%�9�@�E�9�-���%�:�@�D�9�+���'�:�A�B�;�'���%�;�A�A�<�$���,�6�E�@�7�,� ��*�9�B�B�8�%���&�>�?�B�7�%���&�>�@�A�7�#���*�<�@�B�4�%�����.�9�D�<�8�!����,�<�@�A�3�"� ��,�=�?�A�2�"� ����,�>�>�A�1�"����,�=�A�=�3� ����2�9�B�=�1� ����0�:�C�:�4�� ���.�>�>�?�/��� ��2�;�B�;�/�����1�;�B�:�/��� ��5�9�B�;�,��� � �0�>�?�;�,���� � �2�>�>�:�.��� � �4�:�C�6�.���� �#�0�A�;�;�+��� �$�2�=�A�4�.���"�5�<�>�9�(�� �&�1�?�=�8�(���$�4�=�?�4�+���� �&�5�=�=�7�$���$�4�?�<�7�$���&�6�;�@�2�&���#�:�9�@�2�#���'�7�;�?�1�%� ��)�4�?�:�5� ���(�7�=�;�3� ���*�5�>�;�1�"� ���*�8�;�;�2�����+�6�>�9�1�� ����)�9�<�9�1�� ���,�5�@�6�2�� ���*�9�;�:�.�� � ��/�6�<�:�,�����.�8�;�8�.�� ���0�6�=�7�-�����,�8�<�8�)�����,�:�:�7�,��� ��-�:�9�9�'���� ��.�8�<�5�*��� ��.�:�9�8�&��� ��0�7�>�0�-��� ��2�6�>�1�)��� �"�/�9�:�3�'�� �$�,�<�9�3�%����3�6�<�1�&���!�1�9�8�5����$�0�9�:�/�&� � �'�.�<�7�1�#� ��"�2�9�7�3����!�4�7�:�.�!�����'�0�;�6�0�� ����)�/�;�6�0������'�3�7�9�,� � ���&�5�6�8�-�� ��&�3�9�5�-����&�2�:�5�-�� ���'�5�7�7�)�����&�5�7�5�+�����'�6�5�8�&�����$�7�6�6�(�����*�4�7�6�&�����)�5�7�3�(�����+�4�7�3�'��� ��-�2�9�1�(�����*�5�7�2�&�����-�1�;�-�)��� ��,�4�7�1�%���� �*�6�7�.�'��� ��,�4�8�.�%����.�4�6�/�$�� � �,�6�4�0�!�� �!�,�6�3�2�����1�3�6�-� �� �$�*�8�3�.� � �� �/�4�4�.����"�/�4�4�-����"�/�5�2�.�� ��"�/�4�4�+�� ��#�/�5�2�+�� ���)�+�7�2�)����%�.�5�3�(�� ���$�/�6�0�+���� �3�3�1�)������#�2�2�3�'�����(�/�4�1�'�����(�.�5�0�&�����'�/�5�.�(�����#�4�1�1�#������&�1�3�/�%�����)�.�5�.�$�����&�1�4�+�(�����)�0�2�/�!�� ��(�2�2�.� ��� �#�7�-�1��� ��+�0�2�-��� ��,�.�4�*�"�� ��)�1�2�+��� � �'�3�0�,��� � �)�0�3�)�����*�1�2�(�� �� �*�0�2�)���� �,�.�4�%�� ���1�,�4�&�� ���"�*�2�.�)�� ��!�)�5�*�,�����-�1�.�'������#�)�4�+�)�� ����!�-�0�-�(�� ���"�,�1�-�&�����%�*�1�/�!�����#�,�2�*�(�� ���!�.�0�,�$�����#�.�.�.�"�����#�.�.�/������#�-�0�+�#�����$�.�-�/��� ��$�.�/�)�$��� ��)�*�1�)� ����&�.�.�+����� ��(�+�1�'�!���� ��'�,�0�'� � �� ��%�,�1�%�!� � ��'�,�0�&��� ��'�-�.�'�� � ��&�-�/�%�� � ��(�+�/�&�����,�*�0�#��� ��'�.�*�+�����)�+�/�"�� �� �!�&�-�.�"�����(�-�-�"�����)�-�+�%�� �����)�-�*�$�������-�)�.�!�������+�,�+�"������*�-�(�$������*�-�)�"�����%�&�/�)����� �*�,�)�!�����"�)�,�)������#�)�,�(� ���� ��$�(�,�(������$�(�-�'������#�)�,�'���� ��"�*�+�'������.�'�*�����$�)�,�%��� ��#�+�*�%�� � ��"�+�+�$�� � ��$�*�)�'��� ��"�-�'�&�� � ��"�+�*�#�� ���'�(�*�#���� ��&�)�)�$�� ���$�+�'�%�� �� ��#�*�*������#�+�(�"�����$�+�'�!�������"�-�%�"������'�)�&�$�� ����$�+�&�!�� ����&�(�)�������)�&�)�������+�$�*������!�$�+�$�������&�*�$�������%�*�$�������+�&�%�� �� ��$�"�,�"��������(�(�$�� �� ��"�%�(�%���� ���)�$�'�����!�%�)�"�� � ��#�$�*� �� ������&�*��� � �� �(�%�$�� � ��!�&�'�"��� ��#�&�&�#�� � ��!�&�(������$�%�(���� ��#�%�'���� �� �)�#�"�� �� ��$�$�'��� ��� ��$�$�(�������#�&�%������%�$�&��������+� � �����$�&�#�������"�&�#������� �)� �������&�#�%�������$�$�$�������#�&�"������&�$�"�������%�#�#�������#�%�"�������&�"�$��� ��!�!�'��� ������#�$�!�� ����%�#�!������&�"�!�� � ���%�#� �� � ���%�!�"�� � ��!�#�#��� � ��$��'��� � ��"� �&���� �� �$�!� �� �� ���#�$���� ���&�!����� ���'������ ���&�!����� ���%� ��������"� �$����� ���#�"�������#� �#�������"�!�!�� ����� �$����������%��������!�#��������#�"���������"�"�������!�!� ��� ��� �!�!������"�"�������� �#����� ��� �!��� � ��� �!��� ������$��!�� ����#� ��� � ��� � ��� ��� ��"���� ��� �!���� ���"��������!� ���� ��� ��������!������� �� ��"����� ���!������ �� ��!����� �� �� ����� �� ��!����� ������ ��� ���#��� ��� ���#��� ����� ������������������$���� ����� ���� ��� ���!��� �������� �������� �������� ���� ������������ ��������� ����!������� ����� �������� ���� ������ ���������� �������� ���������� ��������� ��������� ���������� ��� ��� ��� ���!��� ��� ��������������� ��� ��� ������������� ��� �������� ������ ���������� �������� ���������������� ������������ ������������� ����������� ��������� ����������������� ���������������������������� ������ ���� ����������������� ������������������ ������ ������������ ������ ��� ������ ��������� ���� ������ ���� ������ �������������������������� � � �������� ������ ����������� � ������������������������������������������ �������� ������������������� ���������������� ��������� ��� ����� ��� ������ ��� ������ ��� ������ ��� ������ �� ������ ��� ������ ��� ������ ���������� ������������ ��������� ����� � �� ��������� ��������� ��������������� ������������������ ����������������� ������������� ������� ������������������ �� ������ ��� � ����� �������������� ������ ��� ���������� ��������� ��������� ��������� ��������� ���������� ��������� ����� � �� ������ �� ���������� ��������� �������� ����� � �� ����� ��� ����� � � � ���������� ��������� ��������� � ��������������� �������� ���������� ��������� ����������� � ��������� �������� ������ ��� ���������� � ���� � ��� ��������� ���������� ��������� ���������� ����� � �� ��������� ����� ���� �������� ����� ��� ����� ����� ����� ��� ����� �� ��������� ������ �������� ���� ���� ���� ����� ������� ���� �������� ���� ����� ������������� ��������� � ��������������������������� � ��������� ����� �� ��������� � ���� � �� �������������� ������ �� � ��� � ���� � ����� �� �� ���� � ����� � ��� �� ���� ����� ����������� ����������� ���� ����� ������ ���� �������� ���� � ��� ������������� � �� ����� � �� � ��� ���� � ���� ����� ���� � ���� ���� ���� � ���������� ��� ���� � ���������� ��� ����� � ���� ��������� ����� � ��� ������ ���� ��� � ���� ������� ��� ���� �� ����� � ��������� ������������� ��������� �� � ������ ���� � ����� ��� ������� �� � ��� � ���������� �� � ����� � ��� �������� ������ � �� � ����� � �� ������ �� �� ����� �� �� ������ ��� � ����� ��� �� ������� �� �� ������� ���� ��� � ���� �� � ��� ������� �� � �������� � ������ ��� ������� �� � ������ �������� �� � ���� � �� � ����� �� � ������ �� ������� � � ����� � �� ������ � �� � �������� � � ��� ���� � �� ������� � �� ��������� � � ���� � � ��� ������ � � ��� ��� � � ����� �� �� ����� �� �� ����� � � �� ������ � � � � ���� � �� � ����� � �� � ����� � � ������ ��� � � ����� � ��������� � �� ����� �� � ����� � ��� ���� �� ������ � � � ������ � ��� ���� � �� � ������� �� � ����� ��� � ������ � �� � ���������� ����� � � � ������ � � � ����� � ��� ���� � � � ��������������� � � � � ������ � � �� ������ � � ����� � ��� ����� � � ��� ��� � ��� ����� � � �������� � � � ������� � ��� ������ � � � ������� � ������ � � � � ��������� ������� ������� � � �� ������ � � � ����� � � � ����� � � � � ���� � � ������� �� �� ������ � � ������� �� � � ���������� ������ � � �� ������ � � ������ � � ������ �� �� ������� � � � ������ �� ������������� �� ������� � � � ��������� ����� � � � �� ��� � � � ������ � � � �������� � � ������ �� ������ �� �� �������� � � ����� � � � ����� � �� ���� �� � ��������� � � ��������� �� ���� �� � ��������� � � � �������� ������� ������������ � �� ����� � �������� �� ��� ������� ��������� � �� ������� � ������ �� � ������� � � ��������� � �������� �� ������ � ������� �� �������� � ������� �� ��������� �� �������� ������ �� ����������� ����� �� � �������� �������� �� ������� �������� �� ������ �� ������� �� ������� ��������� �� �������� �� ���������� ���������� ���������� �� �������� ���������� ��������� ����������� ������������ ����� �� ������������� ������ ���������� �������������������� ������������ �� ���� �� ���������� ��������������������������� ����������� ����������������� �������������������� ��������� ���������������������� �� ����������������� ��������� �� ��������������� �� ��������� ��������������������������������������������� ����������������� ����������� �� ����������������� ���������������������������������������������������������������������������������������������� �������� �� ��������������������������������������������������� ������������������������������ ���������������������������������������������������������������������� ������������������������������������ ������������������������������ �� �������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������LISTX���INFOINAM ���Complete��IART���Matheus Tavares�ICMT"���This is a Creative Commons sound��id3 r���ID3�@���h���  �jWCOMM���%�������This is a Creative Commons soundTPE1������Matheus TavaresTIT2��� ���Complete����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/run_tests.sh����������������������������������������������������������������������������0000755�0001750�0001750�00000011374�13574463525�014702� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash . ./tests/utils --source-only . ./src/kwio.sh --source-only declare -r PATH_TO_TESTS_EXTERNALS="tests/external" function show_help { echo "Usage: $0 [help] [list] [test tfile1 tfile2 ... tfilen] [prepare [-f|--force-update]]" echo "Run tests for kworkflow." printf "Example: $0 test kw_test\n\n" echo " help - displays this help message" echo " list - lists all test files under tests/" echo " test - runs the given test files" echo " prepare - prepare environment for tests. -f will update environment, even if already prepared." } function download_stuff() { URL=$1 PATH_TO=$2 OVERWRITE=$3 if $OVERWRITE; then ret=$(wget -N $URL -P $PATH_TO) else ret=$(wget -nc $URL -P $PATH_TO) fi if [ "$?" != 0 ] ; then return 113 # Host unreachable errno fi } function get_external_scripts() { local OVERWRITE=$1 local ret local -r CHECKPATCH_URL="https://raw.githubusercontent.com/torvalds/linux/master/scripts/checkpatch.pl" local -r MAINTAINER_URL="https://raw.githubusercontent.com/torvalds/linux/master/scripts/get_maintainer.pl" local -r CHECKPATCH_CONST_STRUCTS="https://raw.githubusercontent.com/torvalds/linux/master/scripts/const_structs.checkpatch" local -r CHECKPATCH_SPELLING="https://raw.githubusercontent.com/torvalds/linux/master/scripts/spelling.txt" local DOWNLOAD_URLS=( \ CHECKPATCH_URL \ CHECKPATCH_CONST_STRUCTS \ CHECKPATCH_SPELLING \ MAINTAINER_URL ) say "Downloading external scripts..." echo mkdir -p $PATH_TO_TESTS_EXTERNALS for url in "${DOWNLOAD_URLS[@]}"; do download_stuff ${!url} $PATH_TO_TESTS_EXTERNALS $OVERWRITE if [[ "$?" -eq 113 ]]; then echo return 113 fi done echo } # Check and downloads required files for testing. Argument is $1 = true|false, wheter to update # required files even if they exist already (true) or just download if they don't exist (false). # Default, when no argument is given, is false. function check_required_files() { local force_update=false if [[ "$#" -eq 1 ]]; then force_update="$1" fi if [[ "$force_update" = false && -f "$PATH_TO_TESTS_EXTERNALS/checkpatch.pl" && -f "$PATH_TO_TESTS_EXTERNALS/const_structs.checkpatch" && -f "$PATH_TO_TESTS_EXTERNALS/spelling.txt" && -f "$PATH_TO_TESTS_EXTERNALS/get_maintainer.pl" ]] ; then # Errno code for File exist return 17 else say "--> Preparing unit test" get_external_scripts $force_update if [[ "$?" -eq 113 ]]; then complain "Failed to download external scripts. Check your connection." complain "Cannot run kw tests" exit 1 fi fi } # Reports tests results. # Arguments are: $1: # of tests, $2: # of succeeded tests, $3: # of notfound tests and # $4: # of failed tests function report_results { local -i total=$1 local -i success=$2 local -i notfound=$3 local -i fail=$4 if [[ $total -eq 0 ]]; then echo 'No test files.' elif [[ $success -eq $total ]]; then success $SEPARATOR success "Total: $total test file(s)" success "Test file(s) SUCCEEDED" else complain $SEPARATOR complain "Total: $total test file(s)" if [[ $fail -gt 0 ]]; then complain "$fail test file(s) FAILED" fi if [[ $notfound -gt 0 ]]; then complain "$notfound test file(s) NOT FOUND" fi return 1 fi } function run_tests { local -i total=${#TESTS[@]} local -i success=0 local -i notfound=0 local -i fail=0 for current_test in "${TESTS[@]}"; do if [ -f ./tests/${current_test}.sh ]; then say "Running test [${current_test}]" say $SEPARATOR ( init_env ./tests/${current_test}.sh ) if [[ "$?" -eq 0 ]]; then success+=1 else fail+=1 fi else complain "Test file ./tests/${current_test}.sh not found." notfound+=1 fi done report_results $total $success $notfound $fail } declare -a TESTS function strip_path { TESTS=( ) for file in "$@"; do local base=$(basename ${file}) TESTS+=("${base%.*}") done } if [[ "$#" -eq 0 ]]; then check_required_files strip_path tests/*.sh run_tests elif [[ "$1" == "list" ]]; then strip_path tests/*.sh for test_name in "${TESTS[@]}"; do say " ${test_name}" done elif [[ "$1" == "test" ]]; then check_required_files strip_path ${@:2} run_tests elif [[ "$1" == "prepare" ]]; then if [[ "$#" -gt 1 && ("$2" == "--force-update" || "$2" == "-f") ]]; then check_required_files true else check_required_files fi if [[ "$?" -eq 17 ]]; then say "You are ready for running the unit test" fi else show_help fi ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/etc/������������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�013063� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/etc/kworkflow.config��������������������������������������������������������������������0000644�0001750�0001750�00000002650�13574463526�016302� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Default configuration file # Note: You can customize the settings in this file but no setting should be # removed. Otherwise, KW may not work properly. #? Attention, when using "./setup.sh -i": #? - USERKW will be replaced by the current user #? - INSTALLPATH will be replaced by kw's install path # Default ssh ip ssh_ip=localhost # Default ssh port ssh_port=2222 # Specify the default architecture used by KW arch=x86_64 # Defines the virtualization tool that should be used by kw. Current, we only # support QEMU virtualizer=qemu-system-x86_64 # Defines the kw mount point, this directory is used by libguestfs during the # mount/umount operation of a VM mount_point=/home/USERKW/p/mount # Sets basic QEMU options qemu_hw_options=-enable-kvm -daemonize -smp 2 -m 1024 # Defines the network configuration qemu_net_options=-net nic -net user,hostfwd=tcp::2222-:22,smb=/home/USERKW # Specify the VM image path qemu_path_image=/home/USERKW/p/virty.qcow2 # Default alert options (You should use vs, s, v or n. See README.md for details # on this options) alert=n # Command to run for sound completion alert sound_alert_command=paplay INSTALLPATH/sounds/complete.wav & # Command to run for visual completion alert # Note: You may use $COMMAND, which will be replaced by the kw command # whose conclusion the user wished to be alerted. visual_alert_command=notify-send -i checkbox -t 10000 "kw" "Command: \\"$COMMAND\\" completed!" ����������������������������������������������������������������������������������������kw-20191112/kernel-stats.sh�������������������������������������������������������������������������0000755�0001750�0001750�00000015251�13574463525�015266� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash # TODO: # - issue when there 2 signed-off-by from the same company # - SOB count should ignore authors # AUTHOR="collabora" FORMAT="<li><a href=\"https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=%H\">%s</a></li>" SUBDIRS="arch block crypto Documentation drivers firmware fs include init ipc kernel lib mm net samples scripts security sound tools usr virt" DRMDIRS="amd arc arm armada ast bochs bridge cirrus drm_*.c etnaviv exynos fsl-dcu gma500 hisilicon i2c i810 i915 imx lib mediatek meson mga mgag200 msm mxsfb nouveau omapdrm panel pl111 qxl r128 radeon rcar-du rockchip savage scheduler selftests shmobile sis sti stm sun4i tdfx tegra tilcdc tinydrm ttm tve200 udl vc4 vgem via virtio vmwgfx zte" DRVDIRS="accessibility acpi amba android ata atm auxdisplay base bcma block bluetooth bus cdrom char clk clocksource connector cpufreq cpuidle crypto dax dca devfreq dio dma dma-buf edac eisa extcon firewire firmware fmc fpga fsi gpio gpu hid hsi hv hwmon hwspinlock hwtracing i2c ide idle iio infiniband input iommu ipack irqchip isdn leds lightnvm macintosh mailbox mcb md media memory memstick message mfd misc mmc mtd mux net nfc ntb nubus nvdimm nvme nvmem of opp oprofile parisc parport pci pcmcia perf phy pinctrl platform pnp power powercap pps ps3 ptp pwm rapidio ras regulator remoteproc reset rpmsg rtc s390 sbus scsi sfi sh siox slimbus sn soc soundwire spi spmi ssb staging target tc tee thermal thunderbolt tty uio usb uwb vfio vhost video virt virtio visorbus vlynq vme w1 watchdog xen zorro" ARMDIRS="boot common configs crypto firmware include kernel kvm lib mach-actions mach-alpine mach-artpec mach-asm9260 mach-aspeed mach-at91 mach-axxia mach-bcm mach-berlin mach-clps711x mach-cns3xxx mach-davinci mach-digicolor mach-dove mach-ebsa110 mach-efm32 mach-ep93xx mach-exynos mach-footbridge mach-gemini mach-highbank mach-hisi mach-imx mach-integrator mach-iop13xx mach-iop32x mach-iop33x mach-ixp4xx mach-keystone mach-ks8695 mach-lpc18xx mach-lpc32xx mach-mediatek mach-meson mach-mmp mach-moxart mach-mv78xx0 mach-mvebu mach-mxs mach-netx mach-nomadik mach-nspire mach-omap1 mach-omap2 mach-orion5x mach-oxnas mach-picoxcell mach-prima2 mach-pxa mach-qcom mach-realview mach-rockchip mach-rpc mach-s3c24xx mach-s3c64xx mach-s5pv210 mach-sa1100 mach-shmobile mach-socfpga mach-spear mach-sti mach-stm32 mach-sunxi mach-tango mach-tegra mach-u300 mach-uniphier mach-ux500 mach-versatile mach-vexpress mach-vt8500 mach-w90x900 mach-zx mach-zynq mm net nwfpe oprofile plat-iop plat-omap plat-orion plat-pxa plat-samsung plat-versatile probes tools vdso vfp xen" ARM64DIRS="boot configs crypto include kernel kvm lib mm net xen" function sum_commits { s=$(sed -e "s/^ *\([0-9]\+\).*/+ \1/g" | tr -d '\n' | cut -c 2-) if [ "$s" == "" ] ; then echo 0 else echo "$s" | bc fi } function get_names { COMMITS=$(git log --grep="$2.*$AUTHOR" --format=%H $1) NAMES="" for c in $COMMITS ; do NAME=$(git show $c | grep "$2.*$AUTHOR" | sed -e "s/^[ ]\+$2: \(.*\) <[a-z\.]*@[a-z\.]*>.*$/\1/g" | tr -d "\n") if [ "$2" = "Signed-off-by" ] ; then if git show $c | grep -q "Author: $NAME.*" ; then NAME="" fi fi if [ "$NAME" != "" ] ; then NAME="$NAME\n" fi NAMES+=$NAME done echo -e $NAMES | sort | uniq | grep "[A-Z]" } function find_commits { get_names $1 $2 | while read NAME ; do if [ "$NAME" = "" ] ; then continue fi COMMITS=$(git log --grep="$2: $NAME .*$AUTHOR" --format=%H $1) echo -n "$NAME (" git log --grep="$2: $NAME .*$AUTHOR" --format=%H $1 | wc -l | tr -d "\n" echo "):" for c in $COMMITS ; do git show --no-patch --format="$FORMAT" $c | cat done echo "" done } function find_commits_sob { get_names $1 $2 | while read NAME ; do if [ "$NAME" = "" ] ; then continue fi COMMITS=$(git log --perl-regexp --author="^((?!$NAME).*)$" \ --grep "Signed-off-by: $NAME.*" --format=%H $1) echo -n "$NAME (" git log --perl-regexp --author="^((?!$NAME).*)$" \ --grep "Signed-off-by: $NAME.*" --format=%H $1 | wc -l | tr -d "\n" echo "):" for c in $COMMITS ; do git show --no-patch --format="$FORMAT" $c | cat done echo "" done } function ks_report { echo "=== Authors summary ===" git shortlog -ns $1 --author=$AUTHOR | cat echo "" echo "=== Authors total commits ===" git shortlog -ns $1 --author=$AUTHOR | sum_commits echo "" echo "=== Reviewed-by names ===" get_names $1 "Reviewed-by" echo "" echo "=== Reviewed-by total tags ===" git log --grep="Reviewed-by.*$AUTHOR" --oneline $1 | wc -l echo "" echo "=== Signed-off-by names ===" get_names $1 "Signed-off-by" echo "" echo "=== Signed-off-by total tags ===" git log --grep="Signed-off-by.*$AUTHOR" --oneline $1 | wc -l echo "" echo "=== Tested-by names ===" get_names $1 "Tested-by" echo "" echo "=== Tested-by total tags ===" git log --grep="Tested-by.*$AUTHOR" --oneline $1 | wc -l echo "" echo "=== Suggested-by names ===" get_names $1 "Suggested-by" echo "" echo "=== Suggested-by total tags ===" git log --grep="Suggested-by.*$AUTHOR" --oneline $1 | wc -l echo "" echo " === HTML report ===" echo "" echo "<h4>Here is the complete list of Collabora contributions:</h4>" git shortlog $1 --author=$AUTHOR --format="$FORMAT" | cat echo "" echo "<br />" echo "<h4>Reviewed-by:</h4>" find_commits $1 "Reviewed-by" echo "" echo "<br />" echo "<h4>Signed-off-by:</h4>" find_commits_sob $1 "Signed-off-by" echo "" echo "<br />" echo "<h4>Tested-by:</h4>" find_commits $1 "Tested-by" echo "" echo "<br />" echo "<h4>Suggested-by:</h4>" find_commits $1 "Suggested-by" echo "" } function per_year { YEAR=$(date +%Y) for i in $(seq 13) ; do git shortlog -ns \ --after=31,Dec,$(expr $YEAR - 1) \ --before=1,Jan,$(expr $YEAR + 1) --author=$1 | sum_commits let YEAR-- done } function for_each_dir { local RANGE="$1" local AUTHOR="$2" local DIRS="$3" local PREFIX="$4" for d in $DIRS ; do num=$(git shortlog -ns "$RANGE" --author="$AUTHOR" -- $PREFIX$d | sum_commits) if [ $num -ge 10 ] ; then echo "$PREFIX$d;$num" fi done } function per_dir { echo "** $2 **" echo "total: $(git shortlog -ns --author=$2 "$1" | sum_commits)" echo " == subdirs: ==" for_each_dir "$1" "$2" "$SUBDIRS" "" echo "== drivers/ ==" for_each_dir "$1" "$2" "$DRVDIRS" "drivers/" echo "== drivers/gpu/drm/ ==" for_each_dir "$1" "$2" "$DRMDIRS" "drivers/gpu/drm/" echo "== arch/arm/ ==" for_each_dir "$1" "$2" "$ARMDIRS" "arch/arm/" echo "== arch/arm64/ ==" for_each_dir "$1" "$2" "$ARM64DIRS" "arch/arm64/" echo "" } function help { i echo "no help yet" } case "$1" in report) ks_report "$2" ;; yearly) per_year "$2" ;; dir) per_dir "$2" "$3" ;; help) ks_help ;; *) ks_help exit 1 esac exit 0 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.checkpatch-camelcase.git.��������������������������������������������������������������0000644�0001750�0001750�00000000000�13574463525�017146� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/���������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015016� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/kworkflow.yml��������������������������������������������������������������0000644�0001750�0001750�00000000231�13574463526�017562� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - hosts: kworkflow_local user: root become: yes vars: users: - name: kworkflow roles: - common - users - shared_config �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/kworkflow.retry������������������������������������������������������������0000644�0001750�0001750�00000000020�13574463526�020122� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kworkflow_local ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/���������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�016142� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/common/��������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�017432� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/common/tasks/��������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�020557� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/common/tasks/arch.yml������������������������������������������������0000644�0001750�0001750�00000001116�13574463526�022216� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - name: Update Arch system pacman: update_cache=yes upgrade=yes - name: Install required Arch packages pacman: name: "{{ packages }}" state: latest vars: packages: - bison - flex - libelf - grub-common - ncurses - autofs - gcc - openssl - bc - kxmlrpcclient - rsync - curl - wget - screen - base-devel - kmod - inetutils - bc - git - vim - make - patch - zlib - xz - libxml2 - sudo - gsl - xmlrpc-c ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/common/tasks/debian.yml����������������������������������������������0000644�0001750�0001750�00000001176�13574463526�022531� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - name: Update Debian system apt: update_cache=yes upgrade=yes - name: Install required Debian packages apt: name: "{{ packages }}" state: latest vars: packages: - bison - flex - libelf-dev - grub-common - libncurses5-dev - autofs - libssl-dev - gcc - libssl-dev - grub2 - bc - libxmlrpc-c++8-dev - rsync - curl - wget - screen - build-essential - kmod - inetutils-tools - bc - git - vim - make - patch - zlib1g-dev - liblzma-dev - libxml2 - sudo ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/common/tasks/main.yml������������������������������������������������0000644�0001750�0001750�00000000176�13574463526�022232� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - include: debian.yml when: ansible_os_family == 'Debian' - include: arch.yml when: ansible_os_family == 'Archlinux' ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/users/���������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�017303� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/users/tasks/���������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�020430� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/users/tasks/main.yml�������������������������������������������������0000644�0001750�0001750�00000000115�13574463526�022074� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - name: Create Users user: name: "{{ user }}" shell: /bin/bash ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/shared_config/�������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�020735� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/shared_config/tasks/�������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�022062� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/shared_config/tasks/arch.yml�����������������������������������������0000644�0001750�0001750�00000000252�13574463526�023521� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - name: Installing required packages for share data pacman: name: "{{ packages }}" state: latest vars: packages: - smbclient - cifs-utils ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/shared_config/tasks/debian.yml���������������������������������������0000644�0001750�0001750�00000000247�13574463526�024032� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - name: Installing required packages for share data apt: name: "{{ packages }}" state: latest vars: packages: - smbclient - cifs-utils ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/shared_config/tasks/main.yml�����������������������������������������0000644�0001750�0001750�00000001744�13574463526�023537� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- - include: debian.yml when: ansible_os_family == 'Debian' - include: arch.yml when: ansible_os_family == 'Archlinux' - name: Create a shared directory file: path: /home/{{ user }}/shared/ owner: "{{ user }}" group: "{{ user }}" mode: 0755 state: directory - name: Create a systemd default mount to user directory template: src: templates/home-shared.mount.j2 dest: /etc/systemd/system/home-shared.mount owner: "{{ user }}" group: "{{ user }}" mode: 0755 vars: user: "{{ user }}" - name: Create a systemd default mount to user directory template: src: templates/cifs.j2 dest: /root/.cifs vars: user: "{{ user }}" - name: Just force systemd to reread configs systemd: daemon_reload=yes - name: Create an entry in the fstab to automatically deploy lineinfile: path: /etc/fstab line: "//10.0.2.4/qemu /home/{{ user }}/shared/ cifs uid=1000,credentials=/root/.cifs,x-systemd.automount,noperm 0 0" ����������������������������kw-20191112/deploy_rules/roles/shared_config/templates/���������������������������������������������0000755�0001750�0001750�00000000000�13574463526�022733� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/shared_config/templates/cifs.j2��������������������������������������0000644�0001750�0001750�00000000045�13574463526�024113� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������username={{ user }} password=1234567 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/roles/shared_config/templates/home-shared.mount.j2�������������������������0000644�0001750�0001750�00000000543�13574463526�026527� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Unit] Description=Mount Share at boot Requires=systemd-networkd.service After=network-online.target Wants=network-online.target [Mount] What=//10.0.2.4/qemu Where=/home/{{ user }}/shared Options=x-systemd.automount,_netdev,x-systemd.device-timeout=10,uid=1000,noperm,credentials=/root/.cifs Type=cifs TimeoutSec=30 [Install] WantedBy=multi-user.target �������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/ansible.cfg����������������������������������������������������������������0000644�0001750�0001750�00000034614�13574463526�017124� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# config file for ansible -- http://ansible.com/ # ============================================== # nearly all parameters can be overridden in ansible-playbook # or with command line flags. ansible will read ANSIBLE_CONFIG, # ansible.cfg in the current working directory, .ansible.cfg in # the home directory or /etc/ansible/ansible.cfg, whichever it # finds first [defaults] # some basic default values... inventory = hosts #library = /usr/share/my_modules/ #remote_tmp = $HOME/.ansible/tmp #local_tmp = $HOME/.ansible/tmp forks = 20 #poll_interval = 15 #sudo_user = root #ask_sudo_pass = True #ask_pass = True #transport = smart #remote_port = 22 #module_lang = en_US.UTF-8 #module_set_locale = False # plays will gather facts by default, which contain information about # the remote system. # # smart - gather by default, but don't regather if already gathered # implicit - gather by default, turn off with gather_facts: False # explicit - do not gather by default, must say gather_facts: True gathering = smart # This only affects the gathering done by a play's gather_facts directive, # by default gathering retrieves all facts subsets # all - gather all subsets # network - gather min and network facts # hardware - gather hardware facts (longest facts to retrieve) # virtual - gather min and virtual facts # facter - import facts from facter # ohai - import facts from ohai # You can combine them using comma (ex: network,virtual) # You can negate them using ! (ex: !hardware,!facter,!ohai) # A minimal set of facts is always gathered. gather_subset = all # some hardware related facts are collected # with a maximum timeout of 10 seconds. This # option lets you increase or decrease that # timeout to something more suitable for the # environment. # gather_timeout = 10 # additional paths to search for roles in, colon separated #roles_path = /etc/ansible/roles # uncomment this to disable SSH key host checking host_key_checking = False # change the default callback #stdout_callback = skippy # enable additional callbacks #callback_whitelist = timer, mail # Determine whether includes in tasks and handlers are "static" by # default. As of 2.0, includes are dynamic by default. Setting these # values to True will make includes behave more like they did in the # 1.x versions. #task_includes_static = True #handler_includes_static = True # Controls if a missing handler for a notification event is an error or a warning #error_on_missing_handler = True # change this for alternative sudo implementations #sudo_exe = sudo # What flags to pass to sudo # WARNING: leaving out the defaults might create unexpected behaviours #sudo_flags = -H -S -n # SSH timeout #timeout = 10 # default user to use for playbooks if user is not specified # (/usr/bin/ansible will use current user as default) # remote_user = # logging is off by default unless this path is defined # if so defined, consider logrotate # log_path = /var/log/ansible.log # default module name for /usr/bin/ansible #module_name = command # use this shell for commands executed under sudo # you may need to change this to bin/bash in rare instances # if sudo is constrained executable = /bin/sh # if inventory variables overlap, does the higher precedence one win # or are hash values merged together? The default is 'replace' but # this can also be set to 'merge'. #hash_behaviour = replace # by default, variables from roles will be visible in the global variable # scope. To prevent this, the following option can be enabled, and only # tasks and handlers within the role will see the variables there #private_role_vars = yes # list any Jinja2 extensions to enable here: #jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n # if set, always use this private key file for authentication, same as # if passing --private-key to ansible or ansible-playbook #private_key_file = /path/to/file # If set, configures the path to the Vault password file as an alternative to # specifying --vault-password-file on the command line. #vault_password_file = /path/to/vault_password_file # format of string {{ ansible_managed }} available within Jinja2 # templates indicates to users editing templates files will be replaced. # replacing {file}, {host} and {uid} and strftime codes with proper values. #ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host} # {file}, {host}, {uid}, and the timestamp can all interfere with idempotence # in some situations so the default is a static string: #ansible_managed = Ansible managed # by default, ansible-playbook will display "Skipping [host]" if it determines a task # should not be run on a host. Set this to "False" if you don't want to see these "Skipping" # messages. NOTE: the task header will still be shown regardless of whether or not the # task is skipped. #display_skipped_hosts = True # by default, if a task in a playbook does not include a name: field then # ansible-playbook will construct a header that includes the task's action but # not the task's args. This is a security feature because ansible cannot know # if the *module* considers an argument to be no_log at the time that the # header is printed. If your environment doesn't have a problem securing # stdout from ansible-playbook (or you have manually specified no_log in your # playbook on all of the tasks where you have secret information) then you can # safely set this to True to get more informative messages. #display_args_to_stdout = False # by default (as of 1.3), Ansible will raise errors when attempting to dereference # Jinja2 variables that are not set in templates or action lines. Uncomment this line # to revert the behavior to pre-1.3. #error_on_undefined_vars = False # by default (as of 1.6), Ansible may display warnings based on the configuration of the # system running ansible itself. This may include warnings about 3rd party packages or # other conditions that should be resolved if possible. # to disable these warnings, set the following value to False: system_warnings = True # by default (as of 1.4), Ansible may display deprecation warnings for language # features that should no longer be used and will be removed in future versions. # to disable these warnings, set the following value to False: #deprecation_warnings = True # (as of 1.8), Ansible can optionally warn when usage of the shell and # command module appear to be simplified by using a default Ansible module # instead. These warnings can be silenced by adjusting the following # setting or adding warn=yes or warn=no to the end of the command line # parameter string. This will for example suggest using the git module # instead of shelling out to the git command. # command_warnings = False # set plugin path directories here, separate with colons #action_plugins = /usr/share/ansible/plugins/action #cache_plugins = /usr/share/ansible/plugins/cache #callback_plugins = /usr/share/ansible/plugins/callback #connection_plugins = /usr/share/ansible/plugins/connection #lookup_plugins = /usr/share/ansible/plugins/lookup #inventory_plugins = /usr/share/ansible/plugins/inventory #vars_plugins = /usr/share/ansible/plugins/vars #filter_plugins = /usr/share/ansible/plugins/filter #test_plugins = /usr/share/ansible/plugins/test #strategy_plugins = /usr/share/ansible/plugins/strategy # by default callbacks are not loaded for /bin/ansible, enable this if you # want, for example, a notification or logging callback to also apply to # /bin/ansible runs #bin_ansible_callbacks = False # don't like cows? that's unfortunate. # set to 1 if you don't want cowsay support or export ANSIBLE_NOCOWS=1 #nocows = 1 # set which cowsay stencil you'd like to use by default. When set to 'random', # a random stencil will be selected for each task. The selection will be filtered # against the `cow_whitelist` option below. #cow_selection = default #cow_selection = random # when using the 'random' option for cowsay, stencils will be restricted to this list. # it should be formatted as a comma-separated list with no spaces between names. # NOTE: line continuations here are for formatting purposes only, as the INI parser # in python does not support them. #cow_whitelist=bud-frogs,bunny,cheese,daemon,default,dragon,elephant-in-snake,elephant,eyes,\ # hellokitty,kitty,luke-koala,meow,milk,moofasa,moose,ren,sheep,small,stegosaurus,\ # stimpy,supermilker,three-eyes,turkey,turtle,tux,udder,vader-koala,vader,www # don't like colors either? # set to 1 if you don't want colors, or export ANSIBLE_NOCOLOR=1 #nocolor = 1 # if set to a persistent type (not 'memory', for example 'redis') fact values # from previous runs in Ansible will be stored. This may be useful when # wanting to use, for example, IP information from one group of servers # without having to talk to them in the same playbook run to get their # current IP information. #fact_caching = memory # retry files # When a playbook fails by default a .retry file will be created in ~/ # You can disable this feature by setting retry_files_enabled to False # and you can change the location of the files by setting retry_files_save_path #retry_files_enabled = False #retry_files_save_path = ~/.ansible-retry # squash actions # Ansible can optimise actions that call modules with list parameters # when looping. Instead of calling the module once per with_ item, the # module is called once with all items at once. Currently this only works # under limited circumstances, and only with parameters named 'name'. #squash_actions = apk,apt,dnf,homebrew,package,pacman,pkgng,yum,zypper # prevents logging of task data, off by default #no_log = False # prevents logging of tasks, but only on the targets, data is still logged on the master/controller #no_target_syslog = False # controls whether Ansible will raise an error or warning if a task has no # choice but to create world readable temporary files to execute a module on # the remote machine. This option is False by default for security. Users may # turn this on to have behaviour more like Ansible prior to 2.1.x. See # https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user # for more secure ways to fix this than enabling this option. #allow_world_readable_tmpfiles = False # controls the compression level of variables sent to # worker processes. At the default of 0, no compression # is used. This value must be an integer from 0 to 9. #var_compression_level = 9 # controls what compression method is used for new-style ansible modules when # they are sent to the remote system. The compression types depend on having # support compiled into both the controller's python and the client's python. # The names should match with the python Zipfile compression types: # * ZIP_STORED (no compression. available everywhere) # * ZIP_DEFLATED (uses zlib, the default) # These values may be set per host via the ansible_module_compression inventory # variable #module_compression = 'ZIP_DEFLATED' # This controls the cutoff point (in bytes) on --diff for files # set to 0 for unlimited (RAM may suffer!). #max_diff_size = 1048576 # This controls how ansible handles multiple --tags and --skip-tags arguments # on the CLI. If this is True then multiple arguments are merged together. If # it is False, then the last specified argument is used and the others are ignored. #merge_multiple_cli_flags = False [privilege_escalation] #become=True #become_method=sudo #become_user=root #become_ask_pass=False [paramiko_connection] # uncomment this line to cause the paramiko connection plugin to not record new host # keys encountered. Increases performance on new host additions. Setting works independently of the # host key checking setting above. #record_host_keys=False # by default, Ansible requests a pseudo-terminal for commands executed under sudo. Uncomment this # line to disable this behaviour. #pty=False [ssh_connection] # ssh arguments to use # Leaving off ControlPersist will result in poor performance, so use # paramiko on older platforms rather than removing it, -C controls compression use #ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s # The path to use for the ControlPath sockets. This defaults to # "%(directory)s/ansible-ssh-%%h-%%p-%%r", however on some systems with # very long hostnames or very long path names (caused by long user names or # deeply nested home directories) this can exceed the character limit on # file socket names (108 characters for most platforms). In that case, you # may wish to shorten the string below. # # Example: # control_path = %(directory)s/%%h-%%r #control_path = %(directory)s/ansible-ssh-%%h-%%p-%%r # Enabling pipelining reduces the number of SSH operations required to # execute a module on the remote server. This can result in a significant # performance improvement when enabled, however when using "sudo:" you must # first disable 'requiretty' in /etc/sudoers # # By default, this option is disabled to preserve compatibility with # sudoers configurations that have requiretty (the default on many distros). # #pipelining = False # Control the mechanism for transfering files # * smart = try sftp and then try scp [default] # * True = use scp only # * False = use sftp only #scp_if_ssh = smart # if False, sftp will not use batch mode to transfer files. This may cause some # types of file transfer failures impossible to catch however, and should # only be disabled if your sftp version has problems with batch mode #sftp_batch_mode = False [accelerate] #accelerate_port = 5099 #accelerate_timeout = 30 #accelerate_connect_timeout = 5.0 # The daemon timeout is measured in minutes. This time is measured # from the last activity to the accelerate daemon. #accelerate_daemon_timeout = 30 # If set to yes, accelerate_multi_key will allow multiple # private keys to be uploaded to it, though each user must # have access to the system via SSH to add a new key. The default # is "no". #accelerate_multi_key = yes [selinux] # file systems that require special treatment when dealing with security context # the default behaviour that copies the existing context or uses the user default # needs to be changed to use the file system dependent context. #special_context_filesystems=nfs,vboxsf,fuse,ramfs # Set this to yes to allow libvirt_lxc connections to work without SELinux. #libvirt_lxc_noseclabel = yes [colors] highlight = white verbose = blue warn = bright purple error = red debug = dark gray deprecate = purple skip = cyan unreachable = red ok = green changed = yellow diff_add = green diff_remove = red diff_lines = cyan ��������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/hosts����������������������������������������������������������������������0000644�0001750�0001750�00000000123�13574463526�016075� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[local] kworkflow_local ansible_host=127.0.0.1 ansible_port=2222 ansible_user=root ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/deploy_rules/inventory������������������������������������������������������������������0000644�0001750�0001750�00000000133�13574463526�016773� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������local ansible_port=2222 ansible_host=127.0.0.1 ansible_python_interpreter=/usr/bin/python2 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/kworkflow.config.example����������������������������������������������������������������0000644�0001750�0001750�00000000252�13574463525�017154� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������qemu_hw_options=-enable-kvm -daemonize -m 3G -smp cores=4,cpus=4 qemu_net_options=-net nic -net user,hostfwd=tcp::2222-:22,smb=$HOME qemu_path_image=$HOME/p/virty.qcow2 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/�����������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574466123�013145� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/�����������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�014273� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/fsmonitor-watchman.sample����������������������������������������������������0000755�0001750�0001750�00000006377�13574463525�021336� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl use strict; use warnings; use IPC::Open2; # An example hook script to integrate Watchman # (https://facebook.github.io/watchman/) with git to speed up detecting # new and modified files. # # The hook is passed a version (currently 1) and a time in nanoseconds # formatted as a string and outputs to stdout all files that have been # modified since the given time. Paths must be relative to the root of # the working tree and separated by a single NUL. # # To enable this hook, rename this file to "query-watchman" and set # 'git config core.fsmonitor .git/hooks/query-watchman' # my ($version, $time) = @ARGV; # Check the hook interface version if ($version == 1) { # convert nanoseconds to seconds $time = int $time / 1000000000; } else { die "Unsupported query-fsmonitor hook version '$version'.\n" . "Falling back to scanning...\n"; } my $git_work_tree; if ($^O =~ 'msys' || $^O =~ 'cygwin') { $git_work_tree = Win32::GetCwd(); $git_work_tree =~ tr/\\/\//; } else { require Cwd; $git_work_tree = Cwd::cwd(); } my $retry = 1; launch_watchman(); sub launch_watchman { my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') or die "open2() failed: $!\n" . "Falling back to scanning...\n"; # In the query expression below we're asking for names of files that # changed since $time but were not transient (ie created after # $time but no longer exist). # # To accomplish this, we're using the "since" generator to use the # recency index to select candidate nodes and "fields" to limit the # output to file names only. Then we're using the "expression" term to # further constrain the results. # # The category of transient files that we want to ignore will have a # creation clock (cclock) newer than $time_t value and will also not # currently exist. my $query = <<" END"; ["query", "$git_work_tree", { "since": $time, "fields": ["name"], "expression": ["not", ["allof", ["since", $time, "cclock"], ["not", "exists"]]] }] END print CHLD_IN $query; close CHLD_IN; my $response = do {local $/; <CHLD_OUT>}; die "Watchman: command returned no output.\n" . "Falling back to scanning...\n" if $response eq ""; die "Watchman: command returned invalid output: $response\n" . "Falling back to scanning...\n" unless $response =~ /^\{/; my $json_pkg; eval { require JSON::XS; $json_pkg = "JSON::XS"; 1; } or do { require JSON::PP; $json_pkg = "JSON::PP"; }; my $o = $json_pkg->new->utf8->decode($response); if ($retry > 0 and $o->{error} and $o->{error} =~ m/unable to resolve root .* directory (.*) is not watched/) { print STDERR "Adding '$git_work_tree' to watchman's watch list.\n"; $retry--; qx/watchman watch "$git_work_tree"/; die "Failed to make watchman watch '$git_work_tree'.\n" . "Falling back to scanning...\n" if $? != 0; # Watchman will always return all files on the first query so # return the fast "everything is dirty" flag to git and do the # Watchman query just to get it over with now so we won't pay # the cost in git to look up each individual file. print "/\0"; eval { launch_watchman() }; exit 0; } die "Watchman: $o->{error}.\n" . "Falling back to scanning...\n" if $o->{error}; binmode STDOUT, ":utf8"; local $, = "\0"; print @{$o->{files}}; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/post-update.sample�����������������������������������������������������������0000755�0001750�0001750�00000000275�13574463525�017752� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/pre-push.sample��������������������������������������������������������������0000755�0001750�0001750�00000002504�13574463525�017245� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # An example hook script to verify what is about to be pushed. Called by "git # push" after it has checked the remote status, but before anything has been # pushed. If this script exits with a non-zero status nothing will be pushed. # # This hook is called with the following parameters: # # $1 -- Name of the remote to which the push is being done # $2 -- URL to which the push is being done # # If pushing without using a named remote those arguments will be equal. # # Information about the commits which are being pushed is supplied as lines to # the standard input in the form: # # <local ref> <local sha1> <remote ref> <remote sha1> # # This sample shows how to prevent push of commits where the log message starts # with "WIP" (work in progress). remote="$1" url="$2" z40=0000000000000000000000000000000000000000 while read local_ref local_sha remote_ref remote_sha do if [ "$local_sha" = $z40 ] then # Handle delete : else if [ "$remote_sha" = $z40 ] then # New branch, examine all commits range="$local_sha" else # Update to existing branch, examine new commits range="$remote_sha..$local_sha" fi # Check for WIP commit commit=`git rev-list -n 1 --grep '^WIP' "$range"` if [ -n "$commit" ] then echo >&2 "Found WIP commit in $local_ref, not pushing" exit 1 fi fi done exit 0 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/applypatch-msg.sample��������������������������������������������������������0000755�0001750�0001750�00000000736�13574463525�020440� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup commitmsg="$(git rev-parse --git-path hooks/commit-msg)" test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} : ����������������������������������kw-20191112/.git/hooks/pre-receive.sample�����������������������������������������������������������0000755�0001750�0001750�00000001040�13574463525�017702� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to make use of push options. # The example simply echoes all push options that start with 'echoback=' # and rejects all pushes when the "reject" push option is used. # # To enable this hook, rename this file to "pre-receive". if test -n "$GIT_PUSH_OPTION_COUNT" then i=0 while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" do eval "value=\$GIT_PUSH_OPTION_$i" case "$value" in echoback=*) echo "echo from the pre-receive-hook: ${value#*=}" >&2 ;; reject) exit 1 esac i=$((i + 1)) done fi ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/prepare-commit-msg.sample����������������������������������������������������0000755�0001750�0001750�00000002724�13574463525�021216� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first one removes the # "# Please enter the commit message..." help message. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. COMMIT_MSG_FILE=$1 COMMIT_SOURCE=$2 SHA1=$3 /usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" # case "$COMMIT_SOURCE,$SHA1" in # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; # *) ;; # esac # SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" # if test -z "$COMMIT_SOURCE" # then # /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" # fi ��������������������������������������������kw-20191112/.git/hooks/pre-applypatch.sample��������������������������������������������������������0000755�0001750�0001750�00000000650�13574463525�020433� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup precommit="$(git rev-parse --git-path hooks/pre-commit)" test -x "$precommit" && exec "$precommit" ${1+"$@"} : ����������������������������������������������������������������������������������������kw-20191112/.git/hooks/pre-commit.sample������������������������������������������������������������0000755�0001750�0001750�00000003146�13574463525�017561� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=$(git hash-object -t tree /dev/null) fi # If you want to allow non-ASCII filenames set this variable to true. allownonascii=$(git config --bool hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ASCII filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then cat <<\EOF Error: Attempt to add a non-ASCII file name. This can cause problems if you want to work with people on other platforms. To be portable it is advisable to rename the file. If you know what you are doing you can disable this check using: git config hooks.allownonascii true EOF exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/pre-rebase.sample������������������������������������������������������������0000755�0001750�0001750�00000011442�13574463525�017530� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up to date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/commit-msg.sample������������������������������������������������������������0000755�0001750�0001750�00000001600�13574463525�017552� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } ��������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/hooks/update.sample����������������������������������������������������������������0000755�0001750�0001750�00000007032�13574463525�016765� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # An example hook script to block unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 <ref> <oldrev> <newrev>)" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "usage: $0 <ref> <oldrev> <newrev>" >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/COMMIT_EDITMSG.save����������������������������������������������������������������0000644�0001750�0001750�00000000547�13574463525�016202� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������setup: remove unnecessary checkpatch script download Now 'kw codestyle' uses kernel-tree script so it is neithernecessary to download any content # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch checkpatch # Changes to be committed: # modified: setup.sh # ���������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/branches/��������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�014735� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/index������������������������������������������������������������������������������0000644�0001750�0001750�00000016320�13574464344�014204� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DIRC������H]gT;h`?]gT;h`?���6%N���������%=}p�>wI� .gitignore��������]gU�]gU����6%O��������FYPM>\@X �LICENSE���]gU�]gU����6%P��������H*zޝz>� README.md�]gU�]gU����6%Q��������5v`j&E9\A]�build-drm-misc����]gV)KP]gV)KP���:^G��������9E5!R(R"*W50g�deploy_rules/ansible.cfg��]gV)Sr]gV)Sr���:^H���������Sl:`kltHKGߣ�deploy_rules/hosts��������]gV)[]gV)[���:^I���������[XNmKjG5ߦ}�deploy_rules/inventory����]gV)[]gV)[���:^J���������G"%'^;�deploy_rules/kworkflow.retry������]gV)[]gV)[���:^K���������!O({q}w�deploy_rules/kworkflow.yml��������]gV)[]gV)[���:^L��������NAzVKL<\=�(deploy_rules/roles/common/tasks/arch.yml��]gV)[]gV)[���:^M��������~߂S~0Q>Vаd�*deploy_rules/roles/common/tasks/debian.yml��������]gV*<c]gV*<c���:^N���������~V̴A섿&T�(deploy_rules/roles/common/tasks/main.yml��]gV*yk]gV*yk���:^O���������cxțzu5ͥǁ�/deploy_rules/roles/shared_config/tasks/arch.yml���]gV*yk]gV*yk���:^P���������e lU� [0�1deploy_rules/roles/shared_config/tasks/debian.yml�]gV*|]gV*|���:^Q��������gj|-]jCT;�/deploy_rules/roles/shared_config/tasks/main.yml���]gV*|]gV*|���:^R���������%]N0}jJ x�2deploy_rules/roles/shared_config/templates/cifs.j2��������]gV*|]gV*|���:^S��������c?с }c!l�?deploy_rules/roles/shared_config/templates/home-shared.mount.j2���]gV*|]gV*|���:^T���������M gD l0^q�'deploy_rules/roles/users/tasks/main.yml���]gV(2]gV(2���:^?��������F;i,m"^�documentation/conf.py�����]gV) ; ]gV) ; ���:^A��������GŎLх,ߘ�)documentation/content/howtocontribute.rst�]gV) ; ]gV) ; ���:^B��������(jlϲtE�-documentation/content/installanduninstall.rst�����]gV) ; ]gV) ; ���:^C��������׍ud2|L#~�documentation/content/tests.rst���]gV) ; ]gV) ; ���:^D��������0lL !_O&a�"documentation/images/dev_cycle.png��������]gV) ; ]gV) ; ���:^E��������VѮ&v5^ys�"documentation/images/dev_cycle.svg��������]gV(2]gV(2���:^@��������2 dĺ NM𙇢a�documentation/index.rst���]gV) ; ]gV) ; ���:^F��������(N�ʹMud%F[w�documentation/man/kw.rst��]gV*|]gV*|���:^U��������E7=<�etc/kworkflow.config������]gUx%]gUx%���6%R�������� `%K\LKM'1(�kernel-stats.sh���]gUx%]gUx%���6%S�������� @ne93;BSF�kw��������]gUf]gUf���6%T���������tA$̡V�kworkflow.config.example��]gUf]gUf���6%U�������� z]ld0� run_tests.sh������]gUf]gUf���6%V��������c%a<;*At6M�setup.sh��]gV+}]gV+}���:^V�������<s?ߥ%yi8=럸�sounds/complete.wav�������]gV+}]gV+}���:^W��������;"tg!e#}`öG�src/bash_autocomplete.sh��]gV+}]gV+}���:^X��������'eOCa!cn�src/checkpatch_wrapper.sh�]gV+}]gV+}���:^Y��������o7 qnGA(:-@v-�src/commons.sh����]gV+}]gV+}���:^Z��������x09i�Ԩsl%�src/config_manager.sh�����]gV+}]gV+}���:^[��������-[fd+2*)*S�src/explore.sh����]gV+}]gV+}���:^\��������WEr_Y2% Y[J�src/get_maintainer_wrapper.sh�����]gV+}]gV+}���:^]��������F"U31HN� src/help.sh�������]gV+}]gV+}���:^a�������� AsŶޤm89\+ʂ_ES� src/kw.fish�������]gV+}]gV+}���:^^�������� %_ it6Zp� src/kwio.sh�������]gV+}]gV+}���:^b��������kL\hCt9� src/kwlib.sh������]gV+}]gV+}���:^_��������k􁜞}XUob8 � src/mk.sh�]gV+}]gV+}���:^`�������� cx28e³ޗn� src/vm.sh�]gV+}]gV+}���:^c��������� NfQ 1`m/ mp�tests/_kw_dash.dsh��������]gV+}]gV+}���:^d��������ImF~ORS� tests/checkpatch_wrapper_test.sh��]gV+}]gV+}���:^e�������� yu>|_r"rk�tests/commons_test.sh�����]gV+}]gV+}���:^f��������*w6Rq칵�tests/configm_test.sh�����]gV+}]gV+}���:^g��������lx6G6ni^nBXc�tests/explore_test.sh�����]gV,$]gV,$���:^n��������rHpyK ?cIj�tests/fish_completion_test.sh�����]gV+}]gV+}���:^h��������B= 5^=x��$tests/get_maintainer_wrapper_test.sh������]gV,$]gV,$���:^i��������$ Xy<-D?%0W�tests/help_test.sh��������]gV,$]gV,$���:^j���������ڼ#g {@ܚp.�tests/kw_dash.sh��]gV,$]gV,$���:^k��������K٦RklK0"5�tests/kw_test.sh��]gV,$]gV,$���:^l�������� 얛Flq."2nWI7yZ�tests/kwio_test.sh��������]gV,$]gV,$���:^o��������yT|vɀ]Hcs+�tests/kwlib_test.sh�������]gV,a]gV,a���:^q���������}u=~YvKx�tests/samples/MAINTAINERS�]gV,a]gV,a���:^r��������kʻ2ZgzÆK�tests/samples/codestyle_check.c���]gV,]gV,���:^s��������lɄAs"X `/"gu�!tests/samples/codestyle_correct.c�]gV,]gV,���:^t��������l�V*T2t_�tests/samples/codestyle_error.c���]gV,]gV,���:^u��������kKkưNAC�!tests/samples/codestyle_warning.c�]gV,]gV,���:^w���������J8SeS#)ELs*`^'h�tests/samples/dmesg�������]gV,]gV,���:^v���������|gq5~'_�tests/samples/kworkflow.config����]gV,]gV,���:^{���������Y %q@Ϭ�!tests/samples/os/arch/lsb-release�]gV,]gV,���:^|��������F"7vh� tests/samples/os/arch/os-release��]gV,]gV,���:^}���������V yO;NBww�"tests/samples/os/debian/os-release��������]gV,]gV,���:^y��������R// ۟NB�0tests/samples/print_file_author_test_dir/code1.c��]gV,]gV,���:^z��������p d_V-R~_�0tests/samples/print_file_author_test_dir/code2.c��]gV,]gV,���:^x�������� m*><01Y7z w�tests/samples/test.patch��]gV,$]gV,$���:^p�������� ?,Ȟ xAY�tests/ssh_test.sh�]gV,$]gV,$���:^m��������џ508!ѨJ� tests/utils�������TREE���72 6 Y5RD' hetc�1 0 yQd”[]Ysrc�12 0 C-i<T?tests�27 1 ~ Q[SN>+samples�13 2 fxE>UQF{os�3 2 }[)օ5bXarch�2 0 c ;kZ|debian�1 0 Au[ zZ+2print_file_author_test_dir�2 0 ۂ0Jq@Jssounds�1 0 4Ne򰯷ίaP8deploy_rules�14 1 k>�$,OCkLroles�9 3 か %u+m0K<users�1 1 hE<<A@`v.Ltasks�1 0 U|Q9jN/$Hcommon�3 1 =g@ͣ Dtasks�3 0 љ8H0_>l@HZshared_config�5 2 @9-TwB3tasks�3 0 qZt# T S&K_templates�2 0 FaIͿKiuCګհdocumentation�8 3 zG{բ׋]#K Rman�1 0 lS6 k.|fMDimages�2 0 q_J jcontent�3 0 v.Z+ʶV.ie[#Sc.;<:ɕL�e����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/packed-refs������������������������������������������������������������������������0000644�0001750�0001750�00000000510�13574463525�015253� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pack-refs with: peeled fully-peeled sorted 2868d546a05990430edcc3a0138fd37160fdf4fa refs/remotes/origin/kernel_install2 4eadf59d6705d977a3c991b6cebe6eef9c5b768a refs/remotes/origin/kwlib 7c838ed49e43ff37fec31e18243610258b00019e refs/remotes/origin/master 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 refs/remotes/origin/unstable ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�014107� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/heads/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015173� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/heads/master������������������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�016405� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/heads/debian������������������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�016334� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/heads/unstable����������������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�016727� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9d9f09e616eaf15999de222b065ae12cbb7e993c ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015565� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/upstream/�������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�017425� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/upstream/KernelInstall������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�022113� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8e67c6cd53fcb4dd1221abbae6d8bb2c242c10b5 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/upstream/kernel_install2����������������������������������������������0000644�0001750�0001750�00000000051�13574463525�022434� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������04671e4b78cba6fbefb3c34bcdcb1c1c9a729e1d ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/upstream/master�������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�020637� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/upstream/unstable�����������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�021161� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9d9f09e616eaf15999de222b065ae12cbb7e993c ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/upstream/kwlib��������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�020454� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4eadf59d6705d977a3c991b6cebe6eef9c5b768a ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/origin/���������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�017054� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/origin/explore��������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�020451� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������38323f12d16efe51058faee59528aadb7ef13c87 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/origin/checkpatch�����������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�021070� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������42dbabbe202598d41a6b0a26bdf0e1d15c91a758 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/origin/num-proc�������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�020533� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ec88cd9934324cbbab31d4370f6bb403bd012f97 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/origin/arch�����������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�017710� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������164938621c64296d324ef9ede0eb2cdbbae745d8 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/origin/unstable�������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�020610� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7c838ed49e43ff37fec31e18243610258b00019e ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/remotes/origin/HEAD�����������������������������������������������������������0000644�0001750�0001750�00000000040�13574463525�017472� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ref: refs/remotes/origin/master ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/tags/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015045� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/refs/tags/2019-11-12���������������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�016016� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/ORIG_HEAD��������������������������������������������������������������������������0000644�0001750�0001750�00000000051�13574463525�014410� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7c838ed49e43ff37fec31e18243610258b00019e ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/���������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�014602� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/53/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015031� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/53/45f6d2d3c84027c96fb74fe20823edfd39876d����������������������������������0000444�0001750�0001750�00000001300�13574463526�022204� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTMo0 YC14RvYoÆfEaZlӶY4~bI;YG w'p;]ך!N[A q*=P ZATkN9\*h6ʒxAۢ& nPSL~;e6cIKzrX̕kl QCe0e<ZLU"RkC협yBnҲH)b�Z=Ly!#BA r|nv9Y<Bi5H/ARԞf!*H%qsSq;:R< qS3$K ֆ;5=ulxySsGXvVo!eso#%`oUbwλ#7T,Ij,РO*LQLj̓4,^ ZD' gw:ʰBb igM Y 5[2ҘVkBS@bGGn,w}-kxMhi$4D<^˵XǏ'tO]yE6b[[(vypy8r&+2>NÏ kc{zTdٶ*|[Luoasn}OIL"<:Zi>h?aFNhJn y ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7b/f9e6e5cea5c17a917a4e5261d06b3e48d22af2����������������������������������0000444�0001750�0001750�00000001012�13574463526�022374� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ</#uwxLFEgD]jI2ʦ[(6r5<SRstg0̸̙[Ӭݪ1>޾ 7i3lrM0^&9ݶA!<(;-'\/9?/-3]/"1 'J;.R9l] žCM,*͋/I-ج0uwUWY)Sc/|b"T]qjIiumȥ~?}?+ҼbkMR?mXa,^JA%3,]l_6߄_|m-D '{˲}JVMs9"u�e����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ea/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015166� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ea/ada05fd239ddd82359fd15e0f6da587389170b����������������������������������0000444�0001750�0001750�00000000510�13574463525�022404� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xAK0=Wa$M."xQv$afI]񿛪MD23 }:Y D ʜ+!͈X*r*0`; G90U^h#eF R 52[ū|p&-= uоQ\JQ s.9giH#W,4 Ɓ[k[WA7!ǧ cSnƐu=<u~O"ޤiע&PGӡqD1Bl&I1T]kO^8=&l>lm)6N<so\WN '>'G����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ea/4a4c4af2f9985665ee51613c909134f69a2922����������������������������������0000444�0001750�0001750�00000000635�13574463525�022045� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 'U̺tuR\'ɌJO-WĩEȮ w-)'ߞȵFFF{A5e*?Nɼ/-OzCrL-=ba}C[p% SNqk^.yDөN.$l ޘ M%, /q-TMn6H_[&S;1"4` Pe ǒ+vN5Hph;{n�Ĥ���������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ea/c92ca51b04aa88440764adc92ca22ebd49cba9����������������������������������0000444�0001750�0001750�00000000344�13574463525�022522� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xKj0D)z7I$B lrX 9 aNe=Uj] љACAmRJ+N: ;oyu`+L(YzJOBiNd eD)@2jIxmx[r_gzk\gj q}^UIe> k|=͐z㾟rli ,h/ m��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/cd/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015167� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/cd/d7358202cf5c87470d0814b4eca75a10d2f32d����������������������������������0000444�0001750�0001750�00000000706�13574463525�022227� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xˎ0EY+C$N'-Xa1]I8qd;{*1҈SVnLDU'Bzh*ժ,\5;}Ȫ4Sy:亦}Iz#H:Wr5i!eUEz( <Fjd-{7WK;|Z}iV3!ˢIwi*ʤ;,!WGП:OGHir>":,?b10h&Kћ B|w v7 :5!́p#Uwd=a~вlw jn9=847wO GȱVx/`F5>jIEO4y ynH޼fgJ~4:«DVv̋sdlE֯}Iۓg,\_2?L7޸4?&5}����������������������������������������������������������kw-20191112/.git/objects/91/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/91/6fe892f0c7b3209ed632224aa06e111a86502d����������������������������������0000444�0001750�0001750�00000000515�13574463525�022005� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUn0{Mbd,LRQ$.=#B( Xu4 j*ݻvBv3+Vxz|@֕^ֺ2e,f{mܤB*M'] P[ZWhc!@@XLlgi3S@%;* E5 >?:Ӊ080G.`~?{y8vzx: y0Ng6rpr�Uۣ1CPg1CiPs>UؐlM]OD\3_]B#<T6ss wS M*AL]ATTc /.>3_�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/74/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015034� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/74/3844f792ff384802928c111f0a87f1c4d530df����������������������������������0000444�0001750�0001750�00000000460�13574463526�021757� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMO1E]W`Җ"B po:ӄi-ۓ{On )nJB9׭vNPԠB d\Hfe+FflG2g]\D ֪8fxW*Ȱ.јJև l>9LRb~L6.蓂eU7(kjz\^]"˸__pL1ta_Oop>>)>sMh[xr9}y[?Wm.lCw$:7ѧ5 <k\7����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/74/e8b4ebce78866b30f9a66b1c1ae8089d856abd����������������������������������0000444�0001750�0001750�00000001053�13574463526�022425� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04c040031QK,L/JePe0ûeKb+*)J,,֫aw9~45*tv ve)6W n>i1 J\]|]rS}L3\f3~h TdnjTRY`Z&O۵ϖ1 &@Z__TZ}ώaU\WXPR3vdC?ܨXQZQ'G|k7wL84Ԣb9z 3.s&4kw#uM0 :V Ei9zyiz9 '?Vqg,ZjbQi^|Ij1f:ʊM{9SKJ @Z5Z˱O3}E ,/K)fA/ӆ[*TAQ2ClikRf/4eru6Y+&Y8.A>/��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ec/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015170� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ec/88cd9934324cbbab31d4370f6bb403bd012f97����������������������������������0000444�0001750�0001750�00000000551�13574463525�022310� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQKk0Yb_DB’6"#[ĖX^_-ms63`LgO֜NZ]u(L%JTE#4ꪑ4X]ŠRJ6=8-S[9�GE5ׄ<rӭ u[W Y&Co9~�9\6*aަ],>Nco/ 乚 ! |".wfٜ!Kzq#`~uJt_q_0#%+= RCp;\o;箾<y6)gѿ~mp�������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ec/d850fcb0570d1c59e44d4cdc16b61deb434be0����������������������������������0000444�0001750�0001750�00000000561�13574463525�022524� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMO09WąJë !** 7IbdRiC z8Y~~wf4 PT,8D(SgMō$IP4JJ֪`t8๨4G SB<PFTr-<+SԼdr98q%&/w_oyoA~iRQrQI$aQI~2;';ƀ\@{ņv|pvl=c{Z z{b-=w˻#=laO!:DsD�s%Lz0e\kz0O.[t_.Wu ct;WZo[EwEѶ# 5Fv:Xi#,�����������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a6/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a6/abcc4048335d58964633ac93eaee0c0e07f5b0����������������������������������0000444�0001750�0001750�00000000634�13574463526�022313� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 'Ri)gEiij 5/JO-WĩEȮ w-)'ߞȵFFF{A5e/g?h怇OrL-=ba}C[p% SU~Y"Cٻ(p%9I 5>1ΛJ84X^[lO|xՓϷjUP Rp,bWT# 67<�©����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a6/1f20885d354edc049a3efe88264a6160d750d8����������������������������������0000444�0001750�0001750�00000003416�13574463526�022115� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWn73bch6) TĽI/NЧڝղ%7$k!g/r%ٮ TuYùsfnݚWK}oCmKVtŝaZmǕCJT:ư\-+cӏ֕׺ܶnÒ6fӴ˥ Qo^r϶b[x~u5~FG bð=ɘsʄqy٫j׶n4vCpRSjz3pu_qaYSZblQr J}_m4j  ~³k=t>R؅/:$?`EejݰW0t6C&.9;c]4`Io+p5F[*YrP (􍱷q `^P%ܛpX^$3° cY>³L:LgwoS)ݡꍃNpVݶ2>,EWg.>9+afo0.Q8€ؘ@tQxlƄ�Ҭ<ДsKA[lu fF˧g@X.Jv-"NL~ylOmO(0gFq3+iHCCIO G)%Lw%T>,2踀x̒^hu ZuHJ_<r/WWvL|'\4œ7Ww.L8^2=c| !:o92>VA 'mhoxx0ERB^FDFӧx"7;+< 5#erKN92Y 3rH=3;[H?TAl蕱mmZqIjsq}&FoЃklF۹Ťjh1\(u݃<S]0P $"BU@d#a=]r5pڻ0Ay]0xUo4w ȧ.whx.((<Esg$y㒂7,5W>'ȏeAR+TOr825y\ EKȐ@5K NƧCꬣX5'/ƉnGizA*-} cLDv�fQ܀!0 I)(F.E>){2]B<pE `f`TmwE6Էl�InBߠ{EРrp4 R>rE`: f^T$n->*,AVfah�;{nw3)*m< $f\Nu:  E1tVjxi|6OTHTHnXG~& dpӟhvx.u'/t1ncSN"ɒ@tbe|.`bn^0^(dCƾp+yARS4) O0ZJv0SM&+єCg&B+?+"Wl5r]Czl|I C&;&~'R:q>u![}zRi! kՏo~zq/' g!oP+ ݧOOţO쉢ba3a,y]3V ҡMGEqReοh2b9Y/P?X3 B>O/vKg^�w15c| |Lz2?c wwh2u{|$߇3^$arh4|2Ska4<�̟��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/92/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015034� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/92/0537f9e7315840c6ad8baf69ca0e70c019a392����������������������������������0000444�0001750�0001750�00000001053�13574463526�022104� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04c040031QK,L/JePe0ûeKb+*)J,,֫a&Q(Fw͊g޹Up1Rl@@}2b"B:0~t8l*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,c(^z;!vb cnT,jK-IfP哣fh>s;~&�uVvjQ^jn1Мb 9v|k[;& r[Fr+ɂSJއ| 촜rtԊ܂Tg|+YLHgv-{54/$bU_eŦLvPuũ% J~hc_㧙􏿾"o3\ hi sϭO\`R (!5)]2UaY, JdSl [`SE�]a�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/92/53791735762adbb5fcb3977287ce6abdfd09c0����������������������������������0000444�0001750�0001750�00000001414�13574463526�022262� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUn@bjHiID+hmBG z^U VP$_vw3{v<FMmu%!eUR¯IEP.KO<sJ%ZE\F:U:RiA4 A0g$I猑$){smYZAJOM3>,PE0l(Ŧ)_k!hX|yX8Cv(kAREY$lSY̹b>dL`9'16 "iqk?e*�+߽ǕJZ-Dt<^9D UfrܲKQq}UD±mjE$>k&Lb-[dIvX^%Ѵ@Љ uZxZMj9'E7e\SS'HuNBp" 2-JJ�幮шZȥ{Ma[ oflmZQHxE*$Pcq[JÍ5:շs܋9k:0jczw�S!ٸpi*Zv+*z$&=(/ڲsS- #ѱHŒSv2}5}ݷ߽.<oz=\pw{i#.Qs(`˃͵43c\XG ~5'e)HӯJ4󋡳 =rGsKn<錱c*bsXlg+Z}Ft*{Qj[ơw_ uݜh>$RoBP����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b3/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015105� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b3/4b196ac5e7b9d3d14e15a02da856ac95bcec50����������������������������������0000444�0001750�0001750�00000000276�13574463525�022452� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xAn 9\`Ev۞` d<)!9-5'ӯ:}7nd} &2sr|ԍ:(k`<G?1ebdbq!1Krwyp'4cmT$ƣva M;աoEm^-n]q!^ n Gd ]y����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/09/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015031� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/09/cfb058c05f05e83227b5fec455592ff7ed5f46����������������������������������0000444�0001750�0001750�00000000206�13574463525�022261� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU046e040031Q//O+)L*-I+*.ax]|ҷOJВ)dvUW\Red|/Ύ9go:dl;b;_vtf:�?2=M������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/09/d520454c5286081fb5bf001e323fad1aaf10c0����������������������������������0000444�0001750�0001750�00000000434�13574463525�022116� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0EY+fU<W!gQqc5DCQT;<mW?bPJwjFa="*>Ԯr@/-:a,[! Վ;_K.릩7v3ޫ鵌D.3Nz -Iٗhi~Qbh;x9}i3e,r6#ZY ]Dy#ˢ!]p%l`͘)T}˻B&ؕ b7p*2. 4)*������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1f/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1f/2f93d0bddb42630d0be939c89d8aecb0f070b0����������������������������������0000444�0001750�0001750�00000001733�13574463526�022451� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUn6bM&(P`l&m:5SʋwHuE g\K?|55r#jT3WW,Vr-Nh6ԛDY_ /5dg˖@0s,=wi1X_8,!X`Us"ſdA*K?򄉏0T -ط[]UL:?BiN_ ~CP҅h_!P1)SAf}@c1ji'Ikba-rfTkaBB:(ܤz *W\i\ZQ:a@:Sf*/:$߰|s\иA:}͌Mĝz&X~,Ӑ? װ:p]u[)'M]-j@u[im`!QL(GHT0.˘w6 yh[ C;^zCd)n�$c yjc*vh˔"d[4M  gv;JToo?>L jM}AB[TT�T![(pt<!6LSmHe^Y&r)&G̵Z%eLb; *])7T5ݽ܎?M?>=v;$IK2NE?& 4ax6~ >ВZ V77ډp0ژ%Q~$΂p8֌W.I#L,+4o..B{z]Sqą-4A#uW.S,L4-Yj-t4gau##%ߨSܙGHe]z _yC奄w^<P3Ȟ!韷b@Guc  R�vLB֚% 9}EiCs3{#`Be[gRO[>g=_c(�������������������������������������kw-20191112/.git/objects/27/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/27/d3266bdffa37ec6f46ecf1790dcf5860e41074����������������������������������0000444�0001750�0001750�00000001012�13574463526�022330� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<3gG{)k%|Iu% w+SfoլN-K-SW02gŽoMvzx>R7ܤSZΰ!O4Ւx٢֛ t 촜rtԊ܂Tg|+YLHgv-{54/$bU_eŦLvPuũ% y$t-š6ײւ {ͣZ ,/K)fA/ӆ[*TAQ2"f:isMŧBd`p,gd4c+b^w~�՛����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/27/88710febc7320102ff69e7a50c975116d4fd40����������������������������������0000444�0001750�0001750�00000000561�13574463526�022026� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU012`040031Qu bנ`_ʼ>*KOI-.IOHMKfnFWn^0&�l=ͱ^PsBRztV EEE@~k<=h%%;'P\XT>ɛ0ٗmh{-)TyJnjq:E9ٕ5]k%ĩg<*./N/KKLgܚɶ3+ ?.\v�j?GkN4iɂ̼L`%dŗ�,>%vӺI^8ykŭ$$g0<ۤeCU<�˱e�����������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/27/05032adf72b5dfd68eb52c1a378c6f6ed57c3e����������������������������������0000444�0001750�0001750�00000001331�13574463526�022403� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVo0s /veݞZ*՞,±=ہf.!(CB~`)yG/P,xbg!, ɔYR .|A_7c}/_:n073HI\ <Xd#n=#uO ]}EtQSl '2x0z讆S:'3T({F!~G'b"u|!''!g$YnzNCO+9iNkAj$/K#`=:7jҸX$-H<^:b\aIXP/`2j0M6tȔac Y(A4h{̠u+Nɖ'ڃ^/LRz&r׾+A$jAmtFU Ȯ|=|r|LpB*v\VN׉H$j+t mLJ,$z%<\f<>A3:[]m,;gBy|Vn< h!UrޕK69Slܭ' ꀍ,2:Q\ czcb&蔰ޒ@r4J@nu\yj kJ/jʤm*A#+gI%*aVi]�x 5]ݨT|�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b1/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b1/bd95e5a843946f57ce59ea8600b4c81af72150����������������������������������0000444�0001750�0001750�00000001536�13574463526�022176� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUێ09_1m%.x"H+mB;NwW8&EUt<9sN<Ow_ ^z{sbr4SZyNRD!CޗJS!kQP'*ͬS@$e*(xdLt Y.BN1yX>SjUlkY S*8LoANu<Wg9|}�3`N3 _XH[h#poWB PDX>eAp冦nTHB}gR y'|ic17h\ðʼis @얁2D�h?2+p`f-=,DE*aV?>Nj45gPdY7{% a'/{k(DdkZ`A-[ 0@&Fd@+LB {l3bWPx4r&ny=c?/fx|Eⷫu_dp" .fL|Q,%* pRCtp- ڷG51ƨBg/ /2/fcpB9 K$><V%K+ #i^zNEaBO5IX?Կ'!~Ӱ D_z6F8KJG`0f4J֚5ֈuܾ$u6Z)}e:*9>9#]?S^{OǩVA"mf5 ]pz5ؓ`O{>@m&Oas ;3YL ^}(^EjU"c:F^2l;b;J?9uyfi�.bj1?I ޞz:MZX/%?"^������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/bd/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015167� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/bd/633f1eee96a6ff766678fa904c4573a19c6a5d����������������������������������0000444�0001750�0001750�00000001650�13574463526�022355� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTmo6g3`-`K0tc Z'[PE"UXQ(mۄ Ȼޞ{JmK8oku�iMvщZi\6d3Bh<΃2|20x QWP2*]<h@z9ۡCegeh89 ¬XP\͖lû[BuZHCVF Ѝn/߼g\;J-OUVu+mЍIg]HF-6JUyUS (CtI_|'peЧʅ(<,X\/M?P+%clj_7w 1H 2a>2R*n�ñ]DjUt<@?O82l ޯtMEc[\^ttC)g*G#JB^ aW{ DG1Bl�C3Z-<}[>*)ޯAb#R ̺m:|I-a 'iĨ 4Ωlx;m %?;u` ۛMVPaA(i8$i'YB^Nʶ0 .T'*T$!m1ǘȋ{:N1Õ!4R1,Amv\uy6vb E/Ayڒ'uz}y{dp1S=TS#5I[yZ~G QIR3H8o{j{B}# p~*U"x_)%Jj,ȳp FM\p(<KlPAt0_Ƈ" 6::R30&-&5 -ɦsH8*BZɴ'(V4g ~=r5S1=03][ǏHe�e����������������������������������������������������������������������������������������kw-20191112/.git/objects/75/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015034� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/75/8918ee01699de2b6357ab23ab3a161fa529ee0����������������������������������0000444�0001750�0001750�00000000135�13574463525�022162� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU0`01�Ԓ ޹K^=Gz{ne٩Ey9y%99 teeYٺ}ܺ>=��g)"�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/75/0227a585828aeda9630a04ac085c670f3a929d����������������������������������0000444�0001750�0001750�00000000516�13574463525�022023� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xn E+fMmUUA}5A(_P.j8gtGqtd]?HRuJoR+[Q#5vR~-ZkiuM\6୕BmQeV`-}ޅD7غ=I#2RRt5$T᜕l~xZ7d9 e@1L c;ʗK]hL3PstT<>$<;k<[ـޟ} LS]dK4�"_MW|㒱&2UOw~�OT����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/72/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/72/146f2d02ef7439a1c55a55f818a7cf6ec4e721����������������������������������0000444�0001750�0001750�00000001010�13574463526�022160� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,c`it~V wnSlQZ0eK7u_n:uVvjQ^jn1Мb 9v|k[;& r{My=Ei9zyiz9 '?Vqg,ZjbQi^|Ij1f:ʊM{9SKJ @˞0q_ 56=NnN=fq~i^J1õ&~60U/ t|3nKOjs_Qޜ@Dzlf\y!�ڝ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/12/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015024� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/12/32d1215497299515e1a6217d4613dc7b1efd89����������������������������������0000444�0001750�0001750�00000001606�13574463526�021666� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWm@s~ŸyPl?V΂BH Muwc=LK߮z׻RH;3i*pѓ4ɝibðv 3b,% rKU?_tv(LjJ+IV"u"rPEˀh ȯimXPm0Di)jO.% Ge, t X<̏ !5̗R降ܒAg 9ځ.Qwee^߾'c8x1/wc15P,N\kcd%["B<A-U<6x>'/sӮK͗, yl24ߏv`jM0 )/Sef|efm?QE=Ř^Ac𖢠k/]3;F/;=^{[QA.4dc82χjV/V}�:u9dfNo�"Яo�5|cdhDZ j`XiUK!~Oqտ:<CBPT6Zڃ3uOAԝhufi*+ROD\Q敉g(+d-=mwUe>̪':@ eDnO&B5/GǓs·S}>q5^~瀔=%R˖x;OIbCXhp,S( 8j⏰`E54gV:ѵ77CxltjCrUFaiJeIL�uqҖpc:FC6IC̹"ORPk��������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7c/cf18c4cf31f7be82a19c7acc8f0700686dea76����������������������������������0000444�0001750�0001750�00000000771�13574463525�022477� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗuI`T\ y5++|fߚEU}5\i^Zfz.\e OK6Lέ@V•k0%I+SXeJ23s rRK2Z<.t~қ~h,Ԓ̼ ݷzɁ,8)ӺU{wP ΌԜ 6'e%U𿷠`A =;o[]ZYzUn,Svc .Vz \Uf>7fM)S2 4V).'3 pFHMYe'^ omH.f71�DPX3U yԻ(G,MhZPA sU:OS KeJK2s^0wyEq3)Zl0z;� (�������kw-20191112/.git/objects/97/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015041� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/97/25e1dd4b463c5b5f872e6bb209841072279f8c����������������������������������0000444�0001750�0001750�00000001053�13574463526�022041� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04c040031QK,L/JePe0ûeKb+*)J,,֫a&Q(Fw͊g޹Up1Rl@@}2b"B:0~t8l*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,c(^z;!vb cnT,jK-IfP哣fh>s;~&�uVvjQ^jn1Мb 9v|k[;& r[Fr+ɂSJއ| 촜rtԊ܂Tg|+YLHgv-{54/$bU_eŦLvPuũ% J~hc_㧙􏿾"o3\ hi sϭO\`R (AfJ¦=e+5Ȃ]4M9v y f?_4~��I\�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/97/0df8c3496790eb997478acb2278b64f75804fd����������������������������������0000444�0001750�0001750�00000000710�13574463526�022072� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x]1ί@oڲnQDQDS Mfdw=ݤEo2<yH*GArDR]a^y[PMm۬D*K 8%JTyQm-S,$VyId[lc >0@;a1<*)0גU6aI"B5$.j\Yḃ}lZ}-z}F+/?@ p w}{!>FN.@n0a10wd8C3^-@@Hj y2`B6y =)!;AQM}c�1f3t8T{m!DԈ19g8}*6 "E5y )2, IK4D;Z l䌄Y5$hI)^ZW9xɅCɊv<n^7 _;��������������������������������������������������������kw-20191112/.git/objects/aa/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015162� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/aa/ebd49ade52d3f243ecae1acf2a4593e97c695b����������������������������������0000444�0001750�0001750�00000002026�13574463525�022700� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xU]o6ݳ~ŝl`{C`C2)v-]\$Q#:^KRH {a@yy?=pQM_WzҎ*]3WLL |YkXîdE ^<484 ӺՕq0T6L-VT%.6x ?ވfMjd8iBpnafYNlBCg+S~F[x<6m}ް֋HJoq:[*azՈt(!QUZ-\%.VծZ[hdCz "xKڴY${&>G[ǖEUlßr(cc)zX :=]K r+]y:;ng%\�9v@Dggb*.ob ]G^n=vw޾=I@^uI(T5J{8NrvۛbK&--ٟ75Jс;}̉PÍ]H*3t471H{tSlk(mJ2v9.hRqHQ-Hg%R'LV=KĚ+4?{LwsB'&6vTZxػ?o=;/k8`DNq4:H Q,4Nz+kID/Dž]q)Ooz9맻1T%gI(9'Zlvb'UeEȤɕZ>Fb7~Bd<-j w-rI'#*3$?GAkNQL+RV^= ypn l\>1PD'1$K(|xǜ$(8;R8u鮑H"&WS'X^=``\{L]6ߎ0tsIG}DPn \0\}2–΀f垓[H ~>_8$܀8v'?����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/aa/775341e12e542493e61c9fa233580febfb9e61����������������������������������0000444�0001750�0001750�00000000412�13574463525�022160� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xeN0DY+Fn6H $tE ,JMba`"ʿEB¯;xGؖۛ5`t{:=A}3֞1I=QiC [vɊ#Oc04 Ǩ9?#߀6X+ݭyP,'nJ7ƒ2B0 :`kqd<)ӟҪ FE2V u4׉GLBj_W-ʽwP^.l#~�l������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1d/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1d/9f0622e276fe30607e5f3bf8e84aba5debe664����������������������������������0000444�0001750�0001750�00000001052�13574463526�022411� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04c040031QK,L/JePe0ûeKb+*)J,,֫a&Q(Fw͊g޹Up1Rl@@}2b"B:0~t8l*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cHaPؚNaz#f_Ԓd U>9l>^g¡ Pge)+`q3aǷYUc|}nҀ)-glY/w,8}_@./N/KKLKH-Ie8qƷ˄T>|faׂPJKR!6+L]UVl9_oUWZRZ�rݬת6Zm%?~I+fq~i^J1õ&~60U/ 5fj*DvFAd`X4\tu37egk�D��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/2a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015103� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/2a/7c78d96460b2a0338ceb03dff57b2d0675351f����������������������������������0000444�0001750�0001750�00000000635�13574463525�022162� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 '҃I+/{em%SKe�qjk]g |ɷ'rџ#^PM9 ɛsSP%9>rL-=ba}C[p% SNqk^.yDөN.$l ޘ M%, /q-TMn6HG}<mIIG[}w*()8\wECIߛv{�ƅ���������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e2/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015107� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e2/5848dc06650b0e8216e72238d294f5a826706c����������������������������������0000444�0001750�0001750�00000000413�13574463525�021670� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xeN0 %H\8pXUUj6* ~;;{9 4cw)u>tȲALꋱЋQ4-Rvdlـ' >pQjFղ ^g@[,n<P46m 280 :@Z\ OLJ9iYRiQ0zՊK-MU}%8 TO%dZ2N:͍i7MRj�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f1/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f1/5d88cc40d8a9aec5dd37e4838295144071709b����������������������������������0000444�0001750�0001750�00000003270�13574463526�022122� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xXYo7~dc(,mˆRA Pܒ\Fΐڥ.m!ùg&o'DxL܎gLH\=AkTU2_b~rcM\Z%δJ),MGHQ.dyw=xrCkd3ɮ˓gǎ>/gGGW[aV0m؞ Z^0Gl@jvr%=—NKܖ[v/rg7-:쬈[Ʃ{L$OD0%6AU$ta"&V&񏛡V6͉&|VԼlhtWTۜ*K)2a ќ!J@<2Oa`p Vsu܃#] |=RBܨ /!Hy7m,+r\8(a 4hdDTIt5XVq3-WgBcp08.A*<]5UL{HebU/лH5Ut4l"O[ 稈yktrާ3MEe T[Mxr]HSC&$$0r &ѢKdt,I׋>qs U#_ [EkdRwD8p˙>Qs9pMϠι}ԯQ˫�i5& A>~hMO|Ϟd % S8t*J{I5| ~%GW↓RKeyɃ7'[ރ[}D>{0l]yA1\۷ 8D9VÜסE(s mQ:{wڈF`@xI9–+ w9@k;8ieGjA<1棃@ffP0fXh 2/wKw;ݳ%³v mrGN20v1vO-r, |z)>XH6 CuH4YJrg謘b2[a_$tJۡ`}yrAXHT!W yZZKhxo];ЪkW unM>.*O/e!z97aZl#c ~]>LJK $"?܍8Yu9˶QrOu" J:U; 宵c?ꮥn�* 'c`Z5Y-3j yPQMR%:l{9Cb*=pB?]aV9?rc 27ch-Lwj:d�hk ezjY7^jbZd@ .y9{A ^CVZH鵭 +՛&S~kۯۣ},z- wZ޳R/C{Ht@.T׌tHFB1}S0rǵ4Bޮ�/0:\^po##EI 78S"aE�?] ~tuhi4S+7M\) p8Npj3*]k`=7a{Ā}P8fD*P}[s #JvtR����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/22/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015025� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/22/f912cd4cd32966486da1730439d28c349ea3c2����������������������������������0000444�0001750�0001750�00000001010�13574463526�022014� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dތ/՘~*, 2ݦp+OKc*�Q@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/22/eb94a8c32c68cb95a240add88baeb2c5acdca7����������������������������������0000444�0001750�0001750�00000000634�13574463526�022670� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KuGf{j%*=h^f^ !6ܵ(~|{"9ՔS�ronJjd~?J2Jn$e]oÕdL9{T5^ifQg8>0d&dKd8o*8`^xQkojrA uuugzpyU rA %Wjd:wݞ�%����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/22/923bf8d9019c733e601d7f6e6036f911e881f0����������������������������������0000444�0001750�0001750�00000000772�13574463526�021764� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗu.q§n>H_%hBLbңo'眝*d&Re)\i^Zfz.\e OK6Lέ@V•>>wݨck'}qsqvPi9%yp-l :jQcH4ITKzjI|nbf^ }['ۛPXo:5ζeMŃ :3Rs 6pGTڜ_WsT ނ90(5ouwiwfH!TB沠O968"Xs7pUp;pYU:aepu9Ip3Bj:*;R`~kKGr6('ª!NKE=bnBӪY R6د}b_W^p\*$3| J}|jxqŒ{^3�������kw-20191112/.git/objects/c3/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015107� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c3/c58f093c54f406081d933fbc9ef4316067bef4����������������������������������0000444�0001750�0001750�00000003144�13574463526�022176� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWkoFg~]UDيѠ&! DjEX~{ϝ Y<{,3gIw:JN'a܂wd8zx__8ˍ<?]^ .UW׏wߧ,y*ӢJj ]n!Q ƓdtnG׾l,$w<z~}σt<]'pݞU)CSQD{D2V"+2Y֛!L[oCD-VA@hVЎoqBҌllMhX#d_n驘\q(B,v:* <U*Xo:wT%G?8#G T9ܸiZ},PVН[9LSINuc?.D8a5LABzGU`nzЪ zu [+DOYD l & JJEP9R̒4) Orn4??WIѡE:@rFQY0A6M"j<2 R* TEjYUNnfwԄwٝJpHaQ"tZڏNv1 dN>P>7rs D59PpEq/"e0n:!<fF~s$SXVHR9}Ƙkv$73¹,j$`oϑsm%111 'Y%6~9пZZbqj֟SsQoX%`EbBSGlQ]}j?~}`_XK7hҜV*q;[) zKP kJô<A xM }GzY45rO[Emƅ̒bb㺫te|˕S%w۔9yRD5Ʒ\#euf;S2z*`7ys ZϽ=M9Tdohwcydݻѱ1ޥ>䭓O&)c̡\/[>iXΰl7q_#Iҥyeb(EsU K =  m/@8�$Ǔ=%lq4 Wsh C?"GsHE`KE?LG5B55Ch-;``_јћ09 f` 3,MQ&LpsB/HJVND7~< &'=x;7M4];WiXi.91e:)TIߐ&Bzs�\kKJў5 hNڥJP{4dzj3ixl3N#{�H2d ~A`K(lJjn1^= x\�Mtbޮ.7,2U݀h]@LKDɒ6 .*~Zc'g"ޒXJ&S׃`&+h;P¬z^RS@m_"79(9Ryd\Mɝ&-V>ܫ�8 3P$Z((oYzz|BnNk Ba(72����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/43/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015030� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/43/293e9b177045292f0d218c726c5935891c715a����������������������������������0000444�0001750�0001750�00000000635�13574463526�021542� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 'U̺tuR\'ɌJO-WĩEȮ w-)'ߞȵFFF{A5e*?Nɼ/-OzCrL-=ba}C[p% SNqk^.yDөN.$l ޘ M%, /q-TMn6HG}<mIIG[}w*()8\wECIߛv{� ?K���������������������������������������������������������������������������������������������������kw-20191112/.git/objects/db/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015166� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/db/e7ea4f972d3848e4492422d0f9def055c668d8����������������������������������0000444�0001750�0001750�00000000557�13574463525�022305� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMO0=Wq7ZƋML{0^Peikk !off .ۛ룓c*R^d]r*l\k! +lN vKyERF+[mhр*!%ʬiDeZO^ac5/XJr|˨ ހn ց{\Z H9X+@5Opo3EkG YJCAhP]wYWwm_S04kK]!܈wǸ �<ƬC"UF|DP %[fOOOijBgK *}0Îᇐ $+'�������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/db/2cc90dd5ff40f855546bfdad6f42124c4d9a35����������������������������������0000444�0001750�0001750�00000000372�13574463525�022464� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xJ0E]+bJN3"DѝȐ6t@*r.s/q pݞ duc7 -ֵ5Tsky H\9hIfWoFLXƵURmX).&'8?$O.фxi% Tbq)-Cz}lJHqz6q*lwf(ĎtdX"0A`/q9 kJ|sz����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/45/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/45/844b6e517ce6741b2e50f21af35d8c2dfddd93����������������������������������0000444�0001750�0001750�00000000206�13574463526�022325� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU046e040031Q//O+)L*-I+*.aA | sL33KsrRJl%sv1M'L-q}RZ\R VZKoMcx)�<L9b������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/45/26c3270661523010d12c08db8a5094886d3a2b����������������������������������0000444�0001750�0001750�00000000503�13574463526�021554� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN09) 'Nz* 7"SoWnݙo0LP5Ud"h:Qn.I7Jl۵MJH̚G1UݙvhMU(ʮ3dPaSrc^gw |^z|<Mڍ7(6MYtR5RI)H#C,w0},/0ctPG< pwO/#Agy1{NL3o_d~8ېq LImR5[Y.3q`ҽ'pi\>_~/ph0(o'Hw���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/66/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015034� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/66/e502a67d02f8a0755fef360151be4be4666225����������������������������������0000444�0001750�0001750�00000000771�13574463525�022023� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗuI`T\ y5++|fߚEU}5\i^Zfz.\e OK6Lέ@V•&X˰4yǗ mz@eg'䤖dy\.{G7"d'YP-%񹉙y%@ %oYpRuMg6P9p#*mNۯFKoAv{wIỴ; $`!~sYЧy\|ovSdԑiR j \]Nf\ጐN6\nb� ʼn*fHpwQhXд%F 2t~bի#Ad38ba,fRJav�R)�������kw-20191112/.git/objects/02/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015023� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/02/6b3694950b017c11421f9b99d0bdb838f1c9d3����������������������������������0000444�0001750�0001750�00000000733�13574463526�022024� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU05d040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Rbb⭺_ye(n;�W14 뮬8ǵ rTS+ r.rFQ祝PCyy%@Zpע_~\k*odTSFjNȩَ)R{v񓍆ox*.K*q,>ޒ#1ڧ>w W2Qx%?D͞\�WRӓn_Fú kN.&7rV 53bX~�BANizf^1Ci;̹Vmڼ0WмP#Rs!qp*[s~PD,dϱ]S,R'N�l L�������������������������������������kw-20191112/.git/objects/04/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015024� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/04/82e053fec104f511afba4446ee7c53895da30f����������������������������������0000444�0001750�0001750�00000000531�13574463525�022226� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMK0E]W< ΐ4E u/i҆IMť!*8DH9RsdҪ(yZ7EX}ZLUJTes SU,TS謃7+n- NğAn^hjl,2VaI9$8I0q9/'Uuv5lڮY`u4PBދat62@T@`zhaq-f4ζ{=E=4v2(fa'v9WqJk Ӽ^lRM<XEȻnKԲ>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/04/5aa6c2042b08a128880b10fc5e9db13d8deda8����������������������������������0000444�0001750�0001750�00000001010�13574463525�022265� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒ$UHo=YԺ|7KR}4Ka' x)UP̐'ͱw.eW nO" v=e> %+ͦ[C �[������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/04/671e4b78cba6fbefb3c34bcdcb1c1c9a729e1d����������������������������������0000444�0001750�0001750�00000000254�13574463525�022667� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xM1 @QΩ xHQl,&%ퟑV',>a"i+>-,PƕbA)lxuA|XɢR8əDM W˨nu0<_9_/!9xĀN=G}\1yQo�rW ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/25/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015027� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/25/eb2a2ea0e7ad07b1e0644fed660508e26e691c����������������������������������0000444�0001750�0001750�00000001261�13574463525�022304� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xuTMo0 Y�A[ȡ[S-t,D=} ?JvrrLѵ>}zs}�ۚbeZ靇b,TVU r>wx@@ ZIU T .8oowUz G~+`r%lM@gqd) %-trDX#QʬlƷ Yh azCRQ>L5C)]Z$m@˄3z7`! !ă,Qj#kYGhAo6zM܊Ň)Rcw7WPxw,O=ڙw^ktrY4YCFL<Q"d^%- GtvpHҮюڑU4v1]�Oy38q6BNgX*UơEsO6WKAV*OZDY�^JFY v|7g AlDv~ƁN%<rM#Ԟ׍*рS=iucqt6̇TLsプա:XNt+sr~4|>]T8*_'`Ѽ#&m#Eo"{o%'Ҕ)}fp;3i0hӅm0*O*Eц5tVV/_O������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/25/f79ff9fd0e3072d586b594d14753db3419e8da����������������������������������0000444�0001750�0001750�00000000634�13574463525�022214� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KF$)Z|oknJO-WĩEȮ w-)'ߞȵFFF{A5e/g?h怇OrL-=ba}C[p% SU~Y"Cٻ(p%9I 5>1ΛJ84X^[l T4et~B TAY.H]S,R'N�}����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015111� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6b/49791ecb121942f4f95bd6f094c1b94775c905����������������������������������0000444�0001750�0001750�00000000771�13574463526�022055� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗu.q§n>H_%hBLbңo'眝*d&Re)\i^Zfz.\e OK6Lέ@V•Te >- dҴ܂Ԓ<6_|_$$ %=$>713DS(7g۲vP9p#*mNۯFKoAv{wIỴ; $`!~sYЧy\|Vn*j{O^2$!5{glx)0%#X�AaU̐Vj'|%S@7iK`,)edW>1/O«W/8F.XZSpqSt>Pb=�������kw-20191112/.git/objects/c5/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c5/e72f859b79fde170fd5b869c61cd7b30e22436����������������������������������0000444�0001750�0001750�00000000061�13574463525�022263� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU06f040075U+``MV^5xmrz̮sj� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c5/8e174cf514108987d2d185d8032cadafaedf98����������������������������������0000444�0001750�0001750�00000005652�13574463525�022346� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xoobmHr+Ѵ�p^+iO$咖Wz$,)َK?ÙgyffeX߽zoyWfwag`.Cݵ~w.{ol>79͢pMYCr[ϗ6ߖƅCƯ7%BPkoeWi;_w毮]il]3U׾_Ʒ0o#uۇ4m]ssZn)BWnλro6Gdk<`;,ϳ+۶y_Vl:ӹuZpoݮ]|n?tXݚ\י~6׵+fa- 3[w256vxjC%<~ɋ;,]q9ncbBW>0ܼ zZ-Lt�boͦ뚸8?_nj`Ͽxy}n]rNZ\:dwk)YBJO8]�ʵ`ue/Lڳh;h۝] 4Btd4U_w.ڽRjb'uX7;fҬpss2*Y|BWfؗ|5]A>y DI:8FRN"IN8}كWCJkBq<1kl[w!̧ lw7S#QKmQ=4#+E20[Ϟ#p:wW;5ɁY9acGxrZ=D?KK%)sR[%F}U}oQG_Q|~@Cɋdڲ[__!#$wC=\΄S8n4΁1u3ة[5Vj\P(q(6qv5PTT2ga)Cۙ y|C7j@F>VL[XNp%QC$&nB_C:bFtڜ|"79O*Vbĭo;+abBCZSL}K2Lyp-hMV.?:tVPF>w,QjTbQ wj>=@0QFsWL<w}@ J]_NE͊`iq) .9 Smang+zoʡs.޽{o>fr�(Ezt/ - =jlV$HmW" QV{QZ D$[Uc>"_LpJswthx(heW"~،*wLkJܼ`3Q4}|>L`ǗǏ5G%JD`^ZiL|O؏fN JAg5%'svJll- J/LCyKZ9N]TRzS)5/ /MY2p|3WsHGΎ=8* /aLt>J$22�2 sRx*-YF QW! Ed&g)i vɏڔz~Klǫ{?XDzpbxk+D8TXڗyt{.G:kSJ40ȣNTG()d`8FN!)QHK&^b+ &1y O1 ~i�B{nbU;x')Kh} w٫O'\AT4j?=V?n89TmE\ M1| mDa2OjRHHZsi/2?و*I+1l@jE)uP<#+v+[htn-da±U(wI6xEF!2 3nl_4K 'iDžGh ՌCK�v\ȝ/6o Fճڄ&2 c=L>/D ·GR4 kD'it:s\bdN]ήOQW& &a{Xѣ8KSsuÚ s-;!gH[�/#BZ<esdf�;@ulR* Nuh 4F V#D3>sʴuhQO㐕VJޖKw'QՖLpv-GEhg&/ mhZ?1Z&h�! �k,S5X-_ÛF}7Gَ^'} #xѩ!foc2F+yꉼiP&)ZB�ZeS$uJ5VfaN,,Ok'}f0Λ yl. nuVS ӣwkKW{NZ ZvNRђcVOXT]{3+$ȧ�dXdc*L#>wcQn"y^`(>Qu'Tt:[m%ŋJd9Z<GCnْuɼoh<?e^AhH)!?i>. ;s3^W.{*Q>ل%q.d;S2:t9-+ws$KQ} \:f1 wlZ}EbE4L_OxPI2bo9H#yɊP?%x#sFz0َ%n02yMJ->8i5} YG ]J+U=V2h= 8z)nIw+x%_ pvT ,V-b,%{*^O#û4DŽ$U_LkubH ReAb̠-%zdMW<F,\p)zG˵2%�QG2#I2M{PIPQ/I' v&0 9re1tc݁\ kߺ ImzuӇn. ^E#[s+#/O��������������������������������������������������������������������������������������kw-20191112/.git/objects/c5/e289db8f590a2f8682bf4927ebb2fc61feb8a2����������������������������������0000444�0001750�0001750�00000000400�13574463525�022476� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMK0E]Wl"DѝȐdHWqs˹0lOJfkGBem ZC#WdZҨ= +]ոTjR.eX'6GGpi% TbvT~b̴uȐ<,)ES6%8>Lq,lwfs(Ět`X!0A}oN8onz~5%>t.z����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c5/9bd95760af099b6b851324023fc6043c5924a5����������������������������������0000444�0001750�0001750�00000001770�13574463525�021751� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xV]o6ݳōٺ!q M MhQBRV }ږmtÖрmjNN~ 3̉N{ CAiZ*|% t =8A7Q^ӻu.E=BE!{1MHMnݥ_zZU g1SPow`"dKC;[u4DrUhX&@‰Y KEuњ:*jP[!�Dk̍*)x*H%jH,M|z_`m`db@tUpP -|-|8Sy?M!6ih!G/KmYN?PY~TzʅvLLp'UxOKmhoڥUrrG8HeNE`#-mtV,,o4:T9~@DŽ"17:/�h:/Y XS"ޤRG&*NO8|~hĶ(ӐXC:-Y1Ee)LXH&jTܸ[lM GޣhgPDyDĸ^%o3Զ TdY0ԉ"aT3Res�A q˪?.vx?}׏؇u`I_D5QW�j%M7ꡁi;cOL좮H5k*'Ξwˆ`SM&ܰg'8Ž&86m+\]4͵D=!kse@W%R{|Bb)h}+Av=Gq^1Ir`S<MFePԔJvn{o]"@sʟ\V7]*PCc[9;88q.5rv&gpR4=wp:߽uogbDɹV۰+.+ Yk!\YL/v q^/.WH_LqXȌ:-3�:>��������kw-20191112/.git/objects/d1/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d1/429368f79a88eeded7c091c84af1975abef17c����������������������������������0000444�0001750�0001750�00000001000�13574463526�022424� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x=o0 ;WY. ƾCPddh: -GͿ/廴K,L_TgAhKpDE]UU*oR]H*k [ӬmĄ�uY4e}4MeJU֕*RΡ~ai'x΁%7z}{إEnN-<鷙Cw爿286 WYwi^EV,) ~X' GcVG�kKgG/J%sW7;m,0 Z'C`V@]<v ##G#cW1= v:|xP2aG>vn ZȀOkh#;vc-t=:I4 v+ao6@{r`G̰Xbh=N-{v??.'jʀQ+%hm裿%⯱4.LxGnJgxcg@%Qkw-20191112/.git/objects/d1/9f3590ef30951af489e53821d1a8a4de4a99fb����������������������������������0000444�0001750�0001750�00000001146�13574463526�022264� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmSN0sb I C (b q4rZ{NWl33g^mJ&Nq'+P_@,:HV` /,7b%s C̏o|z7WӳW7D2{;fk[L~q- Fa?QS(VhuF9<jE+mA %98@ɡ`נ"kOB<Rt“!o4۟b b}!Ѱ0Wd4*f  %-Ka 5 ,8 wsTg`1\k1f)6-zS]§|iH)YbA.*a YR>h^?;z{ze~VvBVT i~<7|R &w-*3<2ąⲫBCSe謌cGQ1o >5@+{Rj^iڭm:u>iVT'%FpwG<!?% ]GeԐfה9Z A/ B|DÓa+$cRvH~PRd#M 9tQGZxh��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d1/8b2ab737333eec23563934d0c91fd0fd598fd9����������������������������������0000444�0001750�0001750�00000000634�13574463526�022260� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KuGf{j%*=h^f^ !6ܵ(~|{"9ՔS�ronJjd~?J2Jn$e]oÕdL9{T5^ifQg8>0d&dKd8o*8`^xQkojrA X}M*^2+)\czYN8Do�7����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/55/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/55/63991761e02944b3b5901f6ece388abc599966����������������������������������0000444�0001750�0001750�00000001011�13574463525�021711� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d3(ڶuE&/nAd`9/q}M Tgg}U�i�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/bb/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015165� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/bb/b084af6aeddef5d867762927bfe66ef631aa61����������������������������������0000444�0001750�0001750�00000001141�13574463526�022554� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xuRIr@�̙WSHmVfcXWnI]ݼ&:%%Hep'%s)ƑK$H-0-lhdHRuԶ%AFlyןA49!! q,TB0Q n*j@BiOՙy^՗Gg-I~�dxB>vRaэN ֍]~be-2? `>$N2^u#/0~$3Vu(zDÏ⻓@q 03"$+y)'HFn"a贍e{76t4s6>L`E]ܸmTEĿ}\>'d+nW"g ,1=fd7am@vO񶹗y:da]^k/.K! Q]Q1O7KB[nN餩ʟOO�і `8Ѝ6lajvM~b寯~/5L bnݐ?^UQ\i(- λY,7 u}mO^LHIyNuQV'P<>/c�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/bb/e0f5c86d18215e9d4d8c73574bb0ac9759ab6d����������������������������������0000444�0001750�0001750�00000001010�13574463526�022405� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,c`it~V wnSlQZ0eK7u_n:uVvjQ^jn1Мb 9v|k[;& r{My=Ei9zyiz9 '?Vqg,ZjbQi^|Ij1f:ʊM{9SKJ @˞0q_ 56=NnN=fq~i^J1õ&~60U/ —fngv.~2|#D '{˲}JVMs9"u�7s������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c9/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015115� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c9/72ebb557d8b2bd8539abc0a8e4685fd9a0fd5a����������������������������������0000444�0001750�0001750�00000000641�13574463526�022557� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMo0 w֯ ȱ0l(2mH.;Vt,̶\j?Ma^_a=R Ui]quUXm;]!BMzc)UYG)l**u'1ֵM:UۮL't>D8)z|JL~:kƏPۢUU[UvJqw}ԯtF_jӖJ̪%R;yw.POE?9.\S HyC$@~f%=P<f&2ᆀ$k$g qػˁP|?Ǜo_y&l>;ɇIݧ&C&vM= l#D^Y<_Z eq oB?MVVqÃ7<R f/Wo�����������������������������������������������������������������������������������������������kw-20191112/.git/objects/10/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015022� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/10/b8e5c4f6f1cd82f6a9ab9262c54f9f3af7453c����������������������������������0000444�0001750�0001750�00000001760�13574463526�022422� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUmo6g:K~X3#bo1q]'b-I1v9 Z,瞻fz]bgeUOkުęJL.7NhѰdM.UyQ/05|Y$dX!xs҈ 3:]vX"3K$Jk`rX]YSbiY4W}> kz K4DC4 K֡ \�b4 :}c5{OghHObw=E:Tf6Lҋaz=/\-+2gZ{8Dba?> h57Ol }'evm<$jdQ;o77Ɠb|N9Ͱ.&'fUH Vtި2 0gWMQhP A][#DmGA:H5qO|XC"o6 =>d(gQŧq;RlQPk?/F`%J OGQix66ArxW!Dp6*\\'~$#UR*% $Iħl=DMV I~89 q~/ۢFc~D'$v# ,4p!&0k\)yQg[6$HIޑ8YZ ( jF�&w 2<vijH fLVGSϣt}5HfzJc8XdHlaJ#f=+DZBk㙍xB5.�D>=F,N.e}H6*_&M:doFΕ '%&{{.Pe`I <O2C?oi( tf3Cs=`þw)42hmt8WyDd^ήogx5O{ΥxQ$e,$5-ѿy����������������kw-20191112/.git/objects/e8/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015116� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e8/8dedadd473a9808445429cf25faca1bbba5ab8����������������������������������0000444�0001750�0001750�00000000634�13574463526�022626� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KuGf{j%*=h^f^ !6ܵ(~|{"9ՔS�ronJjd~?J2Jn$e]oÕdL9{T5^ifQg8>0d&Ը,{q] -8{yl T4et~B TAY.H]S,R'N�pY����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c8/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c8/e5661aca7d3a491d912354416b258be9f91326����������������������������������0000444�0001750�0001750�00000000736�13574463525�022035� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xR0x 54MSJ @m%vX$v=/I%v{3oܸ7M"v[JWBne-M]Fײ)Uxʬ(t)Ju&ya.uz9R7۪ƌץfbM�gq#� ^랆pM�YYeg5f1)o.N x+@{t)V"rShay gD |عEBs{!4-yFbQZ|LC?w 1 @gB�- E]hWI,:0l=-(y@X¹5=3f0̖}`t60+$:ievu@Ѫr-,{<yݪY1tj ;`фU܇zq>pra|^)c'su"k; __ ?^����������������������������������kw-20191112/.git/objects/c8/1e3cd6d60c066ce6dc05796a11c6e78b3b1ee7����������������������������������0000444�0001750�0001750�00000000634�13574463525�022406� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"K'濘fy׌ JLO-WĩEȮ w-)'ߞȵFFF{AH)�97Q7_5~P%zi@%G[{2FTӇJ2A=/4DٳwQ Jr2@j%|zc27ph|/ƵP5 w%/ik-sr�\czYN8Do�Š����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c8/540ca0d90068098269035c93b7f42f0f24c58a����������������������������������0000444�0001750�0001750�00000001011�13574463525�021735� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIaCh%E79, Ei9zyiz9 '?Vqg,ZjbQi^|Ij1f:ʊM{9SKJ @{T!"]ӿ(guSE ,/K)fA/ӆ[*TAQ2"f:isMŧBd`p,gd4c+b^w~�]�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c8/eb5b64ee1db5bd4286ddd53b5dec5b01105b11����������������������������������0000444�0001750�0001750�00000000617�13574463525�022520� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMo09WĥH%dBeAn?&8lt=Nm%.xy59g#T<{="d-\ȶTU)+l. s! UMA(Np^ms)yQ*ۉ9Hێ|O霴VyYM%&YR4) T< @ 0O`!=yvBvcZ (R.u;牰 Ge3 "W9+E `qϨ:|L|ԡKp١zwF۞!bۑoxYnmCX@O I]VFķɳKKZ ;nDݨߣUh}f�O�����������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c8/8e0aae822ba717515d89c0ca201882ca89498a����������������������������������0000444�0001750�0001750�00000002212�13574463525�022161� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVmoFg~ԡyQ ptIBhU)Iu:q4kbv E9%&|ٝyyfGjh0_5slhڄ%Eʏ@x"KaZ-~,0wÛ}>tƭΛ7o?XwUGl[{m?on_w6{QYwϫKX s$ҊIJ4L ?| ӯAs3Ɯeg*lb"5,g%J,ʄN0uG&M=!_(]�&FhTĹ/(՟}hkǙ˃@8'R 4G{"6T '$J@Fu= GB<ڦBIήZ Kh)ֺHw(%OjϵQ}D[oK%n].e(Ԙ&ԢCꥃG"L.1[ҟizq/dq :;2 \X 3&]]]K2Ry.9 ]UYY 6muj+GFL_چve qhFͥb*tRQKiX(U@ DĀ¥C;%3Z)Y^#ToѸ|}LhPH_<_ GG HA`bpgr{4"ί Wα'j8\%G utʮ;21"W(SHT~` АJ}p[N1|d,]hyW6 &T%6ނ" RvAM(YɱE ,6\[WH\\FX;Pw3aG6s\u :Ŋ=5+l]kz4M5ǯ`%"p>U2+N6}x|g˰@CJgSp)TdR "zdV$5)2{%Ӫ4#@JiTi+ @޹X t"/Hا#Ay:r]r_fb k<UVȱeCYk d3<ۂ_ݤG\c<i$ɔ ޫK;?MƲ?ۻsc}8Q"W(咭!nmj<6E��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c8/30da5cb8c6138060fa7cf2cb734073d23206e2����������������������������������0000444�0001750�0001750�00000000422�13574463525�022134� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0 EY+$6BHhl�Ͱ`m#ڦJROgxlX V{m8 J@:eFkUiE)ƉJelHSʴ8:mQ5km4BeӐʒa\]k/8.W݈~8ab[J%l䜭4ӿeJ9@o"=9!y H9Kp13f۟$Cy~N^_$?~;nnaMcM6m7{oǿ>�㶑:����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d2/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015107� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d2/238a21b515cb5b807c354399165c7f5e04f887����������������������������������0000444�0001750�0001750�00000007131�13574463526�021755� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xZmsg IDGF˴r9j1ƒeǡ;y i9I{]�wC4D:�b_}qo'|}iz;XS2W TIX4)(ױ*uDeJs':4ӹAZ|**(LIRXGrGM9_|D+M+ b q,ך r{q^TLW*DӶ,O&*ҼIS:f U%Ufꊢ*7r"Z~&>39u &ړE(6Ѫr6!6*tNzt*uw XÔ580RS]AW=ՋcřrYCNh.J2f7aZdM0|YZ2ǡ#.r{/ \\|_{-Ҩa)* B{mjOasiZB6.qaB|JIL W@ N{OpP]#U jYvS_~)O+8EYU1р9[P^z-pTQY@QX M\@UC"x:L۵~xKĮSo\=lUdӌװX!8B90]X6%Ea D ,X}o 6>=ŝ8]?݈bZYUkzP?N[WvchT{?FAẍ́>F#Grɝ#V*+8_gA81-'A\q{Y?f'OϞ?^101oKBp`BN>+]<qwvy9>ݜ}?6Z{w~k\;r}:+K]ir*5aH3D<q"8X:9F[ԃp*VMa^:'$ $Gά=\W.UR:#Nq>ЗvDLs<IJ6zl-kAn�69LVo)eIʷvXKh\Wf5\-4'ɚaZl7,8a~FÄ0 ^yl%(dXarSNWUG0Bk6 Zn sv3c�'S!G ؎C>jtwv|r>&wK8EO.pRdZ ^] %ez9d'>>(SI/-҂K`wVRr1\KӔB)]ܜ\ޝ9&F<]v1*a 98m-aũk2Z'fyO;_Ծ]wQ5. [J}ꞵnT' 5N<FqN愙np 3y A ?{=:\^{du*')er[NHvXo kיV)aDqG]pWfkNFF-h  HgPZ]g.*.R@WqLVaI!^bnrJnjw.^ | WB+dbj©ўR+a*0R~ :MCVW-�k_}⣖ĊXW(G@')};\')l|o0c�AsN჎e:I+Kߛ$ 3q]k/jm4d WkeZK3,GNO2Pzɑ3ȘڶL;: p1R;lcƗXP̤Ȳ9 0 FK4XkQw .RYS=l\a۞Xr57>=x$kǼR7`dž>rc^u5 ǔcviFb<Ylw.k,�oޠy&;+C۷-˷Y34t#"8cxi!�P7ŹU `�] ]ӟtn嶃cQoxVMTۯ &vBQvAs /dpN$f 9lĝYp]Q[.[f:kRQ86mfjF A@y lH*sU!)$ `,\Fq`ޤlovdzta I|$C¥e*eqokY&V4R䘥&CmP`M$]A>zܚSV ?EșS:,u(%ϰbP@'E3@]y޲8*0'6CǤ4XlZ?fvnߢ139<zT?:u[8I KH|%4+)\@ -QD] Fp߂�7N#~<k_>[qf J$Feb})KJ|ރ~!LD4@yA)٣ ''E�ѧ•v]p5$p;ˋ=yY;f妼U�{* �yk!Z Ҷ Fi݃^(Bt3e"_ a.: SY>P!rb}?@'\5) %'k$b>W&Z<-o(9Fi4< hS`˻2  30vb !ښ8EGAH?X<P}fI&)zku׿@Aܧ[.2x9{ul8{0Izߚd;.u^#qr5XOUx/,X{ 5wC|&- 䩉.$|F8pɤCWX:Dm-圃'(K8 ƺ3*S4S" q%#-K2LP*Ad35+/ 1B RD;24è+>�R6&77hbkW3~dۃ8A5�ٜ$~m'Er|Skje!@o%bhy&$gzw7/]mkMwNŜY�]DgB\H�I�0/n :G^<0⺯A 1`o,PMgkXrW 51HUPCXwưDBD _s_]JJq`^W8 �PO/ SeK㣡ށu419!:F:db%]#kAп6ڴ5Zzo kBKWk^5 *=>. >@5j3鉪)!A\8R[[@f~ܜݶV~ph(^iĩZcp^6,"㘼T<Y~5GZu]ߩl:+>->o0NN`cW)xZҸFŸS^RH/ڝx6'|/ |9;q_xw^Ðt[?�+(.=}q[qZ[)Ocu_;`g Y@QCtXhn27Vtэ9s (Kf]>[-՛cEtEͱyᄴ)s\EPAOf ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/33/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015026� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/33/72909a291c5bbc48d33ecfe69b4a2c584b8493����������������������������������0000444�0001750�0001750�00000000516�13574463525�022176� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUKo0{M~XZ6}RQ$.=#B( Xu4 j*wR.~hW֭|5+uefYf۸IRU+OB78ǀ1Cȁ/aR5@fxmK =* E5 >ĂD;.@ y/^0Ny}nә&{@L吾Ժ?Ed !P8+P,6Q �dk>*&Nd] *,( O 2`S]M*A ]ATTBz!N-{ՙ/^����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/06/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015027� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/06/3cd82d541cbf7fea0ed104103898a52b6b3861����������������������������������0000444�0001750�0001750�00000001012�13574463526�022140� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ</}Swޏܰ2o su% ?|rt '}νvsτCN-K-SW02gŽoMvzx>R7ܤSZy^a%YpQ]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3v>&eBY*W7{9lc8 Aisd~ h��8����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/99/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015042� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/99/5dfed6d62ec05eb42b23e0e5372af8c24082f8����������������������������������0000444�0001750�0001750�00000001011�13574463525�022321� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d,ٝ3I|]f\5, N<e,4rlE/�pr�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/42/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015026� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/42/dbabbe202598d41a6b0a26bdf0e1d15c91a758����������������������������������0000444�0001750�0001750�00000000435�13574463525�022353� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0EY+fUP⼜ !$,=jbGCQT;DŽyvzȑze"TL7dlWNkBVUiif`dFPWJ4l`I+I \"Ew1S%1y9Ggھ.KcTjay]@.VpJ7pS@`l. f3B2-Yp &M|5q GS-v )%!oAށ~ܟ8HwBg*ގwY'ſ/�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/42/80fa3df11058d3ef9b35862eee5930b360bf5b����������������������������������0000444�0001750�0001750�00000000462�13574463525�022242� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xAn Es$ll�lxRLd%I#u[ $yS!!'D0MRV 'ʚy_WXstx'[v u;טNW0is[Z;9V̞H ȥ0Cn#Dy6LrM4ly9+jI?XcBN9 0Nd1vj2;x7P^2j#+\`ڱcX ]h܊P`+pq)c{IaL ix&*.ݖv_?}5G��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/42/3dd9ca0197c020af35955e3d84ac78e0b700e0����������������������������������0000444�0001750�0001750�00000002220�13574463525�022140� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWmo6g`)KX/-i4ipOM!,I )oe2h|sw(#_~8xGLg@jc4Q0%@gjiY[RnAmtXY�6lWU58�*(B* 1ӨRAOQĒdH{s<L&9}臿.W;־C_<W<S.pg5d2OФ}r:< u,J1*OM4Cc~Gv] %m g#mp`lz &=L v&A. wv=ΆQrou?W=8<ܴ6Dx',Jpc8cna^)kWA܆$ &HNd3/>=$= ݮϒ00E S}L�۵5g|{&p&$ UVz'9&j$>y"+:nXNo8靟~Ez+hڝ&hrjh+dDCiF1粐Ԧ(DPR�N!sC (F2K h;idj)ʜ^s1Du͐J^z";.@ʼ$% )SJ*EAΦWu]5t[SDОbq: am/&6V:ړq tO/? nVwacjm3$z=UB+^R+fAr*洣mѮ ht em�r09<Zve)q~%hY?Orp}xѡѼ̋_j� O6$LRa1q~aTT91(mpjf,#ֵzSJ3l9TJo3mE6mXŤh- ՓVDlўr:jIj=nxIٳ GT7OYtlj;Fh oIk mJyw_MlOX25qg݊3S=C>Q*YkUA)It#_G"x'IOΤ=f}5fb;o<{)Ct#jA;JtN҅Pg?Mo ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/42/004d424d6da0ef55f8deaec3a672cf9ebeb0b9����������������������������������0000444�0001750�0001750�00000001012�13574463525�022604� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dVҺ r'1F'.!`W08YXPl˱1;��|;6����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1c/98bce07ac77f665227b70e20039d3a357b7769����������������������������������0000444�0001750�0001750�00000006015�13574463525�022036� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xms~aICRyj'&Jh3i&!8@__HJV{d >,ϾOɌ>Lu/eO-:s]\,hk|em/m-} S֍_oJ~BPkeO~+_o]il]=U׾_Ʒ0oU#Uۇ4m]ssZn)BWnwv]7KEL7|ޗt3}]<F;;۵U׎Q4![ܛ:ww~]bVr0ݱuG-xYccƫ6T1{/9C6&ʙ*~s5#Ъk_i֔[&../׾żK|/?:2˾uw :zNZT:Dwx8֕s$:7V+J�E}:7XGMLmY ҖATuݹk dֹ">6;Wf W>"xnnVfzTS;]d}Ig^SggbD+ \ GKJۉ^%IiZ/=h5(tq&œy9>f~ڝmkN>vjj ,GFc$9R(qf~1 3;㘗΃aS۸6i ]<kתQ&4uZ.` 3/' Ue[<h ;܇K5^_҂ʴe0颟O]!O>׵3aue@= $Ύ8'|󭊫>0H8Zv {[P sJXp\-"nl M4_m(`=aJ*p7hْ's۵Y]e"jy`l߅ �m_4̐y⣴ķ .Ct-oLv4Jxo#LuoI]*PXza&e8>y)>쏟dƶ6)興a%2ybAHFb%`<@r~<STau+P(oIKW[Rj_yhSR]ڵqrA!%0(WLqfGᆴTv EaWRWT%'w6_jYp'p[ʡHxsի^rw )EzMa0SPwD9qQ*{)N}grvGj:|m: {|i7ʮJC$h3ʵ3 )]NJ ;瓩r@z}}|=7g/H x@CR5^| PG|ӟNWJ]RA8S/oJ,VΕގJNAZhA|;nv`ߵA)PGy~ rӑ;K )9 rkҠT1@kK9d"!<#]-->m!wzv*#@R>@45M֫$2J~ფԽÄ3;'44{~mrwi$B=(PJֵX96<./}º)"MQ&;Bq!]S:.h?e2t$钉# "š:/{0IQo#B\c#(u⠝4T^/=Ο\FOȰK}d2> ?B~"9 Db`Ӱiq/yD2|_J p$Ҧ2IV!:Uivۦ JKf/PZ`B;ϮJ` #N*/%J(t0HSa*hK;Gٰ.+&JRU@7/U~zP8#lF!% y(p'B/7EacCYBmh)4  r̛t^ȁGbԥmk')tsiϜ};>]]m4W^X@``mk?9x~jnNҤCe_?عrZa*EHӴ 2ܥ.:ߊҤ-D~gSX=GIGg3ǐrʔ�upQu^A.PE^eIfRqDVfT҆'4=ZDdh BPRM ڃ~hːEe=3rrԞJO?k`dp,=*5LU:Ҩ~'.? .NA{T`VCLtXYcf̢\v"LV0 z䱸HgjAGoH\دvZ \vRєWOh[@q7*o@^J!qw,rO;T$U6!B d}. 1%(+Ctb/>sȺxN*-VV,%tPMf]z!l_߷{eԠmuV8[FoNuǡR|$”]iK8e0ؙۙ4:ra?7A)vW<AP=.NO* G4dH$jL!t! J8SY nd<頳�(P[ܼIEL>]-=D#QIAI�V24Zz, o.1sԆU.)=+i4V˞I/SԂ&]1$0oIvd i,V\|GxiEX =9Hc'tp6$@WDDT☩Vm#$RF )>k H 1 ؒj)ʩdv0p0펷�}d@5JځSiȒBz|OHLUbjK CCo^ɅuJwxS]5: InCS:ߩCaEp䭹ޕMz.b�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1c/3e2d7287c62504b514ac189e6557bc6c9511a5����������������������������������0000444�0001750�0001750�00000000206�13574463525�022016� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU046e040031Q//O+)L*-I+*.a5ߧ~iȑYZ <3$1''1/4k^2g珝sΜt$wP-%%`E{w.8xą)F5>u2�6=^������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1c/c346940b224f937e66fc3d8e5e4009a73ffeaa����������������������������������0000444�0001750�0001750�00000000771�13574463525�022334� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗuI`T\ y5++|fߚEU}5\i^Zfz.\e OK6Lέ@V•(TLh--'pϓBՠJ23s rRK2Z<.t~қ~h,Ԓ̼ ݷzɁ,8)ӺU{wP ΌԜ 6'e%U𿷠`A =;o[]ZYzUn,Svc .Vz \Uf>7fM)S2 4V).'3 pFHMYe'^ omH.f71�DPX3U yԻ(G,MhZPA sU:OS KeJK2s^0wyEq3)Zl0z;�?r_�������kw-20191112/.git/objects/1c/e12cbc1879e6fcce2b6147e32dc271f69ce645����������������������������������0000444�0001750�0001750�00000001011�13574463525�022377� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dZ͍(Y\8)odM, N<e,4rlE/�}'�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1c/8b10023ddd122923d039dcf61ded5de1475bb1����������������������������������0000444�0001750�0001750�00000001667�13574463525�022302� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUߏ73ńtA9)Wу6'UJ+cϲ6p(=3zᔨ<g|xV=6$K![PtVUNbjMi4ȠUUV%LDY64�^C/4lH Bf rha1T,@Hsm6s9,-Ү {D,  Ңɴ7eW77MHkr=`ce/[Zm#gDᱛb:nHvHxS},C?3\4>l)\vyʑt'[-YKK+E 1Ua0.oƃIm>B�ͤ%mU ]Y:+Ϛp\vCp잴)D5sO.!/Eףּ/;rYk[59ZpgglEoF=z2NMnZ"zWwV"PUtبte:BSb|XZ SL&ThmJ)$5!6C:7ulɓ!T M۲}ƪfsRG|pq- H:0d^ÎH  3(W@ڨKIB$ -#5Rd4*CeA]KF'95Jy0WgKpdVG[*v{k@h6 !UG~=J kxpJ@>!rUQu4wqi{ cl`5Bѿ9 z*RzH0 T/)=1D|CMjd'hxMrJqSSq]2DeM b _]ߊ#FY(!V#Yn8[< 8vwQ?M_8;)YV KHRF_ڞ �������������������������������������������������������������������������kw-20191112/.git/objects/c6/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015111� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c6/4da649f1a5ceced6e0c8b19b270fec22bb2cd9����������������������������������0000444�0001750�0001750�00000001010�13574463525�022663� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d4\==ed2hAd`H{ʴǂf%�W؅������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c6/f73962bb01f9571ca045e6ccfbdd340df1b139����������������������������������0000444�0001750�0001750�00000001277�13574463525�022401� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTMo0 YC1Rz64+Z ֢@d88TM2 )D>>>>긂?}~s7e|8 y[>x0zӪV=MC0hخжIWFgP7вqOvNܗd Ek^Ij[t l䠢lfb„l@Zȵ򕉐AwBq! ^kts�By@ BF$kxzꘗY{;R{<iILYڰ2X8Ns<@`[xiTM~=Dr S ޶ v"(sHG+ Lq\0# gvw?r!EE!6U)Zt: |/mt2꘱7IִVK*l8;3aեSPꊬi/%;> mpSte(\p"ZrH]#&&dbbGU 8J=`eFW=;z-6IɌ۝Ӱ` ee&PjlOL,˅?VHl1~KV ;_&wҌANU`8Yȣ"ڸ^j;4Ru=HNkSʼˮ'sde0+|ND ޼ ynFq'*tLޞ]���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/fd/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015172� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/fd/a354d1d0bff375231bf5b92523f584b5f957b6����������������������������������0000444�0001750�0001750�00000000654�13574463525�022255� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xˎ0EW\!@ FHYeE(l78c0MH}~Mf,uDE!zUm^Fvu!ۍ:eQoUm31c&yDu]Y+IE[U6F{)o:⃒_MoٕvleLdd{R49矱cm4ћ B|w ڛ\›V1nDұ)I?[p`5tpֺe/v͈I#.1 ?E� c-x+`F`2:Yg|X-_sdmг>LZ+K\0:f\cτu2n%i⵭_3p㋪o.bOw_$\^ C������������������������������������������������������������������������������������kw-20191112/.git/objects/fd/5a89427be092e39b6a1902c3bc68e31f8b86be����������������������������������0000444�0001750�0001750�00000000671�13574463525�022341� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU054e040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KuGf{j%*=h^f^ !6ܵ(~|{"9ՔS�ronJjd~?J2Jn$e]oÕdL9{T5^ifQg8>0d&ۗǰ.šӳr섪){@/yM\_k[K'@CbKDFٹLWv8l~UT 2XrŮީFm~'oy�~�����������������������������������������������������������������������kw-20191112/.git/objects/fd/53ef08d927e35b5942912f56d29ddd2ce7a0ec����������������������������������0000444�0001750�0001750�00000001011�13574463525�022411� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d3(ڶuE&/nAd`H{ʴǂf%�e�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015105� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3b/996558a9277ea445012f19aae2c491adfd70e9����������������������������������0000444�0001750�0001750�00000001011�13574463525�022166� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒ$UHo=YԺ|7KR}4Ka' x)UP73`VZwA#?&<D '{˲}JVMs9"u�{�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/69/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015037� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/69/5296eeda1cfbb5012eacd2288ab4168a7074a7����������������������������������0000444�0001750�0001750�00000000450�13574463525�022313� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xIN0DY9q-h5-�1pvZXVSRa\YC1yMqmaLD+h9%s- +ft-)Ebc*%.'rpRaRqڒ6`[f-�{/NLZe0L8i82Pj K(ślK#xi]3B_z IE anXc|}<cyCHo*h vesbM& w7Fo<x������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f9/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015120� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f9/5a9be1234c212f98a065f795f4806c1ca57cba����������������������������������0000444�0001750�0001750�00000005127�13574463526�022255� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xXoWN=F:ÙJ<{$ײd;n/KZg޼y3UWoON%Kd(RUxȸKTiTE+WڶmR9OZ.i&ܙpgͮXO[7ܫLl™M{e]m0CmꃯLJġMs66WC*{ґf1N\װC@F%sjzm≸}rep٫}ت^]ֵuBޛ}kgojT3np:-^;r 'XS1:ٴQwFu$xVw>>صu= 3/�+VmRbm"V] /IƋxcL{j_FKNY~qt*Lk@iL`WeQ*yGLRhu ?vb+xEd -ם)R V&&V֘i]<`vmUn0\F�WHmw#^oB )+1dG'u<qՉ~d8< .g^+Epp9 x^vCܹ07xfm "74JJJF?�`~8y#˓8@5ʰ}t^9]xv&ţt{dHQz@kh:gg-dPGۡ!oey! @d6-rǏ G1|=~nQ~ju"K#9R}>PG@v~n3;z-ƜA (~(qm!l :@yW~HbJI^nq�'T CeuYZU\Ct*؞:N}YTt O.DrFLYj zP! 杇kF|qTsh2|h(Gk"Ba(* wm O Ldrn2#i(R78g5Ԭ;zdUIph.Qc v蝶oA .|_n~x( �*!P 6=-08ujbBJmWB՞J d1 GDhpz^OA3>n(Q?t*7a$<Q�XPhheYR0ۥ:} CJAGBXDV3xK> owYe�'OJrϕ[D鎳hzNVF;*``/%CZliJGERz]њW O+w8^'<rp<QGG�2 j)~D�VJnވ"@"ey?uT,yvOҔz~F"ꧏ|g?]<^EHh 8%ޑCTҗzqe6zS溸ѡh.(j`Q&ST)J8t#NA&0*̮|B!\ z1-9'*3ں H11#Ps3V;Φh�/Qaw`yxw3S̮ZO} ?cu6S~d*F֠~8^b4'|CYDGp?˫I|&lr.DfEQ~EIkaXԖe˺\oPx+<vm!r5Âco!}M6zE rEUDg$ԾyA%O'5f8z(,$R x<t,hȬJ4(4!'%Հoُ<y'0ǙNlt2sbN,7gPWzLi*@hQ^Y{\~pNa{ ~trq0$pR[�#B^<9bf }}K ۼD ZG1Zl4F VCH:{GpX'A h\iYmYdw=ήq^hD:3>>XAOъ5h& <C` ፅF|QfbitpaDnt;9"=:5ƌ('(~'/_?rR`a_kVP/�SD@+kZjxp:#N f0͛3\ YD#Ix{ta^~'5 /#%Y=#c9ˍZ,[0x8dA>#/ E6әhwc5Cxo"yA>SuLFD8J).^X(QsC_ż՟_c҇_(N}W=:"I0EGLN _K8A6v^V./{QyQ% qG#{߈ [9pÝ9$ܳۈ> \#uZOfa*a}=\Kv|ud)\[]{ڻ. n/V�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f9/fce49f79e415d9678e78a3beb345200efb7f0b����������������������������������0000444�0001750�0001750�00000000771�13574463526�022442� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗu;r~ݚ[j{`ssJ+Yj&~v&?fe{ W WjvYBRA }~s,P9Ep9ffy;&O{)"4-8#>9? '$3?rAW-;*y&{>ɂjIO-M+b/}d{ MٶxTgFjNJxA[Pu sҷnw.-άI=*X\);G+=~n*3ni&)u{oZWW8#cגּ /淶z$k�Bq"(*\d]#&4z ̛ l*'Xxȥ2|PKK2s.7`ԗΧW,57�+�������kw-20191112/.git/objects/6e/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6e/1b08bf4db2ba233ceaa00b37be31b0bde38e1e����������������������������������0000444�0001750�0001750�00000000634�13574463525�022634� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 'UBT&?8yPU%@2J8ٵE3Uh/ԜSuSP'  U] TX|t۽%G,,cO5}z+$3d٣O3K={�$'3 &[§7&yS ǁ‹o\{ U Rpj_򲛆2,O*()8\wECIߛv{�F����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6e/0ef8ac034b267aeb45131ca2b451942c9b800a����������������������������������0000444�0001750�0001750�00000001011�13574463525�022201� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3,]l_6߄_|m-D +/1$94'� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6e/7b469b6f19c9cfb413f3299bebc3c76d04005f����������������������������������0000444�0001750�0001750�00000000513�13574463525�022334� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xn1 EWXU *!u|x "$JU7κylR %(5W*QaٖrVM'F1O03V}ѴmU۪nlt8-I`& ݖ9\~ hݓ2RVJJ|i;cm?Fo u#.Ҹ_#'M1b8w%c[:}❏0AΎ&0FM$^{!2d6m3)?eOoKkdSu^TV*Vtt̄(>[�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6e/ca057c8313cb188d8bc2601b0c7cce88a98719����������������������������������0000444�0001750�0001750�00000000707�13574463525�022253� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xa0}Oq{vin(("3"rMkXI ~w DPqwa0r(8"TU5Q|6Z纭.�T(u]JKۍʱPX:oX CY;gxn¾cx~U~@/O!/Lʼ%,2e"Vc@ǐ\!S[[=wŶ5a0lgtPpۗ_]C":MOfhNЌ30>'>^k>Dn1|<ҐM56Zz''p"@7(Sc, ΋Ss Ÿ&ؗ9xl8tpt0x�lϸj33N&RL FGIcB2bgq' nE]{Ӑqh'y;���������������������������������������������������������kw-20191112/.git/objects/fc/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015172� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/fc/2836e6bd771b53ffee550f321d18bb39a119e3����������������������������������0000444�0001750�0001750�00000000063�13574463526�022323� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU06a040031Q.+*.azԺe |skO&�"T�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/fc/efe45275ad0838c2864eeb1d3b1160bd375a84����������������������������������0000444�0001750�0001750�00000003324�13574463526�022322� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWmoF g V6v!AZxyY%q;膮3dl|t]N$$#y]E0:6tN,"f t4]{Wߟ<^\=E˫3ދEnJ؆zK)$d:Ͻ*DF/2\NO:npr3>M㻇۫)Ca"7YJ~џ{yK^дa8i6iv vv^6qejHd�xj+&,j, Pp)^<^8A(RR5i*@dF9gy"`a2[{ OJ?KiSy"m%jzR<T PO-9P`3zlc[H4 D2 UɹT2"I5Q\HC p3ScA-I[R@UQ8P[ކ` ޔnR1a+1JG0\&TնO!MI"&t+iQr<3Ȉ\Ǐ{lwޥ)ж43{>}:c427u!IP"3%aÛ tePAa^WXǯbuHGq{RP2?jFm{s= ztkewaptǭz?t\Ve0̦z^0ZV@"]SӂMLh] "8WoK{ÅjMp#x}g$YKL)N(prR5jsNoeblb,-l<n6wO,AT3z"%_I)XR$y {#q*45׮HγAK B跻S[6@$Yӎz,l>k(%3e[{}/͵<mEnw:J2_sl*q-0OY~rz4HZʚ= N޻ r6! vmt"MMsATb_2e7JzƾU^ae_9�)Um!k Qb,{-#]\0/Y$Odq4/ f2P7h<=paR ؔL(=RMc 8pgJ@=6e .?<<9ҳz!x%Qvӥ~0yۨGݣyhl0cZVQ8hUI9ЯQ{6ùD,)BLS a-Xl](ը&\mT3[M/6Y�sC:s3jSJ_ 1CxYHͱ<+ +km' [<�; 8#D[ gg,٤ݥl-�%)C3)?L[Lae8~p,g{jb۩UbL5r~d"F3qD {Jbg"єh ~ ¹)bt=Q{<'<䇼nY* 񛮱r˦ԟ}~F?~4Au^}FyA9 %?b8 luc$������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/fc/ec3c61125c228ffb6fb3b7878321f18399dcde����������������������������������0000444�0001750�0001750�00000000637�13574463526�022425� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xun0 ;)dH S:tJl6qe A6"s~~6LNAoy6;8b"@1Wp a ފ_ϵ�4E4 4'ȫE6zg.f|R8(i?ed=\2{`"I,N9HqupX"uAt!*.ZۢUT| gN9fv5fL)&6_wײifY*'b[R Qh>�K �eƄz f\R{t*wsW[zX`,z+X?E6Dg=?=wpE 1 nH0V^tg�Zd�������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015107� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5a/80c1d797bb8fcd3cc55d1fadc4561e00a2d4d7����������������������������������0000444�0001750�0001750�00000001011�13574463526�022521� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ</#uwxLFEgD]jI2ʦ[(6r5<SRstg0̸̙[Ӭݪ1>޾ 7i3lrM0^&9ݶA!<(;-'\/9?/-3]/"1 'J;.R9l] žCM,*͋/I-ج0uwUWY)Sc/|b"T]qjIiu? *]aqﵬ`^7KR}4Ka' x)UP̰wwfڜ~b鷵Y+,y,Y(Yi6؊_�(�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/29/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015034� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/29/4e0f43fce2d131f5640bf16c4edf4028a4cd34����������������������������������0000444�0001750�0001750�00000000637�13574463526�022314� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xun0 ;)dH S:tJl6qe A6Y$s~~6LNAoy6;8b7 ^6!102P`[LZ]g�"U Yw3U>)[2H?.l`=VC0T$s CNnHa$8w:S8~t,: Mhc{rxhma?G0SNE~]S{j䵬mY -(4PKIN%_x2ck=p\Y3.d}{t*wsW[zX`,Zd@pSPעbd m ;H}"Uh7\+Ru޳mo~�������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ed/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015172� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ed/eff4819c9ea61c7d9158556fc16217c0380bef����������������������������������0000444�0001750�0001750�00000001756�13574463526�022355� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUQo6޳UCNR /͌Ũ3 :NkTIʎQN]Ȼw}w\fN~BLI%|[]C9S[Ŷj-2eR.%J;/ޣf0ϑ@!ko`PbJX˕Cnb.V ' $Z% VcWYa6=,Z >B^'8gM'@@ʪJC0T)lM 2Gb.Ǣwg[|929iQ2l>0̯WitLX™TFi3`@4Wh57|BOʼnBvksl恥']6@[>O&;')V6i0U$ydUU6˛i<>"'i JS֠+k䛠-#𤱢N s p\q8'<YZ /E猅/{ {uCu GNv>c h*=n?FOJ2^4}L4?9[1˫>f6#v'qH h눱r$h}wC�j׌_߲yc-~@29d^Þ+ADO3Bn fk<m,R<` ZI`=Y<NF*C&P2&# 1ʲnfO$ٔ4РcT/0<:O4=P<jxJc-JO->"|U1Y\+0Q/{ g5DB/=9r AbG> 0 Lw;#"zTGj�nL_ǣk;W+!|\JR^9yB>N -~&{rx{ޚHKIH6NV󒟓`~nw_Ѵw\dYRe! lť f������������������kw-20191112/.git/objects/65/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015034� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/65/f5c382efc324b56c438afdf210dea11587341c����������������������������������0000444�0001750�0001750�00000004376�13574463526�022246� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xXo l8@mu `$An[xE+lfg8[1`۝yf湝ӷGϿ}Խ&EwJMʖtoӥ#SPiR&3IF x]78uo[reKi kG9Un2Ty+Z$3 /;]Nή&QQx3^_K^Vv&T];:7I">\U*sU0qhJJ*8Z_rWs618g>X-Okx;uAI4.w9p9ХI%YUT%DߤFFTzP3*vKUcpTʫvB/T.RGXYX*_ߚ846#H\!pt:89^57t}|uv9D]ͣAff+UeEKfb]$4|/[٢ `Q'J,Mr pL(,Ȫ#b48YaaLEn5r `*W8&H|7zyE*_kI?_tv$I R*GNkqeucMLgJ](Kk9dFts:EMTYWE^!c+_%[t$ =iQ8#+]½yg @P x,|\¸-\"B"hx O><{Go7n&7o6w?o~NW7ñqHd48xD?/0SpFZ{#DD*8bPNZWa]mVvswC~(6mcqΖ?R}.heS^Ţ}h<.6N)žj8sbWuXv(l߈+X02WX >U"/H r`ݛDQKpP-8XcQ2ڒh:nSc8SR3[^8BEiڬ5PL)ĽJaljv8G;6낡H`"܋�=[8Y8֎e=@tD[N-/zȼɀ)-*\d$x3<tEBCMOPbhaM$P]41՜֠B&I qy1saKu 퀕wN)@IU72S \. ȭ. r`HHi#^BJeiK){[H%uKe=U2nXt[ 7tv k4LiBqݨOǰ\rK /Soġ?o6p}OY1[tͬ)m ?9<2VtnGX i-{ѨNY)4)r`Wi cJ nkRޗ+`41\#4TXk/ avխ;Ax ] W;\!GLr&ч�| kPaoE`L@6fܰeQBH +P麫 ݟ@J ǯ/ޞu ?pA{L'wT`AQbil|ű]wpX{YS=?Gz|r:DEp+,=]>} ԍg ^WY*amAxe~7H^*Uv^.ճm[|u-bx4stҔ@`C>Nu9S\Ȑ Zo πΐ'at|MA87ZRvr`@$8~apIZ?XlZ >bOw]u"Ɍt|<b]dy$~-nQQ)9DHŖTW&RTBi t~(D7nNgw |͞Xmf�f!r%B28"L|O-*V'=jɟ�#;xӣ7bq{9kOc'I6}r?yVL9Y�1S)eo ݨS?Àn]S;{_?j CGsBWvLVnw; cGNqƮmqG֖1fr`ط]o Wy[Rqo 4<'rdAlhT_ktos ?j,qzVS`,Ļ� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/58/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015036� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/58/b447951b132416436e3928348c6097c39567f8����������������������������������0000444�0001750�0001750�00000000536�13574463526�021424� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xO0 {-f׉w(˰.b+rbAqz){z{?! "U!2%PBXR5U3 jzآ eU *lAVRV=Nvc曞�wv3u[TTRMO<nmX9uv |qz}~y$!<g�ȴB$t|uwކ,ŝf~_L&_eЍ<8 ӱR'&=8?Kf!-!fs@pG= y67 Wg!~q������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3a/c2ea97cd126d347386e50b0fdaa2b0ca059864����������������������������������0000444�0001750�0001750�00000000711�13574463525�022301� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xˎ0EY+zD7yu'i!Ċ pJbƉ#!S~Lie֩c+7 &w!)JZU\i*r-&5DLQu jyQ#ZP̳C$Uqrxpڛ>st4vLCQsl<IW4gy]\2D3Y5<MGDG,&fd !z3vAnq\BLrÚ@ZUw?{H l)e5/:kr{|kqr3i"Ło <恟"@c V Fk,}ƓΟ>ic-& 0@+ #ܐy/wJ~4:}3E"+wqvS۩nK[fgUoO.b/>?dnryB0Hzvۜ_`2.4�������������������������������������������������������kw-20191112/.git/objects/3a/b886a8e436a51fb1d0f814ffd1d63c6e885463����������������������������������0000444�0001750�0001750�00000010456�13574463525�022262� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xZksȕ+zU%3hd9f^yR5/r dϸ6`S >=Y9ϿwC(}VŏYYe ĮlVV벾[dZN}me}geRJ?6sퟸ ǁMM23,-D6+S[9d5u_ZWM52=/y?j́3S&MZy.@s]_/.W޼uݭHGggG".^Gz2J::MYl2u@FζYF/^:O!k+V+[/ITm3u,uZ,j㚺@AV{U榔#NӢ0FǦOMh,,yVǭk<?H0h dr""Ha"|~x{�.kF[X7Q*;f;GA"K-m$Eo-V7m!!ah 7gۋ),daڬq9닙~{5=勺 h}3~YSx#%*Bl;~hSUN(WqHcۭ) hn\OQ98j7e+HaD]D,!& pmt760s/^&DI%ޑWmFA^EY)9\#mѨv?ꌿ"94ͩ-EuH`)H 0C%@Ez4ّo,hv s*mYӠ6ҹXhxtUE']!EAe, 7�CY"l#3?[y"jbqڎ`}MV"{V6(L'n[w/<pOxt4Bߺs_]^ĉk# GICf�5/a72Y i| 8|ڏ6niWNL7Hāi$H[%CbMD E>/Iݞm ^˲L ~}ِ̀U rs RJ22m`@CN¼,\d'\̦g'G 0Ǣ.s(&Oő.++д$.,3Sx6|^;!B@4Ƭ .Z/!&<PD%몝gn}2BXoDl^!nC !2P) d&, D,!pӸYr3, Uf6{P0Ȓ>xuxs&a3[ 1)N}cF(rx6i^e邮qݚ%qX&ByD9* kHE[Ue͜& Q6|ȶJQ4K5sq7x;CO|":%RLѰ BT) K5 -kCehHԩ^SaN0[C8#1k6]j:;9$Mwi%b]9یKPH�V�J1.|vߙy@<|BlYNC5�d<dܖp +XU6؊d=OG<jnpXh 8yX 2�Pnvru+>Z|zoQ_oq߾pRl�IE?Jb]R22]4PX XXo@I,G,!`B慆&Vw4|D(1RM%MYhb;dExv`ZhA|E꩝NPS\{X+_Eѳ5PmPcu(]v㋑^ 鏢gܛ7`-\)xÍ+& !-So $<;$Et4uS!'ms7C < %Ů6]-ZHATte `]�ͩPDs$>#ïG-UBӢ,vE!M.$gZP y:xEmYpo*z m7p֡Ɔޫ;-Db,-�~u'{oNf2)Wui<.IR+ ~g-X ˇ)^�+s[$XeA^VH@�ܲqK±Mt~tvYh2DߍqɜPݾG}?V? *<t X8z.A\$ĴʯvlG0=�] ݗ]z8mg5/ڔ& x ݔxIH2 ra gF} J߭}ƣT8j2׸ 8J1xM0Zg3*&}LIq2- Y9 0MhYfn uyO)GqLk lL[N@ ݗb'5)*:**܁`<פېI88ߛ>a\w/1ET2w'pېDWtZ"6;#EkQc86dvPm1/ÎU:m=4^x(-McL}cŀf@Za^SD=::�ă>C J v ]%o*wF3v!Z +p:K :cE[?] JxD q0?}pC<|l B<bZ!(st/ƢH(R&D&us.ZOn5Zܨ\wkQ\v2mRa2y#/$ ^`2\`&H4iwnV?@{g"Dx',D[HaP9 8ZEh/(ӫs �)`%eKݿp #7ؑHSf6D{+<C�9pOxdˑ4;&q=~F.-Z̠/5҇#YEUc`:_ wN'_J/|RߟHq6@[*HKa& Q~n)SxdH}1\=8#1^cBl'{)!'x&@avY' -- nږeIp�ƈ&[R8KT_#tUn3Ox42] ^^̮p= /A/q2͎L1Ny;{dJ8f`&$} %^ x, ;|�lxJ,z}ナ hj�!և?MgoN{2Um{^aEZ2#7TDrwSDQ86R`(d`IcUElގ,"{�%܂쐉@YUH@e *x po[,[ =n.Im<M̽D-۫~/f70;-|=H?[zNcWSz"E^w1ޱ&vra.c~ukN:8`nCo7C$9OAVKmgxѽ| çէAcipPqa@c+.sx%3__E%h߈7},<[%Qxq FuBd/ټ2C+\ל2yevY<ezI5/0;T,{^~wޓ 8{r?3#CbSOy+@O@7MFf&Ԝ`F<@5BH1a;/`t%FX<`3N~9:<=ؑz aSV�f! EEQ xdT8Ri + N;wn0D! SYܪ "X\` 9[pKtDx2;?9ݗg0c{ٮݥx!%@y+ۏé'윭9WR~}{َiڎyUp<\W]/ae +ciiZ'moa(F#7$V"?~ASS '6ˆވn~6 nT rԯa\aJv4.m3k_o{-ژo:(㙌L$=I<bd\7Af`_o)}5_U8������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b4/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b4/7680364694c7a4929cabe8bb55c9feb89a2a5e����������������������������������0000444�0001750�0001750�00000000510�13574463525�022343� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMK@=ﯘCV#"xQZo"$[6"w*x}EXqz"Hm qRy3KieKd8G!;pPRh 3a(,j<9|U*J))>ڛ2ez ߓ0}uWVL JI&҈(2J0]f 2:?/20FkyCTa}1h݀F3BRr0uR#inn!QDL!Eq H&י: [9vk[T)t'����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ce/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015171� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ce/598435e017dc5244881c270ae214fe68d4e0e5����������������������������������0000444�0001750�0001750�00000001011�13574463526�022101� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3,]l_6߄_|m-D uZ8go'޻~v������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a7/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015111� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a7/4e58efd7ef5b877416b49a025e9aeec93e0a0a����������������������������������0000444�0001750�0001750�00000000457�13574463526�022504� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xP[n 7 $1&_r 6.ms+ۙΎ RݥHo00FռR`"D(Mu߲ #YVbK*DYٚ7Fk մP%%]Bn :?1'ڛ=qk�Ul ^,9k`;8\>񋙿|؟t׋׼lb6e`ra܁&4W<x7^[uN󚅦0m]x%H1)C e#M{.K֮V>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7d/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7d/ac24b2eca47b096fe236ac2cbf5fb5988d5c14����������������������������������0000444�0001750�0001750�00000005647�13574463525�022555� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xYmog9Jفeh*#V N"M\I(R$8/.$NSٙg >u3@G| H4YZ@$0wz(JiHsœ҄&*f M&є6&7 UZQ_B~8sAffNgQF" $UFLQ*JJ2Nht^F#G(VtCR0S<h")cAČ,J4.t>xQ~ٟllovd�e;(VINPs>d9݈Uǔ*#g" 6,Wɖ*& za,-X;MSuGvW:uqH<澞@Ʋ%;k*Q}ApIwbj8TƟOjf;cgfpz3[.}czS: ;1gwoQ~ χ_pPa2_vGRM71^;inu5G2Lyb}~ g]'L_~w=SZԙWpVA;O#�r:Ggx7jm ,搸6趾VshE )"K+YSJ͂ R1ء.ĝwex nxt%4"Qw}HcC:lZ||wF,gokʨ_U Tz1jTrrk WZ U0K϶RlPr۵7/~sXЭ+䝩~J,>%˖ Bu;H ѳUxݟ= yL'p6㘐@Cg@$gJ̟=HEkSA]s�V"vlm:_5&~0 kNfβQOQF_H3pE|fj/&!1X!nOqtA|^6HGxWȑ0/zB u&jԡK)fEάdq XB.W:ԫT? nTHS('' \^Qshd j0at`~nKfb$LE6Mw@t_I  IoTGZP'dǝFE' E 0tp 3Mt&TyyG ΄JŒV*)]E06 5HChlF$ N/ӂYЃ8E4ɩ"sqoGWF+]{ 8YJ@D#!*K23+9�loe[3ijSNǨ+2Y|h_+>iTx-^Vܐ%%~�7| Μo|J;Y3Zu >)G8hBiS U:sC?* {béOQ006?~sF8r ;F̖|lTQ.دa"Q1Huq5CgB:\ݮ|)|>Ig8Yl2N@*;(@<3܄7W;(Jb\ v!}Kjt=0lLY6,6/lբ 㨣A#BnH?_OPgQ;c+}'S떍*T SW W: {peJujևvZa +ާ`T9!jJ4iPƖ6#ChFs.8q(M X'4FE1D۵2OΟIr[hYghKMBQ2~¾%%Ͱz-(P n#K_,j*(OdЩCgh/e"SB GP]lCDX4}` A倾|m5'.}EN�WMq-QvaWiqYi1;T9mOd]FCp,G3hØC =H@ hvVx5͈ގ.O_8>]Ύܾszu^8~ARCV[J0khumńQ*׋iꅅ?eїyo%ih׋VX~`j[6x*U.xv\lPl- 7bK}D?Yc(xr[}_B{Xc~ķNQE^v 4ْKS2PVuŝQ徿r?S{]~']|5Σ.@}yQ !F%WQ"A thʤ n3c=yDt- ui3;q]\f,{`@_[[Ti"m<G8בçgo%5ܖWr@M\A.eؠh,!4mpuNӧOe~?Ƈ-ߩ5rtkUۨnj6.6V#Nmbz?Qڰ/wAK`̨/ieK <~zu!|5vö Kh}z JުndB;pED&$&l<_89R&$蹠-?G%> 2/ed IWztlBd֙GL;2ࣂkYQ^9tlrYa>gl61 n#DhF!viog<ҡrh.Tk-4(==B/BmY5~.nhi%A)',[6ŭ**y̓t؄]"Ee~R9#�����������������������������������������������������������������������������������������kw-20191112/.git/objects/7d/cca39b59aa940dd26af5790141af6f448c2b92����������������������������������0000444�0001750�0001750�00000000257�13574463525�022330� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dp땱ޔyZg=]'hb� %y% 2vETY'gRb%sX^y6 %3/%Bm/S0}oD)y _\~oƕw&˾g�q%H=�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7d/3265ada28ede74dcf6086bbdae8156b2f54979����������������������������������0000444�0001750�0001750�00000001011�13574463525�022414� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒ$UHo=YԺ|7KR}4Ka' x)UP̰c}͚i Dzlf\y!�!�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/cb/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015165� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/cb/22b9bf12c0e8e408c94f40eb0cea810e801c1d����������������������������������0000444�0001750�0001750�00000001011�13574463525�022422� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�r :۠WY0ěy) >~ڰ~{sWX*(JfXٻ~L绿t3mN Z, N<e,4rlE/�S�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/cb/85b9e8dc123b3f5c64bac4e7be4e7833ce2f52����������������������������������0000444�0001750�0001750�00000000746�13574463525�022555� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU054g040031QK,L/Jei>ϼ8_Up1Rl@@}2b"B:0L'f|g2dzcn}PBRifNnJQnnfq2ix?Yjbl>[p8r6�BJjAN~e|QiNj1{q>;?Tt:x6#?DYjI2ʦ[(6r5<u٩Ey9%%z 3.s&4kw#uM0 ZkθU˖./N/KKLKH-Ie8qƷ˄T>|faׂPJKR!6+L]UVl9_oUWZRZ�rcۮ|>@x.ěy) >~ڰ~{sWX*(JfԽjIbj'hJ$@d`8k{?'_Uܵ���������������������������kw-20191112/.git/objects/8c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015114� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/8c/65eebe6865bc317e50d0accb9b73b508474cb9����������������������������������0000444�0001750�0001750�00000004554�13574463526�022421� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xXs+[s|58Lg:\rav2NjA]vMh. )3N@y?4̌ߝd#[sm.(lI3IJYSSH*R2yrrJ#ߒVDJRe(KYh4<~|C/|!"IF`4Ey$T:.i2[;$y)WmY0J z{L*=]TȲ*uU, i.ٴ{r +ϺGc/O KaZp~Nx㌴PVk֓TtGdjޒpDFF-N@d֚80 V :pڸʹʜzBOVdM.|xV.=f&f֦fipe2:vvnV3͜VV<1UJ z[=Ikڹ,iail2g'_N2,zYo]nּ~mV"'Zm/ •Js uE )j9o>}zˮآotyI4SD+IIG4jZ7u y^腼KaDO< O2'͵W=[z�s*<D2rZٜ/6Qv5 f5cQ+�KI@Bb^Dɑ9hPzEBPX1uT|AXi3S`fbޣ|@ H$2Nk4}M~~C:nn1tL~0 &ӛAD98Osd-?VLf+df,)tuգ( /R%6YnJ'Ch#fR,,_%6nQװhrlR^Ӂ1PiIN}Ԯ?|@Aèuŀm:LkI0XZ{lqaB 5 P}k΍Ҋ@Q#Ӷl%�k_UPeFe!%Ɣ Ft8B؏IQ3Hi泇NE0$ԫ0e;)z?`'**ef@v+Q~r'@6lumsjc4XR3Km%_iHBNF{Эw L Kmp_;.l�BV&!v[/'2ctRx?";lOsq8MǶ:T2v=[$ G܊'Lت8ww+N܂۵cD/vR 8 {l;=PEQe|lˇL͎mٸP h6G;_:5�|X[1.3h|gPS<;pަ &e.�Jgj2s<9fJ`iIr]'6.Aa*4ZATG HBM61*r ]:6wXo@i jPqْHEr+c|7Y5w9Ԕ :&].�q-MS{_ R6O+�Ѭ)h0A45Q)گ[u% H0AC@*JL/9w{Ƈ7 #.?ǨM?sZQh4,z'c g]{6 Ԏ nYWRJztoNԌsfWzHV\ǡR>⽢f޶(y?ax3aoQ4NgCseW<c?EmsyXWE InGDCޥ6J��lC/F8Y{ixAA{E#[ =EjW\pꑫtc aO1$*{NS7t\S Ksw:ʆ^ͷO/p#~p#7/sGw0X$^PdϱsC g.AĔo>pXu|g__n TaU hy.!xb02nr1 1cpVq/3J I$۶2gVdr00XfXi~*sT,ۼq̪9B-P ?3+~x7VK~&RSgD*7 MЁ .c:8cojr0Ȃ]4-Fj4(,/4pىɍ͈*΄~dl,c]yysG,ٱ$Ԫ9s}~Zh}sŹd, ^[G^%rda:E;����������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/80/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015030� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/80/a7d6241fe1a507c195e7cce5eb8dec4cd997f2����������������������������������0000444�0001750�0001750�00000000426�13574463525�022501� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMK1=W̡JM"D֛HI&mp7)B= e󾼔. Pbq6df +dHhW(kшą 7�5i%=֞ +]PR% 3a\M%$΄Rw % a.QJ1ѩuV!L+^W0 RBɴ{yz><>mXs d޷fDS֎uHQBlB͓s{\Y!�dP������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/21/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015023� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/21/dd3cf7bef16c24a28ead0b1c08737b3fc2420c����������������������������������0000444�0001750�0001750�00000000634�13574463525�022433� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KuGf{j%*=h^f^ !6ܵ(~|{"9ՔS�ronJjd~?J2Jn$e]oÕdL9{T5^ifQg8>0d&dKd8o*8`^xQkojrA ,<!\xAYZ_ߺ rA %Wjd:wݞ�4`����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/21/f1f88ca0242d02985e3a73f288f60b139b3299����������������������������������0000444�0001750�0001750�00000001010�13574463525�021737� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dތ/՘~*, N<e,4rlE/�Zz������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a2/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a2/b2cff5d5c037426e56c03be153d1dd41896b9f����������������������������������0000444�0001750�0001750�00000001012�13574463526�022310� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ</#uwxLFEgD]jI2ʦ[(6r5<SRstg0̸̙[Ӭݪ1>޾ 7i3lrM0^&9ݶA!<(;-'\/9?/-3]/"1 'J;.R9l] žCM,*͋/I-ج0uwUWY)Sc/|b"T]qjIiusڄ|a㐝lgÄ}_ ,/K)fA/ӆ[*TAQ2"f:isMŧBd`p,gd4c+b^w~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a2/6a95d3137a48fe885bb4bdd22277299bc53e3d����������������������������������0000444�0001750�0001750�00000000365�13574463526�022257� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0D 鄐4($I$(Vfw48R@VyVkUk\IE 6c@m[ֻu6 e%PI4jc. NѧEC~Hu#Vs \s9[隴<X\kbmz200u6>dr Zd8yX8 ϧk7y���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a2/098dafa69943ddfa2d693ccbec543fd1e5f6ad����������������������������������0000444�0001750�0001750�00000000634�13574463526�022714� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 'Ri)gEiij 5/JO-WĩEȮ w-)'ߞȵFFF{A5e/g?h怇OrL-=ba}C[p% SU~Y"Cٻ(p%9I 5>1ΛJ84X^[l4ΙLvbDh$ rA %Wjd:wݞ�Ø����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c1/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c1/5c21518a4e822e89163c676ffaa0fb79cc3556����������������������������������0000444�0001750�0001750�00000001524�13574463525�022172� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x}Umo0sőFI  E!*Ce)Υ5uviiƲ}i7|s=i;_!N^:ՄaTdY7ZѨn +mR.P.)\~�BûǓtZOEz0!|!,D�i+ j ʃDZa 0C)Z`kzXMu+ MrpVW FIJTA @P:Mj(օ.Y Y:Vl}<[M;H*3B_c=v<W)v`|d=,8俤BCS2q$)g\$ݷGhHɒ.Hnjǩbk+_̼e~*`YECVAzc ._1&�BH&f_Aaho苫Cs0>5 19-e$}Phno tn裾kdtM! K= )Ohݴ) }e춆.P gB.³UlnU9iHqMZxTy_-w5l9{Ȟ6-JjŎvᨯ@8UdU""W[MM715$Ώ/gŷ8ա fABx"_"76\rq&ydCޕ,9>_N>9;ΰ{94[J.Eڏ2`$P<:\-e#_"U/2LPm$i4! 4;X;qzppg ^yjW����������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c1/586221c2af23c74ebf1dd404ad61ef7ca47db2����������������������������������0000444�0001750�0001750�00000000460�13574463525�022436� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmPMO1Ii,//8{BJy4vu v`z3V-YqҪo_LyLk%ٿ@Ȭlk镩A]8;f*\CNxz=Sj4F Uv IO;i`,TCP)"\K6)A"8N8`{U7Ƨ,/Ϗ^f ywMF Gt+*nXhYĬ#)tKZ�$_1<\t*AԢ YYYj:V'*d]/cg19!S&����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c1/8d94a2cdc00a70c0040acaa9feb140fe917f2a����������������������������������0000444�0001750�0001750�00000003164�13574463525�022503� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWkoFg~](Mm" iPm"cx, K_Ό,Rxsx}~ԛ*j(V(9Wpпy|zs֫%9eCbtu=|9*ϯwߧ,Y"ӼLj]n!Q4 Ɠds: d:^-xp=Yaiy2? &nꗅ *KD!GW` ePDZE,7C<'籊ƁLҡ…;s*аH oeWE予CWɶ՚iTB~E-9u=Q̌V$EeNiS $8]\4\7IF:VY"C+VM/NU' k}t\iRk=W@uskAd*1JPi"P !U,Nb[$*VFs'!>QԨ3N(Chi!:k) D,`[Ϭvnˀ 9*yZb05au[B^ nTQ5l;JSI{ .YA{GqC>|J!KZ _lS_1mW n6mi8Gm?Z !O:tF89[-0? 9׆Y##NpfaNmcE*/[ǯz158zEQp -P$F0}/Κ:%1/ V(y<xނ}c6 \Ф> TJwR<Dh#N{۔iyX-SeAΙӭc8xy}MSC"nyQ./ƸF?f~a2#X|$B}Er%D6eJ�vx&hajiHY&BT2sr3@:�uNCgs 9ZϽ=u9Tdohv"yd/ѱ1ަ>]+<M\DCTq!mwl9aa;݀}J_'MW2㕉qUdG+.0S d8  ԔdvdOjMfR0\!f!k8.M0$lNs =h!] M0U WD爚}FmFoLԟ%LD6E0U]C[B2I,WZT;UxOFOz2w<$ohwxRR_"Vscv u4!Ml�:f=+t õM#MuU+9.׵hfK-dF�e|/`~-.D.KRX? ؔ$b0-U{A<1�3EN<ՒF\&K7$W2l6> ؉x8ӳGoIF ?%4E(3aV=Jdq̈)ֶA/`dK,ӏ&HHO-�5:9T6)-W3:~[ʂP~uī1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7f/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015116� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7f/8c5c65cc9434575a2bb9e395869be0cf693bf8����������������������������������0000444�0001750�0001750�00000001012�13574463526�022300� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cFewRWCԥ$3pޭl LYphѿb#Wσ:+;(/5GhN^q̘ ;5ڭHpLi9&<TKe^[or/Xm4r2R+s rRN~d!2!6Yص 9ĢҼb SwWu~"05r)/B\wyƉ\:</!,/K)fA/ӆ[*TAQ2"f:isMŧBd`p,gd4c+b^w~� %0����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6d/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6d/a7f8ccd0f2f946da7ef019ef4fa0f452905399����������������������������������0000444�0001750�0001750�00000001260�13574463525�022425� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTk0gW7v4vRXal,FҌ~ȂQK-HF'd9q]a$=St>ߋBESNc!$J2L9IhBʠ&]ZGk,ElV a=1N1Oӑ+,F u+~I^ jc0{flF&;nJ$ȴLf;R(|e NUp `RA p_5zEǚtG`rIܡ| '\K0- (n*Wp8_罠OnΆ?.+-Ёu[߃;zQӀ ëF謤y}пXhbt<NyY >RL0+sцuԫbuu+Rb!c.`x9(<` Gbh~.x(MGT<ɡ=K1a.j"JxZ٘)Kawl-݆avY6rZ뵱Ti| e6U z{h5Z嘓}aC'xt@Ӟsظ՝<0NƎL ­]ؼQnczF XYtǝʳ;ɞd/جBig[ %,  ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6d/1a3f1577fcb0e740388cb314706958a66fd72e����������������������������������0000444�0001750�0001750�00000000552�13574463525�022116� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQ10LWlERdA)|V&$ʒ߇9$b13;;c m]L}߸\ZEV645(M}P8vV٩+2 Fk qiZрcok4Z ; Kd8E; K/pryA?m\B^ZJQi7'JU# -%{]Lba6Q*`"4sLɲ_?א^wXm~+CʄXp0Gt~{>3uUV:Ѝ3ӳe S ρ.n_8$ZĉnE?aE������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/68/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015036� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/68/449e0b875f77db5f26ca3076cdab1bf6a97201����������������������������������0000444�0001750�0001750�00000000521�13574463525�022246� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMn0 )tMg`Aܠh堹}OТn{HcT{R ,3"գn8LV!$)V,*`7,5֭lt/;&hBB唽=߳-~_7"8Glr|�8ȡ;85]ӈ]WzaX14Z?;$9?_Z@`p_B< 2pէwv{'l]N\YRdñĦG:fx> ,~,vʭgވ{吙 _e/ċSv4_7n�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6f/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015114� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6f/48f1796510571e6e2f74d5d9bcdb784f2b75e9����������������������������������0000444�0001750�0001750�00000000474�13574463525�022230� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xIR0EY]a-[($\@C+QŲ#~_]u79"mѢm5gtPJ4  1=Yd9UkN)zrTKfE/R e)%C]0kA% IWq /ݴCx?6ctnXӐJkbl#W/~,Sx%"!/GY gluva%"Yq�7/Sv˄ sN%B7h V1osAN굮Ғt~12΂.!< n[ ٻÌf]h~?i����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6f/d82f74dc88000d9b478312f7bb5092fdcbccb5����������������������������������0000444�0001750�0001750�00000001010�13574463525�022377� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d4\==ed2hAd`9/q}M Tgg}U�#������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6f/b99b4d8569fcc01fe9f96d5794f4f62c665bdc����������������������������������0000444�0001750�0001750�00000000771�13574463525�022463� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗuI`T\ y5++|fߚEU}5\i^Zfz.\e OK6Lέ@V•Te >- dҴ܂Ԓ<6_|_$$ %=$>713DS(7g۲vP9p#*mNۯFKoAv{wIỴ; $`!~sYЧy\|ovSdԑiR j \]Nf\ጐN6\nb� ʼn*fHpwQhXд%0o 2t~bի#Am,-)f8t{R_:Z(^\��������kw-20191112/.git/objects/bf/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015171� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/bf/c0fa2a7f949197e7be0797e9a47ade9d7acc3e����������������������������������0000444�0001750�0001750�00000001304�13574463526�022651� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTMO@yT`S^UHT)k{lٍ $ROqv͛踀O\;xPRw-9pkp;hAu!9bs P"ِeFA*V u5[pdw>%�iZgU\Q]F *I.$$$d<Z3X Z9(P>Q鍦N)=eБyU2SBF$w=<Du+^-ƋȽ=T\T,cOM%*fY8ϰ2rf+]dcFd $˛柁?@' 3p(_ 3@< r$˄w7PX83q._ؘA=% }Pnj6B^*\.U' g֯x J]y=t EN� YL^H:ilTŚP*P<,qzʶ[O^b aI b<aszmSB3([,Wj[8t'FLd[,5O@Zd2 CaXŹR**bs죁yZ!_aM-ȳU}y,\&M9J$Su"/NmevO<TAvda";hfR����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/98/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015041� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/98/6b546bc43deb167d00961acd195fbeaa4b7595����������������������������������0000444�0001750�0001750�00000000075�13574463526�022332� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01a040031Q./N/KKLg"fb[~ݘI��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5d/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5d/413873b77d2798cd63c799c6a49cbcb7f4b065����������������������������������0000444�0001750�0001750�00000000205�13574463526�022212� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU046e040031Q//O+)L*-I+*.ax]|ҷOJВ)dvUW\Re,W52_WbP-%%`E{w.8xą)F5>u2�9�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5d/89e396ac649ba132d56a3524d5b34a40b600cd����������������������������������0000444�0001750�0001750�00000000635�13574463526�022152� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 '҃I+/{em%SKe�qjk]g |ɷ'rџ#^PM9 ɛsSP%9>rL-=ba}C[p% SNqk^.yDөN.$l ޘ M%, /q-TMn6H_[&S;1"4` Pe ǒ+vN5Hph;{n�XK���������������������������������������������������������������������������������������������������kw-20191112/.git/objects/24/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015027� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/24/3d8d7d3f368cb696ba203ee6ace63c054f6676����������������������������������0000444�0001750�0001750�00000000062�13574463526�022254� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU06f040075U+`{@/yM\_k[K'��*G������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/24/81d898df41b0c549813bf2e491fdf9e2bd4812����������������������������������0000444�0001750�0001750�00000000666�13574463526�022211� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xKo0{[[)ɔd#([R"*.qﻶsh9rDwN|( C(傫4м}߉vza'0P{.+݉qg~лz[,1Y dxwQLƅXQ+bEO;s-lO$7G8?]J~<qҭ MݽΧv$/A^D]=Up�CINzA2xYEΙ_P 9=3YݘfU/ 3;9Dk72xgԥou| ,1y2{M\Xw,VChv+9ޜk&07=ӗ (MѳS>l+喖*z7�E/]ή,q~x+`1:|��������������������������������������������������������������������������kw-20191112/.git/objects/f0/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f0/b3a8e8e36e14d406aa8b538c06c1601a7cdab5����������������������������������0000444�0001750�0001750�00000000507�13574463525�022360� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQN0[N-y8I]!ĝC�ĎnCV +3;]Feq R[QHTU -RK,ʦmJ$\Bޱ.\"n6Rm#\вH;Tvް=<#p<xx+~B;ۼRXU=*6C[ÌQy&„A6,#e=@hzf;G!^Gn.dWM]c& Ѐ'z0~qGC=W-3``7gd@'3ˤOKCS CX j{GfUw~ag;94�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d6/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d6/a8478c0cab838a728590b5474b904c602e55a6����������������������������������0000444�0001750�0001750�00000001375�13574463526�022037� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVn0Y_1a8"˭QqP$*",.9A^"dYyqf8I)wGVBu1-ô-kx!*eUu58g%G"dCL~* L5pS !g (h!)Y $<]F8y)Ms+RcUr)1" "VAHi8C4892SX%0|.^|suAҒa"VQ/VrhgwzSV"Aŵ.O0g-7,�O}e=w CyfdIԖXOQ\.H7qas2 ЭȢhwdڼ*61ҦϚ$}mrɻ0r,<a5Hb9.꽗)y..Ads,Zo HyvIVNN&pTk, HBCCM+2T@孨ꍨT1=Gփ:uJ^L{VU3USKW^@\h;̤]tcc"Ɔ. 2<k z3W߫.'_T;mݴ5Q^,:W΃R-#I+__^v.l*,-$ kPp~6/~:]H[fȕkw5 ̱{6 pr_Vp�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/14/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015026� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/14/eef76d394fe168fc12d2193a1442cd9522051c����������������������������������0000444�0001750�0001750�00000000502�13574463526�022073� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmQMO1_$Fl 8oJ6t۵E - ^y3ׅ x~zd Ac=eSiJ685e me0+kȶ B,߻yv4qFsJ}:(&+<*ʤk9 AA<FX0Y5_AmWI$:QRv7V-y9j=8Kn4 xe?˦R~_ 6oxGj".>אltM./5TV l����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/14/0384c2de7aa0f82c1ef51e125749a473faffa7����������������������������������0000444�0001750�0001750�00000000325�13574463526�022314� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x]Nj19_1!n%*7&k ITY 4f޼OT\<ݙk%V!gl[@]tGI? mWb(3&lgJrwKQA| zZX7x(!Ťr![t A~.~ p(>t.W�b<B0:ŎFX}}n׏%ˮ#S�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4f/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4f/0735f9fa64df84360219e4fb816d1140dab76f����������������������������������0000444�0001750�0001750�00000000477�13574463525�022200� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xn0 wS� )Mq FKH LNX[62b3"[Jk $\+FK4˺(m\-Yj֒P ոʢlP"J`)6}c)÷6 ZkU骔0JJ1S̿L']a=c%Q1 Aюaʏ~%4p ޹nKSPa\NfC Ґˉ8& pD-/.%z!x1xbf}e^'y!=<6ͼ>o}oѲ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/50/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015026� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/50/a294ce5b7b65e6462753a61bcc2e517dd5170e����������������������������������0000444�0001750�0001750�00000000772�13574463526�022163� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗu.q§n>H_%hBLbңo'眝*d&Re)\i^Zfz.\e OK6Lέ@V•n; )"_1l9!]1�4-8#>9? '$3?rAW-;*y&{>ɂjIO-M+b/}d{ MٶxTgFjNJxA[Pu sҷnw.-άI=*X\);G+=~n*3n=<Z'lu .'3 pFHMYe'^ omH.f71�DPX3U yԻ(G,MhZ7A sU:OS Ke6d3\o:T/O-/Xrko�<V������kw-20191112/.git/objects/50/58046f52532c29463e5e05220f232db39d9125����������������������������������0000444�0001750�0001750�00000002553�13574463526�021520� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWQo6޳Uv6mAXXI(0Ȣ@u=o,)=Dcn*uC/_|l2?^KeE4]O&gV TjF?c%Z)ܭfs$w4n(wF].$4V 2Ԯ34VfdLE5dzͪ*y;Jihs+UMiTmM%h4"_YYRFZ. Y#C,/e-G8Vэ1;Ysgߕ>٤Tƶ@64mH-m _sXytU*Ϫ64~{hQڦ3gƯv�\5V}eD1Gi"o/ގgAv Q(#7qDL\\{"ӈ\.("g"KKs!9] KXdҷZ vk!E@nD-ȽmL{!ƔK1*e/ eA<D#Hosj!{Z#ꂗ(ak e`˨c`3gȎj}!n|-<<دR,W0fՒ: \+Kv+l1_HMX~,Amt⺔yDXʦGqgaDȌVkbFR/5*g6w"M6|pwĦzz69L1�*Qs;}Eݡ;bE 'ATB Kj dr-K^| C x@j- Y :6/E~6aax ʁ2ܽt=bpg^{ND=m0 81 g߼A54-I Q %% z<.)+ ɴd3} 1Niܣ{K9gѐ^qX4~oϡm蕧;X‚ŋ=?(U-*HD$YTgLx-3gɬ7gV�_7!߼'돗ظ/L<Ԧm+z�|C箰5>xQ<8Ć,l׮ROOz+j (npt  hQDGʜ53D699i;~ҥиD絖tX eѷ(ޅkqsq^gmw;[̎. OcK=Kjap7D{JT& [MD_w;|0B]:a:_4Ýw 8_K~Pxͦ]F8a$>JPLޜh41p/l|A/]c�����������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e6/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015114� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391����������������������������������0000444�0001750�0001750�00000000017�13574463526�022337� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xKOR0`�� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e6/29dcaa512305895926b4ef5e8663fb8e0088bb����������������������������������0000444�0001750�0001750�00000000510�13574463526�022176� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMN1 FYX*L'E!!dQNI<mL\ moO U>ɳirZHi;S˦ƪZˡiiiJYmɢ;2tB5Vmߏf7RimU5얭Ʈm_9o8Šmtk7 'ɚ Zֺia!奙PV5U}fDy=u O0@Rx-fCfl6Lt,nÖR>z9Q-@~-CQ p:rqy/ī;m#ŋTwd<pQrJOGB~ws9!RC����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/30/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015023� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/30/37782d208e5d411f5bca3d22d23511fad61b11����������������������������������0000444�0001750�0001750�00000000206�13574463525�022040� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU046e040031Q//O+)L*-I+*.aصM iRx yM*+.IIK)̓Zvcgǜ37|2ITKIjqI1Xk-ײo|6Q^ �g9������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/30/3947dbd5f304c4651c7ecc683ccddc1856abe0����������������������������������0000444�0001750�0001750�00000000416�13574463525�022375� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xAN0EYsV BM{=I-%Tsp1RĆ,{X`Tȑ^:[U+5\(c3x5[ںj\ݡT:$&ˁ3)w觙b@xE~iBמGj:XI-XBvrL1/nLoêu6m>J\bDDNB\5p.?Ok!qLV< +W5e^{](>]��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/30/b5433274ed7e5d348c47d4ac10b5fdb93d2d60����������������������������������0000444�0001750�0001750�00000000510�13574463525�022224� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0 9),qi(kE!!q=[4I?oOE?ٟφePˑZ(+u;+۠ƪd?,:U' {2,av0ZRȺ+eiW.m+8-GXn~ILּlFt )sYK)JZ~Wu4 (OG.Sd(%g| `dv{f DBf# D vk-$%g@fq t*rq ě;}#ū k d< s}~)\9M.RXc*x;@F"����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/30/4e03c4be9d2d347ab8d2244d43f77ea2b509f8����������������������������������0000444�0001750�0001750�00000000425�13574463525�022237� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xKK1]WE<f:iQĕҺ)48LP+A;CJɳ�풴C!UEe VXV IZ 4&W-Rޫ*ABJ-s$fƲK&1`]MM1 +%P0s6ѩi;$?6d\Aq HfoM )&B r}w}x|0>f'&:ȴ #~ӱ̭C?ۄ6':-B{!\G�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/30/66466d2abc288ce1371c1c69df315c5144282e����������������������������������0000444�0001750�0001750�00000000634�13574463525�022017� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"K+"˦wNc~|a6"yy%@Zpע_~\k*odTSFjNȩَ)R{v񓍆ox*.K*q,>ޒ#1ڧ>w W2Qx%?D͞\�WR-Ἡ@{E7){@/yM\_k[K'@K;"u¡$M=�����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/8a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/8a/e100854285adc54beaa61f60370e9d7dc960d9����������������������������������0000444�0001750�0001750�00000010453�13574463526�022246� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xZksȕ+zUؙNQ*YYR<TM)"h4\{Jg\>sϽyVo?![+IGM۬ӲuօtbW6++[uY-r]\Ungup6˲>г2R_ZFO\x&&qy4K Ѯ?dYMEUyELco7ϿSe@tɴqŁ~?˶:?x+tW˫7/mEw(H..瑞L&RNgSy/L6墳nK*WSD&mlKkU &z6Kڸn㦭PG{ifjջ)Ӵh?;Lѱ)SS$-6Kq2O7&i\8vpfHo#H3;$uXB轣/^#˚VM ~hr79DtR8gF6Im#Gc[KE[HH,m6ZMY`!g <Y6k@Nb^ME]zw> C?,)| ΒVbe!omtm?)AOhy+sS8]֔ 4\ (5қ`X0"ڮF~"P86:9tzq sry٤H 6Q/h.ˑ˶h?ue":s$ZܔfqZw衒nb=HϷ|^;9}o򶬁iP[yz\PxMCnB*Ӣ.J@ށҐ䢠Vm�,K Fhn<CU]8`oylm &VWHy˽ +SBc`S7-Ocwwytf'< }LJ{!oܹ7p q/DD_ӵ#!xCenQۗ]e>}od�eGDpi+@'R$@{Tty4!}"TnOH/eY&ؿQA>WGzQflH*EC{P)Fg_T6D ˇ?e' a^ .CCEӓ/OfӳgTBcQ9|k اHGahZIuřzH)_V<gxw>! dcj~-H|qX QS(|u3{g7>c,7ubg6!Մ[plZBqju]ki,ˍG]*3yY=(?]~`izF_:\ ^9-ix>t[# Vf <V4tAW@ϸn͒`L,z[!<"ZK 鍅5ffNKKU>Od[@m%}9F8WkJ<g'>j?ArMJpIVhX!%Xҵ䡲C4GJTqU@-!⑘5.z5__~zzz*RCOVxi4yI1MJ`Ԝ\ham%t($�+�>R;< DDG]{M]Mb'!V�b2Uveyo2PnKbwDlE _ħ#[578,`V<a FBOۏYy>�Nآqg_Spfy`[�-@(5uˡs!ׅ"Xt5q!֕.%/E}9a+e0GgHC[ݑs /DG;;tlkz*ɢf@C!++C &¢vr;Aeras|E&@MrV 5Q 㫑^W {svt}\)E3rRީ8B>r:|}q G)$9FDdWȮ1lS4qz}Gu*z7�,%�耬)qƙKhKp(1Һ$B5ETTxXəߨXD#a,1g!MBBQ-=|)"Ɔi#MX'wZY ^YZY#<BO!0.ߜPedruMexv^+>ihZP,L. 6߁]A !&HJʂvk2* e#~C1�e0޿/K9}9|U;9V? *<7tLZ8zRH\$ĴvmPB5=π^`]˒8mAl50ڔ& Jx mI Vh9U۾F* ־Q*mk5R&>@XWGl$ްחi+G= h%hN1Y8^5|D@Ɗ-GNyK1ԓ LK E@4݆Lތ} u{,ՒndJRfz$�hz:6�z &ޒ*-wvҙnGonc;.&e6 -X$Y$ZPVm*~U k5yԕJLb9D ۘ@:cW[?] JxhD q1Q}7pC<|{iq B@bZ(s1ƢH(R&CD&us.ZOn5Zܨ\wkQev2mRa2yʢ[-i@%63ArL-s+>#&3?j'JԞ`,DzlK*BAٝ^00iH%�C//Ô^�̇S'<@DEJ[ %[{:Tdċ0'X `0!aG]8 /j&-\N Z N*IQ.}h0>Ut>f@h{ pʡ(p!(4;hM66&p!oR^52g|K4ѧ7M؃S0 96 v2xGo¦:P ojk:uA!মz 'n̚opz%=<dMP8ByX5Z_ui>Gy]#cvz{ Yۓ?]sGeCYo6lrAJ ReڀɇP�Ģxo!n�fۣNfm+L_qXF;~&^Rn g]F o"` l8 qj"۱ۀEc7D [Ж2Q#5\ȲLTm˚so!crG-%)4r϶%{{u2ۯe؞,7ݡzQ&bǿøw\RzJs[ZO(kF1;B.~Q.|N=bv-aW̍1|~Fb$8 W~Ia?/17q~s qT4x >  ?n`l|u%|�dhV (M&0?бEݱgJ/.6N%W zz~{S&l.v6+_,_/飢eƲ~'zjjˏz {20gO`F|D~Ql{9/{e$)Ğ ]؈5F)F8l,N2l2yGg';R1l]€ `k <y"0~\_|u G*:?d]DI`]U(5a0u bY L1'W"c .quNf'R fLwoKu/D07g85" Bʯt/Kt#^w:9W]/ae +c?iiZ'moa(F#7$V\D/c >aYFQq?bFm777!@2%L!)g?Ѹ͐�5~ᾙdc;/hc?@x܏g2J R r;`#o'q]Oql}! ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/40/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015025� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/40/fa32e329efa39a1591775e69b6e2b097377e13����������������������������������0000444�0001750�0001750�00000000722�13574463526�022040� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMn0)ٸbEA]$,(j(DI mv#7o0e?9ʼR1\cH]U!<ZZGH&pL5ǼՇFE%mʪ8pJMV9>wz#T/0lB`Uh8eM BGYe~=?r6a'yxgACؔ* c7(2rm\.,I,0xݣ>O*3ݜgcَh:bзߗ uF؝/}Kw`vV:糖=yPѥ-Ұ&_Ƈίko@>ovGLTɎ(>SDi@Gf ODۮ_𴢱1YЊ]!R[V츢w_Tv47f\OY//d^]gV ����������������������������������������������kw-20191112/.git/objects/dc/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015170� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/dc/678af1cdc911c7526bb90bee5dc46229968ee4����������������������������������0000444�0001750�0001750�00000001053�13574463526�022421� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04c040031QK,L/JePe0ûeKb+*)J,,֫a&Q(Fw͊g޹Up1Rl@@}2b"B:0~t8l*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cHaPؚNaz#f_Ԓd U>9l>^g¡ Pge)+`q3aǷYUc|}nҀ)-glY/w,8}_@./N/KKLKH-Ie8qƷ˄T>|faׂPJKR!6+L]UVl9_oUWZRZ�rݬת6Zm%?~I+fq~i^J1õ&~60U/ ^yx}9#,]`̈́&fi*Ad`X4\tu37egk��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/dc/663822258048084d18f880660ab5289e9065d2����������������������������������0000444�0001750�0001750�00000001054�13574463526�021543� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04c040031QK,L/JePe0ûeKb+*)J,,֫aw9~45*tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<=vs=^ZҊyZ`8D]jI2F*]6CIs3SRstg0̸̙[Ӭݪ1>޾ 7i3|z6zF謗;wXIzT>/h de%eV$28[B~eB*gm>kAsEy%*+6E`j圯S _+N-)-�nVkDk-Ƕ?ͤx84/AOoo{n}�RPE Ij^Bd`Pd&b/?��5������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b2/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015105� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b2/406e1565390833a6a2eb3bb2429cfe531146b6����������������������������������0000444�0001750�0001750�00000001344�13574463526�022004� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVo09ɢiCOLa)rkcձw.?ܲvi)&;_/*%޾?u:NSj 8"70"3j8M`Gr=>In?>\FO]p:ְ2õK4uzY1rm1%|G]p1F!<:05.sO\Z;9>7tѦp!"Q+㈧Z: 2+3 5N] q!JiBm.F-0jޅKB2W!'?!g輶a<lF `XT5˓niQ%H0k5m-\Bx.10D<ɋP4|٧J2=T+ ]eqڀJ}<-+F:IiOtGOm{}\ZG(ȷx{o#wy)AJ .jGk 顺_�9>&8FDw-ڬ=3�Ht6c[6[μψ\Ic'+ECM[(vq,6Euòdn`G`dr؁'\ہl8[ѓSI'R@#ˬ'y˒,UӠrCSB=S[`b_u.{ӕC̽h8$*gTQl>Tn.ϦXp ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d3/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d3/96b1910a2c4523efa0e2fc8ef3dfe4f40d10ab����������������������������������0000444�0001750�0001750�00000003015�13574463526�022516� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWms6g~Şa އ\Є4L d[` FX2}ݕdl].XGg/2?*\p."v:iY8 ~ǻp6<< Go^X_ Efݲ>]]*YKX(3ZFWֈvt6M^vr? X%_cy3O'S#Kwi8gh ͣRXniւw=z=L^"rÄ4C<gǘ\;8ÅYwg7:G2 �o"\ T y(bK;e)bV�}. �=8|xWll# DZD"´X9 ZAT q:6g,󌭢x<كA3G+`{YkOjs sлVfT0x'S,T:LU3 �_‡;$|x :em6[z9L. %'*&6cc4wa4‹quէ*e/l`aY.eAQ5pт_B"M`l$ƚS:BoĚ E10 ժ˝(sdHa]Y/C.97pʴ,sX!cXò0b .Fuv*DErsy:zװG F]v?zd2 16bgt]['18v 41^~ Y4yE佈B <Nqd\}=.L内B;j`{ǚ%4vU,u s9Zw2zvd"G&u ; l=iRu<7<4,dq*O" &7Ի0o Qӗ")P.ײС ԗ 7m5z(}sI](T\2ᘈH ?$+x//YAK@2.5?>i Qۏ`B,/j%7] $-.يS-#ZHܬ$#Zw"P|FwQaYD,eMtm*rh{ EeNi+JjԛO/is TviDi9'r]| 8)|gK=+>v"k&9CՉ#Šw`Z.$yfg\^˶G�-f(Q [+d` JFg{ֆDg6z>yfS T�7I4!(X0j .aZvr?lq&bhJhTJ| DOʜQO39)|3 h]skfT|kIo2OX(R\A}x ,noJ3tU,O@ K(*V _4 q|k"0ŝ?G_�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e4/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015111� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e4/6278141b7c8fb5c5097b69f175f027957e6f14����������������������������������0000444�0001750�0001750�00000003012�13574463525�021771� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWms6g~Ş4wl7CcL vWk0God I!vWG>s9o/9<YY tRb(ߌ.np;{m/Z|֫jJZWo3"r[FOֈ�tps3=v ky;OƏwWGV"m`a6x/Ƿ7)B⪔\9+Y+nj{L5e\r)ڧ^0t}q V3Du^x };{ؤvАIje3A%,"u:J$<T:^o:u�t/e�7?F){J4^S~|(bX9Rb@Dy%9,g8ٹ74gp0 =v.8RaU!͙M_tbT0'6,%("3Jz/GO΃0>2cmPD >\ ld1>I]Q=ZЙV94T% n`J{!, '%;kL 4Fš EŜ@kkv"T r? jC֭oF8%7aeIWDƒ2bPNUXfArd/OңZ"4 i[f _"�XukfZ#ai4l8bA˘c/yAΖhwHD.M˻mޝH2%etVtjkVgE\f33�~2fQ~zg5]cLH!8FB* U`84ivmFS`ɂk|rDwoƒLB޿9Iޖv&!aC%e[HKvaO|vB=KW%KY@'T B~D ndɳ&VA<хKxu3;׋B˯ ,}iqD])6яy{gr0w7'+/ EM'r ɓˣ9-8�A,M#bZ 6h{RD筎h&fB'`:~eNj9Ȗ\`F8#FjP\Ns623m\�6b3Þ#¸ ;Ix�9(<w$sʬ3际we[Yۣ�-7NQ$5Hs<_i,LJÜ%14qwH$$A$HmX {pV337k5ښdCFQRZ ]ji!Kƨ>0h]C%wVϰM@{P_⹬cʂ!Nc0w%)f@Rx cĄV.2.>cspUE$yp?&q\7Fy ZjXBZo2g|&qX����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4b/cdd69b8341996651f2005871e9ef2288df80e3����������������������������������0000444�0001750�0001750�00000000556�13574463525�022060� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMn0)�AYԏWQ \`Hd"QE{RJ}8x= Ι5oHͮn$TM ]KU!['t+*rK*P(lm]HފᔮasУ\̈8+CpdS؍ �E𖗢j`,8wx5rGJvȶ]Ƽז@<c?nЛa(B >Ht%pz>|.i9jIp0!)A΄?h)DØ t`0EHP똑@J&|thyE7XZ-DS$8_~_sfabzOzn-/_0ϱ��������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4b/892ddcf1ff6556bdcf62ea5c7d3f902b451860����������������������������������0000444�0001750�0001750�00000000542�13574463525�022414� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU010g040075UHJ,ΈO,-O-I-I+`RؐSQĽD=7oB'g&g$$gė%4;Թ^n\cPi+2?)cCن} t2s!FGq*>lns>aX'Ԋ"KuGf{j%*=h^f^ !HϞ2>{#)#5�ԧK4䇭ϟϜU]R2^<Ow-\ U R -d{WHSoocGo*()(}uRoǡ ʯ�A��������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4b/27f496f8ddb88b98026e96792d34b8dcff13e6����������������������������������0000444�0001750�0001750�00000000733�13574463525�022313� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU05d040075UHJ,ΈO,-O-I-I+`N9?oӴq+3jM8>9#59 $9#( ]νr}2LC~nn~^1HUЊ2u?+�\U^Zfz|nb^b:H,33̃//Q*N(/T{{tZmFFZZB KSKe�qjk]g |ɷ'rџ#^PM9 f;K١O69$\/-ı{KrXXhjV0\If>Ȕh+h0?OZWRsY\SOo U RaCKsUNi``b� 9y z?*~35/ΜlQӀ`M78V%~es'³,dϱ]S,R'N�G�������������������������������������kw-20191112/.git/objects/2f/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015111� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/2f/ab5c0ee0b5c2c39f8c1d827c05c6245349e792����������������������������������0000444�0001750�0001750�00000000206�13574463526�022241� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU046e040031Q//O+)L*-I+*.aygY;kI[7~鬁*+.IIK)̓Zvcgǜ37|2ITKIjqI1XQޝK;^:q}Q r �<+������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b0/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015103� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b0/2ec64b12f6da37ecd3af89d7497fe0b64e800c����������������������������������0000444�0001750�0001750�00000000565�13574463526�022472� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMr }�FB?.W,s4#jL�Y$K^I,&A״R =-P i=K9IB v@.tG"E|Т^D%5>",G(8 8[5P}ǻNl�^sa~dK8:X˂V::3Z"kD1gX=_Wkv@d L;Hdldd *c*}*ܮ}!g!LbLk$ƁϒneLkK~3D?I'fkAd?Ic3}`Nǵ{v؇8R'i|JT ᰿;w�������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b8/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b8/b4173f680feef38329dea716770e70c483dd85����������������������������������0000444�0001750�0001750�00000000634�13574463525�022212� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`\!1F WVZ֦u!?77?B<wVe-ЅKLMKLixeruWVy9Pũ9E`~oNK9(HKSK!x TUzj м̼ N-BvmkQL/?D5sD72 )#5�lGݔ~=;F7<~Bde8voI SM +rj�fEq|`.+LɖpTqBfܽfڗa-˥d rA %Wjd:wݞ�J����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e0/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015105� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e0/dc03f181f9dbe224b510a198abcd0dfb896f10����������������������������������0000444�0001750�0001750�00000001012�13574463525�022432� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIaCh%E79, Ei9zyiz9 '?Vqg,ZjbQi^|Ij1f:ʊM{9SKJ @<mD.W |^o3\ hi sϭO\`R (age3ʹ9&ok!`W08YXPl˱1;��ߡ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e0/54065ecbd2af3e5ea1a06418fc3997fde969b3����������������������������������0000444�0001750�0001750�00000000622�13574463525�022411� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xO09S$O'BV+=g4Ǎ.>;ӴО|̼Xirں|#ojd٪Z.fKn1M'`TN6VJ[Br#R{Y9!—`xtgr}(*L4 ݸa�etʪUQ`3xqb2_Yzn=>e<hL0_h% qoi ;fQ89:J82# xz䂇`<9<ro-ÿÑ"fnMϴA8ƠF"^-L2?7ZJ织o7Εe*DpcY q;DiK!ޓYkW?X=׼��������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/34/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015030� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/34/110a436d6031cbfab04c0722c5f0d28398ecce����������������������������������0000444�0001750�0001750�00000001346�13574463526�022212� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xV]o0s~FU;VU6RPr!V;RƉaeʐr~`X]0rgiMМhNbL0|ߌ~n*z2i>FSl9 xY1:>Q%|6h2-X25xʡN/6O58a1W"_jb! JSJhjtL I-WON�!_El><Pb q 62UH[e}CD Ekγ3BS6PR,j5ϰ[D@A*4Te`4l .&!;Wh"lm3 "WQoЖ3X)[ŇizCyU9yw\hVҢ16r rkWŽgRsi,ޢAܵ|=u8p� k&mxr{T Vn?Jߘ2Pt6#4Sͽq A3*J4WnR5a.ghh &$ϙޒ=2ZXWA w7͘ūؼ Ȩ1Y5[J%ߪH2'ED^%(Ԯ[Eڱ{@1 W땰ޒ�r5Gnu]�vy5E79'OkAC+gQ-jaVk幸.0Ch7r������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/34/c7fd6f5bf3497b75838a645f992c51692ec53d����������������������������������0000444�0001750�0001750�00000000722�13574463526�022146� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xRr0YO^d:IKgڋ^ 4#}l?@.Y)?6AӴ_R@ >TkQh|m/ K^RYB֥ (v2|OJzoDUĒH.^řDx\bDvKsînx+ʆCV`j0`{' µoGa]N۬f4EL|�;l@7E0b\ߌpRLub ˿m<7PupNzj$L8;:K>a1کG;(p2x(`)*u$51iXF6;QzVLkl~BMMn~)Mg:W0`p!==@TH[MjRxK>&ygTkZq]?:Y;mj3oL&?;g𳷅Ŋ ����������������������������������������������kw-20191112/.git/objects/64/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/64/b39a851c59f813a4309ed2ad3b44b957c3141e����������������������������������0000444�0001750�0001750�00000000634�13574463525�022103� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KWy{_Ə\[AU�+"d׆oOZ?GTy#2Rs @NvM߳Cl4|s'TIv^Z&Pcm>!`|)g p?,!j]$l ޘ M%, /q-TMn6Hk}nZܲ\:?!@,XrŮީFm~'oy�§����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/64/13556c008820b56f65ad3e20b7140baf32034d����������������������������������0000444�0001750�0001750�00000000257�13574463525�021713� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dmBUV'lZob� %y%  }ѧl. &-QZ̠Pdܓ}5 Oֆ3Wd楤V0e ]<~f/-1%71Ꮖٳ߅J\(�XE�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/64/6fb953d70119810fa0bbba3e09751776178948����������������������������������0000444�0001750�0001750�00000001010�13574463525�021665� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RKfdd}-V0MdUޥSN-K-SW02gŽoMvzx>R7ܤSZ`/]6R#bC!<(;-'\/9?/-3]/"1 'J;.R9l] žCM,*͋/I-ج0uwUWY)Sc/|b"T]qjIiuf0k}ƦM~٩G!,/K)fA/ӆ[*TAQ2Sٔ܌5Ng^ػY+^>rg[Q"׋Ø<�N,)������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5f/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5f/b036ff7142f08da2a83ec2c2006121225b1448����������������������������������0000444�0001750�0001750�00000000453�13574463525�021770� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xPAN0W-7qw|�mMcűcZ$W+F3;<m*TF4% u= ! CG=ĂL>J qWJBsC˒z:c' S 1GO3Za~]ʪuUYI)2& Y@We!>A1 HΑ`"VOl$kX7w ]l+1Cv&4d>ܵހT*ˁ.W0I7LCS܊Ow���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5f/576b3f07d47f98444f6a4499e042e9abeed1e0����������������������������������0000444�0001750�0001750�00000000421�13574463525�022265� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0 EY+4>@3,!'qۈ}mkgP>ˑH:rY\ ^ZTTlHS[f[ duhGV.FKC}pw1JL^u#܆.zk^†U]f7J|1XS6!ӱm�qcO0ci O2ko `I%E 1vDnvcޛ!~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5f/abf14f26e4f98e5fc8851c0602dcad2cfe4d25����������������������������������0000444�0001750�0001750�00000001416�13574463525�022550� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTMo6홿bnq�ǮU\Q#XTIjͯP+;6r ۊyޛVk ݤ/Ayn$)1#,j0o]Yerg͆ĈLByIfG.ˋdRZf&MmY3R{}e]˛rE.M|YҐٔ[S譃G8Yث'R;@`4ZZm)pI"G `Y4tޣ2fz끄{ h XEB�8=#9{Aj 3;9̹KakgmWP))L%SzFs˔ xgװI* Cƥ;tGzL0IJ0r0b=hFg<IktJ_!/�dP#b$yE!qPr+J=WI+h+nl~q󓇅'x־ϟfHai4ЇhĎb^8(Hw"�𜥞UGg|︓)c"/Wue.01s?F[n̸r2{ 9oyϼYM bFUc. мX~y>\OxY$EÇ]7v?&{ܲkaV?3"!A  [`=Tz&9x1LzvQ b:C͕m۫T��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/95/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015037� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/95/ef81771a853c06b93e87c9db36bc99b06b6d31����������������������������������0000444�0001750�0001750�00000002075�13574463526�022214� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVo6޳6 X]I`;ÀhdHE?93!Ļww}$78/? pVNZ5/(Er3ҲTFâ T9XiW<o|k�NYf3gHv MBi``BX)۰-b,f DIHSS0)̖, {x,.V)|fpфWmx_5�)P]T 33  t>jx3]v/~ԥTqKx(sz4vW4:U .\ύد vpj7<`NyC6Y;ZԮJ Qw ?S/=O28 sI4bO*'?7RpR~|y3F;^D#A!tyܬd=8V4 Dr;GSs%a9cᄗ'r^)f|X?puJԦw5)on#F!z bp|y^^ψ+̾<4u� 3EEXu%sB*%) �x%J"wGch)lGvrx3~nJ)HC(tJWTW!d-f(>II?XTL~q~-2ʭmmZk{LM@tBr^æ:WHLGrS!W^,qTI՚`ZIHa=Y<^ : ʌJ�oZ >JVZm?<YҴ&LΧQ3[!/ѕb&{~Jr iEYR&_"s8(X\(\npr{Ͼ-6%_2zgeY2Xa`rm w4 ]tquSe]E~Ν-x[n2SgI4 ,?oIWx:1�>u9؞7#b+O=Z8=^^t7鷻^܍o` OKxӔ,Y,sjq)8�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015114� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9c/6964427f15d7a4782fc4812b7689773764bac5����������������������������������0000444�0001750�0001750�00000000420�13574463525�021720� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN09)I !$@-n$I?oOZ~.ǝ43gʜ Xi6MaKddXƩZ6J9l1#mJ٠e-Ұ֤\U;֎sB}�6ؾ p?p EYM%a%RE]f7CU|1DmCKg? )G? +!:`ӕ=,A_)ptfG9-ɏ{[XR,#*4ʽoj{>]�'y^������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/07/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015027� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/07/bca1c8137c21c6802310cbc97d23fa3f3bf68b����������������������������������0000444�0001750�0001750�00000001777�13574463525�022311� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUmo6g*:m}if^-Ɯ80:Y%R#);F;NbgACswLû;+S'}Z _tU$4VbbtjFKEV&kJt΋l}iY#L $9&C("Fd)7 `kLLA$$<SZ+=|i</͒dK}*O';cHUBi*i@(C<6It,jx368]F>=9PqËIo4J/Uor֍Hs5k`HܧPim n| j,7O |'eڬwJғ]HG䝩1+ӸL7iuiV>!]V$yl5O*_)Jꍩ Qzz9\w?"#j *3HkkaK= HQ'ɹX:8fkH$f9cǎsk<q�GpxHFERY3 +7'xu> QLxU Á6' t [wB k*p4FR N2]%]2M%T̵ԺŪa?A0oewyW֎~D'$6!M7'4p&*0K\)yRV$HIޑ㸥8YZ ( \xT5cxr$d3fS+} ty>YH=ɳqkiE g_[|^uŅU"mmmFRrd! ˚C�5T #'a`6MIBk@/kdvZatse`2׃hxAtJqqY2$>G(`C㭯$%ԇHRhbiehrq6ǯ7Q?\L?wK~(IVLYHjwRF_>6F�kw-20191112/.git/objects/07/f91252c20ff34dbb1f88e1cab0977b78c322e3����������������������������������0000444�0001750�0001750�00000000710�13574463525�022233� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x]@_1޴%_M"("2ٝ4KI<D$0LV0hզ~-L62V55eZTgJfUږ؈Z2dAMQb#Ug`[ UilR;p b~-yx J<ݦ9<IDE C8+w0w0:MEٸheh<n/q/'9h? ȭ&3,<掌XghFݫhI54]L(߆7^'%08db'(jo R:^L`x' y!ҲQ=> o)}Qo {^~̆}'aF, <;C.9#aցr =I?Z|F{};Yqۮ놴E?9��������������������������������������������������������kw-20191112/.git/objects/07/b18139c6682cb3d71801c283dd0da7b2d9e580����������������������������������0000444�0001750�0001750�00000001011�13574463525�022065� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dr6׮<Z%xys, N<e,4rlE/�o)ީ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d4/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015111� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d4/b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2����������������������������������0000444�0001750�0001750�00000000467�13574463526�022631� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0 9)|iIS@W7qHmStRߞl�?lH]DPʦ2ʹhT4r*¬Jل�J*,iVL7u*-3Û\ K蜇3޶g!Wa޽>nxQy*)sxqbΏpGMMެf^ưv\ov.j#2y"xq>ş14/|b/B=Vl/3ҶPK9x]N;v$wM_Ӵ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b9/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015114� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b9/0afdcaea59bc2574fb96c44c23fb11fa7e1fc5����������������������������������0000444�0001750�0001750�00000000711�13574463526�022673� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xM0 @{ίgv{R۪ 0M[Um%${XGP;Vmev*eh;]vE]&l<N Ƣ,F@t{iV.<t-Feg.܏[ nOƷn%q?.YQh,I]eDw=\y~gzGαPLZW*ĥZ(-v45˶2m+hF nHGٸ}y[8g+̞eFZ`wJvbx ;E}m `΁4Og-V&Wl$%J;r34|p;KvNp䖎xPoCC<R9qx^ii䶱`_ ><i\?aQEͯ[z‹ë7C[55�������������������������������������������������������kw-20191112/.git/objects/01/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015021� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/01/e80f1527654f80e743c8f26121a563bd6e13bc����������������������������������0000444�0001750�0001750�00000001475�13574463525�022020� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x}Tn8gT @B5h7>$JS#5M $ǽP/png̙S8}?rHN5lDv~Ym$fhwjsTFe 6`)(^O^~�Bey=)/ƓtD֣3lB�VjcЋT `RXM+ MrsVW FIJT A @P9:Mj(օ.Y vie6Pb>-LɳeR| )0A/,0/ˌ͂C%z%2#II?K7"@FCuBS30W-YY)W7^. ԥ6I¨ϻ;ȾCli1Or^+N,HB~šGp[h\Vp;`/ K S=d:@MhP٧�C ҟ#n _SA0W@ =ShxLOؿ NҞwrHB멐x6x74ֶ4'IwCm]{?duK E@c[Y.q?'^ @+;]hμHޣO/8ҁºAyX"ϗ1NR>/֐LZcH`]XEiy8(ryaz‚+%[Єb++Kő40؇( rn7VF獯/>_y.Zcu5A74[hC4t' bhcMËIyK4GU?8.���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/01/a81158940cd85a28e80384eaf0a8baa6862ad1����������������������������������0000444�0001750�0001750�00000001477�13574463525�022157� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x}Tێ6DM)ݗ@(ҽFl,Ї݅BS#5M ;| ys;3g̴_ʑNte#⍴5m.e휤 .Z͞{H=<rAr7L?/,[wWh=/ iZijaHU+!Iѵ[s +W!l瘄LFINTcM@T']m"֣q:'qcXM+KjJ̕1Yv 'O}2؝2?0~@L[$Ya_yGᗴںBشZ,Y{⋤nxD{b~mݒrE鯫yϨ0n`>CZ4ς$=s$tЁܯCaKЪB`cj /_M5kB$sH| Om-5z8�/\}%wOzˣX;9z&Gxdaw3C ughYR=)-?j0󏤢<KJ8n!l�$vcr?�1 +G3'FozȰI7&/ԁ-!aX^lWC~/i/$R_*V bn!(|4H&)9GƗ4RS{^01W( \ح x^y.ZcLGۂ}ɪ;Zh#r|fX;ڂ~MË<KtH/0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/03/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015024� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/03/d8a3b14dfc2e85483d91e5dbf3ab6c291cfdeb����������������������������������0000444�0001750�0001750�00000000430�13574463526�022613� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQn D)6DUH=Ar؉z+iJ_>govgm0쪧9UӜkUja:/k}-mMihsEժw]/ܑmj.[ʰ]](8g,GmmMʸixjҰsVrL'8B!n@1mCRTJ[{l5-&41`N0e:_]Rvpbƞ&?ɘ2 f*y2tt){:>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ac/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015164� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ac/d7c421eac66924f008b66ea728b1a9122e1cdd����������������������������������0000444�0001750�0001750�00000000746�13574463525�022372� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU054g040031QK,L/Jei>ϼ8_Up1Rl@@}2b"B:0L'f|g2dzcn}PBRifNnJQnnfq2ix?Yjbl>[p8r6�BJjAN~e|QiNj1{q>;?Tt:x6#?DYjI2ʦ[(6r5<u٩Ey9%%z 3.s&4kw#uM0 ZkθU˖./N/KKLKH-Ie8qƷ˄T>|faׂPJKR!6+L]UVl9_oUWZRZ�rcۮ|>@x.ěy) >~ڰ~{sWX*(JfHZ8UP{mϱmz@d`8k{?'_Uܵ�i��������������������������kw-20191112/.git/objects/e5/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e5/1413ced73288b55cd4422f171bce5e382f3e21����������������������������������0000444�0001750�0001750�00000000552�13574463526�022156� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xRKO1_1Vݍ�!A8gRmN#yă饙o{Lv uT&_ * =<x ҔlpSkW9~:̨h``W�mo Q/x>scljV bGWPUl,v"t~DϣJuP!XcOZ"hN""6P/ [U\{8a]Udēz@lj E))D0? AdX;_&mйNo:Dەah)D?/F3%6}oPnpAe~�]ս������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d7/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d7/1cbe9015c884c21e1ee3f84010e82ff9dc75f0����������������������������������0000444�0001750�0001750�00000000507�13574463525�022327� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQn0 쬯)lIE((NےA)qUХ@8 4ILRYU)(knc ԸZWkI2 6 qQJW *VFc+a,}G�w|E8Z K{(۲W"9iϨK9CD6[02^fi"ˆ=A`#AOiya7%!G?\(xmB8e`쇀,k�W-"=Urc2)%SOcs>.xv{Ovnۯ7&CD;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ab/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015164� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ab/9f2369dd7ca8685f771fc4910035a20dec6485����������������������������������0000444�0001750�0001750�00000000607�13574463526�022202� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQMo0_$։Bj՞VʪW<':N [ yy3|<"ԭ(R%9Z`Ιjڦne`9 $3h#kQTTV*QdLm d]Tat:{=88ritFσz| R4Y?=j,�{hVTuԊvY<~�m(qYS%Yp ﺻ?rV"$vNBiJ Io/[9*}aA:Q1Us||J -h>cFv�' ?$ެܫ^q7AdاNTk9_]p#*Z/;�������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/56/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015033� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/56/8baf851f57afe09c2bd237acb52cb0318a51ec����������������������������������0000444�0001750�0001750�00000000433�13574463525�022445� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0EY+fU+س(_0'%ODQY"Ws34m#TJkljcfHKU =VV# 45*RTwT62ml{д<r ?p-ٗ~z<?C֕jZ(d-}i3R? (Oh&5 _#˂َlK⍯p\&Jph*n!1J}~ 2{ s&#C]> ρ\Pxu|[O�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/05/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015025� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/05/2e99509a668b706d91c41bf893dab10be444cf����������������������������������0000444�0001750�0001750�00000000633�13574463525�022170� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i0votz\߬ ӐW Re~h_!S;z +]  Te&%C4x<2s9ú++<qmU9E`~oNK9(HKSK!x TUzj м̼ N-BvmkQL/?D5sD72 )#5�lGݔ~=;F7<~Bde8voI SM +rj�fEq|`.+LɖpTqBfܽfڗa-˥d rA %Wjd:wݞ�w=x�����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/05/6323a606f56273ad6367542f24998a55ce26ca����������������������������������0000444�0001750�0001750�00000001776�13574463525�021703� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUmo"7g~~ .EKQDmPɋ*]ӕβ>vmj{!I4Sxy}晙Yifp|:;+S'Zt)|]UW@8S[k-2VUZ.ѥJ;/ʲޣf0-@ +o`PaFX+N01 Arf“\iL4k 5B,-:>AFNX_ P ղJC4PlL @`P,NcVÇ(Yl8)WΡwHc]Lqzq5H^EymC>ULFi�X,Q8`pVc<bb>):l=4kUlgQ:3 Cݙ1-WӸNwil}BMV$ylHg*_)JO qzv5><"'j$+KkQԤɁzR Dr+~ YtX+ҹa-o^hCܼɨQCrvދ^JXY=D|>0_ >u#D2W?0" r0' A$lu�3/RW8\P.Ga/RPw*)g .bn=DV5%~89 q~/胗]Z =3NHF-9Gn4Oh\M?@aָB E]6"jm@+I9'qK%pj;hQԹ$L1s2<t:ijH<f̬VG#ңt}5Hfz}Jgi8XdiyޕF̺W ;; TQ׵3I񊒅stk\�P%|BKX\�jpw& 5UMBk͕u /%ѝ+NKL:\u xd~P`gc㽯$%|HRhbiehriv/ ^N{k0tK~(IVLYH7RF6n2��kw-20191112/.git/objects/4c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015107� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4c/207ae949605085702bfb1e1ca1bce4f9ea5526����������������������������������0000444�0001750�0001750�00000000543�13574463525�022232� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xuRKO1_1V < $L݁mkA] N/|fL __L4c $$uhMB[ X+E)~WRLlqF 3Z!Yݦ,?/ڽS!I͙qo:|pBۮ:}%4R8JYu< ihaL h-cBI=hG|{gD9bsEO5cv-++~{qQ8 bkOCf;q'+g{ uZ@P'h7t]c=s+fګoI.z}Iz67[pcYZNmû?7�������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015113� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9a/63eb25613c3b2a41868f74f8f9361bf8fd4d14����������������������������������0000444�0001750�0001750�00000003346�13574463526�022207� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWmoFSJ8Fmܡ ogKRWmywfvEj~WBg"IgUIba/hp;Ɠz³E9~g.wSUlrr3&ReW~:&:F&[U08R;<_Mڏi6=^` =DfT&Ow3‹MTmTV6Y՛1D;kF:/M:ӱaKcSXIH6CE|^oYe+O W="ȓw4 Uά&t^C)QȌ6] ?K*EKfջ='*I>ȗ+memmeZ|:e`�;:WYJG/59Bm̳"z3QĊ-5Ri ]Z**Щ.w-Krf??V:XNQhrƒJ(- @7Vņ0uQކ|"o7*$iaFÓ`X~0PiXz{&E,JrתTJgNN ¤vB~Bɻ23dg%?&R*{M#~=?H}%}KuBlU-qdECy=5QRY/6RmrאX_<RQ] R-P'=Cg3Y0h\+ sl?>{L`=#6 Bʪ䯤{ fveڧ񒶊9TֵR9] [!c `%(2F=_3e159gS'59`U%GcMLUj/[tO 9{SUUN+_$IMXRdzd{!vedGq4Nfa2{5qUwrn~Gv&ZFwܝUaik::=$롮[˹7 x^?)`_Yc`9.lLMR$Xʷ,J oƛ뭜:G Y}&~]c0ȩMxy#4!/4:9Ґw\РPC7\}J+ZEﴍc/0I^薤s"Ç"sOӃi72Ka Sn.M H7`RqS~߱^˯2 $ХB眤Q~2XaR8/ D5|'tP na8!uk^Fn>b5SgDIZtvXb*4%18FiS.&JS)Sn B-X=YJ+%-y0~=f2@k0+ `0)mh84[fG$!!ۭR`u4p~P2,7>Md(o�h}߽#6Lԓk#fX H* aR,V(4!%  %h;mJjS[cNTBd2Sf=F Q=T\z"4 S:Mnq>d/B%QN]d╫$K^[I}eDg}+_+E$ <iC �g�:,`<,,V1c1¨m#A0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3e/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3e/58740b131f2eef16ab7f12c9c9c9a8d1df73d5����������������������������������0000444�0001750�0001750�00000001011�13574463525�022401� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dŻ6}QYԷ[D '{˲}JVMs9"u�\�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/af/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015170� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/af/78d26d2ffdae7c52cd8024586f20fd158de653����������������������������������0000444�0001750�0001750�00000003321�13574463526�022416� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWmog %wS @KNmHS"WB֩Mp)`[ޝ}fUjVwJg*``UI ba/hp;,{³EY~s){SsXUlGrv3Re~.f:G&[M0uϞTY=r]n^Ui"SU{W˧D&v*+R{]4ŗkmi ~ KԷ8p bi>l԰Șpv&C)da0XWYSeÍzv G@0H( ޥtW/ϚDڤlJso'J<vh[C;e٭l)Eo^9UA+z ҃_yVD߾YLZtiP6UNuyhE;iL}g:8җ-H%b]o{JnD>, y NU!0FNz@)Bab¹9t4(b7UER:suz"9,LjlD_h&ូ+CSvVQya"t?{믟 D.=u7 e6ath[DaJemKɏbuHGu108Jq@hFp=g3r7c^'aq/3ycgWWVE֤KSwhuH5%!9/T@V@{ƂQ-֕kSMHal%g8z9I R-@GK$s2B1H66^MO'JՒ\%ci Ԃ+Elx4b79sjp ׏9`ñ<`dLqw-&ĝ7k17dg|udn+޸ùozx{]�==dQRLG!6q9n2<)+#4t <w(FiGycj]DsSCm sy%Q͕0b+Tw)Pv iiq#'tOEya?3"a>)4~;0I=(7V8Ol{ap؜q^+G% АB(1CRKx+B5|ErpKr'N5k7FH݅אI,;I,#ކjD _#E`GE\5Rgj5MI^psP?p՟L) WbL0TJu?C9Ȫ4TJx oaʣq=Je'm[�>Y\&fj]ؒ"6d08%n< ȍuH3vVwfjՁ{Hv)w-sHdٿbW=<ʣ0ۨT(fGvjO[I*f|coB <@ Z q$dH)t4D0os}܊xBb,ZC(\ D9Ǥbro 3 bP e݀<uU\gzξ E49͓;\>y WǔUb#ch,(F8���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a4/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015105� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a4/86a820a62618f4d07f9c865cdd4c6842bdd9f3����������������������������������0000444�0001750�0001750�00000001011�13574463525�022253� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d[3}nּ\HV, N<e,4rlE/�d)�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9d/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015116� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9d/9f09e616eaf15999de222b065ae12cbb7e993c����������������������������������0000444�0001750�0001750�00000000751�13574463526�022350� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x_1}ΧB_ڲ(("J+ "ͤ;t7S쮗jK̏sL@M[DHUbMYh̒")1Y+b+NҢPmӲ.4 rrU7jj7Mc-;ceBI{XgARnyx i^&YVi$KA;ƞHV^wa򼪲<5 kmFaYڶ8Rkz˯?| mtI: KLҒlzϰ0wh`qW 'L|D<v0ßGGAXR 58EK AT0ldA86Ul (E{kR8lwpHlZ\Łֽ̤Q!H)PbsD[?0yV,f-+{:LVڎp#>8Ép{b'$3�����������������������kw-20191112/.git/objects/9d/268f8b362ae9fea11caa3a9190c1851eb1857f����������������������������������0000444�0001750�0001750�00000004405�13574463526�022331� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xXo+Ji%)8?NH8vwt-͐<IJ"b߼y3¸߾8ˁ8Xvy.F@|lQ;+zmqq\; 4c1i)⋕iMTΚ TmAղY׳ÀH_B#n1hJ1ex~r^cJDٓA y*>>?ɸ8)^ۨl !\7;-HbkGBz% �@ d1d+lB3Xڗ]+WN>X;gbml5r& ^E!gf#a6at>by ^UųF۠|<<ݷX7M}tT�x/TCbгPUc6Rjݸz}9?#Nr&E5q!oPW Ò'L��_č*Of<ٛg8nk&6!͸' oEP!vJ"2:KCɳ@*u&m/qR]@V[L f7/T#wϚӚ6 ̕vSLl"'r�L B4Ҋ1v,&X;ٯC2҉:`rY}$<>[;XqVڱR\VvW|g�B| e#íbrEA@YN8`u/4R*;g! c>aY=Vkyqaw3Y)J}J&}j!"@K 4f+8M;g |;VN)SC^pE5AIaBdjudQs/%T�<O#Oau3t RmXѣhaⷶe"#rB9j +(9ЈUT;O9Ӗ <KR ԥ pCFG/m nK#D4; 4(ôO(w*DQCZl@0|CeAQcm-_fh`oT2#9qRVIuG= $&fN¥L:/yāX/rIGO%5:(a$+CE0!Fxj̓? pL4?7Mqw!p~qʌc-owLF碃C \ \pKUpǢ'D-K^e!^)C˴^r_ˎ}ExY L-K&]Qa'. nX)j\Ұh%͆>t(i,{ݝDES06m/PSY{khobⷛ i \5EНZH8UJ B _(8i٥`/ԋAT3XVbP}DI],*ԡFmj%rnrLU=jD¼ڣ-=R̃9!$em\+ j@C<ґH2x`Jvpi2@LGҟ9@~LW3db4`EAhdN3Yېf+׽qkD)7B\P6Pmp$$ y_GMZ<JsjVQӑ3϶>_ ; φӚb9D4% 4%]gJarW A2((0?k5de#,x}4fo �tp5"j\za>B{ B3 ?tfRwlGkdҢ )6E.!;|û ɶOP ovE=OR>!gqNCJdcS2YZpBz.@rN#`^sFsF?˴ᇙ8;C.-]?!?jZJEW)OS=%\pQY># mɜ{_ۥq^;EЁ78RH VV k~ߎyzFxNk7~Y< U:c9_`(;@/a5Nh tI}t߿z'4,uPr"{XEKwDl&DYm.&粔.56xיLWt4>lEzJ KD2@Uj rOPBO9$'Hܽ|]KBWdꊛsjpcOL(C  =cA�KelW8�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/df/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015172� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/df/9ac836931d82b2bf2acecde89feebf3db8cbd2����������������������������������0000444�0001750�0001750�00000000511�13574463525�023130� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQN0 朧𭧎vM&sId+{{68X϶rl2 L( mնʛ^[TZN/ĂL6,ZIdAE#%G.J5x ǰw_'zf4FΊ6o Ҭ21iie4ov:BGd\A9M>'J 88zxf B7߰,$W,S"P룋hɡ& 8 h5M*ZE:Љ 0b)ІX>7BN]ߧyY+s���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/df/45e50df69d139dba4599a7ca0fa0ad31951f53����������������������������������0000444�0001750�0001750�00000000531�13574463525�022401� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xR0 EY+ v<aP֎$8NJ KK^ *8D5 MVE&SUˬBZEʅ*1@J^ "T!+-MR9:xڙ޼hw0`oA>Qveci簡R1qoNEb9oFA+x*X ?Ou|G5ʙ)xX;B:x5q9&6+Č?H�>N.`NW�K`WuWgD fFGu~ &[nq0Hՙ1 bVDB޴#mM}Y3ŷ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/info/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015534� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ff/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015175� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ff/c1c7b46d7c933d986241677831f1a2d37946c4����������������������������������0000444�0001750�0001750�00000000205�13574463526�022045� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x-LK0u=TĸY)dʔ2VY}.:l=[e $W�~#l!kA_ʖ?%D)r՚I"FFX(Pqđ'd, J,S#"�s8x�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ff/2d933cadebe5cc0bb38a7180db74e5b2b96257����������������������������������0000444�0001750�0001750�00000001012�13574463526�022531� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<OoT}g7,w5k=D]jI2ʦ[(6r5<SRstg0̸̙[Ӭݪ1>޾ 7i3lrM0^&9ݶA!<(;-'\/9?/-3]/"1 'J;.R9l] žCM,*͋/I-ج0uwUWY)Sc/|b"T]qjIiumȥ~?}?+ҼbkMR?mXa,^JA%3,]l_6߄_|m-D '{˲}JVMs9"u��e����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015114� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/9b/9d488c84768c75b87a2a4e66a85fd27e116f0e����������������������������������0000444�0001750�0001750�00000001105�13574463526�022220� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTaO0gT&PMR74Irbّ);;-=. 0<|V6[(* #gyUB^ί**'WΚU H:hCGmu@q#2RyOt{矉#Ez&xB`o؆Ry Jg %Qh1¡mAA @<Cчp݈H|DfMl0#U\hV@We0ԄE|Dk@ydx\n)ǓO/NG2W=A6I:| )N& qp/㳓kwDo憥B]�0whCq.{:HȑGz =NS}v4g7߿1dA$FJnXƴ7J8AFvJW:Tu8u']MI uSINf}nSmm4)O {Kj~m]H;ýى´]+SY[_ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/89/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015041� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/89/8fdfe68cc206904eb42a902e4088d923d3dcfb����������������������������������0000444�0001750�0001750�00000000617�13574463525�022345� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x {)6JU^!F yT==2 i<AhkЩR;5UkV ꃖ(J6*t]U+{,4 ߓٿ-賁y{aϓa?TQjU\ebiU-껖(y8A)s$YWBH3\<|1g,0-,!] h Fl0aēV0%Ň%c- @ �ЊMc__[ā|+VbF-4 9 c}g8E[PXٍhB>*D^-B7[u{!9%v[!~�����������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/89/fed0ad665f18bd66b6e94a1a312a437bbe4877����������������������������������0000444�0001750�0001750�00000000477�13574463525�022344� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xKO09WĹUb;i\!ĥկ$Vl{\E₸|;;E(2v@:Jˌrj2*2b5T΄bT2JoVTІ1j%G\e/bvhk]p?kz麥b"cYFF?bq5Hc L>BD`v~; !z74-ΐzrF 4K)߻ؼ<6Ӗ�"Yc2  NgFp &qyIȃ;�"'dB֗wNY.$�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ad/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015165� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ad/0a7815e953562df97cdae488319b27ba177b5c����������������������������������0000444�0001750�0001750�00000000327�13574463525�022257� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMJ1]uogNLRi1 [<A;`Zdu "R$A%[huPd h4)ŨJsҳtS69pS+ å|ܩ�O쿠ʧ>F z=; Aqo#zkIuف7hT䲎 uHea e4qOUy���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d5/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d5/809e62d3a5db2aa6931fb2a9bf7392681cc146����������������������������������0000444�0001750�0001750�00000000055�13574463526�022243� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU06`01�dZ{mv)=[̆? � D�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/35/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015031� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/35/dec2868a44cfaeac8eda39e07d6a418d6f6f76����������������������������������0000444�0001750�0001750�00000001316�13574463526�022565� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xT]O@b TBJ+M4.[\3!Bw}I~쎥Cٻpp,(�L q͍24%lMMZ$KanSI[QoئZEɃ+ɀ/oQ_vfGS@ky0H4!<DD A !S5qL,A@@'BJ|0c{ ނyI#2j&E]c0H(cB 1$9ᤸҀ0_N2B޻~\}pn5t'uzx2B6^կ(=N^(ѣ۹XԠqÛ`,*4/`t �C)?jo0^E V<VG#+t9򼯗ulN2[[U+3A;sGSq=22Zo 4GG˩BnLPɭbf<8;"5yl)d7$.۸kMe[=@/U0_\9 f5�8|e*Hv!1j؇O[G,pwdn6ZgF#NDh~gՀйr{ ݍ5启ʢjgkղE~=\?` ]KCYU)zWrA!7pT[X6T=h/JrZT*f������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/2c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/2c/4d68db1b92874fb85cdf1ce265fe8d6cd32880����������������������������������0000444�0001750�0001750�00000000733�13574463526�022427� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU05d040075UHJ,ΈO,-O-I-I+`N9?oӴq+3jM8>9#59 $9#( ]νr}2LC~nn~^1HUЊ2u?+�\U^Zfz|nb^b:5*,dFg1"Pũ9E`~oNK9(HKSK!x TUzj м̼ N-BvmkQL/?D5sD72 )#5�lGݔ~=;F7<~Bde8voI SM + |S?f޼IJr2@j\b=21Zk-5{jrA 6(xs*i?YL @ 4=3aMϴWmnxԈ|HDhű*+n;Q,dϱ]S,R'N�@�������������������������������������kw-20191112/.git/objects/19/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015033� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/19/2685665811237d3cf6a114c225a89c63d0f461����������������������������������0000444�0001750�0001750�00000000514�13574463526�021603� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xJ1=)xq^қ(: .xN*vd̢ffQU;:@ApDPb:.J*ʋWUy/+1gtd]OB.U+mӨfȩ$z^+*0ZwF=<A636,M6S(ꖗ} ,*ϙ'=/V=+XIg@Dx`HaH #6f`K&8=`]zv n Rʺ==`*߆-ُ%z@XQVZhPLѮM{ԯ2_}C,������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015101� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0a/2ac85e288530cd9d0227d4ba4d6f6c422cb3e2����������������������������������0000444�0001750�0001750�00000002520�13574463525�022300� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVo6gE@ۡWۇRj,mC1CKEDUzd; !}Qݻw(􂞿wNRהIה*#-(LZYi,\.)ץ{J\%9);}?`ōdYk#`-S4-pVօƠf)"U%ӳW7gdz1,Qfv6^:=\gÛ`3B-skaR@)SXupVEP:`P_�O+D8tD=A8z  j4*!U;D W6�_rQ>TZ (NDQ»v-M%{)vFayl.VKUSc5 Ks ȴ7^. ]_Lg( wx$;Z|İ}gC#m-g\@DxY-#:jw7;m O[RfXkb][\X|2э(V2QzS|f7hD%+%]Y!Z\w2XJsn4M 9Ju))3ɝ)*t"\[?b͎? uʀhߑt+SC7 Am ʔ JǭI"(3F. �}ylq[<Q΍ a8{FNk q޿&}2S1 [oQ~@Ey@=@9hn*klŸN^}Cy1`}~x9g?XgWvjE5lb6v/CnyJT~9'nGft*奔wbw~P}* o(4`quٿA/9 /X]qj n[ |]cDMÜP-Mo=i5OgFAsYkn0M30wDZh\W;} 0<H=UN %VN9smB'(Hɮ LKBĥMoʋyPfÎ`wovY_q(NG#Kz+*(fza 4QWI3S[hDp7<fx;ònMRYtHnW&T*7es*R}g]-l.1aBT`1J`l{A>/߲iJCgٶRn# ~Pdm*ZYSM 0Q?13qho9bjiw^ oK⦥ #_FDvj��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0a/1953099db9a3b7afb62654d75e6751401cb855����������������������������������0000444�0001750�0001750�00000000345�13574463525�022027� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xKN0Y} ǎ?=!4cw$F>v,_IT!/Kn\ޓZـf'e^+8#rdGB~ A*.u/6xަT2篵qzM܎ :ZcE땂Fj)N94fN)[ Nj ! S\� CcZ״8NBqah'pi\�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/eb/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015167� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/eb/9e1085e01d4de8872715edb6b06db755b89dd2����������������������������������0000444�0001750�0001750�00000000406�13574463525�022335� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xAN0EY몕'BbςLƓ&lQk_<e gJb=-fkW֤ՊcQ;67"5 ;8 2Iwi> b0 <{s8,P6}ht_Z S懡2m}?g#^1zhbXhLi^Ror $s>9ÅSpw,+3D)WPDv`D ;2I}w����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/eb/d0fca49ad34c813fb648760fc8dde40fe5cf8d����������������������������������0000444�0001750�0001750�00000000402�13574463525�022707� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xMN0Y몕I\!Ğ7ؓ&lQ |eSD εtcңrq :IN)U v;e(ZVi1NC/ o?1N e9<//l'{c()ŮK+'Cz0"y*Rd #u'(>kopsR*p(=Pvs *LwL¸G<ojm��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/16/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015030� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/16/4938621c64296d324ef9ede0eb2cdbbae745d8����������������������������������0000444�0001750�0001750�00000000711�13574463526�022333� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x]1ί@oڲnQDQDS Ǥ)Iv׃Mj[D&';I`U(8Dh\lKYJ7u[!m6yVEFwhDaRr[Fdk^vӶQB#9n}G8M4<̛UVf41M` $at<3wpۗ_g]J?{& =B X ;lqAW 0>':ZkqBX5;A(&%(Ʀ7R&^Œ`iO-T c-# γ#EO>V]?C.[Þ੟SP(`Mx~q.9#a6r5d0:dtJQfoKg"Waw[{#и/ C�������������������������������������������������������kw-20191112/.git/objects/6a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/6a/b9ef196cb9f8b9889ccccfb2c9e4921d7445ee����������������������������������0000444�0001750�0001750�00000003425�13574463526�022613� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWn73bch%) n^'~SDjY[3 l*,\93^nM/:~)mmIۊsLR}BJg#Ke}lEѺRZmXulq3x6 +VlKAO/nF63!Rlּ2R?c2vnT=8/{U֍n\*uJYo3w>.m0k8zJ_cc"]l-*WѴ߇-[i9zh#} ;:Ju(B6;z:a`,mp\xVuԻ" .j&|˭;. odf&Rmm:%]ƻ1^!lq6 J]ăRPJ$zF#S6d?]t2Ŝ^z֑Iڐ逛suv6U@8t a .im+_tnqu^鲎Svz{MlڎRCOkL)qk: TjKeԉfh>8N8eoVg`hfı|~﹢[m"DGtv<Szfw=b<4T{ѺJOqdRtWRIbf h,e P85j.wr5{mOx&E:^<ywu}´+%; C##o,j0(rچWNˑ adݑ*%TuldAT5}+b{k9rPv.dꔓ)EP@n;#TL;cQqu܎> Jtˆ;%ݾզ67Kjb =fTn;YLbPjЮƅR7=0-@ #TD<փ@)W3u�W(-PFy' |jhZr-kmsAK9r(=$qt;<\ aѾ9@~,OMzN�đɯm!(ZBܐ�q,}tL>%R&?y4Nt;JzTii7n (`"0 Y(`\LJF1*eWp)Nٓa#≀sK3j+9ŠLr3+g.ᄐsߎXM+ZPIר0 z q hSYW 2@S@ V/H=0G uIP T 0Br4iv`tLZ>�RK(Ƶ}B@"t�8bB7QL t@;s!p=yYݿ'csGrI VT(SptsN&@א C­UJMԦ+~X>9~h*LM4GSsd(?|Wd_)iVu .&<v/ Ȓ0HԵV32nY Im4,xs_XOreB ߣVOO;5GSE u/(؃ fXaZ(J*6[;ƥ^|KEzsrV>RɈxdQB@uLfz.b/gxxn}^HkϼM=濕n<S2E>G.ȀKZ;R ;H=>BPG/H TCZ94P5ɂ0d[pAW?'�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0f/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015107� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0f/5facb70fb2b28b4122c7d47da7c80fedf279cd����������������������������������0000444�0001750�0001750�00000000364�13574463526�022621� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x[n E*fl`EU6П1$HƸ`RuM6+cSaۖ@sívb$mQ޹4ʳUgZ8;x1ь8IRb/'PvK>vZSߛ1>’N{ߡQ`M\®]FpMp _Bp̏<Hs:]QORXӝ.0v ׅ.y3?Wٙ~1����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/37/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015033� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/37/583777c7f1a2c81a05dab008b543643309ceae����������������������������������0000444�0001750�0001750�00000001030�13574463526�022064� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU037g040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗuI`T\ y5++|fߚEU}5\i^Zfz.\e OK6Lέ@V•Te >- dҴ܂Ԓ<6_|_$$ %=$>713D^r# Nʴ~,&3#5�nwDuu<whI -:Xn9_V;|~gVB,o. ?o#?7}Wʹns :=ͷU DL+quG?in*PX0(57BFCkN}LMNN P(Nj1CZLB{݄U/y�50?l_ļ< ^T$3 sgy\7RV���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/37/983db35acd6c2be967fc660dc380d3100316dd����������������������������������0000444�0001750�0001750�00000002042�13574463526�022234� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xXmoF g NdYi`?M"3P m!\s%Xiwyƶ>R.v8|/4|ȻL<[!ͽ^S2$ ](Qʈ;"t#1\m_+u5IG:92ռw귐V.kˊ"LU$0NbBr0E&C6r]fڙX6,N6ճnWD<o? z8*0/v+ NׁS�Q^F7܅Q8nQ-6uj@2K3nȚs )XLƒ{w/ݾ%ǿX |52ؗFj i2!\e7v|f'RE%ɥ'I.P S qnjP NcȅQvKcEZjUUO9 gC#YsJϼz)~t;NSj&@a{҂aSNDYs!~q6:X c#_BTwWr]G"deix;5I#p8$ujR!l40C^uQva5VżɈu cHDh< ~ha2BrxN!<[ODDo0}NK@-_)M쨍O#n7NKFĂXqyB9g) pj◨3_3^_G&ܴcjYS̺ڭU<-fPUH6H�^;uǞkuC{qˇlrc\vL[;|,KцM£)9S] -8h30$YˎiwRÐNaw[\vE:H?-5X\J!1*,dDܵIiP%eRG/����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e9/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015117� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e9/e634dc2b19681edb786254f0fd5c659d54bf10����������������������������������0000444�0001750�0001750�00000001014�13574463526�022256� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xRr0 _[GC۲L'K�IHbB*dkn.4 #t$?Vm=jwZ>FAJ3FܐZힴb8}{$Uk%!o#xfӭ(><47*np'R 6lD;x وpo^ȅaBFݸ:ʶesL)Y'jtf<,#[ HEkJIadj$v.hGv`}ʄB&,4dDosXWJq*y)<^yfohij qS$pҐubA_7:gPr_E3XdG`A9Ac%3y8XbOC6DI8[Lb~w˓V,d+>k寉ὌW5m>25:kzYj^zQ}p.,mOv݅SgT< I7��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/e9/e09324cf8ca43811fcda5a1405d7725f560248����������������������������������0000444�0001750�0001750�00000001063�13574463526�022102� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU074e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗuI`T\ y5++U|{P&[Ҽ\R'l *lp[<f*M(/J+ͩ5cw77A|ZNPi9%yp-l :jQcH4ITKzjI|nbf^ }[Gi];YMTgFjNJxA[Pu sҷnw.-άI=*X\);G+=~n*3ni&)u{oZWW1Í54Uġ`6Tan6\դJq2[l^~.k_PUE%0a9l?i. 051�DP3w>n?RbW:@*F̧dW>1/O«W/8F.*+-)fpzYͤj�"5�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f2/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015111� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f2/03f63b2fc50be3b82f5e060a9415f72b8e87cf����������������������������������0000444�0001750�0001750�00000000634�13574463526�022326� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 'Ri)gEiij 5/JO-WĩEȮ w-)'ߞȵFFF{A5e/g?h怇OrL-=ba}C[p% SNqk^.yDөN.$l ޘ M%, /q-TMn6H_[&S;1"4` Pe ǒ+vN5Hph;{n�:����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f2/4548ec24a215242cbdee3823fd5665fb7b057f����������������������������������0000444�0001750�0001750�00000000260�13574463526�022241� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dp땱ޔyZg=]'hb� %y% kgM>>ؒ9{ِ QZ̠Pdܓ}5 Oֆ3Wd楤V0e ]<~f/-1%71͸פ>uW �K������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/78/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015037� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/78/0f5cee346424b32b6aa462ed0c9bd842fa2cac����������������������������������0000444�0001750�0001750�00000003475�13574463525�022455� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xWn6b_`H)8Hk4@ڧRJRO%=3c @8]s9sle}EϾ?SJνKT}cEYRCڥX"-ݥke番7ָM\NյY-~bfFd)֚^o:8mI~1 wڶw&mɸؙ}$lu:ƒ^P[vVӠq39TLש/)5n|ݷK%X~O*>}Y9XI_Y0"kR*ʢuJ]\L:u["SxoYVoT:>-K}8:0ٿ %hv,b ](tt26hA4� ;h3PLB4VdhXbtV*S u| mZZ@K㔥>pIK- 1&_8F &u:,u�D,v.U2"14\]2@sTc@wӒBbD9 x_?wn1 ^ocDFFnJiʞ)5cy]0GbH);c`^R2˯舵vK[&"luXID!ZQq]^U5hԷ o!BVD 1ZiDYʟeytn%blZnZ Oi|.sV^,wT?PG@vtd2;z%Ɯ%`NظBz@<GG1h�E끊|Ĕ~C*+6t W+ uHf?9wh(t4W=Z zגw\5`C[ԓ=&} mV`Pb]Ңkf܏;?R+ a܀D͇5_Wx(yC =ڋ +^$ [DCi`ᙓ%P0%Tg0]Sg6}ZC?pz+(ZdtzAı6oƽ u""҆Ja9NNvV9q"X?.s xXH.( eZ+sx V"bN֣DBoaaN9Ux(n~LSC9KĀ>>xyr~rya&0@ƦE ԝ|rD.vkWHwy0QeI{p $-Z-R}1%fȢ,-3Y5,<,8V̤ }+^U(VbcagW;@eP̉`G"VqB9)Apr �x/#(T.laޘ3%iO4y?hQ*Ԙκ4^=j}. ޘu¦CTSD@+{̆"8k.x�,Y@k Q~WAsFғ3=KP:вY^]:0$hCtt!Faw[,ȇi'v $ 8VeWddN%-/ㆳ/0twX2 Jtx{N:YO?`$CB!5=tke^XlЊ~g?k%aS/?N"'pg0qy }Vw3Yy>;n)$򻇽 {D$;#UVl|-'V ,>c\tH31$H5!B cfJpaUwIonw5/g:�v "���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/78/597697880d9603e3c04c80a4254627b6244a72����������������������������������0000444�0001750�0001750�00000000435�13574463525�021467� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmJ1F:O Sm+]d;343S)}wcY$!ܓ|)-p0Nn[TmշoNyڃ[?AK2+FvPhh4ΎJV`|;,d| vh sߐhXՐEza귥-yA%ǑF+P_@y8?%0^,"yx:^ JGKޑF1oD,K69/,1S~ #*r`!@v}k<xZ!S|d�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/51/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015026� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/51/83320a453ad5e34233b8b7beb372f70d081d06����������������������������������0000444�0001750�0001750�00000000616�13574463525�022000� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQ;0 _AK)('DJJ|Ur;H{28g2 m)G"h4$a-4MrRqzUS-tV3Pz$'բ6X}e'ĨALs^BAE3x1d"—^I#dp_vuW׬TL/hbu'V{ݬpu`]l`&s"ƃCe:Vr*C,/wXUk1 u J:N3c1s -Rr"Ohc <~+])sӈ^zܦ<ǭH)JPe8W m!.4c=|悱3{RnX-������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/51/33f5a5a0f1b011e2bf5ef4e2ef5fc479e1095f����������������������������������0000444�0001750�0001750�00000000465�13574463525�022377� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xKn E;foIŎ*$<T\|JHHW5q}ۗAAj;c[cStFUc;+٢ F71v*izкF2sL 'u!A6SPk^6:}@-d+m%T圙{ق &?F8}RK$?g QO01Ke,`ͤ418U*" N*/3Q`U ;9~*PhZ#ɑFl;1sn;7˰_U�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/51/6ec273c15c0246c7a4a4e6a267ec63fbfc7b1f����������������������������������0000444�0001750�0001750�00000000434�13574463525�022372� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xAn E1`(*uEz1 া}JU_<Tԝ֨tWM ck7Dywpm;[-g3& EgDAɭ$x`kVq.e %!)ݓ}Lǽ3T˅;sBfTg4#Y .Ad3;@υx6:eiK WJ[rMb߂٣ =pܐl.K Wžz|:{C>-}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/8e/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015115� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/8e/74a69ee45ac1f68510fbfa7f21927192777edd����������������������������������0000444�0001750�0001750�00000000355�13574463525�022274� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0EmB?$$^9i3:7u+(jaKH(wdIZC.x0I2RᭁVJZѲJmhgmpqk,,PQ Q\32ީ|2ex)IcxWW6-GT]K۲}p|-Lp:_9Tuq$?j%-V3Cu�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/8e/67c6cd53fcb4dd1221abbae6d8bb2c242c10b5����������������������������������0000444�0001750�0001750�00000000313�13574463525�022565� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x;N1@Qjm`g!J:D jq8"'l�W7Z�D2YcKBgfn:ew: Ijޡ &'d)>>[zYe=<B[}>J8>Ä ~<?Zk yk7N}1v,rm>?qW���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/8e/09d4632c8083a5225b94f1922b6255e15a0d1c����������������������������������0000444�0001750�0001750�00000000475�13574463525�021737� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xn {)V9온*U1 0m/VTYٱ4>A˻h^B%JsmQm!u# lN QUi6VeDkU1<n!|*!:ԍ{K# tt)a%,9i1.bG<P# .L!A"X)\`q؉V=3<ˎ%@D4z{'Jћ7Z2$-mْ '!c/`w*>}j}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5e/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/5e/3babc8b159c600730baffd01f10a6f5bb441ae����������������������������������0000444�0001750�0001750�00000000461�13574463525�022502� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xmPO0/e `2d./8{BJyem3ݶ׾GSzdv7FjZad5wO,12]_Ȥh*᤮@m(9%,Z}1f3;P{ZqY5 G{@ .,/ 7-yAv"88`sWNǟϝ0#F)-�Z]PI"͓^%0$XrM|pЕEO1x;xΌ/ OWp +fJqowf!`iX4~iEJ|M ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/62/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015030� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/62/ca5c28ad00a56fa3cf41e96818e0313c6ff548����������������������������������0000444�0001750�0001750�00000000554�13574463525�022242� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xuRMO1_1V.< $LJw`i- %4޼fڥKx\\Ke򥠒 #yʃW M'1F4(9{Ì3[#((E1]?gq4}Jy:XLG>yTUG}uhW&mU)Yd"tDϣJuP!XcƏZ"hN"jGzfBjUрv=Xn$Z#!- ']ucb@Эs~chO{Qa~XoH>kVZtC]76Bl^V󄗹qK&:MFn2v *C|zv����������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/88/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015040� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/88/05e5b0cefe850a1ae0d3700faf317e995ae70c����������������������������������0000444�0001750�0001750�00000000616�13574463525�022376� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xM09WmIj'+"q)p[9$6!d,|<μ'(e"D(RjWeN+U˺YޔhQֺ,d ԕUXUa;Mmn5ܕyU)̜: p"|KɄކHξoERB&Y&8JC2#+C`SO`8O`pO s#F!�G(F_s;ׂQ`F#%t&fFcCxf"8|#ZYւ:nZ ^߬сo.~\[1C4 ֚Y|Þ][#|΅8vDԗó'_Yap������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/44/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015031� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/44/f971fdd1b6c1baa17f8ed6a13d1628c8fb93cf����������������������������������0000444�0001750�0001750�00000004525�13574463526�022554� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xXs+ޓ v}61Mlv2nVRBsٕ@`M=Xsk?Tǃ<ba2۵sY$ 2ck)払8Iɩ 3i%g,UQ<O/U_V2WY&LO[8$YX$&HS2RQOK\ENUREMHRRweXH2Ϭ̭bek7tݓS^y=yPwxRY9`)j=;3B$^SOzRe;ƏHT{pgr4Y'Lr1'I rnJUG.eZHS/lXYh�·elv֕L4]ڔR, LeQcgfm9ieGS˲�DG'`'qM;$bd'" UZzYo]nּ~lV�Ym:iUW�$3޿@K5]aK*奜`xwXJ@ $Hz҉VuCXߐ ?&M$P x좹juOl ,*|L"͠[F]jM@"A v:6Uh2I8khs15*2 `,3쓩8Nլ'1x@ WIhʔiMF÷ܿ{x{=;ehD@S`<'o]~-\E4 8*3LE).]uܬ*\]dr呐{'k UVLdE5!ťPY6maNdDz`+x:{724cI\?_Ç@4 ZWau!V*xɪ;Lf0 !ߐU]vVtF-֕&X˼9׾=T\kɍ)|>u(J|0D e|fj6mb'^  ;"zf;a�q`ͨW}%NII%hOX6y&j;&_C-m\Mm3yUp2 ֙CuB0}�ELBr+-OeJ6tb3H(| Osqp;muZ&i!eox;][׷F KX!c{Uyl;ێ$ǨexlCnLm0O9T("G$|%cW5 Ę!|>5oP&<P;M$b<YEھRUz8ffFJVsʇD/ź0}f\B)YhPfi4m" }6DS�&ar N{W`mpЭ+F"/Թl4o x7="ndA+zPS&z!\-|e]BsO۸FƩGg)?,iLs*M\L.>smijp k6d/t{Ap=YH`C�zʦz@~^=@V$oiV Q,~" s4=cD*\֮R[ ,+:C=E:,K45 JOɊuz[ 9#^j8m\&< nƃۉ!8$DIK3Cr r3ڡ^-F T'\xF?񥡶~rՇ/*D۸@&ϽKm�l&gi#[ . kC#p {EgTz8*ܤA0 DIURYWt\9;eC9Í@=G;)䞛LagXj@>OanBuB7EH2t .A<nb2,:|_ٗ~;Uܰ"hy.U�3Hp[G(Či^ O[*1b'me'g*Χ2s_% '܅ƄJd~;2-gkDyIxKE'2N-|RSg �LAGn4A60fupL/tcoq0*pMѠDhfu*΄~A2V6QWN>y2K$n_Y3vrjJף>+%X sowzXRA̦ω"=MdՖ#&ϛr_���������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015110� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7a/19958c934e208fd97c7da35435350848e983b8����������������������������������0000444�0001750�0001750�00000001011�13574463525�021717� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nID97 >JG?\j4r2R+s rRN~d!2!6Yص 9ĢҼb SwWu~"05r)/B\=aklz䗝z4ҼbkMR?mXa,^JA%3t~0,I{2wȂ]`a^~R6pluN1<�&�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7a/c82c0ce97a3753f95c4db48ff27e0cd72192ac����������������������������������0000444�0001750�0001750�00000001012�13574463525�022404� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dSV8=u6]sg9D '{˲}JVMs9"u�p����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/7a/0a02dbb9b8ab0a2d4aba27209f18cb580f2a55����������������������������������0000444�0001750�0001750�00000001011�13574463525�022411� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒ$UHo=YԺ|7KR}4Ka' x)UPP6QQŃ2s!̕+Dzlf\y!�p/ާ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/96/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015037� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/96/d6245d0bcffe2feda6e683301cf9ee317603f8����������������������������������0000444�0001750�0001750�00000000063�13574463525�022415� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU06a040031Q.+*.aѶR~x&#$�2P �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/96/35581211721d243a93f9500c43e408d8650b27����������������������������������0000444�0001750�0001750�00000001012�13574463525�021430� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d>o 8)3֏/`I, 7|~cڗn�|����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/73/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015033� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/73/a92955db59805dbbfc15df6f16a15cd878a286����������������������������������0000444�0001750�0001750�00000000257�13574463526�022271� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dmBUV'lZob� %y%  }ѧl. &-QZ̠Pdܓ}5 Oֆ3Wd楤V0e ]<~f/-1%71a5X.{l a�G<�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f4/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f4/27beecad0d5e5f1707133120bfdf4867dbff96����������������������������������0000444�0001750�0001750�00000000512�13574463525�022463� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQN0 圯𭧍IeB;M-jTN'l .%zلqt U%&JWJi-+E]Q^ um"1!j-e]j$چ]Q'zז\W\ <C`n!_'yڏ膥 #TM[J]iE)Riv;dml6`d 9͌D{K1* 8F�xa7%!^Go,WN]NC!Be`쇀,{�W."`7Ч,@'3XdRƋOcs>.xu{OvvEw|a:r;jAo��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f4/471605c1800c711b2d53771196c3ff2a038ddb����������������������������������0000444�0001750�0001750�00000001330�13574463525�021777� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xT0x@*mY-H\q44eAyf&QxԁVYp̤w|U\o6J\zxk7s)Nұ ;YX׌ZzUU%of&xU9:$Cϣ/ �OwtlZmџ{C*]ty.6{:;Nȃ}?J=,ѕ&j`}zV N$cIwXIJz+]|虲xن^}FoԷ̓i EA�jM;/1y{djƽA.wN+F]v8~KA5FmX={0 Lz.|@UF7o9[3 dǡ< ibnۉAC*6VęML= f^Qm͂6jF{}fChsn##&ytvey$M)X3\QF$עKãM" 6!{)ăzXx�92#,3cm9]R\[$HL2h$AEFk_='\Tbl-avZGqDX;6˳Czgb p4/lb!ΎPick�;{DG01oI>/%cHnol4ۧ6=5OhOQ_AoF��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4a/d7a2f7db790512d4361ba5fbabdd5968bea781����������������������������������0000444�0001750�0001750�00000000430�13574463526�022455� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQn D)GUH=Ar D=RыQ毟376 C(d" ,^h;giiGi4q6^p6a�N4B9oҭuZgDM'wd.-e8.~!3VM6ň&e\4hҭ Xq9nPcr9 NP5'8(}?`YRIf*˴״Hp^R!`$2]n);Xgq8c2B;~$Jޯ`GV=B����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/76/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015035� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/76/912121d238e0763ece335461e2f71c9d1e75d6����������������������������������0000444�0001750�0001750�00000000633�13574463525�021751� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i`|/ħDť{4TZWȔα^JסlþpUyiy# O\ΰʊ3:|\[ G8 'Ri)gEiij 5/JO-WĩEȮ w-)'ߞȵFFF{A5e/g?h怇OrL-=ba}C[p% SU~Y"Cٻ(p%9I 5>1ΛJ84X^[l T4et~B TAY.H]S,R'N�pu<�����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/76/2e5a2bcab6568a2ed06965b55b2353c5632ea3����������������������������������0000444�0001750�0001750�00000000206�13574463525�022150� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU046e040031Q//O+)L*-I+*.a8'UD:kׯ?<3$1''1/4k^2g珝sΜt$wP-%%`E{w.8xą)F5>u2�0i=_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/60/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015026� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/60/7aa1920522311b034bad8cc6f9e33c9e355d48����������������������������������0000444�0001750�0001750�00000000541�13574463525�022065� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU010g040075UHJ,ΈO,-O-I-I+`RؐSQĽD=7oB'g&g$$gė%4;Թ^n\cPi+2?)cCن} t2s!FGq*>lns>aX'Ԋ"KuGf{j%*=h^f^ !HϞ2>{#)#5�ԧK4䇭ϟϜU]R2^<Ow-\ U Rbky׏iB R>B:fz)ԷЏMnbrG���������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ba/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015164� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ba/a8de02d9181b145fef1abf2f7a0c31fb724a96����������������������������������0000444�0001750�0001750�00000006066�13574463526�022532� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xYےܶ35zKp%;N%ەʊD*IU҂$fpgGO^$4HjgU{hn]՗7}eJr;rm[M*ȴ1,بfɇڕN ]nknR5ucכqj<sk5l1|e6Fm75mj#4MڸW Rm]:JB.ҙ7\ō re@uſ^:PL%>5nҵk)Өhxurp^p"j\XՏ緪ث˪:gvݚjVE_m7AukEC+:$dGH|c1b:ٸQ5F5+[,W/흷kz<j(H)jcklr> xe/̭]'ڗ{R)cξߝ@#u 4|".%[ZM炍U[Ur1;R{}zW7񙥨MmCBb2xne<QS ,YŸ/pmķuS!.�Q9H[Isqd6 i5@JWU;SװЫڻ; Jmw|g ؓg4OҊ̑aFђZG5X̱ /흴:'A5O%ؐ *vڷ;`oLHXԎ&Ɛ>Iz8ӛ_{3vN1/Z"q j1-bVtDhL/9xp6ƯEI>`'_ �iLJB[Pm@8<?1-3i]ǥzq`zx#ƋEKe >qvFVx�ۄOqqفDRuUOt nwq93!g{QNp^ڰ(A(w~}=Eo*HXVt]BECidːe계ضld]hH[<QsѼKY n෵Aԙ̚I\YEQM*O*l\_WMͿ}ێN~4+7HᆈV 8%$VL]"<d@{ lA.xiT+ΛKJKvP5+"b ѧAi5h+_Y&9Mk<Γ �prAbM%Tse5zƾ[am  rܮFJ1!8[}Tv Ni-᰷Aaz߽xw T/" H#s�5PۜS7@;VE0@Ej] Ggက`wC<,F Wf/#qAγ<x+b}:t3 W&bE }(<gs8Wϑ(?4%1�X/`=+-{YUhoN,nfED^GY?W殫a-[IpfF$tր>u-bsc*ЀO%'i_y"7ӈ rOHYI %,?:irJ왉9~3l3={!�`\ mNƹ!Ԭ!?}bʰO3N6Iz ɞQr럇Ӫ=<>I@UI^[AyPV.m>.A/t r@8GR{d;CM`HSDBdb$["rN/5Ͷe>0mC@W";Bp8qЎ=j.-?{O\˧ȰK{g0=3']Վ?F4<><,8; Ъ0#H%l+k^ќ}#g Y*kjҨM"6$) +RZ s^ȳ˚y !F*/5zРF5!c+'-<j ~t U!tcY̐#8 AYP.Z'i"!à0U-jr%i  GI%ـoI<?J N,tsRX\-ޜ]Qi`P{�aGͥ<?WGi0v@%Ȩ ! 3p$%&43Z(SQX9ؑy&0^}YR}Gz. y UHGY5+HeF\0xy+DӃ"&kG*(08 %դݻD e[|& =AK4~ڷa@ltÑ`3oˇH|H\{© �#(e) t5ffN548-Έas~CG܂ypﵗ^M8{H\ /(+ಉ^m:MGRz2Gr0w-H966$Dgx߱Y S5jtB0@ֆ~)y2KG‡4; gmoY,P[))Ci9hvL=cGؾ55}ó h[͝&gsDPw8)R>achi:N u`/# <IFGE;GߵnÕ ol82S^Nt&fND6(DSrYpP> \r0ǧIgP 2QS\MwkO8oا*IСaE55TR=CTGmupUjgJZZztqX=&o)@BM0B+&0'�kG]ہ%$?Xtckq53- 飃1bxJ~Y2 {a!@;3-?OO#˅XJU H b3) @ c U9 \RrV7M-@z&5q{S6dI@#o=>Gz$JFĽ푫hh⋠#S&GRE;Ib-#QCY y҉u-@W ^ݼ2u>�7��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ba/74396dbbff1184ac2369eb6c5bc172df1f4d62����������������������������������0000444�0001750�0001750�00000001275�13574463526�022465� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xSˎ0el3BTvlKtc$RǸN !je'N PTM(8"ܶuP^lhʺnB,֭)&ё |Qo[jzѶM!u^J=ղMQy.6Eѕ6v-/1Z) c;+,V#)ĝN`"m *}#fS󺺭`7y)[ ?feF@=sSspPaӔeFm�ۃfg) gXec h$x;tqz Zۃ_PbD38M,~HIz[xn#{t<X:>XDx)_Axز3@-줄;QjeqbՋӵ&8D"e &WE2%^zf2P/Kj$=CID>^^9xSM$Sl*1N^i\Պ 7k okpfTU2)}0q?0q=`L=y#)sߧ/%\- v]*S/I Ӵoa =! )M.*C'Ub$g-bBKiR-Vou꺏B?A!习V0Br3?,Y?/rW˾~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/13/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015025� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/13/ade9582aa2894477b84f4291c9761c242b8cb6����������������������������������0000444�0001750�0001750�00000000260�13574463526�022036� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dp땱ޔyZg=]'hb� %y% 7Dg}aߑHo *2sS a{_o{fp*Ԗ̼ #7La<Ee!&1\s=W4ߧ.w�xJ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/28/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/28/99a5982b9e6e3bc24f6eee9081d4778ef7a2c0����������������������������������0000444�0001750�0001750�00000001011�13574463525�022272� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒ$UHo=YԺ|7KR}4Ka' x)UP`&k :Hߺ߭I-u `W08YXPl˱1;��L?�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/87/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015040� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/87/2e0b5750f050b63c686e5c01879325180c62bd����������������������������������0000444�0001750�0001750�00000001011�13574463526�021652� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�?8ZZ0ayT ěy) >~ڰ~{sWX*(JfXٻ~L绿t3mN Z, N<e,4rlE/�ߴ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/pack/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015517� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/pack/pack-27e9e744abd9290ac6ee13ea4e75147aff5f662f.idx���������������������0000444�0001750�0001750�00000044554�13574463525�024773� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tOc��������������� ��� ��� ��������������������� ���"���#���&���'���)���)���+���.���/���1���2���4���6���7���:���<���=���A���D���H���K���K���M���O���P���Q���R���W���Y���[���]���a���b���g���j���l���o���p���r���t���u���x���{���}���~������������������������������������������������������������������������������������������������������������������������������������������������������������������ ����������������"��$��&��'��(��)��-��1��5��9��=��A��D��F��J��M��P��R��V��[��\��^��b��f��g��j��l��o��r��t��v��z�������������������������������������������������������������������������������������������������������������������� ����������������!��$��&��*��-��/��0��1��1��3��5��<��@��A��D��E��H��H��N��Q��U��X��\��]��a��c��d��g��i��m��m��m��n��p��r��u��w��y�,϶(GO8s6�Y_--%^]EiМ#څxuR;_np;:ut ا%*IDfpag\{[f-bMs?[&Z�acRGE3vEna|b,FXbds܁I j1)8x�P$!L&t0N8=Au.%BtHpyK ?cIj8D]hr�)k>�$,OCkL bo,*c6WGS2^NNa[N�zk"ݏm|h?'X<[ f^^`~;xNJͽ uP?np^!Q?H F<$SC 6׾؍j yQd”[]Y gD l0^q VqK %?]lI Xy<-D?%0W ހ$AfVxw=FX N Z`Gב&  �2Feu3Y xoZOo| m ?%2MiTQB9 i9)ehjM} \ppg+LWIf$w {b K[`88xT |u5`:NSN 9e^z<TUe> �}] '3u[1@*5tm4aJ$֘zqUx}{922s%nF 4R<[zbrq|!`N&&W)mjc \t8Xdg8t TeVL>b`}!&`emSWfq(iAiwl(jN_slg}2 z AWխ9j.zQM C E>cĒx%G@MYAϽwګTC>[@9-TwB3ȹs8qtPwn D["!cF+XD?h8BKHaSKL҈3z%^i^E|  `0ܕ ,j͐tU|Q9jN/$H{ sۥ({/A|QQp$¨o: %q@Ϭ4ּ=]mTCB(f닁,f/ƖmwyX޿_=>yd3\i%Ey͗gM Ȫ6,07͋lxUf.HzUC] q_J j z]ld0 jvqI cx= ѠEtU!8W ~"o~o@h*Ɍ!j螻1s!ԝ-u!^ a2)/#�~VLHg1=|#*a hwaS9Ca$7)A:e`ͱ$OUƍ4ah;vM%=}p�>wI&�˦p'nTC'nң`Ar!<(T«kEQmm9(C歐W 2v(`,Zȱdvk;+(hFYCàq`(twXsO"`s=ct)!N9$J.~) @^qT Oqڔڑ;#*<|/4zj˫[**W]_i,Vk+tX h(>LR;+)$ΣO6kR{*, 8B(;}~$K|,yD5_,JqgP F 4,NwѤ&(He3/w�-[fd+2*)*S.̞Fw7efg.<'Q_lϫ<ˮ.:'4|RmGAYtC.cQĠQU<h.v9<2ul#Ej// ۟NB/ &UET_#q/D>v)~07'^WrX|o�p�$09i�Ԩsl%1$}vlN; Cނ16tB͉h�rA1BH+%mj! r2 dĺ NM𙇢a3,:ϛ!/ޏ32o|m4.,@ncq@~o47BR\]D-%X5v`j&E9\A]6 ^^\kN6M7 =nǦSu,4m6Rq칵7|8Km#q]l7!n -A`\of)7 qnGA(:-@v-8SeS#)ELs*`^'h8C"$;Is+S09T vuoA%qLF:.2F[ BeNW;\Z<'K̳|;"tg!e#}`öG< AjbR<]ɔXŧ <~J 21)Rd<_1xT7 nY=-Մ[b7=M5eNM6�o=E�W^?$LQ>P�sźFہ>t[%խqS;|?\N{xRnဧM!f?+ 7ĈW]NRW?q뵯=,R'kz*?sdj*c~-L|?[ݳ"ÅyAsŶޤm89\+ʂ_ESAu[ zZ+2Aqbg.P׶԰؉9\AzVKL<\=B8HkLy6Dƨ\BIw^Z "e8[CEE3.s&FE1eiPNB y8ݳk{E7=<F(\BIZmp⁣F;i,m"^F )"xI)FO=z`zmO݈./TFaIͿKiuCګհGG<4iU aGclb #cj>hWwG~QofӚ? CGEfZ16ol+KpGChs{r+J, �H#>li H"ٜfܝH$(c+^WK}zH7Jer[ϼg*&In7EMi;�K(I{:zs6[�[25I>8J%h%(aK-PO CM"s&ulKdEkv6!wKd?dP2o#@Mp2;U?7;^:YNfQ 1`m/ mpNgwɑξn[vN�ʹMud%F[wOd0=WfR6"9Oȣ uI&0O@/5\SO1a% x22 f3PjaZ \APeVWj{VWSDrUPKoDw?C<] QvN>)VQҞd].{tA[R6)_)ƒo<wRi]X5W/eU`R.ha 2*&>1-Ra~i A?-h#Rxo !{1vJSCtGKߏP]SzurZ#/.A/S1:*Rnu=c}WUOst*C&{BYUc;A $z\U 7a�;H#U뽵\GdCS*`Fe2 wpVSD4UxoN2Vjc-`V;C4w S![j9PV̴A섿&TW2^L Dƣ%rWEr_Y2% Y[JXNmKjG5ߦ}XSܐ .'h5 DX0IdQU\[XCi(e0cX )zPHVTX%DJşi_yq)sYyEi9ɸ*QYEɠCs ?+Ӣy'YzL06Ӄ3u㣍Z;BVv[CZ0}UA&֋|ɑ>{%PZ;)>`-BZD[,W(iӧ_[ \TWbbj+B�\jm@6 ` FP)E\\#p0&٫/\Λ=;VĐɁ2 )]NSK7JKN*~]dF Q+w^)<ӥF+B)q^+'[6O~^58\w SqfTͫ~`_(")’PT{mՖ_3Wbؗ蕈`_ !h}pMS<affʘL:�35Pb= /qxb]}h^l3PbfAy1^h1cNJ#l.B9]ocxțzu5ͥǁd \F7JΩmSd&? 9fi:$(dvdo%}1ɂdaA"J4<{윦de,W/ZhdíԨ1-@e lU� [0eȝ>,L5.N fxE>UQF{fw<eURfOGpf7>,ʛfR1Ew gq 5$'~$fh4& SM㉢hZ''IG3NfiI,TOI5E|*=jG(xa&"lך۞�j`=]#AQK"jyQIO>x52ƐkL\hCt9kf�.)b-;k3I<BWkҲqEF$E]l:`kltHKGߣlx6G6ni^nBXcmRLPf$9t n$�,6*Օ{vdn?\AqVŐn5_zGnF'p d_V-R~_pKt,hq85HjaqL9Ord^ҘqZt# T S&K_qkV?>![.t%r$:Vד[ i�rs2=�zbs VGya0+ vs?ߥ%yi8=럸s_A%@B&qFct 4 0gvj]tMDJTZ_uo%r7¾au5j5M) #+v6{pm$.8!v"6+Dv7 .vhJ\2 vJg6ҷ {.w42h"B?wZ 7<`Y=5=lw|=uw3p8ETףQw)/?<0@rw `n[=xВ5־yrt ,YtT9Ȯyߜnxh21זOY7yu>|_r"rkzI՛@+whV{5zkC݇4+넿{wP20 > 9{4H2g,|ԞC7$6%�}[)օ5bX~ms^C^\QQ;S!'HOQ3t<hn&bː]N0}jJ x}4G«nT/> o0`W;?.S{ Æùkg% m9_J tDO9є髟͒ e�̾*X>n7a S6Ơ:IG`a?~Cp�RqDI66wR-0觟 ɂ).$see 3<]1,Du6QB24Ay3y/UI�?Ն#$aӋS%2}+R] [ۋ1rmT@Ib_U`g]zpEԏ$@P.̆(~|$ 2J jR@9�#nq:oaY/H" . ͖+݋݅3( L;zmG|6l];{?8񚆣(og%ϒC&5�6'hMeE;tc,zC*HPU1pd�<F"7vh٦RklK0"5*&J${Eݬt�6Q>x?n)&Č+S;.~?ϢSYE-д3 �x ]DKnDFg$FJ4Z7IcOQh"{xk~(r g?يh_oBcϋKRDY2" ۋ*Nq\. M׍ud2|L#~ߺGke ej)7t߳hk <X>z0 .!D<jAzşLRtfrʌ^bTHo'9s7!mwgSH2v�#X 9e'*zw1ŞGl UfOB^0>|G?)3>$ ڕy duWOe.\j#6v;֏XR(EpM!{< gHs*EjfjAEcːա }0f#N k>Pɥ% ʻ2ZgzÆKt{Ytn6 ~ *?Ӓ).F_* uKkưNACo 4dm|ͪ/�#=Idik 嚆63nQĔ21N\-jQ$1f?Sܓƞ~HȽ n#9QP{^L'JuLSL*8Ke`N6@g1۠ 6_8?j hɟ^泚 S 7)<DBmMCۂ:{.a_I:  h ͘T|vɀ]Hcs+8*֪3?pdqPHEOd?a `%K\LKM'1(@hg#RH53pyhFV=^ëUۙmf$Vy-7�4 d}[#YNOi^ܜE5!R(R"*W50gpuqD'钾0< H| `j?`=FPa/{/S$\IT)(l|oF0_D鲷Eљ8H0_>l@HZf,' ز̜. T΄pByĉtQh~T ?[Pwjg𝉙%䷔Gx9==C27k,WI?SdmTpwD+DتM]J2J V@tc F;X֫}7֜t-aДX`6ܕQHRDY YV:S\M}?][D =�v wౡh!^< |Q@Sn|ھKʢHȻ+i3n&N*P!U"YS϶TE*SD60@;@E!E B!RWS/TStzerx|aei}YzVXJ1Eͤ'U}S\(RJndlNrlN/ޔ=1+[v Q u9o{O//aIԎ\>iDH~>(R6 yIX`<dUf5�V*T2t_7Phf 6TzZB)>~X _;([k#̨m<Q<:pJDAШ&z&)z#S <WK!`d#D%|jFXR8s<7ϵƩjK-Wqhh&]umK8|Z/y͖?5p;M\ KMNٽ; 8[Iم1a խJd2qx {c|ȡ<B)a Kt{wM!j CO+N3~xospVnEhL`U'@in<Mjqcc SJcO(9Dh wޯ%*HI+j{¨0a)B6ވ:b/a7ljq?,Ȟ xAYZ" x?d @L!�BS z]:'_�?�MA~b|ܤUu0Yx#޾ :ɒl: r} 6 :P�,N!5C Ն$V#on^h)N˫٭~0. νbI>Fmw<^I_"eH M.^1{{n <qj7C:US*lYZBì̲�fd:2Ϻ t~g"ҍAl34p)=MT2eIyEOn+ *4j+Xp1rO#g {@ܚp.1G}_v bU!_@SuN&|.%*BȉüC-F zK{a :�,eezyFJt\$ֽ֝ "L^߾Gtjsq핾<z$(8Z-OJzjwByo+(iu8NOJ 9j|3hgj|-]jCT;y"5TF{:U-"I`$<3djX^ 1QGJ0jc ;6 "Ù'|DŽޢJݧ/%D7JN# 'A4VHD3 kf̈ 4+!/}J ĝj{ ˴;;|Ųzcγ@,k2 YvމYYv/ <C2@lӋ</cx28e³ޗng{^!@"<!O({q}wǦ@C �I(v%\-K*r5PHo"❍mHl<�^&#I:QVn?Қ ;yɄAs"X `/"gutA$̡V�؂'}AR4{Y+ٵ< bT+ͩ7 83g 5U/ ԡWqٛYk$-36HXz98qJF[>�#n2M= lK9˜3 0"7(\)/3jxw sIdF.B6R7 =iWj|k;3߹$`"l7{ ߻`^5]'9Va\~4FWv1%_ it6Zp0ay.Gz<X/r\TG[. Bd1i6uπ!X�i}d ϸҨs8淍\؂D|ɲy06IT/g!dpnG==iYPM>\@X Ѯ&v5^ys2Y ,J91K!%+!Q0/xdҫe~Yz,56_7!ҬL EHfY?C<_nJ! ]F9MӠE7Y Kۣc*qʄ.pq'.,<^":E\l(Ņufl'`tF&-Nl[p.Н[EF`5apc_u FMi\ՊD5ϻȹhՕ72j-GeNslհ™#Q]5jqoWkvNa4Ne򰯷ίaP8A26>,%E3۹kVG'<2tEhKŘgbץ#h"7zV5_JH'ZJJٗE ~W<IlS6 k.|fMD<ba88C�Q\ dU'6'ΛZ_6& yړgZks6K'ڢ2U5iݦĸ8= /*"Sۂ0Jq@Jsm=σ 2NDN1eםQKMO1�~y^$,D%Yfv›5*nx❔ݲZ^M8 ù Vd%{0%c1mM;9`PXgZ,X#| Llr;9.2>*ࣳA'ýޅo, 7Ti/Z9d.%DfRC_߂S~0Q>Vаd=;>8!~ "/*Nか %u+m0K<`*ql)kG#<$^<}at5/[Jz?qa&R.BeWy5+3r~9 m.5U県l^?;}>:{& J;f?{swDoVzJon/Sd,}@6 hE<<A@`v.Lm*><01Y7z w(pLw]>?с }c!lVs <t!tɖ䱾= v i&M|U)AN!N~G"%'^;d¯h]÷Lҍ=+`Ͽ`K:qTTrN>fʄhXbLy|Rkk8iVԽV yO;NBwwp;,Ѫr 9X3mQѪ Jqv9;:'o݂ $ _[kPYr%얛Flq."2nWI7yZ웑YU80z%v=  qMⷚ},Gi)>gq5~'_c ;kZ| %'T0#fr`hpX>&Brt"N w͑|yWa(fLwﳰ}Xl~YG' :t(lL !_O&arPPޣ'}X<1xë>'M6N72sRL\ 7xN!J[^\k_+;9B,`'I +-$z_i[Kr�Dj^-lݎy[ }_LfL5-^b!2P*@-Ko䬍EEۢk}Fo奷yYyR `~OomGnq4AtmgRV'1Zo):O.Y20%M$_ ~=|>ݪhrScVߑ͂eg)=g@ͣ D}(xȦ 2/ )>0/%FS3}u=~YvKxF"U31HNk˾�Fo͉S>ED�|D**h# r0.@^<H0e/1ʧ=$HSDC%3pR4 9 Rk΢hP<L̀7gVd|+?#DWYnS7XgיZ;Wa- L6"NSogyz�PksI*B5mDs ,Tly>L)SkH}IӸ'UA?ZشJij9).?hRF5c"1З ZnLd?V5E !pUg41%O}+RKM/G."tf/GFbÃ3uvlm{*ZY3moi5i@CטYWr dkW]6bs<,xR^ǫ/C`>rU- u9Q:Sdpb4gl)&}=C㍷qi0p?ds&�`bw<b}! 6Ni?pneƎI^HwdWw;cxn[u4Bf0Dm>|չKjk"i{K2;<wg*Զ RF4H5#͝ wGhƙy#NY@h9Qw{N@*o#uba>X%F +!HM%@kvbU8Ӆ+\|F~nJ?[Z1nj# h˨ša1Zi7LQ/L<$yZ 3&s+*ttgNS`juS,T .b~bviPfW2*\JG7aVx8ٛ"U[+O$u_<U$8C\ySQIeȐ&(>!Ԁ]56REW++A�C5^, 2fDro/ kF=,#ywcw)>rsU`<V&3ȿkiR5OB×L[$K3V"Tz&0އ""3vݎT]ǯÛ:4-< gf;&HN®vb ȡKA%(K-ITtmk%yeм$=eض`,Tvc0 &|Hs*Sξk\Ņ؜ei@M=r릉)t'ð]1"}` p VҫʛTR1$p+5<p� 2OΆ>Kѐ<"*RŒ`$UT^o�nhW5#oNYO#@pO "l/<Έ ں+f{([CTR>% =פ^7@1:|=U %?X^IIlI5*4u*h%[@+E 5=N½0 u_KGucQd# Ȁ1^*-yP!4p mH' $Yx\خ)tkz/- L|ZEQmCأ4UX|#1IMo]OY-,] w= /Og[6~IGeDFDx%*@\ݎNlkh}Uw WTy$|:9eXnT#i ~JTV}d=1hY/AxOU[)(æIg5J{2P#P )`lRc g0M\yT,>tXzZDL[pat"F6Q(kޥ J~k1]NyD242}P3^ $3[)_{hpz{9PѝUy>@mk<0E^v~Ǔ2C�z\0?y 1uch<l U.EG N97q=u-Oc 3"`Ǔx9'lVTMPm lk} ~gzg~^kS${%0w"t5^mڍ=}B```,;y5rTpj2)<Qk-Ctэ0*"]K-S2B^+cbsέ[kA4Q^]Md<#lEc0oA[6%Մ6zz­7Ys` -+qp'[xo4[5.y|;w~i,r| PI<eQZaH^afM6su@?Ǡiqh5'Jw0[2R!鸡|2HC! g ѳ3�pR|zpr.),k^*S9i" L:鉆b ^dORq ~!e?2^ΡEПb QޗW-ȕ9`!t"Fe٠bCۈ̧$H*EӜ{O KDQȥ5ǽ&VT zI8)/b/#&C,HpJ3�i{ʞ#Ԧ/E7XT[NI("�]�x��Xq�G�O��ׄ��*��2���U�&�/ �B����*� ��k� �s����x�Zv���Y9�^(��l�P��h�N�el��Z���:�g��_�*�['��_��e�s�}���F3�?������iy��w��I��e�91�=�y��-�[�] �O"�w�vt��+��/b��^�b���˟�3�-�Z�V��2=�>��y�E]��cT�|��%���-�tv�u]�Q��j�2�1#�.>�1�w��g�o�w�F�]�I����[�(��O]���4��,4�r��b�<��AT�T-��^��f^�\��%��R�H��/a��H��W�Z��5Z��3w���>q�9���$��K�q�� �>�]��*R���w�v�^��}�2�]�Q���K2�]T�j�[R�DP�J��Q\���9�'�v9�;��A�X���t�R���F�~�G]�� :�v%��\9�V��P�f��B�*���p��B!�1��@,��2�u���� R�j���G�v�W���@�m��J��Z�WI��c� f�)�^L��L�!�^g����a��4����Ns� d��P� �<I�p��f���%��؈����[`���Q��(�-�'I�T+�r�Ch��c�I��,�����k�ߖ��*(��R�=���? ����D�a�S��Qb�b��b���g����i�8��x�K�s��� �<�KS���M����+c�V�wX���a��U�F��"[�G�@,�k��_0����f�t`�.�>��i��j�4�3�5�^M�BG�>�H]�S��=����j��J�#M�B�[�`7�+ �v�tk�� �Dj�.��K�tM�m�8��H�E-�F�R�`��J��C��u �q�"����2������x��ӌ��T:��;�%�Q�#�[s�5��IZ�3u���Sy�&�/�,�f6�����.)�ZM����� ��^�Y�C�A�-�R�\�_��W��8��SS�`��y���M�b�2 ��.�b�B�<�]�:��6�0�e� ��]C�U�� %�s�[��e� �O���Z�'��24��J�&5��gI�ǿ� �D�v��!����<��lq�ڼ����%��Q�=�`���+�\�2�K��u��'�1I��db��:��U0����VT���j��w��Mh� ��?�3���4��]��$�������m�D�M��`��� ��@�1�L�B�^�P�T�+[��8O�w��z�_�a|�X��l&�u+��\�� ��=�d��l�A�� �s�Hk��!)�I�?�)��`�J���|�c(�,�I���o��(��!��Y}���N�G�U�J�6�c�J�&R�9�/�a�x��`��A��\����E�f�\��-�� �s8�4"�� �?3�y��$��k�} ���+���f�[v�>��e���G�<��0�i��=6��#��9�*�)� 8�v�c�Q/�/�%'��̛��k�D�/� m��e ����!� �/��R����(�����A-��JL�y�T��A{�>p�b����a''D) Nuz_f/Y^J]>悹����������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/pack/pack-27e9e744abd9290ac6ee13ea4e75147aff5f662f.pack��������������������0000444�0001750�0001750�00001074455�13574463525�025131� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PACK�����y(xn0yE*r~ *(l P'ؾNoͥ ݍϜf\"ض-kL#̪~jBKaVA% Vt7|2ӄ]3ZIB4LKoVD9iZa+%&&97kCIg%<[/u׬c"ջR%[L3”T [EM+U}qPe\xta)> 䫪Oqc!E .슎syZO*rߡnqK2/p\pj`O-'NYx~.:!9/+r_5#X7@8jC]Y +B">ysUoahW�r$b9mt `؅+xQKk0W-U)P!tr cidVɿd%&}|tՈJjJ!ׅƦN USMZ =Uˮi\V{;ѕ}s(*! %GS B#|.D}&4v/ JΛeaWE:^ŋ=Fz;Y9R Vb|B'rd#J6\,z(i1Iiuv^#3x2,c)pH}x7kGhCLY/Г%XcH[zK,pl-l 8OuLa00'3 �TXmv\!Y9[md%fR;7e�CixQj0Du.ɒRJ('VXD@r9A1*3X)"嵉)Gu1#Iƈ8:kQ:91ƠDs,"T\*owT ߴs$ŧBeyփՃ zTKj5"x˞:og8-sKexvTNc_׿?kxJ0EۥMYD�A/$6l)iVme|ӗ9pLk[Pu-zBk &+fZ XX$[KX[{ j?[9/ۘ2t|ko4̘NKuPժNT _wx 3 pxq 38F׉ DHy#-! . mN18> 񖆅B1V5 =Ýxun0D?b,ٴ?K$-겫͌dD\'ZfyhYkRS! ZjﻚHfq*`j˸G5Rj/B1Db2 !ǥD3)3i/9jRN1PF)tŔ>ͭ>Y`?>Ac1O&8̍6~~}wcN Cn_ &]JcYhR"k5xuR˲8" WKH"LE.66Ǝ_w@<llɧ̏lfYu9@ qLc]Md ihʙIQwpub"qdi13ln\`O,ˆHl0-)Ď cyl ]HjYd X($A#4|SB%kV7_@,Ch"|LMSlUt/I纑\޾fE޲ssϟ.__oW;:cJ#' r$+g#|rz4Lԩ0fxcd A|'ft`r<w[.kvWuR6 Q%7f hȡT<^N5~U;t1+iz^發STPy V>Evh[-Te+9 [oF$qm+tGTi> џS Q`&Z#8)ʒXTaf_\RaudNY?!hYu$w|}&*|m,VKuE_·re-NL 8e x;lT6WԸ"^eB*>$7(в�N@Y?;*xn0 E C8(h$JlJrAvGd DPZ\i꺢sjUת\eݥHi` yݴ-}bZ[TU'i޼ <xx+q@JfaF OpnY5Vp"WgNϫu]Uel,3ő><i?8&!�4&B 5ЯǻKb:"曠eo 7Z#X7^5 #k):m([ם"d@vKnv".}{}uobp<e] l0u`EY!-ᎡhV!;[{R~ ̜5xuɎHE|EH(d&U`cS٤ @�wS5mZotoso (16`B5Hq"2%MRE1B8� UMC)ʔ(2 ARYre{D&M e<,"FSbb@I1M]I4YN8Kkpb@G`]jPBEkZ!VO C@|Qb}O8pYbRsҔה-mҎ{{wNbG;�ƶes:؇5x~}=pody'_#J=[N#vbwF12E'j7r~xn\Yp(3 V><jiU ׽*vvw* E헛|goYp_Vڠ,6:uw3iݾ\̇YqP�j8IoS)IۮUՊ-dy-mX X'F.Zx^o qF6ْ[raJ!<\H1f-]#3e߉ [S,'u=M7�uU'V5b7C/Kv}F�b~z`T~۪ ]�,^ExSM0W K!Cc'6Mi(e7{أ,c[r%9}B{5OF7!ܪ,yqI"γ8)#yu¡ r2.UtmʶqڤeyLrhIQ; @xlnҶ JӈQMaG-Y_!x ğg̈́HЇF1wc0]m$BuoOdg9-0}׈Sr&}B:Sw0jί]R]O_ތu@(O^v XS&c×b }oχ 6�u~NkgG[zM-7տQ$$L IX-lakϣ?}w[^)5!v:sd?@P4mO/@~&)Ih&[ ?zMP*glW/{GjajQ:XVK4xuRr@SM H B 2$˗ bi Sc!sI%}{לQ 0֠U]VCU(2T)jbFGB2Zqxʢ$!T #$#PҢMB5"4^áI,A$F+X!LF q"W xu~~Ҝ`UܳN(iQM0/>DEHwA(lsNrFྪmׯiγk[ڤme.,#m1x 5i0\]oҙgE;Èm's[WO $ll]e/ibag~qkK<? A]͏@�smZR9Եq`Y&KOzݗWƣXy`&LgzQȏ-󩆊EdYo:xmJJZpj0{2ϐ&P/YM2/at:D:UZwF0቞ vqZV�UD~L.ZhG'RސKТR/I > R=3wb–ZZ>"HX]kJJ"'j 0hXB / �xN0E٣TvJ]a(?$1M2q{@b7::ީ:s7btDF&Qu rD*M)H%aMGoBĄK{c`.F_0H~yE@h-$V h䜭tʵt\c1Gd} lK7+S7u5 ] __$TݎcgL u]*E"-xێ0 ~ ZUUWU/z3C D&t޾Ъ{Y)R$g%c{,2-IY\VeViKeTbBKVR2Me^Iqs5-*e^_JJ{EZaDZtNSwĢOyvSTۏy\ey%p/q,G=YcxS?fRwF܍tT+IIfKhwdzm%r{`vs{IIy�ؔt*\]R;Akj@)փgzڝC:\r i!kM{C&B8 &<, fc[z�6Iᛵc'h<+Z^Xu0Eae; )yY+Z>,΍o3$ܶ?HxAN0 }Oݬ@k4B\ NLzFnӯכc"2DL|2 V 35;ˌRfH^2gN`dɏOfP9id"ѣ@!V{֥봵%wm?rݶiݞK_\ | <x?<t_{ެ-rKGy{ʛ]oaH4xuˎ@E|EKYZChf�fcx5<<@vScqfeԪtO{9#(^ny@E%bJ$$tM1#0 "%T="M'ed8'bPN |!k)ѰrEӊL&*VS CWzX(Y]Rs)xd_猶_* x( w9' 5)x(#}sZּ}yK,ǝ`z&ru|24-4C+g vd-PWfģib91 ݂:L6sxGNbSKu&hc,^0ʻޛP`\)'> 9'TGq^nc{B�ɭos(8 m CTt #H궕Jk;e1ؒ<h%@NyNۉp AcIܒՍpzY^*zgy \묜 ⼵7 nҼ&EnE0D ]�q՗1W "9ɚoscwixxiTS8ftE*z'<yW |x;&, + 臦Ct@h Wd8ZuuGt 50.=P_OϜ)xQN0 )�3%f Z@#MiDT'+';;)A'xEgdN+Q $Gd95)՝،\Ip\p9Z!jd4Ü@9^ A?Vz ?8W} h%/)?M6%5(E}aZʅ瑒pcrH˱h//x4` ? ;ݹ@Ȏl*x(78>QpwL>|(�6Z}ZS1y$ؘq5V6]y#VZP_Veϲ`S ƛd幚*�3KPLq_״*W`=;{o̾OJ䋙!xN0Dqi*qҸBިTuN-;r"p(HzYj$ uUqkhT@r6`$@\6b%uSFpeUuAAC\R t 1iဧ0}-,5E8qX�y)WuUURA }R1JRIa~DvAcMֵ`]G0ۤ_šei!`L/f{v- x5b-g:5 Bj)fLVIKd`m?׷<}6xuRn@|+VCRR1`'/͘uN??VڴR#hfμpF$6.r,A3R$$U5$*NTǚ,H& D@]X0LŪaG/AD'L )JBdI6$#(Hp 3MYS);R2 f߿Qp>7q$5}̏?'Țj* $E=ܒO7S=<%/?o)o{zKxچϓ_�зvb[X^ϒH:RWgȼ޲ҩYX&B wE7 ")&@j6{8v_.xvtP,Dup/D6աx)É+}z:ْ GF %lo_ lmrJ[9Ax 4:w:bٻgtֽt*zy=67wkRl0Hl[h \^0}mMn6_]K:BB8PE;Q�dj[̌ -E+\$MS.ժ=N9a,|d6Y>;1aAXNkXO�G ]k` f5|\7 oiF | ЃSv`S6�LbxTMo0 WK9_N3 z؀{ KtŖ n?Rd` {|$M4Jo|>KղZ6K{SZcWKcVZ:'VʖZUbm5.pez7loۺZ! $ԍ/: -L:~zUrQ0+esDwu·/Clͺ ͂iԝ>"L'4SGhb@3XPg}tw|'MA!CbpdI13P�GP#d^^vd 4"E'-7:OQg3lDz97 TNri)F|5ڵPMa D Gx!w[~CZbB<IdL OhuE߾ x`h֕;6xRp|=L8(g ŋ$yݶxy\;a'侼f ];T@3Υ؍]nyhusP#-e푱Fo$k w|& bh$'v8l1p1b 5nMc@z)壚l.N:]]۠e4>&G!r5<O}Ήŋ! /myCA]/ޑ{޻D%5�xD2>vy`:nx.<1,eF1cZR~sFErEb&z#?_<]IPC; M3{~'W'xn0 z ^WvX}]ڢbdHtӼ; ; "8s=Xэ֘Ơmڶ‘hP f ǮXSs89=b]̩s-ئW2@h-(=gS ujmN'm`Z+yͩ1e9]#F0'9Yh%w%B|(lb* ,+h˜,uf\9L R[3݅(˽׹% V^VN%*9^0`m@;dylSgϷ >[eS{4[>ExsΟj#夶*R)_"}rn?ܾWJۡxPN0Q9!M"@(۝l RgLֽ-\[IZ1L#o8dQnX[k!9WG~DݶF7ڠՌ.>Vgg۸c6~OwP7Bcp eN.% mp{6p:޵T^iZ"`PB_"`-nD/l]Z!B%>re'P&v!ai؞Kq1 9aF[zϯ'x|iBiAbQj^BebrqeAQIbeZI!P:+$#*k&c,-t |SS3ԋ3+SRuKKrR2J`\.�\(5xuR۲F}+**Tͤ=*`<G|I7lfӀ;)9[eUkKA)B1AjSFYrnk2 +m.h-rLu2"q2S :NScr_Yb lnBA50sҙ6D{~)9X5_ŧ#TlU_qS99S|:ʋTu#h[>\{?kE[t�_?\D[/b[Cy?YTV, F#(8S[cNdtaiݰ;i+I9 !V֜:bR]kd\;"Kfb8&>If,ӻ>{ $8T!IfTIqVtT@ xޛF+OGoY g}aUۉhMI]n(_ζ'Lj:hs{jQ}7vήisaf3t4Z_p-V}5eRz?0XmyQ-PYMH,2峳pwcʆ/K : ~DSM.ϴ|*\^7AsR?)G} SKԀp ' HC/؄hx=N1ާ l4Y!DL?cbGp{VpDq# SJ*!fI>:qs 7 Z/M^E#iFc$MpF7w߀oyjŵK} f`B(B]Ld1Fh3u@Z -^,k(/oo3xRIn0}1h91 @`ٔD<|/Is'WD5= ]m)5ɢŢF7ۢ ʢ)N=M:YJc۶eNZn6ysʛT H#I7~M]m XE &Fpq%>�㩐u'Lf sM[l7U~ww~M%q2b17 =au{0�H!F<5SuZ_N},eR&QIi%åv<gk$FR< &QJlQ&Z% k#?z3a`o4<NC4Lxyۏ/z_<MRHRƓdpEyMY/vHl yMu.A�K*dO qoi޼d O̐߰V/0"2xN0~}T!w'ě"PO#zB .7LNDPk+Qskqn{!+!7#mFvD!3 ěFH˥-l | #^(]%n ~y.;yaJrTE9+t9S蒟"t}#/Bs5=9[,iL0o ؿcp+c*ZNO1c*c_{_wOQG+xr E|EWeQ!K rM*x41 #۷OrDT$m8Ju%>Aq>CP3Ҟ񶣦xPCk jӉ~h;NĚ .�<͇PI^Dm}8id|5kZ8цR<ۜ1¯?+()J 3pga]U;~g k.Uis�q aB7! n-Wv-`V >a;+lULҭxJ{+Ls io-A%cݍP`6OEFRVc{ T\�S#5ˀ+y74Q#B*e/vO>!EłΕEpVP-1<Lĕ?~xMn FbP[&v(R]u` 8Qn_GԮ}z'Dൢ3ȆtZ[Z'ttWgf`s촮+AU-[K}F\"% "5(%'282ڰҎ2m(%&8zd4A.I|Z&alͲe &{V8y8By5>G>"yW^L WEwFZ2ƿ@˃Wܒk]+  Zx}58kP7Bؙ)xQn0u@2AF&C(jkpN*T}Zm8{HHM'7jv%Q6F)lłBUjkd5un۠ӝѯpOx*{kZ*޷]a'<)ONe%¤+1qF?UEuRK`\&C.x'b,1 {[8_`jno 8Aɭ759T/ ,0rT\0+< 0dNpj.[KǙ>*J~yx2^?>wĭ�FDgex˻MC1�P y�ۑ lŸ OGJUm`�s>߷DRFCE2eOd]i*8HQL p1NF ђW+Sk~-uh,^?7c5=r:M ʱQ{сi1w3Jj{2mcOb(us ,SM2xRn0bE$[ ]2K8G0SIʆ,:d#{w'A ,UQIjwnVSUmYJ1':mylZڕ%mմ8{DSw$�:2S5y s!yL+oz;` ~@cZ?əBz'e(iOa'1RA2_Г3O6{O2tg=%8Y,=Y3 ^њy m,Xʹp-=5]:0 qVYC(̎`HbiKz/&x3=-Po{+΍EF-7N)z3eB5kn/k.r;!UHQz~?Hޗ(xr0 E{~VqҸI@$Da, ߇];4�w= ײ۲DFjet4ņlR&IweCj]RK-Kݫ<|#B3<mh~6+R(>Ay:RdrN{6#{7`}K|:s[!XD a�`K~sƒG8z5S|՟rJ͞TtFd҂j)v[ggv-p VFd]؊kiw! !(.޲&AyS*+3K8zy0Z_haymx4wVo9 ن#xn0{>v߁O?g�NVR",Β>I 2 f`b"h2M3Hˋ箷AVJ[Kki@&jnMm;DS>IzV2ps+rY "<-\sCX=U<5l Kn ~erěwa9< [֥kwW|'x�S쁘˾!03 -\>kvLLig3QLڒS K`5to $ؐ9|hP8┽KFZܼM0؆ FO=#XYk$xKN0@>i#;N!D%OElG[LӪH{I3"JTy*hJVhF6e'8>앬 wҵ \纒+ sStRӇ4: x$p GD{cR6TsFgSyjQIdv;ٵ7Ҡk*6-~"XoYSܚQ 8c >w6j]rqVl`Fhةsp_iWDt˔eѳL9=f~~bzŞ5xRMo0 WNP e {AK-̖2Qjю.ݬG}NeQpg5U{wzwׄGcܔꌑ|j -Uj[Pm9웣5آœ23 paCaX73lX:cJ K" &6"c"<Mt3׮m3 f{`?L#K^]ܿuDm%T0ALʀ�=d51s ZU^d9ItN.x8S4b;xv(܋.K^z xG5쫛[ʵR_zˉf'!>1\9:oFFNXI $1FT|H4z+8 $b-kJ"Fߎc`1-ƾŇd:V ֮O/4 -y!xN <<v1}�OzovKiMܫ17!G"VVڶUu4-~ |Z7 F3`$+UӫJP[ul}h{uy ^1&xO$xqb%5Le|i3תVJB! L0@Lw̗b؇Mw` i I3]". Z..u\Hq%pR�&DDFwM .d5=�}x9!Xܼ?.W~)ě;O+Wc3xR]k0|7\JA4K MZ"tXrl> ff&"(ˢsQE)Y#e&֢R*j)NmƵɫ2CBtE^cZLlrY5IEGt= ,|ˆW<!neuZ%ysv&ˤ6`/%SF|vd8M|N pw ʅNZ%ŃӬ!(`¹Wmg5 J [ f8X )-U$Oǯ!XݑsVIZbX&j.W<-W]-/U=f &d?K>Ow}띷}ruz>;87"<5-jGW|[y>/Yh::U54B@F?C<z7CLEMV Fj&xj0z=)P(4HX KFc];mJ!fŷ3;ͱkPʮM`YlJ:g kqϱʶץ Y}QlKk&4�" 8G83"<Wahgoshۮ( I a/JO<LP58c0le{)ւ\ bM'(MhpH<p'+"3A,%xOE\"20v}7ÀLk#*"FtB#?C1٦o}liaػ99T:;^s~xMJ19EO$μD3=7@jS|UtS<*ѪM1 6DXULvŒu\$lbvɈJ}V9BI3F>b?"s@s#"|;th_'ileKm},}{L4RILqKXH{e.Jܯl/vp|'m<4,|vl x1O0w''i^ύE㦕b}w/8"(2U&DUTRR"U:ϸVTk6!@B*U5r] K^բZSYkd8:x3q}vwtIc-\L%&y9Z؛ωpQU詳7]e.4-5#i00;=u8K|{ׯ"1s8(؏y\Wa:1ybgM{꬏]RK>=+Fl_q{"Eśd?'f3;͚xn0 Ew}bAN]ڥim T v:4S<dDP(Ter)*+ԢEUy+vAOSFVvQ\j%WXpkT\Kb8yx #QFFqBuWC,H}zL + W0n<5=d#D 8=34\�'-6}]_u6p:._!=htZ~v̵m|3ƞ�`7`!`[4~ cxTMo6W̡Ů~AM Z٠DX"UwH甛4y CQFIukRfͪ K$8Tj_5<VvaYW}7> c O @~́Q !!ءv,,n,uU|0jm,j':Fn:%^oW3VqӶZ <('Ȼ }pC<z A$0MO`'tkkhEs@o-^H  !.n?c9%|`T0qVeLHnCzW?×xXМ@mlR('eNkA{ s>�%O 6wӿ7 q ,IQJ2x X?<;j9 A2QDR55c{;1Ufpb38QW d]aHtYjƤ  +(^ S'|l],`C=pv֌ Op\>r"`"2KxUБ%оkk2i/2d4%ө60A%F^| :Ec/y<ՒsΪFHX5yEeY| ^ U+Ĕ92yNIk_قy,(m_d˦Z  nB"=]-V{m"ΙQZxƍmrro`/.Yw~Z$ͩeQcJ-ӻz5޽E#񿃆?w2w_׵l]1x͊0z~1-{<aY6%$ CKݶ4φ}!\*$fiJ&z6gVORKzs>3iqġJVA+Ib(/0QfX|Dzs !蛒SLz5a$)E3W 'X"%Exu+>|i;p78wXo 6Cb0X:�˖.B|&b//^@35gٱ5Prih>qKJlg PmSzgKqeoZw_~R:!^Nq]OM,}gBxSˎ0 +Ǎa׏$bS^DBJr}){c5g)Q}tZ*ꪭAK1a X{˦E6UaG,iZ4� Y̤ek’?)OPuwl`We)8kuJ?O}m'f'6p7d 6_.K/๛vhFXtw~ Cni:NY}()CE/i.8rs3 L.%`QqrWY$Α;/->W5w!q X3igJG!>~FiU Fra= ^ xPpdފ9c ϩ٭SlF~qQ&1v獾7B 1e<&'8q$Cj9r %b}g0_R33alӕ^fh$ qR6^Eޟ�_QD&{(짅Ƚ*5cd>ih~=[!LԳ>;R;_gyxJ1yy�[6I""<xO0IfvC;5ƟA00|}S |иè1,Y{}0{cH\wY@}]Dkv^ȁhkĒczY)Eo0Qa”A;{ vjtJ.X!N%`nl4k8eRq:2+$:R!H f[x"4ڤ+-W7H3Xk爕Vcfa?Ab!l'x݊0&O-7>X"'!ocas(z"ژ5voJٚ-bgF(;U*iT).uS4FB$%0ř=vbxD#|%삣Nr~@)Qz. Ugce]Yȝ%^鼠&pr:\:ȰaJtmkq&'c f  gE/ OWQx$)@HWO}r+q>�g=y�i/gC iSeJF;<e=.|V!t̩ƣ[})!촒98?�1N*xj0 ~ ^wI&M)>@gŒ'NN˼}=޶?sdt;&0Qo8-v4;#ڡ4i-R۴]L9hƸXW1Dx I^Vp?*R؇6LPAwu]7ӵ֪T'ə~AgEgkr73JD Һ,!fpe% 3jXgWIBO_b'3o<_p I '#MCF† 2%v,=N?୘0m{`^/ s@ <´,KyC+ˇJ'9Ln8w0exQN0 )[ꦛ�!8�Ɠ)IʶSƸ߲Kb5bM Qޠ:Ѣ[!O Vznmt@ v۸}Ƹ}wVR5$]7\X]|؍$hjmnpjQJإ^ǎ |qV<g\y{$SwAra 3u|q'd$9zCIr |�D qDeU> {0S=kS}v7xAN0 @}N 8] pHT#}?*DD4>&c-aH}IǀeF % ZFDsNa20G'X[Vz7ߧ.]zߥnKo&RΑfx轻tc[) ~n �&/X Xxm!�;ULaH崐T�`#/ˆ?|}73c눊 iQ)Q`FXq6I!、ʒYbQI: "<{8'x[u}.D* 'RmuN~%^s0nfcq2<xlB`XZx !�;UЀf;c  `XIQ5]Dc(!�"@o :O Ad9;w dsl''$tg-PƵu}jsytT.6zГfGq7`GkCq=}NUuPǗxQN0D}@+'UEo֪G(ǥ\�7;3YӠzێ{Β՝;i*jQxPHŵEBgzpLXjlm{mk |I$m Gyy.P.ϭaUcș#Kn}|  pZP96tUx�,vA)0y%*sT6u_I>xi+u i ӟGo!xAn EbncUU J]Q08%N/Pl@`-6J ^ռ ilCUuڊghk-43A"oZYa,\2)D&H)*xw% 3:Ί~ p)jםఫDUΔ3G{3͋CD,Ֆ-SQ09Q;T !yLoq=|{]ݴ5!3@ m rSHpKʃF@]P cBK'¥[=c0CؑFfӟ��x[N!DY@fbL܁&i@i݋q6'Ujt"NiiѢ HI$6)Q >S2WKןA.p3g*9Im95;p|BG{MZya4y`s6ic]^^xێ53q~<[,xr--ez.qxAn0@ѽO1(qlǑ*D%Xv�cg 85\l"!H^M\^k {Xr3"ԑB:eNf`"={ 2|)p?wɕf2s6[ 9vsnMRu&p<| <-j9L[VxJ0y ;保AD rt´MMRoo` .S(-^; 5?j-YVLHaњ8ϵ>J(t=í\bR#F!!ܧ`)>30QBX+Ys(=9{uuU)52c6 X弭kLG_2|Oq?0<Lc0.}}Va'xn0EemHMA$+9 S+im.y0wŰ$"JIۚz*#4j͡gL l}YR`!U}D 8N&'t! Їm4JʦUֵKK|Ѝ=)a!El(@3+鱐⇅<?h4q:ӧ2?tZ1 "`ǴgHPBuup &]X:{햪B)ycfރڑ>Q)-køš� aB<>YC}xJ0Eni6m+(d҆mLݿK7a8UthZg={D0`hC#H޶D^Qbr#B!#<捔o0 X8=lҺ]Zt .Ѕ׭#@�OrLǫoC(52xIPlox1}ݚ?(˥S{)%E`3щ,WBC?Ew矈/1xQN b. Jb{3lE*D]R9DcF0uv!r #ட81>ؐWZ:h 1Y4CuZk^n CKgxr{{U.sj2{?S0"N2Gk�ýcW||nM#m8gXx[j0wb6 dcid+V(}y?7f`P١&mt ƨ1y3yœrVܨށ0B˄:*)}H8N6)yHHAZ+\K#hr5oTC'U [߱%N 3' í+RPs_lx[j0Eـl=Rc XWkhB=\UDt:KJx1pW: V_qip6A&$\.`JkԨq{q JÕ>w~}*S;褒RPk.qw trv;z6!>7BaƲAcHP2m'!4-:ι ?_ɞxKn0 D:/@_ ,IN@[TBRI^-fAp0AУtRO]VU6hʡw,4orqv0(nގjaTFVQZn9 \ ¡<H}Ds~&y? Jw;9vRl4qk.z?8r$BݰB͉`sI8/c^A ֆL 3.v9HWxm0bP+RF`W@j T(# n yLo"g0#H83F6ʬ'6%K&퍶&Vq_g喗 KnNl/P^K64s>Q.oRfX"٠}ݻR׼<z nzx]N0 s ҿ4E X.&N$%M=)xS$q8I%D Պ0Nh6Z6 '-80VcɘIwR}u#Ü9h�gFxUfv=Q*rΊlJobZ; .6zSϐM\i{6!d )$3%pPzƵxc1OXtG:;q&{=Ξt??}qզ(xMn nlwE#$(Ca8@:%zDD`%a¹ة'DR88iՓ# QWh4p2 ھmy ~y o;qDx7%} ljkNAvRn37k%~1=A сG/+'4&12Ύ^hnQ*^o?vvE^åe)S|e- Ov:IpHJ5dqw[L9鮐93%(%B.Z+ٿW*O_IpἊr?*xœ9kJzLx[N0E@+'kU@$'8ъݓ҂i>FgtD(TLJVf@:%0h% h)`=(mi\`lð)&x61ɿU n$A9>bxF+v\p6|)OW#軋=[ .Cq!OCMh9pϘ<3"هu_K~ؗjϰM|uXk=d2e3vBv.>�N4x]n 9 `pj4�F5b5/xvA(c \v*QMcqMO5]Kf1hpfxkޡl{(36 %%z-clCXg ,w#Sx6J!mESRKSwyɨ ;ÈL !.堋O\NNta鳟"ɼeO| Ä_z.jxȳVyS6M7rCDMm!_$=xr0z &tzꭗ/H h ߾+ M:Kz`op*?<%̏s<TǚNi]J*:2$)g:JReGQU}schV9XꗑC▊_ =u[ӣv_!+Ey.i 4OS^@uJVjx#FAɺ6 `pa!!~ 09R3_gqQ;R8:2hk̽N[0r6~6+z{'f ;` w2yHs8uѬ_QDoO49 |·jݑ 퍜n{N;߂d-kZ;+Fm(;q%iJ`1*H3sȚ&![4 "ͨf:cXx 17b, *F˷$ { maGRVuC!fhj<e ;_6;!1w_6[VxA @= ^aP 築7' F]@1;LR9>Q(Vjt!+tYs%EU\AA{}tTP-Zpm|Z!8IR:S@L'3K:xA �heA/t#5!o`ьV`9O!f<GD(qhEDNU6sdk&1Lѡ"e<OoJO n<\K}.xM*뺨ʿK+RܷK@ nA̰^*49?:Vx10 �=-UU E*;7\-vT&".F.$%1٨Z-JB gvԡPb5( A }{37I>iv-a}ڐZ 2תDp_i,2l~`Jx̻ 0�S 範-+3 8rO h_FlRHtsZl2j.dJAoV#\5%:gjYQ6ޭ}[ m.n_W0d1dFUiC> iȪ~8JxM 0@}N1P&"έW$*ئԴW[) q)t stcT3/25:dgLt7vޔ9!k{nVιn<y:ppmu yp@Rgk 6`37mWMܞuRBLuxIj1�zErimBn ZZgd4=&Ϗ? J3dgNeW<)d-&JDe?'MHK)MQqkp7X#uy |zfQ,M( ioRڀV=:o�M?JPxA 0@}N1PL4 έWf2UiW >>՜Έhd`8&f!F>"f?j4a%[]']1$Ek{ uix>pK`ƾpҨJe^aT;/ZK@xA �;@1޼mlKC}&9 7"CVd|ю2z4PE'Vl0xICV!; Cr轖qRI:;kǾ1 \_'t T cmإ:@Y VY^Jyd?Tb[a;C-0`Km\Y|XxMN0 @}O t!vl88iFi:3b]AJ" EKtaY%帤`Tepm�%!_"Qk輈w2fc|>sON;V+K|J u0tKuUcޏu}hxoux[ȕxn0D{vl`GQ.mڔuFpBۙD֚Zjdˍ}x/V^d+& 4fV\"BkꑓR)2|[#7x` |=1 TNh-l,Ђ΃]e', \A gK#xPn{L7&x<SZUE%,t RG٥b 0MR(~x=N1@ާmO䟱FA"۳qDo"WFg}֬-:Yh0+u<ȡCJ>ٳΦ@^j4f'hu8A۝6x9=p}[j Z}e4J*Ij)ů)Q!N T& LB,o@PT v=\xA0@}O1t`1Ɲ[0mbX8$\[2;ǵi$Rא"Gf$}P3ɬ6 |7II^&$N"TFn˷Ț.1c5ag9<^�RSb Mg)_'X(E�SՖx̱N0OqGZέb@07ؕV<> g*B`qûbFt޺Ȃd>$X]P%72ч !+p>gG6bTz BHLǯ;/wxeJ>DuV.SkWGjyUm})όEևG!m˙im}]SxMj0@N1p4 tm'FicE 5 ~"S%vMe&:䴏F]Mk悑kaB㪩{&=wp~>\p᰽3e!n?@۔t {fg6JH_ej<@JZPyYԜxAn = $V1DG9~S'Fʁp=09%m6|F;+΢q:gdI#2 99 ‰p:|{+v oV Nj.cȿSƺ^< qI{ᱴ mopo`!xAn! @=L�KU]:"'?9b=fIMQ >mڔZ-ˤ5!*5BI;w,(҇ݞY7וK~=Y(9`�ן9+VE쯎Më_CSxA �;k/, ƶ4~M a3$ tB)b=6Z¾W y%"9j )xױOB;N&>)꣬p^nʛg8wh.RƑcY2X Z}ujWޘ_y]R6 xA �;h$x3JbmxhI|a0;L)#`hxWp۾{?+πcO>8k1 ,UU}Z c; x340031QK,L/Jei>ϼ8_cQ0+i^Yه<76]?U몗Ly϶~:S>X;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԒdλM) M}3PljVyPSRstKK3f\LinUoGꆛ4`JA ޮ~|~]q?٢ r:(r2R+s rRN~d!2!6Yص 9ТҼb SwWu~"05r)/B_3h^s el84/AOoo{n}�RPE נؔ(VU{D D04>q) y�V dx�T59YPM>\@X 100644 README.md�@SuN&|.%*BȉÑn�#*a hwaS9Ca)lS7XgיZ;Wa-+4:.2F[ BeNW40000 tests�+)$ΣO6kR{*QD:x8�Zf?Sܓƞ~Hnc~X _;([k#̓ GxkeieQ~s|~UYs� xSVI-.)*y%F\z%ɉ9ɉũz%z8RKRV%p�?!OKx-+QZ\RW[W� =&x+m`P]Z\RW[�7x\[sȱ~_1KU4wdW$b"SZPD   x+[$0ׯ/#k|?Op2OWkK ӡ94|qO~ٿ׹~1e] ?+{[:gŪzKJgo:_&-г|g<߲4ӊz6]Uk{EٳW??ا+wQzu&*UaDM]*y]9Ki L7XjMofe7.yX'KشyQ$ˊ7S?K6څ]aKӗ\Ȯo[.͊,6Ưy:E'^0yU&h/]d^OGgHKN [mL{zd:}Ma8FokO 'Ro@Zf$laVu9&wwJ-2طuj]!'MED8}픚v(H} ̾whO,}e碶$œW= (X]n߈[|3A[i*lKڟP^,ҤRu*#'1칪Nš`ƈIMWXھ~}k,\Er$*^$W*jGu=K4.J,ܽ Caoy֬,gҙxrJ,g.eČy4pY`uY C7TJmf&tv!YR WV җ<*U7DcN@S,ԗYqK_ߒ6zI`9j`u~R>1 rSxIUH;RZ*'\`Œ,t/V3c5}k"ͣu ~M*Al2P UEa_iih`S\H U:\'4/d&Qz[T{!3(9Bk5(bc'A.{գ`U H1(*ak(5߈Bi^%Ўub b:1L|n>82/`?& sg[X\(yXH<z 1A}á,BvbrD)Dk Gm]quٮǛ $UkBi/eE!Oq+Y;V EWPF2DN"͗kA-Hdΐ֑n.8eo CJ]_&ԅ$K`\ @b~B-E5U)ڀ湄Z?@-X.ǧN(^kP}ѶUx}KφS;h6zOÄ~||?h:?ft;lcQ1ؤɜy+o&I$6KTy!Z"Ov}7FIY F�cQ;#x툋=�!cDtPN2OĴy簚8 z֥|uGƫ큳g1iӶMu%#Q$'% 3jew&+Žl@~�آoسx3! d,3 $g +P)#%PhE;T.2D+S8Ճ$p+SC=o9U &~DȁW!d}jZqxf8, ;G(蛯vlde 썵<v A9p>$?˼1xc l! 522>٦}&aNKlam )Zz="K q0~sn (3 `rJ'sr,m #6WPAu|tdIW@\4=dԐ]<Gz-r7INWI4[08s"0[fj=^QNUW1ճlDAr#t= 1duP2}0ɜ^j8'J". ?KN.ڌ`^҉@Lxˌ3¼Ux 6NY!x%R/U<yJM0Y61G-K\X捂3hΟy u8מ TcbG$K.}FbkLe _8a}9LKpRU Ó%%J(I*RE@hAFiT.)Җ%u)| PB>yQwAP0E٣/Ӊ9�.%3P+:.W#/ Fè˲̷{J·-`;!.[cK qHo4A/%8 9DR1b Pэ>QW޲NLM (@'ZAjɯ:i=KCAG⋜V.Q�x;2>6 6Wd !6A,�[h5-e,(5%#}$~okԟyO6Wm<o$bc oj̒5Bo'dZp[O0@”B긊@n0fBJ#'rҽ$b˟^oR(ы�J_5Rı(2NH$w%:X) s漡݊~s¡&u"3̎$4) ЙG92T:=8\ j#�W-dG;@?'jW()RޞOoepu5Y r>R?> %!P'- �ّk>0 -SgjSR iZ!m2ǡ2 Y RSF5�A 5㰀Ux Z$eJ_"Q[0D0vI,5dIcO{5RYxw'ڹMU0>b)W�%\z{?WAXx+s< ȁq?&2XҮ4 SD)+S , {=GDY-3E1֕K9(<%emՎPE@ }1}64iY9ꎝ}E.f٪u*RZE(41UnbF- 1RkL_v7lz3tIT)mJsbx_,P#Hn]ft+elKLư,KbОNyGӁ: Xwp\݇8tQTzLv]2h .ZK$f!ftz.'H]&Í_ ŨRrVA71vϏDZ[f+=Q :s{Wh!Z+�tnLƊNZց FljYJ6e5ʽ/m}Q3xI4,uSKs):٫E`?-dIH5q ]k Z:PˆByo[q9}HyTDyb[8o ۟-&QAn%5@ A$;-#d ?VX13Bǝ��ZTlZqa!-A0@�yVu&%KJYtх.5j/)JO͚k_ݮȃ A|$$e%<P%oM#_:[ ;qJZ^<YbzFkdDKW_ѱF1 z|BqCc^SKJ7N HrL)724"Fܭ$F@Y7 mw/)=nKVufO4kKlkoUzMXso*(_@NjC)|v2Ѧ/@I WDɩ QZ<C�{.Mں&sH  3Y;: C UP6n=E#37[HOmb(}b&2~W/t B�O7uFfU$ !/ +[oM4H\|^ D 'lO'� f3q2BjbGY=OD 9?AOM{M,K LkpѾHt9"{+t@TΉIR?63D?DjA,/.jԣkHK.\1ȓKuME͓u.^>I5R ݔPԔ؛aY\Tۢ:TܶuHɍ$Sk|AUOW̞nV;e˓׉&48]DaP RꊕNduGĂ{MyդP}x [ڿ<fg+v:Ǽ`Zndoh܁ĠIniҔ՟Ի=;NjYD)[B`_jm<OòE�K>K2+׬3�;@_댔H>i% j$G.RƄ=Ք@(vAqg4GܫF+:pψr~sXf'<cYBUZڶVn "'^Ca=Y.� i8<]sshš4(=LRl(0-#s^7pKD\:SDk dhxd椔y<1`13T(kʭ[9ƛ_劆7*�baM7ok@/)Dߦ%"rytb{x6-YJir"0$ck] BuFd\ӡy 1rV={G4ОwcJ +$#vhKQÄX2 t ng:mgvX"5,Eǩ9v9C~Q#`p0|ƒp~yTݻaj4n\7<zoiEMhmw^/2Gq02o84%F> 0;0H--)m| j'\N-~[UYMʎ+@2ذ$ayEIPu0 ƳgV}{5<Mvv7Og;9{;íL> {xn2Z?g>'Gvl~h_^gpl3 hlNF/= '</d6N et=`JdٯӬ!?F㛞x?')ڣDnx4V?̈Ot2s φՉZ|Njt?-1K|;i 8O:a:DM,Ev05_B]Z`|͂$kJ7xg/$^z>}*3fN/kLSӓ Vy؇HK_O{v2sDi|о{ } ~<˨rwxpE," nӞi>G}OG)8q4衊 6]{OS(m2XpLbs\_?Mȴ jOdl1 lͣM'泽&:F;? $Z#dӋVw*=۱g{Gc/#xǐ-LGʓ]Axi#7djYTbg gx1" j]RΊ-EqMet%Ng4_UV&PI 9R vF*"H9X /uѦʌ](VUC5#bJ8)OV8(nބy [QF[1h 6KҊLxu;mmڑdR_s` `3T'vxޏZKs/D�T~a b;BuhdsJRVA"3G kώkud  _d__;Gy_6";R'9P豻�f4j[m}4Uλ@qV5*s@gdV$ΞLP>S= (r80IKnbSz+|r/"!ztcn-:$ߓzh2+ΖH|I Vn~-�3�` x7q< 3"3-BJH;9^IVo~jxNcEg"էASoϢaжko/(k=!M_VBjG*/ƾGhauA z)42n.&/.!@м.vtΓV܂ѮI=;TBЛ1%t\H%Mo<IE=ܙMAK_߸qyM s=|9gݾN�k>`GbGԲq兕ߥ324۵UY{% terܮrN[l3 <l@MVs+ܩspk61�`uº9-Hߡƣd^n{-M6;w+ M&Np_d#K+_z2�=`_H|?60O,_.l{ v\ܲ@/f^+M5DŽ1r /ъ۔B Vw*_1x6Sx Ӥ& ]gs1ߏqX? xV]oF|Xb}cN#NAy4/"dE{gd)PEnowvfEYUu1IN2J 7m T&E4m1!g5J[j_iU*1*Du-Ӆ#zk6}դ[#XéI< UQ4WF-s4RZ͑Z!hlL q)D}ꚾ`]yu8L_9_g5M ]j91=s( j\!5^;xt uyUnrBϘ[^=M� GV䘀%D&2//?Kti|\dUѵf-Xi|X,*]R}�e|^!5܎W5/ "Gׇ)%i~z'7dSLJ ʕkE2 yAy`ҢĜPՄtcw $T�0ujeY2KԦ&atZcQw"  IO:˝-C7i*g Bר:Nl'#d&DVkp͟<9Bt SJ!6\TXQv@,4,`$:*Tނ"ZOR.Ĥ�G] p'[A-z`-6&TZ5hlL hB#y)Kvp{/-dߗ]Byp5TH;;F͍VGVdJ`)-!͌ÌbE^Gw7&]Ћ7S .LYyO 5 KW5 <kܔ!ŌT[pkq5U]ʤL{\D:f_\ԇ/M Asyn1JYXVeeQl3_O2], /8AC}ihZ> `uFYtzXQʅX㘷3Ih} ^|սg  z;z@ \w.2#E PF:^cB-GdvuE)X6BѭhGHg3u3h?=Bn "-]oװD ,Em75tw'OO6nu; 2?;8o37`1r3AE EL [Of8ug{+i rQn#qn6B M}}v~ۏ7?x'O> ϳ_Nh<Ӆ'7Жͦx<cH&x*`pDַ\/-Lct"ĝ/i|e�'ס>k�rFEHe^cB9f9r#Mfۓ _1pj9Vx،ʹٷX3A!�f5.{[^\}:zv T 3!_ddOIhxT]kFb=OMZ>B1i6ujo!kVf|i!iajιg=w:]6(sGEV9*(x4rl)1 Pj.a ?JrYB~(z/J[3֎GOFvg71g{Zmwv|zyh6FlQ5+ Nz2aVJߠB@/RpпU٫G49O Hv 0NON}l6|busZn+Yh+&AAPos\_30,X8')ccX`eTh<L<w' - arob,$QE 5#ڬ;>~8C*4/}FPzE.è'^6»קgg=׏Zs`yN%C&J϶%#W\Nn"hlvB InIM<e/Y1Am(A3g%xAt^wzbѽHaQ?L?8Upmg' _8VC:[nF!iXODWXE< <AJ4S*V ձ<h+1OSr,^Lӡ~B R$  MiT!˄lɸ`?70v>q% oMx?αj?(E-;~ I2%7z[aXmDXpKRi)gdkZ jq:];y"uFrɵO?~YH_~_ =1}�I&嫰UP[Z/[&&暜vVNF _Qj]}D4L Z%PП-oF!(xmP1N0lREWR@P�$$(Hh/ٜs!{uT<GЀx`ey<;;3ç,tؾgs@ AM NbeP,}#* DP}Y|$\%;ah#0i y@Xn.]\X΍'`TǶAcчAQiLZ,YRiՏ۾e7G5 IE a} |GaVhjL$=E:M6AJi?dM~׎0xyPXDm%6P%(g`h+`#M[u�uu"zgxeTnDU`a ]N3D a@WvMLUَ%HY_[vwBFǮ:{νϮ?㯽WWZ$'tM$$t頴r[B%b ֒5+`ɵ0+-) 7e|Z'(وFUs/MΞJ!;mSKna0'BeЀb%},F5j {:?<ҝe5Z]}o]~E,$6ZlXDRed$E$(,־Zĭ/آO'u1Ⴄ锳S'K-^-U!R-{I9 CT-|}% vR嫌.^ |˅%RfER}0[{2+婔"ґp'<l.mBRնe Z*H3j"rhh>9~d6͑"Ix:繿)ϫx.%L̩(zꔇ~Caqs ; -<|0t 4qyH#qd7t{nŠOFgr8Ü�<nԶANw]_ַZIl@4I }ʐh=1'6�MfSאo:�_m@ CشGb6Ҙ+|x8vʶ^x"_.1k[xhGu洘<8/WO~8;8k(_/bo⡩-^ʵ"hB0σuC!T.cB8rJ%ˀwl�lDFX/V?[0 >/^RŨ-aUKA47_޿tBܩ1|h=ټ1-V=WUUl(!*QhrNs\Xg`mbE<=qqxBcjc@`tf4ˮ|݃z$ôi}Q? BxN=JAegF2d+ q !VZXi1_fGfg^@zع7=t) 0wU)%#پJΞa wMi58tbi>m2n* Ezutxxc t"s PYh�l>$Л/1iyEsY!}2['m\:kYNZ4x}PQk0|+2 EU-bKZGaO#]u%Or߽ГT]K2 \JNnZ+O=ZYqb�yM6 44+'+dLmV/`&!;(ì>s <ÌuIӵyE◒YggOf_n4<zGڪz7JN_�RQ�FXkew (a 6J k\f:Ҟ,; ^x340031QH+LIKNKgjL#JsM Be3X%dHxz}{Cd敥U2DzT2W~?U]__WZT_HN-}]UٸJ+ss+~*HU}ի k_0�BQ~Nj1C1[g%6^Rx{qYǍ 8UK_\5r>&�| Rx[moF_7p\Pn{[",Ҥh[ܑ8X-~眙!8m7@k3gs^t]٦mq]fZ_y>v}Ok\No5]}L]g{әڴfv]Uͪ6>rAm@hӘE"ڝ5e՛yx՗/c~"flgmVV];x8s5vE.lɳ]Y*zLTmُݘ[sՕ: ϳS/٬jo@#K{?;UgS>|ww͡h\9:۸}_?' ֦NcY6t꺨Z\%h'NPb8{9&]ȫOOAO[]Ǿ1]N߀fzآ6Dyh7rYzm_1-|ijo|JWqm̺/#\%57hL_9 },f1;͒lWtYyunPza-Fj]g~m6:\3f.PuC 53o֐GԐx X]3R7K Pr#,>G %n,Usc2}WA nS,1_WF J^ZU)o.D{\vkڻD9T]?}⋸WI6k+Zxw7[a&<%1{l @dbK); :@?G*^-&"H�1$Ӗ4a>Yz@DEM֘ O.A�ԯؑ_{ѿWpĪ]CsM.m(gX GzO8l7p�*K 湶]d׀}LYVЗ;;: rtzK'W'= -ΩaB7_e n Yu">ڸQ>`2k8Vߗ8XPů 'gpcۺdJ zju=›1 ('q],`@"{) -.q/i:G#ؾ'X@u"Z\qݙRQW,,X+`' ܃q~4'X nۋՇy0OMuj,a>w(VK8gkVLrUd~Y|ɖ>8r{Gɏ\(.S7eo鷯^@wytAAaI_/rCw-l&ܛ4pO%h �I+RX-/q|zA_1>=^aIQL5>CYf$v-M<lC |Jr6ĪXsk݀Ѹ1'ȉS(ɠʃKHF,#ツIZ.rh-ހS1Wn t&uت6kùEOatC�Vqb @1VH<%[M2jm?g3qg�JCXn=4~W$&fG'Bz>zS0e[pBv{ xԛ/rsu-CfRFKkþ$JiVH �]u1-8[A}UO#HQo[1Xp2\jv )&C>[٢t[6H؟GT$8$r lP�d 9hxƳ>Y*E.44j=tANE>?I�+b#~j{zy8o.\p'2dRFq;>kC 䖿P`uC5"9z. dbM 4*4|8<W_O sCV�Eb`pU؃TyGQ=WPucUb@1uP}㭐6@jAL T@G nQ.[ѾL_(wtNxlN>N?ToO#4ЌP<wnKq%w@EFtÉTYnD#[*ZWcuN`u0σ~^JYaC ݒ>hm%JFͤQ,AǭDыOM'0NhC+<M$ŹZġSXqX䝞!͈Z]#WuLiĮU="`l64A.un0r3|Љڦn;h"~uHf$J8Bm3dY/i%\$(7T^Pv3 [gýǸXbz"#ދD⦸sL6<~:k`3 '.`h(ѣΊᜓhn)'ݚ5Sb9�ª%,ZNWF$8YN;1t*n+U>B1_d@s`9^L"J<y?3 ySbT-oI2u4Od꽭7iţ%} ZGc/Ŵ0]Qf(ͻo8]c|5zq<щaLR$2R#Yٔ"hbfudu:p F89pm78w >ɑu]4ՑZ_FE G.X</Z+Lybo2i#:JY̔? >f2F.PvCXuN; o{`Crsx{g@LObPɶ469z2QXnp4<%b=TZBwk"1\x;{4Ik;b 4ew=!u4ߜ3f1{~{*N!UP?;{89LG/#gSv3BOS 6pk>U~u)C.DQ%P<)"*bgI^ݭs&o ďgB2D>r^fdv:f-*m ^!)iݘ9`\s&Le'gt0(m!}'+V(Fc1; m1ԾBi1%94%'Ʒ4r('ѪNaEcN@m<4"vHRZrjfxR\wiCbЗsgū^*WpD)b)51}9; æThU+xA>U;InMdtACk;v6ycmTu81/> +Em7C7<r?8"cvy묝 =8?=l@?C 0 dխ m%ySWߣ/_âjLN' @aoǼWΎ �igR YA_<Vnb( GĖ[p*J N0!4{F7GEwB9lGD;-?PL}pHK1!2ˊBs;Cy@Kl+1, kK6:?5&[3."HYA!@YJv%PtZ d7$$ ,Ja&wIxM2!750 X|Ft~xԞ(c`@#8hw,vCFH%\)I; t"{2CZ#XRΕb]WzhBdLÇDE]fgÊ2X1\f3nr&:{`懡> jEK>a?SWM~pE "ْi{" wo:(^pmIIb�1H5њ~ױvx>UgLrt;C%%QWNW$n >8tLJ*Zc6JqP#&F�>!.0{IFr=6a⮒~KJc:߅G';IJ֭tk?6&7M}*iCI6OhƯaɦ ɮyOϬ;#B[DLv|Xύ*G=M~噙zzT~˜i$ʐ4DDdnC%SbL-W-Pd;J3)>7ӊt#t%`U-ކ Jf˂"v.V.u sbJn+�3bUJreRQ%K0Njo7߽D!QIaăcӬ/w7\W|zJ֫C bMedNhu|J$$`Φtfczٽbs^|^Vx%P<�.FGۧ_ys\Hc /|?}.;wM Vg}>g#|~iR MnzZ&B|.5ډ1QtjՆ?Q2%WV&xHFMm% \a=ࡷ3v<P]jCxF$.tյ+DZ$*2ZYcf>[vll1Ƣ;<`塕З q.XV!Ҵ8'O b?פ̹be<uEhVYmiE:/h&#{ εh~~A G9Mv<սDIb5"㗱 �*{ێFf"Nk5Dm?%e.l?vjidI"J=.`< /?`c Bʻ5\pKɣǩG<1MGu'9»X�v]*"ZN@XEC$?.*N(DZ ¨6ػt,p/ҥ+U+=}gXx 7bBCA &>XPSO\ޫCN ?m_->hWPWnf H'Bʊ-J:<Z;j<,F[u 0$̥(H Չ ^mV8 $;K-'IvFʖrQBpcU, WC*}"{|J[֨ "[⠗4YoTk{GԐ"OS ~lz 3/uh]+07n�[P1Y;IW'WugلN�J9ZLU/hTK-0]m:P1<H5Ό<(#0뵭,-Rbe}rG6֏/^42mMv2 >~4w &ɈKJr,F">#1Ík$1N�FR A`NH}z>U}(k%ZNSbkzm Yl _߰NNZwr|đ6wo_L;hTyxֈ)J74.z(1W'U0ZpH)!_ OC7R~et1�^\&=Gh2Ol7>Y;7LlKLۺ&ћFDzee'l<I/mqF:p z~;co-LJ 3(ʉZ!֛Ie;bMB-g] 4fk #}0lh;`L?vz4gQy>6"]xON̉./N/ ($g&g�!\ "ũEE%\�yxONQH+LI//*5HF~q"Vdg敤I["<}�ͼ x./N/ON�9[ x= 0 C h/qL@ݾjk$>" }s55pZ{M+7x<I#^>+zc!bcc}ٗbz*|7k-x31�<w[kۻ5{W=bVPX 1anv_I=Ԣb'3\ml.838t'=ջs�3b-tx31�b9gu=ao,c(�J x340031QH,JЫapRv5g}v?&%5)31~ uRSgδ[v&†CPU5aOH|#7-'-Q{�/'x}PN0+FV>*|�g4U/3]gԂ f130FBG�z%- kĂ!@ 9qP˭^m]Meu4-=Y-c!�:4|OakMJ1eԖl-Lb{sXV_Y=΃.h]4u@�B4W!fJqcv DR6s&b#:6b e)oNw{wxERWWKW!/17J! %$U%5)31o1\ �:4xE@0cc4Wiю'\V4; 1&V7y'k�H).iUٻu$S*j;K^-t0 PKU?bк"e<MF S!+)Q6 Oĺ?7m/a֊!�4DxUK)MIRHIMLӫRP(HͳRH+LI/OK̩TUPw+TB֜XAVG̼ u.�)tx31�b¨AeGC\8B|jnANbIj1۟DϦgf:Z�^rx340031QH,JЫaH~Vqbvծs\0=t͙㍆5)Iy`UrysBO1,}5Oor3!jΚ5Fx!ݳ2Y"!?-Ƿ xEL0 jRb80 ΞDgq\ M6p$`7nAm;Jy8/nvST9YGյXzS2xx[θq[AbrnbD,�/̶:xMN0=Ũn; *HYKT=ilwg(HHl<ϞVh'ͨ-Y<.NXm&h[fENX (؋ (u`C+ R�Ec�|E֟R??ԭnW~c"o"vb4F d~uG)LΊ,:1QHL/G-y?gRwK},on :$~pI@U 1-{w N:@D GhT[&X`|iC3?]i-,_Ԭf?ie;Ъz+N|Z؞\Z2™dB z^-x[}3of^rNiJBbQrDQe.G WZ>`f�7ݣx340031QHL+2b=7;.eyq2VaQ[X_WRWk*ȹ]�M!x+-N-KMV(jk Rl ML̹� _ xuN0 y>@d5v*Z4I;jڻvC8-k@n=Ppd<Z6Aez33& C1x௘>$H@M lNlVlzFZ^ u<VUΉws6s982ІClVJѺq<h2*Jv#2`x օ!ah&̠ �ox31�bP7[{9� x340031QMӫaJ“tZg+�; ߽xUKMRp.JM,IU-N-*RP(V@Z*T] SU gX)'e'%gp�^x340031Q./N/KKLgp=u|[8,c۽mt�^\;xmMo0 D{-!S [;BBUQrrH$\7E^S^i#\o@ 2ErF ЀH}eb6Xwz8wͰqQE\1`t�>8AO !BY(d/VJk2k!CLKX)b�+ arylfɩ%9fMB r8rX{R(_O|zp.] T]'{{ܽz E()Blo|n>•XGU/9vAo>c_,`DpVOL:0hRHh?`\{2jW|9jOTFz2͔< ׃MU]\_ey*Dd))~7뽭ъp4P[GaVTh*Ch~zc,gPyyqגuzߋh ܄ (#x뼠aO]1^ kjW_K%xmQJ#Aƽ/D2=-d &zT&=tOfs+M|ՇzEu A=飕d8enGR'x~&],Vi)J L?q^p^<|YE=h&!4 ?l'm @X>-`kD8?F,0bA^(xW!{G,)-`&m۲&J|7zhqJ[OBFwT Wi`dxt<&pO%f0heܚ\}PI41зLNE}0kWeM$ |>xs 1!fN.Goa_xYms6l-Nm,Icr67IoII@~@P/~bła,aL}N_>y1Y.*ЂddVdt/(ժt]dX)fO};Me)< Ҧyw//&WEbY$:) \trx8̤ݻŞِjö ZHL۳皠X72|2:œ FbW|WiS\(~M\/j+ޔJUQThCa7!YIҒ9Q Q!cJXr ap-kvAFJ*Uj&JmU4S%+L2X^jW^qbS9%1_T b=ߧ\YH1'tOhd9:"̊kʌ'cjiJ*&RTTj,Kp<\шn)iHМAҐey.kcʠHBhXH0.ybYSOI%$fdeWp[S4l(aJ)MYW-+%2D+ [Κy"M]!Jżd)qx9�O\Di`Ú*Nujq2V63Jw'P;:xqH\+ _s`(fpǒSZa P|J|fjYyՌ*kT*a ut#`a7ޕ$"1Nj 8yV,b5UI ,J/ eơL1Bc4s;Uʩ\,\Mj~JR)ƣUS3U+mOɱt-tJu [l|j5/g`kC9ڂ�s-K43E`*|+4iK>᰾I5 b Y = )cb@e3 ! 3q 1IXz`V3i: yb *PFiXT7 9ьY'*9;BuI(]~wRKu0k@.6~B$G@BD BhEm恫|)ZFfȀزjaQA8A')UO0LHžGAдt@\w .ѶDәԐ-Ws0^:z^vcX<}rv@T`V|dYB@Oqy0�"4p$2ȭdrghE* D<sռbA` ̹(jY0�-+Rם0-W`>^ ̓󸞎;w{wtw>L-Xp;D yhT [dK5]2PrtOżFv ڧˁQǼ z:,ZnDrhj @9g3'P`/Yˬ4L[L.kFHeVVDT>W/-3o$ 7ڽ~?8z{rgow.G,d5  ǹ54dJo(ꛈ&"zK\6z[[{[0c8{[wM5d W?~PjR :dZԓ?UnFw0 #hS&qdADA 7$E=>>N6m~O20o&鏏r{orNް˽v)7]VtL4(z^oˍC Eg?S~o7ZxYt}v3aY|& v𭯜]\h7Kӽ9mP:z[+Gc,wGI \Qc` 6& KҶ3ȟ6iPl�` cG;CA튇QE-68\•Q_ ԇN \{UDmo󙗋<ӏ l}+H`G][a_垾6W؀CF6wK;0;(7T偰2Q�xx]b0cN 7x 7Z=,Uum#}mFޅ+Wο{ �}D͓Sd=?kaC^G镌^sn]v%=lXq'^>hm׸=$?<}>J?.}s2nmd�#'iZ,8;n&߻3SKݯǰ}kH_=�\O8 g8B\(Ŭ t'6e,BOF_=P vQd1}wVmzF3Er#nMW;*GD]7WuZڸkj/:e?/~yY"p;+TM*W~h_ V귢%{bi ]+{.dPDh `v+vwHƇX9`Lnr :b,cɧ Ç]>&%$aˇM\?--g%'jk0랸EQõ2tVmYqaKۄZo={r_,\2BϮUk{uedG&1F=a< IAxVQO0~ϯB`RxBc6'qĊc{P]ҸݺT%}jGƩP㔹,=xbG),LɜYR .|דp{w2y3yq+ 7,|6qfi1 كULn@ OgK dm ɳ֓fu+mV f^h'KDk/s|v8s@d-&BBׅ>m9dcQed4rFZEmV9XL>LHhI@r#xqU${g /.ZC^&KU=a`!SiO`,f6ҡ]Ԏ]nEFiF_(癔8m]}WPqA$jAnmt FU Ȯ|� ؕsYZu<u3Wσqpkà \+&`w 5_B֞gs<eƀHKtD &`LO:j6(il%{:І5PO*a=@ipA@}xCiA H^ =0$L)Ѧ3$Y߻E9ȚF5W !*"_/.x+vZb HjIr|ZfNjq|AbIJ5P`dFyi59y@ļԢ,Ғɥ%e0)Ɏlbpd�a%f xE >&թ ѥJBp)PO/o|2FY"9kpɃr FqdM,?F .[ER*^ErNALz4$ݭoW>(W$M:xXmo6_qU*9N Hᭁ,;uCjLZd%:A#EJ_[&c^oھ o o"I9xr/,j/4 )rXcF4d<W`2 &dGq)A Sшs$*txj�hs;rȝ)ܤ !Հtc}JqRrϞg|9 NR(U4[Rb*bpbN(@~~i @LGbbqA QiY:!3 %˩TN.JuЖ5{7B&, B Va"7k RGjY[ue+f,"fKztu;EѧI-ˠ(?FDmF<�wV֒N8inquE` MT3 8 S ;)1zd`%Ku, S;NE;:ۻdڜK~np%b朰(G٢-25Lg&4h/B>hNe(L=zx'd?(�Gʃ}WˏeDJJ/Delip9<=wYc6{"&�hZ3 Tv_޲&QJMsBBOn>L{l=Z }z'{[}g4/ZSUL DYc@OBB:+]xK h3$ .Wd,v -a5'Brdy o2܅?b1$kJM-@cl)Bi*- 8SS_o_Qjx(4E)("  t܎(K`"fQê �gP6NQRn�Sp�}e3sH3"ꗆYԽ&6PtJ]9 G!;8.QEsq“+٣R 9%RuQLNak�Fd1x.o&G > <"Bf2&FSq֍Djݷz7։{U0N`D<༘7uc< imX=*ժG%T3Af^KKR}^;4hej;_N'Ɔ3NV-Qk׽^?sO%Kl}:D6Į U 1[ ~4ΙR[k*8^-"0$ir.Ajv thI^P;jYmUHbLT3ͤ,۽4PjZEr4/3>(JG dl:5-$�4+>C6 EP.ic0sbIZal]њ`o%NR*ţrƔ2&`"eWXT*!Z\U8W`S848 *,@·:'EΕMvZ&thccא"S}Uxrnulta/PmhHKٵc2n}prvLl CtpiΪwwǵ19]ݖJ_Y.r(FbY fhcNsƫ?kx;Gu1KvyfF-|~!@3I(=$>713S r&1o(å�72Oî-{&>N�6'YxVnF}WL(CY*@@" R\%vY^$J<ܹϜ9;qܲRJiRIV$f":۽<ۻMcܞi,J&g|gRZ˺LiXG|-Ƕ:Dm|"uh.yUYSIz`*~TBp*jD- ^,+yP+n-�E`.J�eg=\tyo65<O Jx\ I4BZ< AVӲ7P6FBư2  @産 %N3κ@TS�sMM=tS44xZG>$+G&g:I+FNVqSٰ?Lm$ՠ;QL* *]|h M|pwᯊO@`i Z@ |I.]E[<_=:0vU2& tqc']b7{^JYM1[4\C{|I5vArP8 :|ZD.m^IT+d܀i&qvLXQCk J/ L&Ȱ,e\J}}I]?ՊJLMSJa*`~K.4VD'W! yiDڌQ8112NQ։V)¯W|UFV=SXuh6sy&Po0(Lp|V=Z3b<xpo 5f4hq.w&( 4G#Ng ?GpXP5F; 2K_+oDz2EŬBl Myk4r{Q @K'eUqR'*%rS ĤLaU$xx : {gRjI-z5kJK2SKJ 22sR54+KKs32 JJAڊJrsrK3JsRmC]U@~:HUqjn B_pO ¥ZzK/`btqFhNQqe^nYQ0Ve,fmFLfB ,Y�h_&gxmj@1{X!ZP[DNm+Xrf-nЮc^!衔e }zqevgϝo+ Ɯ`48 DB$lm3FQp/z~ɄlL -c9qT~Tޅ5S(n`rHٴȩfR@8-�.㿵I6)w0&Qtm){SY Rɹ̀%׌R  ss)0QCS&4.ӰQxR?rߎCkYcmX]Up  kds% h *[~}s8@ cmB!<^Oiw-Qٳ: 4_YFFN8Aeȹc6ūm7yg6%xmRAeiEG2$Q!a@L,Kdt8gÂ?=M/3]իzw_OP,&t4.ƣlFXɔ/Lg-N+AĶiքO''"(x &0!rALH[Mfs.OP18*~kLFoNVMz Gos-!\"nݵ0H!dM}d* nVNKʠ Q8FWA}*f$K?ҞӒಞD9zhB{{5N߼x$9Ղ)]#[`531QJ#qn <QWS'0.Gw2nV+ 0 r9,7&W +|YYJ`n7mPwm[ ଄V;seZ ŕ41d[9VO*ņ+KܺyKŚwЍNv;slr[rԊ4Cuy 19`\29U [Pqhl x340031QH-I-I+O,c(tjef,, �?x cHF۶12D۶m;`͍ $㞶mwOk˩_uusjX^Z倀]Gp���W;�1@�@�̘|jf=}"sISEq{wY$dsn: PNFťM|kb{LdѸ/Sy@%R^$)xctqa_ R2Ky&? |:I}a` SJ-2(#4ؼ\^Y嗠a4IJ1Ea+UiFC&I}[v\zvB 5}kVI2 7LDhJE R:x՘%fY$fٕ%#o} _GrY k͸"SY_ z_UXD?<h |Lq\a8\ojYt̥y*4zI~_={+~ZS7}ň1�Tob]+CrVE@[cJ}Y"?ZlX$,%t댿5/oM7P٩5- 5xu_k:9 Mc9c W~ !{3ATFra8w [/en6[U983 +Ln.|ϛd7hEU'`1 x]x͌Zvծ!]ͻUm('1SLYuem^A*s K[<+VdԨ.U-j'xJ#]:X_޶` $_RijVi^s.Ewɦi5lu+u/5_#,ȋ@'KP;Hu@Uz~oP71 `jE5Dr^ݪOI~ C'[66' bOoMUU> d-ТwNV"1͢( VMmxbX ,%�MfmQjh_AS(RL  ZZ*ݫ`=hx`IKI+Q&2ǢmU/>,_eQw%i@"6_gSr$U"y^n*+SCv'[6^=6C:I%J}r-`r˯WjjYGCkh 4QަdEi:-?_]QSv͡Ov/닿b䥠FP5kh.(Y? 0cU_)PRlWccK/sÎjk#x[hy}D O7lh[ͭ6-SY脠/V;&UX=ҥ˙EpYByoذr-B}1i +\i*~߳Ym}?Pݦn%ax^E|x*{PwduiXSIC+؃{ʂygq%G7Rm-I,xa[gP{ZqZEڃrBK6q 򹝰{Ӌ=Wմ-ڏnsv[erc4)KzF=L7s(g/8T,띟d婞uguXol#nOQpQ*ϛnޚ|i%1 DSo o /+l;o{בj7֏]lfg^)[U-;ue5$XfY-"VjP H NY+ 2#uC*c킚 c? Eʞf*Q}=RS#1Gj+\tly G΃ͱjՔ55]"Ay¿.\0 `޺OXskz zIf6յDZs*4<M)]vJh,VŌֵX0xEו /[QgBR1a3k(.XE@P''/-< +=kmlmMEfBqw#c˞D!2*4 Q_?YG14uqE@6WRM=o؋E,u}LڶukTI[&6n Ke  $ q$^:#H Xm Ew&wKҾ%RpvSu?Xί U9ra ̄t^)�a +^[Mq9DHͫ|BCgy~f)<eŒ|#?H}XQ{HuAXIٳns8`vCmߔ;G 4/g%vtG;зGC+=>gӖJq0?uk[eESml>7̭54{X/'??[$,C7 {Zjæ>ˎ.͇)*[˪GJq$oi7p:||))33QdiTߨ˟bGx|bt s;rQ,͍Oō#so҇m/JDUB(7h|g#}$t)YUg@&::]co5p 0xRڲxd'}/|g}oδ38 rRi L0kH]V߯b9?n!H 1抇zľ4*ZnQ BP鼢%�zm ZnreI7:yp_aDXJĥ WkUCkeqQ_Jԅ)JgȼHk@i ױUǬ/#G!_(E"wdf|\\W 뷫VБ"j΅`awrⷵ{UlE v.fm{ 9EgJ.H%`&\x^?>"΃iwŻ/ğCL#5s:\rhNI<?a.4Z񠮤&帜�3&J~)W@ xu cΞM  {~_1jخs#aLP(q:qSv[/ gdW.x)T|0{2,oXW"_nҢ/FqbY٘wG㷺r.֤֠RGd@L/@hT=OlM0 vWٸKe0 i*Az s }@6}1L]i! nd=aVI,p?wZaoqVa/ugEܫtszoc?cGi^rm*ZT%A3kÒ\L]_yY}7W1f$~(|ގEE3%-]iL%ɹs\mE~Al霯?LU�Ђ[,/NwW'NڰryA ?yް=ů 9w5[͏'ftpߝx]Q2s\XP]S\ yf Mŝ ۈNRA vxCd ZFCk_͔)PX^ik @r`aÂٔG 4`{ f. <Y=ai|j[AtA7 )Lt$w|FT5R_0%4ᭂŚ|+2I`WկBs>#v*~((-ޝ#jU{PHcx%4Rlh+i9Ͱrjȕ'ON9lݰH>W;V+jUh-:m^Ceˆ/-FTģ ?[Ƚ k~{ƺ4=D<Yx( s`x|s_S7eVSU,g-^tB3 l(orM:wlɕ‰E]eVv :+JEDϼ:T1sya"t:{ܷxM1A3\@l?/mRdc*F7Hk wLVV)tJ#YIt,0X1ao9.u.$fFOLg=c Ŋ'>g᷵#%=oPoSk<}qO@i0};+?ͅ J5SN06DZ6V)*.<%.clAI.u?h|pR2IߚwrȰE2U n򹢺 6H g WI۴uNIUm�.+odĢ]D{iAg?F%<hC8ma)*.Nr& fUeO-C PǓ[Z~�y(� M̓UӅJJ46.PY_W?y NDmB<e!ǒ󂅃/!5c/|[I<K!*-?7jTrf}Od6ϧ+ ߉ܶUj~ɉ8.!>roA y@/ږQh\]x[ r^0/^ay$'?s zm11(i3V&l6[תʯ4mp7`KÄw  CaK}:S -! qLꏺh)+`aT?̍ -Tw <צyRPZxIcrOU[j-d3b*W-(]a74 1OW=W2dGUԪ[YñsTz%)zNDbq/g$kY1L`'yW8[~X-Pp$<<囔*v1[n|/[&^<g}?w:%ܴ7?ӀKV .)2RJZnYd{@1MziƉʬ|e:;f+9_S7= mƋ@$d٢b̳@R5zU f<n $`>@D'﹩kcG@ː߸J鹂Q焃h�ɦ }os0+8J RgMO\+/keS33NjDWXYqL 9Vz~TcJk1?BOqv60-3//wЭP5omőɠw.=-O71n(V@oB\ٖ'CZ8rڡ|>3.pwz ٟex;HѴb¦t\'N6`#/F FWj*6(:6ǞA[a2O MЮF[d{CߓQy ұ\ F2Bs@;R҂R7a5pE@*z$^RZ zJ<�ٺMRtT~r�x NL~Z`6Z&* KP{L$[Aa++4nHRӤ y'H lo 2a9qH2j>Br !0@-PpTSnOH:o[S1e4eb/ޯ_ȍtȒ75sfF<DZqTUiJy'ǡ^D^|| 3K՝KݾPځ+N1JЕZڔUW$3ɿ;KDw qQwC}[LJhd%?+AW2b~뼔o:L{MU 1,8s_(!35+7TmR3,O}QX<k(F^͌$͞-ƅ4rKϠv%냸",O+ "f'gzZn+6kZ낋r  Q_UM^Pyk.:+$Q(jgFCeTm_�*{u!CNQ=VmR<s\R?F֏d-]PUWՊS0QRϒxɋBs};o?F JzZ^K))g莲$%r<)3G 9,ܣ|;x J\'EO^ᚈOXãWIcCcI4'# 7u+ʅN]lwJKrj Aб@wP W}\ l(B;)EDN[*۪$.@0;O#7Hfzvrj>hQaT]Wf>h*ŎCnAGz\>Sv2ȾiW+a{6 )/yGXM !lõMO> 9XYfh+ۨ&!9@$"W%aN5O F4۔ KLR!D7 J4ok<Ϛkj㋥V#42`^)Î^8f99;A(>] <%3?ތ޲PsA6NADS6_~rhᅭ§òBazTM:gj^*/jZZf24OOڿȮ6fwC㵼 eb>3آ54q 3 jT;38 9LT'C8aDij:\f Zy̽"L%J#%Yޞj굶mthi<6|/RnH(kOƸA !�ɊeR ;TgJ :{qz=x"{Vv #Kp5*<#!(UPRdӪ.TN~$$;-YJY_:a ߪ胎яCG%~+/Argb@*~Sq`2/ 'ɐT! ͘ S"$ӊ;r`CQUP2Ltτ4SFv;ަ\"b2fL3阦ת{%VCͤC28ORZu_}?2&cx$#eU=;z&|U&u3i;y,JYGDa_&Hގrgڋn3a_挡mF_ۻ:y~%%x_؞榇U4 '/4CЩ-L[zUqsh+ҩUO4=|R[kZppCo^4XsZʥ1?i)2@}$+ Mx`Uu,ӷ#h@A#\zͮ Tӵ-37.1)(m!jC0YkZgs&B0_Ila>T-^mԮ/?[O,X&HIȹiob: EFC2Znfz*83Q ( >I־fMo 3А&1cp \n6i&<{mh]N%1&fJɱ^fR>!].b~K+;_MN{ӿ- ~0cgdǹRֻig~cJ<dMV[So i櫚i9@*~khSNA{$%}n3*ױ֋KNJpC>;hg]P_ľ*#QV{\Zb)@\c)R:1a)slff vA0eQ/v)#w% 55\x'Cw)YSAo eK鄛x#Ieer#:йPoBy$zA^sF9Rɺ8Diz)K/ 1Kq sp \Mny6 qCha[MlO@}îiFjgWx˒5b((MObv'49!$1rzK29�LjW$A:y^Hlj Kj8;e*%)lA7ǂ?mbMNenDQ OgdWِ6)V:=yj$$igP,1(Yt]4u3 U'JRu&s:Pg}QrVM@@KR0% )lgFg~[7?_ >C#OYWhl?4^/S#~~en氾}PhE;f:D^ARz?JQM1lwM :k\8 KwSC7@rO1K<qrv ,$bGm(atDNJjicHd!$ njlVk1rp)A;aQK4 Jhnh;9DN1E֒"�9ɚjKbWC2 _M$NYE@mkt(h%J(4?D{vgʺ1*؎:-dH _Q`vivi{|x$Az#DKVG.@b ޴^LdpL'B[/lƘbP4ڥ4.՚piH jvF'q߀t<-J7cN0VTP,v.6Զֽ4j: Œ`N5w؏)N):ĂI&/n%h;#9o^@:Y,:.C0M^rMRVF Nz[Lm<Oǵb SIt$>8vfkˬ;AShmѕkC Kc֌^ I;H\E{zE&kl4HQr`M<} ގ7l~2m^,jśM}|~@C6+ĐSW";7IDVf^۾h;۵م8u+:%*=8Ph]cxdJgh;EDtL:>+sQ<E=E!ukZI}6iX:3Epڐ+R0`]hp oLEawgKا-NѮ3uv�1/�=T b /ƛϑ̀B,q7qXx'>6i,X}e"gf$aG<b[ȦޞniUt{� bb%< /֝4]mc8(P%Xm!O<?*44ƍa8D,99d+5wWē̕hy� (r4}m4yėC̿U!L9(;3D\Nz"x/0˸]n閎gZ`{EmF"HY]Mt,+M.`v�vm7ֿ8ךfClph<FľF\#Lguxh$iGe"; ED㔘ѽϰ~]HN"$(R^θ_/LagI*(a7_p+9߀K ,laomkqxU70 p_c9hgPӡCu[͆O JINaT:Ud|{daAzC qTrdj_|UuB {UxOXKTd Ə|c=$f/!唞B%ņfwq6Y<-u9p0GN^0`m<Є0{P{r_ ;s擃95jۿO{(;U* #$iܗ؎`zi[B C$ly꾿mjz#-Fu'62~m\r=m\o67qBH:| } FSLGQlUVN(6˷0A5k]7 {= (Mb_oȰQ?͍-6!BeN&>{QVdLchKa#43'BM@ n3Ճŭ`T/3O&ޣ^oeY7jq7s.LIFJwģ+geCcI1| N(g ^+b�OĬw5ЭϽD_pYH\~ggfYžEM! Ffp+o9- u1WXMrOv0GYsb&"bPCL{@A􊫝ne$ě,\;B=q?dM[Thc m�u_ҙ {@] E; rNT'Y~|fj/2?Oo?'M`N>u%jL<!Fx.~NdɂGOҐŇY΅&t v@,!W r&Sv"g/^&n瀄gTdg`@Iqh2!6�$҅]0Ce&X{8 &Oi]˾D,te@# e$5s QTAK=46(48M_çT9甠e&UY;GƖY`TC| 62L3oq=-CZν DHa6xE%6hm`-ʢ@&Lnѕ~9}S!̛~brX~r E�1h7~03=Dx0lp{B?s!32J; <O(n{yOSAp,}u3#> d^x{;x3ZkQ+lhe-_@pzgzScd#˸z;2Q ~+aL-x4nЭ8֛o?X` ~9coM*/<1 8݈MunB62Nnp!r9`ul狥ɰ8DO1zq/Ѿ`1%lxhjkK ?x-mi1�k|KȠ4lggg kvW渨ft{"wGK̐5 #<a6`75&N)5/ IM#FD~SFMFG\.s0+T-5W;q~R#;]Mݦvnpi>?^H6{]g@Sݠ;}>tՕD{a3h3 g /e$W f;fntn )32=?_M~ d߄f:ۘyP6XJʞƷAә!mwΙO|1 k#IdJ\n`n W4D2(+i(4$Obaru\lIQWU<81nne,\F+0g /q+! 0Ls-} r6w07Sji eh6=:?'a%Ɠ?]FE�tͿSZDBtk}QdY3zb<[U|8o 6!\ϷO3}6Nc#71h?9+ܖNML6d0^ ?HvZqUM|m=Miú6FN/7$fvڙXB[%˹=m�4;A :z'x 0@>k.e|4vՇo: >;C_p 9|o2m4lpΦ$8Sr[pZ` ;+t۾hg\9Z` >sJ1}17$M W\" gՉ[e%<&u1$dsyIx:[&9q.3: gX~ v5;5鿉?+T>LqyK(gPrdk,JQ(l emi!NIi�|>qŻ!W6Oݗ-<gLg63YA5"\-yRh] ymyyYIq<{15Rh*]p0fuf'DH]-]=-M,\ÓHYx xцNiK$fHw$l=p,CLY ~NkSXcx^L*MKCK~4S2 rY|@ֱ&>sL lI{ܩ6/4UXQqgO]62z@Eyi=J)ad#'RK-qUtOwaЧ)cٳx].lhqE`Ig}[ XQ6g(};>ahؘޟ1]LƞKryݐ1It�Xf֘ۖy+}0KUѼZH+kzWg:K K=woklc&նR!Q�b44g0o!5́ f6%foM4h(Ӎׅ3[ zxjjobw >v/ˡ8؉><|?i!L)祐1~3m-.u&%xN.Qaz %t< ׃~-d3F4ȍoMԙW9'BMǜ$},;іgn2w|S :+W̚K!Fܞ6Yl:[WvAk1"R2y$HRB9zEDM2*igSpXzla#ùǚFA+k/VO8 pr,0y.rk<}Za:TɇK5 wyAF7Z+)8|6(c$C2#gY; ]at6 All d_B'*;A'dv +xCfj:ҼϺ=$bϾA!cv_Apx gn~g~,D>#aj8;* us-K +#nކagՄCBHڲ,ld:k("`Dy'=:Md.<_~M] s>4 #b`u<5;3>:55 8y\g[} @){XùB4%֌sы(Xqv=$n䕀ױb3|�QjX{i8(94ڱlowbLaugwUc?5;-<G71AmŴK>B,<_KG 5+=اX}i2˱ߦj}IĖq[^dӲҲn>MSg\=+K;&>,'-sۆMfݦKJe{kK y98)t-bkX)kpxoEg qh,$-a z91#qvgf=$E?<{ jpM vsjW9+726lkeg-pBs)s&3r(ѫUXVXև607~7=>Ù|.rڥ yӛah6Ns$#s sw 8`A:3fHͦH*[K:}!*%R`=5b36·]rgòmx!q(ӎ31ζ|rw y#8JFF;Sh",G3.6ɲ9.F| et$.9?-׍-<G'7W#p$9}:L) ~&զ~k.E!9/|ػ"ZYX?Z;<G*dc {JWip:؉i# g,akieH,4.>�QE䵿Sp0_)e]g$ÑVB*R;~m��׿ J#*!Kv~tn-?}x[xtgTQ`s b+:!I>Ew8XC L+z۱0�1(lV;*V>56 pvZr?i>h5ӟ9 ZsuU, nHf´9G/j4綀Lö.f9^f71S<'u' y KG{3*x7{zba^"̀7ʪ\$g>c9cQ�KG|-ֹ.ope#dAK3IQ-@ 힫OH@_Ѵ/lɁ=!|^{kO[u1-oYُIۑsb߼_lܹʹ :fcaH$(m޴WZOضDž ^x xN|8|;w{ XϦ؋0d$De(;1<Ԉ: C?b\ME>{[IRv[!c NO kmO}j\EDof‘~}u=)bE!ޑ"a؍L.lݼE6oF#6`Xմy>afdf5~:LGl *A+auȵD=gXi44<vQ{'wّ7]uӏC{Ŏ>z< 70~P{㴐RCYIK߲ @/GcF_v)kՏ]~vؔVCo\@ȍl/, M} r D0C0-!brCpk j;q�8�Ldva?bާh0=vI6mH$s/bf%{se# r5Y0[{;!:K,aOdr)6m-xSIŔKJ{ T4"ݶ dU.& gn'G�g!Jגpsrf1:Qu Ccח5)Z(i/* %;& JeS?2E+�_~-`k^: bSL c$ɇl o-lwUnvR 0(WvTߺ%Э$)9/>mN?VT"lb M"g(g,å(<m^݋( ]|;ݥ]{q3$3_gsw>7=:v)RttcK"H+Q`?pkj"|4\R{1rlvl;: )j?@h@bqjvu{R9_Bw1Yz⭛]${%G[pt'ƹͳzމJ_}(s~ ˳GT^_P[� K"/s'<h|M覾Vُ{Rg0,vZ}mfL"F:e"s|;3›襾N {m7"X,7I_Nv,~O ˽svp()Gm ~ e,Όl%oTl5᡹F P-�E2U}[nj᮹B\@ DGL~5+kvLn) ]uwH졵tb"18\ߥն.Eea}UO6}-lllW/NBP^hx;Yc]E2i8O U̝[?/$ئcme^-p[ +wv?y+wf50yYƨy9OxU$e»U+-{  kp |;;L[׳σsڑ⯩S5UׇȌ`K ̊ק:t\pY7^/ɎeK6 ܈hb<5ф(:u{ y2w/ҹ@^XFڜ;* OS+ 4NU7TO9Y婛BX`܋Q]r nO,sy#G8S \=<Qc|=Ͳ:d<H̹Ә%Ty.Ǝˏ#d!j OMب(_ϭ5N,#˟5$rMZ};8'SY8P-ݳtmZ"XoE sJ ]G7܍͎z )Ot_`R`U7ɬR.oYeŹBp;8dR?۽l:%Ll-zގ3u{o\{qaddHn˯, o߬.~;OG.&,_ct_j뮝ؿBHNYQ* ,]#tƆٲ#$̕BI6c::f}\n$ µFnp3~xfFZgiNuP|^w(YkwivY50_;1:}H M滆k_Q_Vd0Hɗ7XdO԰!XM#_,5@k]rwlϛn9{3#CI%Ь ގxe:f*nDTC{{^W՚S#<{v+6w^~@/2w:;'Dolf+KKxB2W~GXɯu\+ T%(X|>0h)M8b;y;BiŖ L&c]w!κWx֑ҋ%BubrFp?ӌ,$Ք1.X6p=8+vM^h#OpOx 6b`@,x-W 0Y3p$Ƃ=؍`�BJtKgOg/ڍBmثʆ.rfC:,;b냝BY_\HO.ϟ>ȑ_^D6ޘ:�*HLYcq̡&J;ccwB5POg~ھ7UFC8 XZ No-t=z[rF6uh**kY.z{] z2&>U;hۙC E~ ^, jnFW=bޡmlnJdIRx(Lgz1 f>gH~?.�cށS d=0*B-bBz 'W0ch)4AWgd0+1 {N ; $�d4TqF. 79h'泷w68aKYq)VLfٶc$o#ottזz`P".L y`A],e}Ea7xJZ`gprT'bٮ2>g, U_r#jFt,5~kszJPg}8dj|LZjB33fc᪄{BTGhuu}l&s33%9W Uc ޾>݁\|D ͗Y1w=t[ɺ7%Džr# D?}| X(I Q 2l1e!G{FҒ=/F\Cp7W] 6Pn  憎6i9ƽ'>_r06;T&H9@|w'ϻ~]v-Ǘ:cC55U1dɽޗ׷UǺpg{kJbE12>>|˫4n<|?(6<M*Ns#tf=du<}w/nX%TwIM K&qZTgV_ޭ }LyQha@d)֎Zc,o7*:_'J6F^C4 0 K,eFlsk)Q[hpN$[uQ'<K|5|kdGm44',_Gqӷ= }wkp%R`0rX�]& _ӏLh$EebuɵwS.% "߂hM'[C1m|>3Q(\͏.$uke]7޳Z viY`+|mJ2|<}kK/-D JDj*Zim+k4b9ɡRߔjaj>\W"CCcgK:f{ �zV"/B ѷ`w^o8gJ2 u{1ef{p,y} B~/^ˁٮ^.4wf2f,sx?yA4"K7w䎙Ul-Ʊ }L˥-p48 ]2ʃ+]{;\1<dQxvZX .GJO1wwk'n#Kp"x6܊+ $^tu9jEl0^MJ upx7ܝfB`0ns^!/z[x10c].˖  P|%sܙ jzz3ﲕ.iWg*^ۇK)*F6T4<Ew^HbF]x=k9UNry#@oB/ڧHcBWS$U;hzK0ozsnRMsCCdpL,Eazۻ3v$% ՏP!};Sl|*g ѐ> 8 245fJDo΄E;yvzySy,D'RjNEt($Zk#Ҟ-޴{ LdCCUqru! =˽o܍h{P*T=H߭t'<I.� BtxtNV zgw =lц LRჱR<[t==3=\MѪP3: [ݔl §"BC4[F*h5^-uz9ZnN+#>w]&9e&ˑc9uy~TvM#:+e*+,Q:l sɓ??E`8vQ=UmJgumq9"]DIYGq ]WnkJa5dG 3| kxME:Dp5yӿpy9ϔ8\ȳH. >"cC%lL)| mů+YلsFSH o/_XE3}]|L*X%bOfs$10>@-`ak8+0Glu< Ly4} 7`bQsg=f{/  ~ZA48<M g/7G {EP#Rp=?$@*I�{:\?|?$<$Q-kjXs;SbbDM'?zQ֍6߱ab3ݛBNIFZ[;&~M1u+qTlyx]x~L$Z?u~09> \Il懏Ֆ$X #è)YIKҝFjs&?Cnd?w%OoۍܣzO$DÉp[~"uĽݳͥM eQtjǶ/ʢ~{g",ai-N#M2'mІtOxM:kME~;M{[XO>^ř;j0TJ+;/&?ݽ= 5/t)^�H6;?07 .*u:Ȍ';J|_!48Wc1xJy0`NT3]":޸xd0Dokz|0Dׅ}xٴDˣI q(OrBdgFt>>=l`<o cQr#½jp<pbq{!㈲{9M#<7i0s=ԇ+ [_Lag.~nDo@{fܱS|Og; s[#z^,G-EWlJꄜ`Gp'lX$<"+{u`ۗ$?eFpXY1mTU]y=ݣYHI[TM ;%EfĆ?-Ӡʕj"oޔ!gGF FUPb.%R?ȫXL dtGZeGGlɓ| ԅ]gk5RsG2;F̲΅\{3 h da[G&FzKKqwue'cedId-+J;A>tEU\_A800qDk֐RֺHYw#AW-ƑS^kwJ( Z=qnA]8w]ZfL{+L┳ebM#RgSlBg|餽ZF22^/d><i<۹"Ck*=*Dor˕`XT 72c`SukiMq8j?rn/S_jckgŻq{NWwsGiMP@sdQt(=~(kg0;!E{p/~79~fҍ-1;(~y}Gu+tKwUw _|8:<E)uQ®mUh~/LLwSgv'_tzvlpK͟Vuw=FHaI%^ |>kU~H_D͑A;)܀WeϻQH]\GFĪ̌|eppFEv|z^e#6z266R5r&L{ #mR_1\H&v\,Xg8K v!d~-J[qO#eـ8)RFl1-\ȏ%k0W&gKK%b$]5\ Oɪ+">7ʹp;\56pdZBn}<rwLw ~!c=Bѷis2T R`2;ZBruE:d;�.iqUtbVӡDoi.KE[Ds2=PtrOg~'jB�/QRb>nyb;,GHγ~ Eliѵ\P*h+%+\JOsPXuFEcׇ@>\iًr3srehOV#0wңϙZo1sFFKǔj{~wLOk*<|h5ʵU`Lch[W2Ѯۮyd>OcTh&?)>ָon&N0�ޢIJucO:穙].];똘N F{Ū8noE.IBjKabptnlP_m^’2$5Z/(􍕍mӯ1۵o6CJ~@ *zW+W 7ՎbHi%3Xz @sQ1ku.ڈN0Iove o2/7j3,|Օa^s[9%3vet6w[\2VGTظ,K$[9'鍮XҊT%R-DgFe}kzy[IQ'x1 ﷎J}plm2x-Qf-DDs~@W"b:2{䱆#ܻh{/OC݉<Wf,78!E?F's425q`@sBt/ARլ4|hˌu� '_JQ0{)am%1\O8T,?$-91u:#czeGbijwUbJn ]S] x_pKD]?VU7\)pkr!՛.43H.cG}"2TwգGcUމΊ]Ym(ŔspCfvZ\Vqط##LK&c<q8+",75:_#o OHɔ:}هW߅Gz;MFevR_ǝtD-kWQ.D W{{}42RЅjF/ʰ՟.֢3/ fzZ(~VfYa3q�Bb2hʮՃ_9>~&A29I#_ �,vPR52>ܸ)dt=\쮕kb' f )g/e,W-q6>=0Cdo-WW1*5į&q;-+ӚCF8ߋY*RDd>3Uw׿+ b(o40d1_ݰVX?Ojp{%ߝ%GƠO}gOI~OelI&X:;7zQ^d+Poum|r$<u;ѯt "jlfRۀ_õ'�t�J?eyݐŚ7^.̯Mb\r zO0( Iت+ɏl(/o3sxh )9Y͏5^"T4_�$[an\l_Go Sn-YI|{OV[>x/ˇDPZMc }#z t0<+MR8)ҶME-F>,}Kܬ*W#mOOOz>m1+*0OĶF_'m6JDfܚ hXsvp$mpHa2Mcr(�@)B^FH1ic0%'s/3Z{'Bb>A(6F }HiX5Zo!1.ź~jl!HS@sHgvy2[_ܧN`ΐF4}_C|Ʈe%d!`?vnح1+׎;oɒB!#wN*.cwr>،Rw*9 ifoSC6XGJ_3{(Ma b71􎰔5k2A -EcbsG;YLO˙`1U>A\gnSSIn4$/ փ*,ڶyzxWa1v&K4`éJP:hF:*añ%s-.lUɡ(| ЉM(\$yDd `:(|aIGL6}_ UOMV㛰yMyo pYAgz=SK|m";7ɕlGyoT?Gb*jJ4Psv$sJl'5?LBCNٙ}T, LA, UZApN Xg6LnWdeO Zb}}"ݟڌe9Xɮr"xUVFtn@7}+ٹBN|j•r�U䩠eW"#|iz+Q~A뤁�?e$Ka }/܏KR~xќA$o- s<+hUmkYor%=#k /,k @J+ݑus2\qzhl yJ7Cbhw,mĭ/1>!C 8k4q V#G<9䣽{ڥ}GsMi\\MMH)rݗYV{ؗkFiW҈DM!uud/p]Z&=QINk;)`bLTMnGne;zc9t!z2~okT[pX(NLDs54;ͶpB|{2r&Q~p7Up|qyWbGO;A䖲}D]z^A=C�}L�sPrXc?V4^?[Șs!L^81@oFX 73_eO/xQޞXj;`45D5kA'Re%!05EQzLLUZ  -USӁX j ݐunj)l.XXtM]9E%Փ.A9T[-|buvlI;Ri5k JU'V T kK>@ɲ0"9~ܭO΀cM8 ei/_Ox~4GF'Yt3dr|ɶ0x|.X@Tzyf%1Z?csŠ`em>*E#f&Zʳ7 .c9wP:f|sȌMGoٵjcM > Ej*NruJ\8KT HjnOwpC"QH)G0}_;(U8԰tW;&nPS|$f?^or]@k^mL'PODr>"K!fi# d-:O $Z5Ƌl/v/pC=T]\..ο vD58k-Ur7M3,xK͠8|<|6X>p,IwфJSmq;w$ngz(Crm8ױeW{ïɷTmj,XoHWS&/wp-Z|Mᛡkxk0W#$&qKh9ERyBkK}{k)[_ЁJ%X)խV[<KJ$a[qbשq^X k<U(㬄-$SW#`[%&s;Jp3LޢvðW0[=2ʂA`s<v<O-&k` mJ3>aS̮v3 wn.$NPK \~_ܦ1\NVӸ{\}q[Z"P*pe~Eν冋-BnHr:dT38[+B j ΓK(h7'儩,QE]*9zJE;~d$.n#+NR-l,OSD ؗ9X);L<-Qsl8AVgqiZ5㢭 gb\Q_p}R0Dt<MOӉ}~7_#heGx&U(\OR~)*-z^*Mepeާk中mJo(Gw^zvFoydC{~m/%Suv0@[#-p\9HM %vSFK"L$Zd8f!LWr^c[m|UJb!ywb1d0QOs..I4?7M&_!3_3d~ 6SpH]`KM&zwʋW"SCUw&>aLl6'*9l^2o:܂`x=?#YV7y2 >!*P1g%sp[q–LedSlS4TjJ�!,ŨRdl(52O,嫈eR$Pn2VwN66KbVӎd>J n//UX90Y+L͍B@ļ|]/ΆXE.Cd<|M_ڤBA;,ە\S1eՍ<+ -Ir&?,*MR%V_gXg2B%>!^9'u*a 'G@KR (e}Bldp&(kMrPmw46|@x'c|L<[(J+F'wxQ$c8+Y[A*><IeݒiX#^wjҰKn'U邉Qr _Q*Fkا% r"h_浖r=R-\|99m7r%:?@X"7L|J oאC*xq8K P)\'&fe ABx:hj҂Whorcڑ'?[rGXih|7WPuXI:ߝ-4P$f&; Q̅ސnm<WI?QJǤrıA $J@Vc:B yUYbq"6"Sˬ)j{ ?&N@Ů8;[Wmժk~AL)aK}Ў6ONbgkoWzoǛTN3@,#On@)=OZl�D'7{ѢzovY\ߛjF'sȩ 4.BC�:F#ڡR'ūKBq~ <"&͉|PtNuo/?bR^8#2Z g8Rj+[W9cbIK #e}N}Her5N& 3ee%kD{ >9Ȳ,I4K7š 5-3x dI\rR,dkŞu x6Rq(S29T)$lrmQ6#*lq8 &^' kcm; J#;Wgڙۉ"!\W4g&t W|nϬKddVƛA5K)'@҇&>;Ua'1-DhD+OWK\ #CdlU"@ (aFsSD$=>:8=ʦ_k3SscQ.$ eWqXdC+|K9J8=~nl8cd~ |SqR8*8>r�ylˌZy=ģJL] ràof )~LY3Y@7BfHD*Z7,mA c1P %B\I<wLDv͈8g?n4B( {KX�p3r|mub.i'B9!!.N}T/"'@:M% ) G^"@^:@Ch!ԒrS̀U|Y10x[)G*ܪM\"$^ߑI`iԛxe0H%5Pk�'~i |R;aKC@*/[:!L)V֖ h)�w,J+bsa+Tb]b(^{͜!6٦Γh*w!,6n ZsZ9~fV$yt#jU!>qp`f`rTyv(l9BoS3咧bkww*#V{l />fgkUúXexʼL Q&*"/N>kǺ㉍�׶NL4W݄b^Kbe:v &hߓ(t{ }źʊčt= MÆ9Dgl?6&")-ŁTqr=[ix6hJTƦ@[l18BX'P2Qӣ:Aa~6$-hOJDxI)g2 < U0jLមtIn|OaC aaalyBHD+2.8f*�b?zy:)]i[BpLts7[vۄRj>xF{8ZQ#X}BmiExjeC ჉x .epR&]wMsT@*8A mRKˢpC(S- G;>XG`SMIᱰAb[);P{3fpP~{TOURJ;ރF�RޕrNӇs#<h ʩg&$MjO}p|L5 -'S]z/_џo�oH#g-3SE!KMջ:h0 o@d0�ki ʊ=šj-,nk<R49Oz#gPkggt^x:&3-SډZocuz/JIdxMS_+OLƳXWә ɪGaGa}\^1b"V>ht]- 06Y:IQ/nR'Q)=+xu=_KROM^efS<ϋ( qWbKm8ġ/𷸎΄>N&+DΜôl[_#:l^<e+@2.a?^ h huOrK4*d:C|r6KWMSΊXQ*m FOb&1Hk3.|h`|Ӝn+F<=|7c x5tuqQ <<iO O7=zsR{)K[&OU,K०5!ngSkacX*bΩv^  Uk;9b}W秶XV:^??w<yBC%Gd~S,�k:\".!*JZy=ÓXw8 ?VljZ^%7S3V ) 6G(qV{uH� q�En.GuBx&~ _,S}U<D\-K&qr4UGu= 3ll+<12+G<Z2 [iďLJaڎT4P%_Z w>CVX[rN?oEFyM5Y;H)|=^+3jl)v8cR܇!ߙ5#EI|3Y:U9?fv&'7KD4U阠ӌ Zל!='3!{|4B,.Tf'8ۙ5t64OֈOFuʩĸ86;ЮwΟ.Ms5'Ö в߶i)QzJS!Ǔol%h^<۪W4K-UJ"?/D_9;zw'n(-9wMχ΢,p7{R<*3yɱ Nj9%JixW:a2ydbH'u#\bRV*~<=!sJ逨K`yc4ۍֱ7%[:&摳ΩJ,Lc9SqF+y@]ih:nP<rR`\jc8\"}8L^Lݰw,ameX^1[o}-q|Y� kOT8,ҋh3~D^9){ u?tldFl'x(;p8ůEge<kY?rS% $zX%�oyZN1ŤBJn| JVd9cburYbP`kd5VgQSST{[J=ϨcF6cy(}{-SU]f7Yc,dϢ@\Pk!qKkl2~ 7K#)Nj!R%TWq$fg%Wq̋LV'JEڻYL?2GL$DNcI>7 'ضmMlۜx 'v&m۶sNw~w=UuOwSXZw=W8Q,rxu$4j{W('u4QVV (\6y h<E8Ň`\;Xh}E`J΍(@4'0Gm{hM>+ùє:Q6P^rFʸV{<s($+ҹ$YQcaNܜ%V1zKK1{W4eJLq 1otŘQI7j>192!oAwk ܍zBk{&#:4Vmm4ra?Mh@ȧMtX qi$e/n-vVJ>[(䓚fψֈq_JNl"=4 *.hS%UjYP$;`Zdțۣ,>+q%^L\Y`>ŭ@m){Xw4]uRKq'ETH?s7Mo-jai<9w;R˜xh}{*; PŦw,lo(LEw0[&&{L5ngܺ1Պ}r?FGgOXFb&[7/@宼>n3Iߘ1JVٽ=hcĵ,5֣TLw__Nݘ76TVq#q-dOw#1j8cvM-RhEd wiw4fwql~@8Ȍf,΀[Ī9wyJs-հvKMp=Pbt�(ä?g">ޱѢNnw[oCYENњNq"hoW+n5=qIl\M3J +n\V'Z^Tkڱ!6&O?BO[u JdhHNXrӟ;pFVr^H)]+*r(0)'P$+`}%);z$+79PF#f5XtMyYpqn y,aH8X̥v͟ɳ;bck'E)#DH~m߅'vFSUVaFH=f-A~5 ?I`4}&+W<XNI`! -h'g7EM7]حh]Vۥ׌zq#xʼEGY{R0F*MnQvߣlP툩}#I8[ۿ"zY894R2MQPoi>{uUwHJг2J}%a&ݷ%KRHAp͆+⬥5)fۙx9nHT5Ljڟb꼗ZJFk"h's|,,V,5GR}cP"e|3j:IHd5$Ѩ>I7%!6\0D̸#Ѱ\Foсi&m&?޺E}}VXZNqدNQ;ا&3_NzM&ƾG9eĠ|}d5n D]UE7>;]Ċ .EFX]P=~xQv詘7zAZw#Xh-uFbcݽ:u#r:JI{"tN$K-@q8XMgW,.&c}]K wigad]y\:Mgk,~,=-"Gmtu?$rHi%o,U,m'ׇ3{h2HJgq,c�0zObdd pƲǚ-."fvoY`gZ`=yA(XG39V,6.˨XYJZ[|Ru*vϛC(Ifeʼ3,V;vMy/+PxFg`E:dxbgP$<0zO剜nCj>͈Z#:l)s&^>1ñ7!>chSB# ΰvبX'~u~fX㑻: ֳvXI͟.ƮQq󦰳'[S#EYU؝cc|W}"# T)v 6wHI3dud6@ 2?n9<ˮe% "eN } dl2(Ʈ:ЃZE,kmL?Ζd~Z/2Ԭ)nM5D_vY=2:L7=j3\�1%8Ԯ6EEU+z1.ۃElaM'fUvgxA+hie SRX{]a9gfHSAknvS.zVlYa ߢisKfLU֑‘ LExQN i<}$[O+ jTnb{^lmrk@E3X")#5̊ ` ?wlB__JX"r!$Mi{,u%:HK-Ԍa?[f=1Q*r?O9Nlg-Jo G=뱱V'' c8Yo2YFPc4?/tNb㼵>`5쵖qk'|]IFrzU?m&༊=u[1Ӫo68coreQ:qi#zطtWV+rZ8((+<)rg W;eZbewp|DwۭKuVxYFA,}׹W'XH J+y%,0Y='ܑJ%}r DZv"7 w6X9"9x/A-+R5J &lCogC{i?5E5oYI#2ӿ;v{wL*}ˈ6SIzpL il=.A3L*OZm:^5l,{~a/w-m"illkyԳw6> .p OVos7tăe?t3aZ$b~XM9v3"v?`[E +LP\ʚ=Am[pVr<vNzv$_VV:M ֋4[٥95KOF7beH7U0Eu'ڪ:M!= i|oJił΢XN g^^0XKSJK�Nngw�O?5:hQSp{۩2!˩Gc[5Zjϩg}]drؙ&CثCKh|g}*uG ؽxh7 VsQU8sZE@Zo2]ƪfU5j4KrwAـsQ5?t5N;M2 2[HUľd'i=XtWy绝:vKq8QкkU:PyŠ7Զؾsw;qeu`iR/%_԰G)|?Y}s� gL ^6j?cQ `-�g,3h4YT艔%٩itu+hf1 F'E v2g&;UwWKE�'\g0cd2<-DZp]{Bz�"ytdgVih^u_@K5*c"4mkKZoMrzΰ,·NO~ h-I�IiZXNf`vZ'k$6$7Ä &9= 2JLS e Ri^yrP zvӅ-ɽ9jd]0 2D<]fw8S19 AV= {Y]{mgpnj/nuΰ ܡ+ #5XuHQbof tV;c4~J>k7r(t([x//F7Hբ3(;\{^l_w*^(B1Z?xFR茳^/XiFҵ@ڨ+gmZzGhinweIy;)mt:nS2y:8LXNݏ~em6I覢Kx(_@}fgk9v@[(gvS ~Uodv׎roAnVºli 0+є-d 9bg5;Nm4Y,ыAw-�⠭8p.YêkbȧJ#/챓8G"uV+*EBv9`gtDF,ge2/0m[9Qնᮆ0XM*%/Qz@P#0[1c6) ol1(j8yYR; .ARr朲[9Xiy;XdATq<9wؽvCZFшgų5-~WaCg#O(H@i_z9\g9JYlB. -nN0څ ux$9䩑j4.6 ,Z95S S{#lblŵQ-ҀO;CaG})fyc"N5 rڏwq8E?JT3uat1`pXDݪW7te~$0YPrc+nm>,dԯXq-v2;_} gm> ^ۉn;SIbtfQKu_Ilw9FޛChY3fGQ1uG,q;ɜi+Q Z4$ %R; u;}<D&ZR޷p7Ǚ"i?mkf m.*),ts~VuF;YwN񼓼)sˋe~5ZE{LB1cofq8.C}vw3wrțˀƝ T͏b>%? ^�]n8 `1?'=2kób p^Ew:|b>2Vɐqͽ<љfDV[`N7 x 2tl\2d '2W̝FWRZR,w:rqPR3ͳbIO dwv9Yy(hmĿC#ZȾ8|K Fipycc'R1y g!p56̖WCK.}¹vI:sY6uyϮz -ml6yOVQgjZ2bN6qU(v)$sނ0^0CMZmF[vgNN^;ۑpF-m=W`lS)6-GaW}�6yOժ7Qmq:~|4d$}& /md!r7E;eQk)=K/4_Er:8ܭS~\66ŀkh_!%N/+Cy&w@E)@l3đ?[ 乱Le6PnuUt;#]&#5&5KnR3w.LY7QJ4 __hMViWyL9l6}LgCy1Jv;˜n{1OCPÜshGb;YP6NKsQ}/{θFCŷNFT<򛫻Tsz7Pv իhMcN2Wr;ħ;.8uc.Xw l6g#X nq8PN/9a:FmI{ n7r:o,T3M <)_;xxw8X9>Z |Oҷߪ6JniUZlkV60aVorghy>OiIi5Nz[6 eZfZ>?ɴ v,iIB-cxUR89, 8Ψ`79xۥ˜n.ev1*t( oX6w֭{÷Wͨnf2&8v< otzۑDHQF⠥<RIH;fӒFe3ƟA ?B.(4HW[˛AgxRz ܨf2&hu9Uw$ouSs3UP_wt)21čgpi#*â'f_2(o4 ePDE8`+@/}?(mn1(PS~9t_VdQ׸E20:641bE ='+_!d#}p[.6Ԋ!A1XCK~Eaώ`V 0~9LNt~6){_KӃFvч,Bw1~DAu9lV3z!x HfC-EOi??HkNy/cSʆuT3ٍ4#\]N %W/j7!Π_ 'z S}zWncz!u,'#}#0ҋ63_Nw7 ,x&}lČ't >u zz3/J%ٸ@gZ0 v;&uK㵱õuu8Jӵ1 }m<0VЦ>e<g۟Z4}o\3Ғ?'d>E>w. Ok 8e ipjbN#Aq2`~F?v4DL̐\t'8?fϨN_ꌠ䬛}>kaFvጕ :v ׬U/~2nxomVPRa n<D2)-c44Dd'X{7!d\_8Ib|0_HT_M`y5q X o,+l qAb( UYQ&WF8ɏWGb>kr[-uy?)l<5HSSYmۓ-{}<)c<2*/2$;&U;F1?P DWVm.dIVRݸgd2ڐ}?\f5܎VEө%>KFr"Yz=ЯF7I㊡Cr֫+Yj,#;,Q{gqAzA%{t'_XEY)NF_Iwe+/ sUVv +Q@{1N yq"+(V)(9)8@ i_cqRnOV`_2x Y46 Xu[~@pcGa?kqϺ-=&H4c,2>x/lmpDaa-AsA-aio#uaJ'^7IFGVt6qkx^JC;0ah\AKRopC0u jq:hA1άło/q[7.ܢTO#'}v'%;nW7 ʧyst<e2AW{b=|L[c;m^g46$َΩղqK&}x iT1>yh:,*g`:=N?w)F:&`:ڱO"sF~ȅVZG`UdK+ # ByTA*|;͝&~N5:HaEl*(.pU?F&@aCFDǓvw!bDY%8CҶN;.v-CyOGi rQl_slqt&[\8{SQ띉Mhj2[L,T "cwW+ =22UP@͉n7*b[r3hP-!XC?8[!$ޘC@h8[ϑjo ?C~=ָۚst$7dȧ[5VWdިk}}N/hHZ S봹R/hzjޏ jFi7xmD8C:|l jo$yBF.wњO-®^#7r)ki^p7W;l%©i#(μe^s2y8Fn"KS!Iۑ%,$.H gd7|fG, 7C b'Mt^.Yw zZpOwh1&'X6 7 .&9_9dUlHm&nxMg*h;X.$쎻M+I5 O j`lS$[+*�= PqpOV|cGDkRE�$LiUꩡ69b_?!J'I4Ne>pӘk-E0Fsh*rZsL\akpCw(uRJ`;:d<pug[= YDShOW+[@w#,?/%ߔzVf2'O}2!IY9%^`/d3Ms|ѻw& 2OCe@NhKz-`x$`>U * P7Brs)eCaGϠ!(1*a(R' FePrR#/j�קVg#6XԎ"gh@3_ (ܕG}jD ^ xm.^剽'uuZ ^$ - x h{yn]] D?wF뼒b%Clxe/UhC'#yy, 3kgIrޥu_R9b X1k@oCo= Jf"DV>%b 9z¾ozMơG '?%e'!9n{Z2%N:tG;A|1Ұl̉znI}/2gl06#6'EuqF=YV<)C+4::*, Y)hpNy BUՎ~wbXY=:$j`۳b,a~S%>熗 Լ49`Y^P*0C;ҟxSICx3VY.Ti# /)FvMXIeZ Z(ԯ.%kǛO9e~E)ח)l8!ॲJѳ4?]飕M~&Y]t>Ef e?ߌ9CNZ,l)_%iիzc0}q*0)D>^d۠ =@ m<eSoE68c ;]mӓ?^Tď8K ,vC &AyH%1-fO.caLVsLm 0S ޘe>`ZU&Czxv$teB[x>8GMA&Pw7]04h#c\\Foše Qo2ΤTDn^0NtْN. {:U^0M3Оd*jpW<=Ɇސv caWB܀97?l@KTڍ& C\a=7/f2vIIY}R;~߿v))]/l 67EmF3Q8.  @?†b=OAxLK;SЛB ccYU6~Z厖_E`^Fn65II+q�Owv6uy@3xl.ɝ~O%hL<Cd Xf?I)?Hj帿~E̖;z-};RS2 27ӷ+?\OzpT>NXwް| _ 2X_U:>'q}ro�? 2K߉-wH lmf/;˞1VNB{UV Ɂp%oeH5~r(Ct'_2$B9=(R)tbD*o5ϠhEh ʪ>-_  {a@-Yhy&j¼{шd|5!B$'LhrRB^׀ S3$;xXO5V*p]cy{1K6=Vm?)ʀ"5$xyGj=i-2z"?G&>Sl*LmސHk CBdJqk&JpFZ*\MY.VaaNmIЬ AWto�\_[Ֆ{iI=𺈔@CcL$w͵m=(SOAHO<*p4B`Po5:"ϱܒH>_CA1xZ2_K~R` ~*J !l ǖjor]Cx6Y֓L"B&T>j)xΔidG y0-^N ҋd0?UJ7e�>M)I"x=|cBm%8&f3/WrUVGMlA_& @6ŻH.i9w|1,\SA.!Y1*)&,'G Қ}%]U !`=t[+i|,(zt|}DR~=:+-y%[V7+hKZ<e8'tF+7$mD@\g?\ g]E3zYwIV"[P7qX LlA?Aɰl|)b4 RTf}1 ~Ӧ|X wq)~NIJz4\|8/�K`i\VB-~-, z�uHc"oP+罓W$EhX`2{r<ZY}@~W<t?a.JB>jpJt˓ɂ^#Q:P'k} {DKoyeeNXO/Y=ԗA<1?�=.쥭@',{ƐmѢOOr+e+W^Oѐxȧ8*U/SxEM#vKwdiԱME5-_K9=-N&3P[KT*~WhQ~ѱ$.Wj*xC%^'V~~ݞ<#CHG? B%yzqS& )T;+I+L[xFlU2p*H6]JTUy!d࢒_ E=(_y}^O$ZAﬤwFKZS呿FykFLi 7H H@iTE ޙeA|^O"I> -Ѳ+[҅7#{\8=(Γd&o\jGJ\?Lΐd&h8(_| xz}ADðH>e4G,~}#$<%nJj'¦yi;<3gd3k,水_D^__~O\2+p 0Ő %xfI<ʄU[߈,Ύd~y8 k*B{@%O, 0 Bh9?zRueQfexh٨zN^?(/i% /Df�-sԔi׼-cp_n(o!7FJ2 >ˁռ8v9l] ToXxb\am8rΤ2UC!<X,BFni ,Srwy-ZA츆(Ӄ,!گl6AQ6"kepPƛ$񁼢#c~'ubTJ7oZ⋌ ) ("z�~;U~#١EԖ* >zEjoP2"WCm6pd1Dvip\Pn2#i0^և[DIwpOɬ8?E|mdU8c-_"zJa=.L(^q33PQk)p)2|Hȸ3nYR!j`le(A!keA14vBjw\ 'pKTWKБ6xo@m\ 'puTL{N{\/ڪ C(v*pEzs\ kq&ik* /?{9#M:p. -)fϰ^pzA듖d&a1/2*<>Ї Lg/ 5#QY7O8܀%5}Z/ H,BЀ?Bed#} \fޢUs+_sHKahF۞!?-'@e򡵸 )@z}H/^Ck?VmI6wՋ//o9%aX[vKӒQ,ވg|o&Ova% Q`iC#ȧP;: |E9rx3hq,m_ceJ;%|PAKhSu2 @O' IFp BomJίJ!I@éM^ ״Aoo͢0X<ӶU! L\`3nu +ߴ()uSRI9*ϋޘઢW\ x Q Hi2L\P$tט g|o,o`N9�Ӳ*OrmpU ZDNX,PM-Nߒ% ],ZYdyQa wgeWeJmt cSLړpW#*_{(lvaBrBpA6EQD^ڰ:ROMuG^KfQҧh8R`gRh3e-qtRp<Ԃl9N ceEq,7HDCNWXzyqWCd xxX=WE%j07_T<9)[upx>zg*fX!+N59Rԯ-,)p *7TSQMN@\<-ԻU%|y;>Zܒoa:-!*~nz9eVzKyWZz4'/ GQ/L'b|%ZZN4;,JKlK gVZq4 Ml Vz)AYeVq0w햲( ސBhe Cm@@Cʤ`Ʉ!.2^񠗲P4tN[ zxDR_܇lL$VŒCvm$h!1h-%j3Z R{i/1T.i3zy47(]2 +OEh+V\"%u#+n, \Ҋ>; ,$='Pw䨡W'"< X?nq/|*򢌼} R9S8@w%ׁ)Bjo_Qթ*<࿗KEP$VW%C=^ 7wb_Z2;l6ߢ5΃/OEy9݀2aw  VC=,_&q .N{ia_(R!blw V@oc5 lM}H/Ɗm3lit~ 4J&҉YТF £:=)O/O}Z-,O-[xE=>fzkH%b$ zNόoWW3.v@rzOωo$;w= gj{\ǫnVϠ:DqNA^7[8a1q]dLɧ4c.\-\ xU@x& y<JB5Eiee QF|AWX<+!EE&A53N>j/l$j Ev*#5>{hJ X ]0F]pEP &x)eLeVupK`aliM^<PyriSkz=6JІ':brz _"NiՕA3σ)STM?�9&VBI q _4~\� ixA h�3Y^&ax/Έ)88 @ '÷tK~y/ibLaF5鈇OQUxO݁_/1WfӇլj4o_ӾTO,Kdq?XKͧ3VZ_T[|_-Ŀ Uja+<x$EpaJ˶{M#/<?ALHgh*@ '7sug#GEsqJ< "зA1FjgI W{_nTY6 GN^ A|y0aQ!Z&[Dc;o=fxJTsC]'7 z7suwX`6)\/G{t gtcP;[ E vZLD5O\! *@KҮP4m)"l?:ڋ' JwIwKwt HJtw !HHwwwKKÝ/_oλ~ZL.ȢX#HyqFLv6{ۖT19 Ob$<b\DF,qLpVIk-Z('"s0V.S3&7LO_tRLdH *S=9+62MU S舔QiG]E{Д -j~T O`㳮SLpZf&A"ߣ2nĊcs[#&Wuv[pLpJȱWs]TDD/T]+%-ĵUݠXDdIN#IP5 pw?;;[|o91M%TlD'e6tϿߛȽaY'hq,O3cb/F%}E>A5v_KN&*Oy3`2Th)hV[lkՎjFԍX44 #Dxw"jF%[~&? sd?\V jGO[AIFlqFA]O68#vГɟ "zt)YdOHo‚=?Zg!ۋȥq'Pߒ'QR%i|y{2|gdΰ eDdT2/h"G ۘNWr>cKjDb(DORˡ:``z v]x3P\I_ G$H,W'e b4\aA7QɅ/qEyEe4wUE!uD? *Q!jX^Ñ]mk)ʪ&t75E,v9�IA=fFijnI9:ffѢz?!˺jON79lY~Xňk9O5d1;z1\E >soIr!<y/r]Ӟv JF 6*(6Ôj ,Nyu>P~rf.(cO֯e 4989bXF_'P" ' #ex;g*Ĉ8脞yڙLD ߐ>|y_Fd-h)t>^!_ A|-ؚxxfF8$HJі54hakʘa0"YD $)f[$%#Zt{9֯MZd0Nez3O,ʮ~M],1gPX[Q#,9DDŰ~%�fF喵߸&j65aRVC$aP(RɒoT,|wGO Y kpR&/a1=$Bq'TM2A}Wa2݅VIqʞS bI(-edp)Ɂz>g "x[aaSer8 Z. ?GFOEl5] ⱥu^w) &"#gLW$]W3q"R >npQxˌpMD6q 8Ì1#5(-Ah#@-KpQE׻uF6=49!Ax0ew颱::&eǷ0=ᖋDc2Y#j2fwO(S%AٳH> bzϩAo\&631f U7į>`hV_Cqݟfl=F1lb:}6 ꢧ>gFQ¢aLfB.oAEU>I~m0f xr\ ^z䣹Qw+,f7mUVTIӠq=_m?=V E#o 7A &l7s'7lw_Z>UYkj,'l�͍ '?nsJjF;cQva s?I 1q%Rd% }w#wsAjlr4Dူdw)tVp:UHE(17;2k~̪A`FA9L21m[~̧7}WNyQ�~gjY2ս[e)݈3o\Fd=l*S3L. 7bNnoՓm߷Lpyx=%hx*ra� &} [s `QpR_jVJlǾsC<t pW^DQtP^ͅLL /LwD<5`.F.P GSS@cH0Kgq2ai6=j.u!~DqRacuDq z}t4U ͵xX#军'jUzRp&hGr|%\}�-ԲOFHXf?!ޢa4Zi.u^M hf4l^QGo~>⪻Sd6m. dKf gt I6+f =q&H>&/,ZrzWn K>[mVM ͟O(A=XRo::lf!ӿ UQuGqnYҿٞ<7, [;;[v//ϫ X,o*rd|%pQ8a~ UT@3/,kMbGg_*ٟ?CIh!{ϐo}^%6fBX'HH.A2Nz*kUdV?i~3KI|̨~x(Pv`Y0"د"  B5Afҹl]eԏ%`& )؋+ը合قxeAtsY8(хv]CmL;\fP:| ;wdE]oF*] ;oTW$3ь\ȮMD76=5e&}u5Xrel2&zL.$btMnvQW5%a3k3Q!hl!V6>(Lkj؋pgf 뗲)zœ1z%򪑺>ޑ-G q8@'p( GPHY`~{~vZL8j2IIE̿apzXˌaL׭)A2::]5~lgT &i% _4l/EwQñ(2 W`ͺs08Py$AmIj<7zy:$s$Q!݅}rOv+?aru<GUuGp+… M2+wbr*s,7rr?gpw9 LBגg]]O/VIe]:GFo#/2KOUeNF+&;G|^3,XPGh# }D Qͮp %/*-H7N8%&Ҵq/"E-Վ~b6qL,%+e<A`HKf3$QvLGb0R>2mu0IogL]td_[ya.s%U۠#nH'.Y4eWG<tyP׆ư)lj}x'T:mPZ8Z6:I+tA )Zx&]*d*\Ǧwa T{E&+Ėjy禉$)>:eQ4Yf!vimwܬ.7e ̀%6:{М=S"1%Ȏa_"%ʩn:?FV dT,τ#fן@7h<ԯxV.Mț^ '$)XWy,qZ8S2m&8}Nu}MfNܴm|${ &=3O7Sz;zsF@&fL"JrUR|Ij.*%M/! />|^Z5 *-M/;l>s+Uj.hX|bW;vA`v/V{oΓ{!s0ZכK*F(<PuG2<;lvdt}7Mt֕YQC>Ig{&{g$ ~҅&AMāJA tNdkD(<6LMW8#zP!s/<V2ɧb#>95(i"ϴCqӳ|e4{1rپvx9llZ4s2~ : ;ŸL{5hoؠ:⮺_lw.< EYOw?)n}ɖw$dpL!'ppj D!T~U nH, ֡<Y8,qT[Ra~﮲6ش~HhsG#5[&\i&K6"SUfjcJ:;ƜH~.7tr+ fsVDIXGq|۹8Oa$CQIa"U'LMP~!i\s|!z$.V5I_űxJsBP=$t=G{}IH=&7L7Jcąoƨr/ JkޚTnV=b11TQhӬBnU=^ w&w/Mg"lq/'Cqt-U�wwLF ,Irr`Yj:OAkN╻eR&mU֕ hk#Dol;=|еu1nO$G-SqrZ]^TGEEg-]ӢܧV:%nb]T#q0&L&ԁå3%M0T &Nʹ'rEڤcC {9Y[%f:{zPמs_~]Sc Mf☎ˮ[`fho{د:)O4#2W4 R}Ll.YW\vc|c7 ؂6Ȳb&YE# G^2Q-%,o\R3e{6{PKfHhRס25_eGȖ~gi%}ɸpx7~ms<BeחG=FZ?հyJs|?ڢ<'^px&E.UL_ׯ@=CU}7u[G \gLVeMLG$iے(kI憡 Nʃ,1w[İ߹I^}?m; 4j.5$>lْH.]"&&-֒p{kml&ZvS?rE]YWbͶ5ym+wT;8KS8kĦ3]}Jӹuv_L%6�WS%QΠ *`R$D73U_}Gt<7)_+iZع΢Ʌ]K'6o=SƤ3SPJKB^ab?D~4٦%#K9C2n-YdC.,wQ*Eݕc 36K4{CS uI")jf*%$~o+; vEMYa_z$%=F]6o&l_]kKUr\r3Jcf +{_-j-n4L9sK臈NxYֻ$O@׫lnk6+wpY_UdFj'$|TZI[/ReB `"g^~9Y2&:?hbn7LHWoRE+1׳yƙ? bxz>cPk?ѵ3Ĵ]GZ|2qPѽO`}"ߣIZz"Jͽk6*j1Q2Il!7MfSzSM~UģYI({lt1]=m]);”4ȅrF_Q1hzu]A&7L1حqdeU:.LÚ+PT{çq|:z-&¿YX SvdSUJoKPTU E r7|٢ g&{po/E^W=hc6dm"`{9"L#ߓhr4VEu LVr<Q9WV؎lNcTMNS]u?؏uN>eHVL F ?M;Y%Io>v[׾ğZf}JYOQ=a /'+Bmhal(;n֦yh[[?.ՅkK.̔kw^)KsQa&Vt1xKLt6QKG'T/=e{4޼9(qT^VyJu=MuĞ5?pEtqY^Ub]ETQA7Ǟ86+OEDi_#㶹K[3$C-j\>+"tJ_0A;s?m}`Uw#6d]7PxV ׿.)nL3l17ȟQU$gık473mE7QdBU ?ȵt0 LU#R*Gq[={v5|k?Lhbl5+ؠUBG[:5J+JKMt}~d ~Qt .? ͝dI]Y8+=:STF|QW7c"MQH݋M+w}^W5}vL)oGrh!&vz\ytEuS.u}*cI> HBzY92M2]K)׹yJ#W#x,9ue?ˁ0o@oVd_4)Y!#L V."h@|s~q%Q<j#-6xsF*b ,_Q5NņrTMr*o)I 3*JΘ |)|;w 4=~!޹֘fInN qG?IOQLf2ب T5n6+Zh.Ӌ+L<II\?6)Wi]m?KU>n*n}?1OBO_. ~d6r׈zlR^f7>d/SÖs} g4AETz2n ʿvjC)ZIRy$l{L+g:7U#&(t#120Rh'WNlGqaq+Xj=WqiXkrF1mEB34}w[l 4)S1A$[|kg65۝e&d߼Xߔ?jsRw'W&ejۃw,=B=+WR"4&()w3rh:v8("+hQBoPsUnޙ+'kLKN9*۝ffOOID 8<6BZe}ZW3Vzʀ&[L/,D!n؃%g2F7fKǫY|0VԾҗ I;~Lz'>ˁgoc?OE?ً: 4TVxlzo3ꮪ,GN~{`.o#ƣ4OSmeA! Ǧ'vIr�B Mw⳻oqa6=+WH.[ZWՒ)Kw~ \?GUd~Vn֫*/s6jΘzZ#?Ulg{UT;b-8e3[Ƶ!?S?vn~B-]d* ʡRnF[Ne$uLUZ k}ǶvnqCnJIT4yů"-|jnn?)ɿ9{Wq/vQtiG.O-A?-wha[ Ԙ_U_ce?>vۉ&-ۭkO?MkOt㳜]T1)Q;&cKUW1:̾1mvEN~.ju"ۻ~9cʤ2hjBW1ړ8TNUtXmkn8) 2 F92HjNL&z%˂1%ZƊzڟ#zM>GqdQ{r YS.,˪\/R>kbIszz`َc)e狈(Oq'_y|V$DYʡ#UҧUٰ6Kβ%9{QX<iHPm[()~*2 e=9<\LTUe4ilq{˼J'4{(FwmAxæs?7[EZ(^6/6Pյr½]Uwd=~1l}*V1mF}Z%΄7#lKןUV1ur&boK]YvB[%HDSQgf"ILGtة uRO Ǵ 07e"ަ˷_4|v9M^Hר869;n3HK0xv<H!n3Lj&G\n!rV3j-Loڵg\GѿS)8ޭ 3#}ΓFB L?'>rsWK=lY#&y6mo&Ddr1CsE#{L c<ꯖ`=PDݖ} t3ޫj&1 *Orq1w2:{jŏڑ6:խK$4(OyZ$X}_ 羚:6iE14wD5PIj ~a>tZXF4]_TT&nJAy_[eeߢ2*ʪ;tݞ3"lgDsM :uƲ=QKq4IVP7PICN&wl o%**[=eq|B׌xvvEMحR2@&cɖ&)BZNR UFz'^į4~<D[T BFu!vLg˟X/C]kl9bTD}Q2wvjk;V) {deǺOv3[h OpG5&v?g%܇{<Ǔ'8 ^ȅ?V4^8uT^;Z_.ٍCPa/ԋ8z xGo)tB*=.'ȩ@uQZ�oh2IܗyZ&I( 7[-p//rM. pDZxx-?@/fj!B+hiqqd(kcHȴ;ސNjmd\)rRUC-E;-٘j> #Jr*zn!]Fd*~~U\uzwe?ťYDAyV>E%x \F_z/r)JnގEརLɆ>RBeYQe!,[DuYmoQBqYƣqvCêjb=TAKd@mnfG>5*4I|sQ.\c`GY-Q VieJo3CȖVUR;MCOL=-Z`Y'~UR @m)Fڊj/ڟzn22 C8#RƣjbW@R<GQ\iU{us2Ҹ1v>+jMk۫v F,AuF;dζa?;v[wƭ㪻%ϋcSvML9zy=m.ymNcjE6Fm{{ƝW.g46dm&r_QE_=أ꨹rX l>ۅ}f|(KlT4zַ/6ǽUٗt٦ʫrG֞ut&r, t ߢfS9Kr].zᢧqCĐ/Pcʥ:C=|?_(n'.O"q̢Zh{-r)} F^K dKwq[8g|f ObbT]֧-b leZMng eiiGM[zbcS²()jvm $USTr¢{T k(&eNWpKxήo,j$n5RezrD#w e 5 V/72Hዸ9<=l6}hѡʸ R<kG޾h+rd\tMe?P"$? &sFk77я}d^kꨎ7-L&5:n-@ َtRQqʇv 6_=ժ.o;֍{um(ni\{]%ņh[7_qOMREq\gT,g.)W)x`[ pA]WgA/sVE!Xqi6OY ϐK6~kei]["m-Jv/C[lx\l-搵m/T+Z U>A׍3w/Oc;p/hl1~{�A5</pLLi3.]bK⫸BYƪoU#U"Kh$(6 ŏrW8]okOmg)LVk*Zv+$N|+A8R'KZ.ۜ|+RxyeQ ]g{:+K"_@ x+⢲۟9FTeE.2'[ؙFVO,~M>>)XX~c-TBRMMn&z7ɧ:W8j}I#r;yӾ8Ԝ֪�&~D Qʌzgo@DMԘZƠqV_:COPE4f? M,621 _Ơɖ2 &9^/>/[G@@H'ax_{M~2iiZCl'Yv%~%SY&Rp9q׿wq.xitwح Pm5Bg# Dg;pf\!_ɧ3 W49Zdb>AnMeb>ZpeF-+.[SVt99KTz;;@Klf<&j =Nfq~IƝKeFuSH.=m]gK8_8g[1v {\ ;XStc7WhvPb_>11FZ|.>H2UH~108logq ~@--I9Dz &<,ka7l(:vu%}j4y~4}&spd;zN>ey\ljL$X#?=H.Ⱥla]u) _&EODZy5-(|k_wL/PK3_@6ު2B{L\_c@E'̰QKHʁ02EN8g̱׏.Xnhz"[S\*gQoS M\T~}ߺ6ō_q8b%Oml"JF*ޣ8D4;D!kUeSཧ>:?XeO? tӧ$iY<jL]v2j:@/c5w{T&n_$8*N>o\1\ŭ=d"&کjSO\~0Kq#81ޝ|/g->Œ;0&:?1U[9Ols[8d9n=PvR)RNQm26YEg弬.gP8gk()0QO}1զp!PTb_sh.U}3Qmb&붅K罿+LQ*-;dm{P~v~ku@h\\ro:!ܲmq5ް}BrAqF{),\ YKSh!5 χ,Voh%U}Vt#dBY8 S~SZLJd\YMNu,io!ht>3OIi8Gv;49}[vT,\e'"ErQn܂t"6S*QRrtn &XeY#-=3<O&:0qZkҨh]M?vIRoO> }NS<ts}QV>Mȧ}*#rfwHa0+YT?[8O9A_I? eQPx;|(鳕l(؎:6@khJvHZjq[W㿉Kh= 4WV\&J*r\00㟢4<"$ ;_r2v׊ʸ@N'8{6q}ET`)j'6xY>%9~/yEcYI#oBD{̿nG@UٰX/<肞SuLUITdal?we#΋t Ld;1sY 븜K՚ ~/;Eq 9 Cgbn<T@[VGM1r4ja|Lj'+C]8`c\]E,ǣǛHbg%uG؟nks !WqFYvp-V@= /wm|Q!7б+WS4FS6["T F$ґxt߳6L>UCZU\+LTcryq|=&ɴX$eDK6;d~ni^Oɾ%|�+E-QD~? 5[؝wshp,0~<XgCp8e<՞Mʃ{3q ,`R<J>!Hxb+$`QegA<IH/8kHFy![>oQ -D~Yd'GF4K$i}i>dMdȥȆtmsd&r YC*0Q߽="Ʌx_&/٠+" ksg[~hYd%ϡbjWLxۥ/Dv\,ܬv]Cy|i7C(�/g$SeVQ,$k3q M;rh&gg4nzq\1C–nH (g\J4+7Gm$}q.[$mh0 nxbo@ ]#DLŲhj9j)'|4ʇ6ZhL{7HhP:Q 1fvȧ= M.|aʹms}!T;ʬZ'W. iO|IL*}lwiXETXFEh'NI7.G.QyM$ I繴kXrBiWuɟ7~Db<1z\i:#["khCI(3>Ȁ7D#9vByub;ud6GNkDO6A"'S%UWQ*ا'hor "k;>L? !?4> W&TgdU9%Az49YFAȧ >&]D(ny}3%XqGA Br>YM=b(pOCIhdGsAb;Yz!}!'˼GT6=+е=R .o&/FVv+[ל&=}7xS6K׈6Kbh#orF(bՅw}4qDt£d@L'a&;-B8q'9V-ƣNAcx/ ~QtO~ħET\` V\ +\{(rXNF' 2nz!Ox9_tFg*{|v$.=2NPv)Ce _D|^ȅ["hM^M#xn$47)/qMVW3-Vį<%[EBq Z<*A?k)Q%&W{~M&ʖr/Wخ{6G [ Z./ǁM:詵HʍǃJ։hr$PLe-dL.c“5Oo|?~dI.o#AY^A3(?un?@d=At;ev2 Jo>G({O qr*)~uܷi( /4M(.S2N^o<+z:ꓒnD𗏼Jz:Ldw3IG~(-w[Ӡ>6D>7Bq^%ۄq\P̿+dl<l5Yۓ_D e|_'ևrE_)qhbhSSIwoJFWG8̛ޗDOs+&Cci PA7æ54Եw2Qs<~ܒC{Qе⌄;`-4SMr?• PI ]&E/>(tMxJb wޢ᫟F aƾq[]BOѓx'OHEVw?H!4Gtsp^]IzOpk鏣Ƥ|dt--<7_6D<|ˆtA-s|UU +_q7"h[%vwn1(2w-lCqIʼiF׏f7 繁m6W_W(b ,J늼GN7lL[%1D%98ynw."52\⊠L/${}oL\N R|BnK↠<>{MNQ/9>5egp^)Lr)^3J9.lj8.72PEpb!'syM"<�!O )q#?Sokxz|K"kZ( U#r"j vx~<iGQEߢɏD--!Ә~5vh_!JmȖ&b vˋԡsBEH36mѹM4͢\SްZ5^;rY8I-vB9Z*CL 9A[9 6dEwɧd(_l ɗl-ç'qs!$pu)QCŝ?C6WDr9GnyYbCO=b"߬;d4w `bͥ@�2.ݨaZ+'ܸ`eS]`+AsqE{-O)Ʀ[W$k;1q(Zb_"'[6lY~0ZXEkH7aϿwi6k|]'sBr9=?of-IHc?7-~\_ɖǝbsY❯@7^ʻy4=#i< G>?=FxxXtc_o ]fOGyZhq&uܟ.?O[{qejWrF^n+ov |:sZBErz&vɭ4'~Hqwe@>qF~ג䨊~G.<݋>_3ZgN6h.d~6O)YLloދbODn;@. sq#ͦdO{qY)X)QLKRg [LC%`KR MJȢ2Nw}bT[:DSRJNQ鞒OIIRr wMУ9>)QA7]!ks$$xeHZ(R-~܃OUGE61ҿ*#'Sa}SQ0狌gb:)xoX,Z@PW>i?$r,.K;<e,]<9 }%qG4gb7OE;M 2_4nw9QK@^kVf~#L<>78<إ[iE&FgO?˭VtMBzM~`b-7;JE'L"db=3TIzu{5cgt^D<W9;Dq݅`?01@NR$Ucw$XoA[/2'h}?t OY+{s2]B*{h2h%izyN~Hvۣh2+$~T}0o7!o;LBHVh1dޯjsWIh25 kFoҡ61GjΨ'CHżi-j*,Z롈Ǯ&QkPTAqqlD'b"{*˓m1d?Dr ߈"Wl)@NF_Z01V2m')"TL4NAq1I~Od"'ޔSf}68L }_|9.&AS!PJ &qOxz)x\C)˙ȁZ~z ߎMO*=e(ZXUOvlz2/?Z˪""HKw %) b`!؁(b R"!!g sy>MAf]減̥RHy'32*{qSO/CO%+ r)s]H7@7cب)OoNN7_y˄ci=T[#TNc5Ry܄S>=}6ӻ29O[+Ϫv`rL?9N>JW}fl0O<) z/`ڍ=azZ^BO{itcڏ_w7c=@O hr,{e=L;fvz6Jɲ^:[&;ՙ-45N#k -Fq<pxKg<>S^xܛ3y˕ɯT;^'{zْw>`Y㓺6y3͝|`W\Gqߛ@܃Dz6U~RtUZo0-<NOC:;݀'_0Wh|1,|Vן>NFLX] N_Osjbg_TOưSwU3ߛ*_/x(jfGf`ݧDRzF:jSdrR7wH 4 _&f4x]]f>MfIy<5> 9mDm5=e<W@-?mI3Lsk)Y<567 !K1&dȪg_L3Ci>)/C4uMVcMlLn;/L7u{'i7 ;J',^K SvGy1%S]1\uJv= қ&Eoٮ`؍t&{2; do]LOA+onIL@{K8G7.JW]L-g'lE-&ӹ|1yYq/Atsә)L'tY'l̍xܬ5ބ Y'Lsd`rj@]^:S}&k_x$͙n]btt=Mgi$7{jSK.X%]ixǽ֝r!{sdvo;S1+F񢎝J$_&߳VTK>I#b\VmpʿC=zoxܻ|�DC.K(qoT5h3ϔ<n M'cW2 PK!̗bfʹ|Ow 7ؿqPHY5˖]zD y<gdަ){1q _3$35KϤ5t<[154KM}t2GM'Fݬ5Y3+y憻<N)aڬv 6a};ĕ\>^ru9d[ڝ0dGOnّܝlzԫXOVW[t݌kg]JVB쌈a|!詗"߇O+vOf6{I_0QV' ңvݦ۝>,N+y~8e$-N݇au3'W'3KC9<Nz^_ݬ13-<Bq'L'aX̔}2jWAǹx܋2>x;O2Tw~ʝ>fO^5_q>Fb祖\4e靹5S4 O!xnM9'k=>f>3Lr2qi 1>Ogd?9^Z03,|Jsu *S ݣSΜK-&!fgUfk-}S_>tj%]US`3۔?)^.H1w~2j)ίg@ 4p-E x+Sd1|$ ^-^L /rqidq=Hqp&ax2bv#)Џ$'L䫬Ym?Ӷ6?Kz#}f&3`r8훞mJu{s2) 8ǽ\naj�q{Jߜmv}2_;Ϭ6m3Ycd:ʌt[PAOa%ِjM=eϺHB$J qcʄ|Tu,9xnҕn12g_;'$|~-LzvMe? `۞52o#ˡmQ3v]f,+̟4!ѫLOv=Iw֗XZ(}.M9zct24KH/6YHs!P ]䥖&ɘ1fL^7ut`l[u|jûCfq0Y|d0 ;גqI&'F F,j)bWΞd>Odt|Z>R- C2fb_;?NRVW$g.F5#|c[C/L>ڕӛذj$Lq!-夕uTd9^{ :!c-k~a{9FQ)$W2(<nOR5){%-.t8ET'Aw}E1!kVtō1a?9> 1W ~ר_"W7W&}I<&8Dǥ^)d_,eazWd _ܙH59t5Hj:@̡t=[4ݙ:墔O^t=˫ʡ -iD&%h:s|NikgBO+}(1 S\O~] a3CgGyn7/YT/15KoP"EM.O*Ikz^1ؿ_Ub\?3#9Tn|,k*/7EQ!cF| ?te6&vfib1=,_Q:&QPK>N1YY54?u&&O͌?CX,CO IwFtQ))mMʚ)cs@ʯQ`#boӢɛZ8VR*Ư)YEi2Q&ZSENzHkkjeV;&/8贲]b<ޜDqCv~|'WK2 'm2CO<474n7􆵲c_NNd $'ٓz<@\c"ltkxi.Vc. SfLG Ũw/FTL@,nflG9ճc>=26Ei{͙ih?/jiO!ƒseyڑF>݆㏬&r:xjrS%넓! >7W'tq)z{ =O6ib4崹3'}j:x;[ׅhhcZKXG OӭLI#1v;Ҽ7U4Q#=-ƹ 鶕074PTu[%s:~;KSqF_-rki'u!h*X:ὗˣYr8-7vXew;i0D%3ɯuIo2[?nLO+2޶TM~lsE'iA]G5c'o';OŒ6 gSK9d{B86^N6;wk2F؞O|!-Ҽv>1雴d<NAɎLKbs<n9ee ޵1Tx3~SM= t =262 =q7D!ŃINm5id^7ޣXݨa򹍡 oTfZ ls6J>Xߙ.ɯ!*+gr[r j`OԶ}r)5xbY~'fZx ]'KsJL̸V3itߘU?ɟlk_!n_x<ݘ^e{x1)h)i"oqN:Qi",>JD#lXk]Z8XUֻӛߓ3;zZA%tmC4D1Ld XI*{@2V0|47ޕo`=ϿLU؝ OI cIֿv,#F~LSe_!0߼ 􎣺`3T)E3[~5h4pS4 ('U4)km%{Qº"^N?4ڥU22W4YOfLsͮWBǟT4?6lZǽ{i.ǓBfK3ؒb (g(JiF[:.Z^-1r%CfN5J$s3g(}B9NMpu:a )){GOة>#;-fz=xz;ʒ&_Go{bBG憂b[CT[6렮= JM~InNuccv6zwRO~0nO_v(@G!/ Iz@#ܥxf?]l8i!jCo^2SBK_1U^#!k!=+zZbl26>{ G{G<n۱@ցBl--(?"*ݜ[տ)knoʤwLGr.ݶuݩ7bI=.xwZ<Sm[RGcԢɠCN9?7UM#wPR9kK K;Ρک:Pa&ʶ[}K^6ͯ b|/G7A춓䣬!&F67_Mf/6ǓbE9-m ]v~<?I fBL~1e9[:1-A)9�Mv_AtIiEqܭ5U~!=Uæ9W:B>rW:Ӷ8HAG]<r^SysUE/{Xg>5㤮7ZNՒmboY6X#F>Ϫ˟VBq9MNP%:A1|r04׫#6z16zjA>ܼ\$~ G-=rBu齚6륍yfj~9'sIr9OΔiL`f6ێұڎ8_`(Srds4!Cs9Ӌe}(g^>0ﭣb1_BON@NDw9uS0Y>nϻo$ui򑴦qo9ޞUO ޳nz" }c8\R=KE Js6 4^l3Yc/I$-1L&=YIZ~1wޛL1岣L13ו/ĸ蓿S~B Gmi4IXzz>pK'FT2LLKT}.7}\IZe sa+9^ro'w#b3{o!JL}/=UgG8$M*ܒdך_91e-o h) +6cu! gCSR164o AmR~&]6ƫI`6s_ff8,هQg f{0id]K z)`d o&KwpKa<~ۖ!T:6m%-삯8?z6 NQ )Ž�G*vJ;j1I# *]JA RZ1/%ӋBR>kuK|I]\5/덿L @<mïgLsټ}L)xPO>|z :bd bIsss; &wz*IǜpJ-3vL[0h'ģId:MA-hwX4bӨ.Q?Lש̌(Sr_44ƧGppT҇94|練b48eɞխ ƛ玨Hz:;M5Q@491&GBT#RI&"6χCM&4_%թSBtYar,uU<;X =j/6H ZXև),4w 1Uir@2=s˒W47\loYcv}U=}(g Ma眅]p0.tuz<%]RS\[1z*Lc` 97A(.Fw8=H?Fz^{)-r<fΪhyoWqt!u/J\5ZX-$zev}^({i>",J_Jɴ6|὇ƚ*qgG-͟rB Wͽ:XX%.DQ5?nb\I)!F=-=מSZJ@<9ŜӀ7Un_vM(N}0]P?BܦhS/;jw]0UN&2-L%֏Nخ&_ohaj\jw~ﴌ. {/Ls9inZaZw bğ:bBdLYi1:x%i u^/jDq#6Rބ Mc3&m;꽻Q Kui-MM<]ss.V-kzzlף]W67 ^ zC4'Okx�=CSjC|S>_fiiG Ǩut8X3s$Vn|JAt|Uh<&T["i^+r*=uDeң<SVIdmuȣ)j- +tǓj|rJUQ^'.xp2L{D{vƸKIz`R!YvyU.,y,`xm{U/Gwri>ftﱾ |dQ]=ZÉ<FS_굀z*;t*G w&jO՝OC |tE헺Z54ϷK{Yw򔀘!/RhMޭ9JjAMKaPmr1 ZX'jܙǍRNu^(՘80+*UQ߫2<{vcARjs.uz:]p׺T󦉰ϼc%N M,{u}:αO>-3>ifޝ^]pz䱄^NZ;Ľ7>~.XZȦ%ĸ?Iw]1{wʯE< M1tվ0!';L:KwI}n,Re+ޢ[>>߯W{ׅxOܭGvzxgT{{z}tT;HZeFuSܻ*bMJ˹ul^s g7^2!@Io,2yFўsKop z*EzG[n7ZPdo;JL_'0}=3fMcSnzC'ҧϹ ?US)f7&~r{\j̮#>Nn40E̍?u'fWlXx[8O>k/2KqQk1ATT Opҏoi.G2MAQ3΁tO%7Ֆz@q)<+ߡt=,:&W6ô(&ez |)VjYov_oKTE[G-lL7|픿9z:Lqv-lNb:,3IN:qzҝ- 'Og}LZ zN|bo!${;nϞB?BϞ<l"{wL#(Nڎqһb1S Z)dlX۸]lG nց0\#zne/SS򜌥p1FGo<:&_e*<w1ǵ?1?Z0}L4ɟjo&MptD'/:F5&bzw[][+x(woEw"1^2M.ڟDO躛L೶s{a}:"^Ig㺈1JQ;|վ{MMcKhenѼ߄9rKfV2ͶjorXtim0mRQ9'hfB7h;1ޱ?;eysŽ-q Ё~Wi=nYmz*o#HmMcFw>C}m84wS5b>a;:]_&O{12>l�}ݶ>x/NDqC4 Kr=6!&p{tSzAoM:t'}H 1>5gM6`lDE}ҍ'M(s欠CN'xjEI P@O* }ڬc/˶NyIpπL U(sZq*6Kz:N'xeKZs# {{v&h!u=P}+\/yqoA2veblΚ/ÛozbΠ9z@7b.] 16ЅwOոR7OO˜Mts;<F/9?bmrcP<eQlNαD _wRX^bFW~[Sd1nU+ue<FuUAMnt+tO(&hN׏$j}^y&@oƻ|wA+MC"7~b~$F</F7Cb?B| ф qS[3cU^~>\Hc(Fն/~rΧf49 ?@ #<n4G_QK]?`=!F7{] ~~zUf8X}:@~gRFRN)cq!>HUI-d?߿<S>ޝ'U)w!Yq>W%~Đ2)]qO5Sɏ F-Բ)P['�x<el[y0T#p&jYC+;&Yc<tOd{\MoSN{»yyQլϤ_qg;bܼ]oToTMBt>{i s#:RrlC8aT'kݦ/w* rJ`rNԥ-6z1K%9| 7P6.mL2 ZQ܋ =[2э{{[to8X9|gxTw$56r`zsj q/*ƛj:ҿ^kd7^iuOrU5y 7Wܕ4ǍB8() 1 ퟡ=4yEyZj nM->['Bݝ;67!>xƧ9{WUFrB@ ߴbCcׯlN[۝Ԁ3?mR'b^^p2k&`g|G77 ަl:[_)Rid2)x\ CM~7`{^1'F</.RO~e2.Ӿ69険t@ 8]b63wCLb n>(M⤏C#-a1n3c~3 ðǩ%/'c<F삗<?2t` !.ߡ Bv4~ߢ~΃x s5yP7ERtw 9SK'!ނh]զN*b03RɾߤLWC|H xl ;p[T[< 1pt Y}3'4b Ջ>.vqi;M^{ |M-X:2Eq7@<bT; qJ/LEqU%h֤>M{ezM/9Si?�vcPSU<Ǯ_bOrw;)Ʈ_~a8~j,D.8nw_ 1 t-;,ds]R.&_T1tZdO=gzNDVHx}}3=m֗'T;ϓ}qmMb'zş^!dNIZ(INa fBZ[wr6ôUض<2Vz|w0.gD-ưtM@1>1rԁS-ICzqtޘ5xاk_Lϓ̧'~c+$.d|Q~Oþ1Ə3Mp˫ лqy4O!F!)۽QBC^XLM}׏@galPܕMyVxĔ_P@׈.0MOq}Ȥ<&+bj}ht>ʟ*Ozw&t[q*x ]æOaLğC<OF=7 nH]i?0Awի 2-.CLJO:6:ymB]?bO=63Ny֙;eߣ4yJOzò!,W?vw'%Fi驁xmaeTĊ='sċݑZ6Q@|@_}zCpʷf\H}]^SYC_9Xun8}i<$R1.p6fU,B|aor&ѣxD؂^eȖi=c؈t%DKwy<'b<�qP=eBoxH&8F1Q|9LOxU-IttZ=5Z';ʳzwCj5.@$?Oy S3; �LdUS^lG٘xTj�tOt0ao7cCt1Tcf=.K+%W/<rB>!} D`z5z?Նz<O9$]?!„_V!B3}&]/0T`z=g΂ |?D-A@A|6'ym@ ^RxL| {rQoz0_rA/:nHU_z3"^@% bc#5xWhwr oI.]H B<g"KOgٹ? &qbͮx)OSKs5Tn<}rQ~xJ Jn0@hG<.Ĺr4k2Zm2mAGϨx\~Ti.q�q碧ݢ]ŵ qq=ԲY61KXti.[_u7z*k{Q싑u Dģjf:Asb\O .=#"Kv9$v|�&;ze8UO1^?t<=!60:= T=ހxQT$1Ay< qB>G?=cZ8';4T!MңO4}ѫ3`u<B\nogX!qL'.1>iy ă"Z( 1Y_y% Z7<:9N)@}:=.QKݦCu9C}(Ny^Ax wy /b3}]e4Y/"Ű8]jG{FK)>?*'vKFz7f-h<FId6ij:ďSKȰ>9!nrӧs3ႣxNoZN,";DN >r&lFG!#:Q,1~1^P1y!KU^7'vϗclwNuy=^Jq#b:Qq#UQ[ޢ>;v]5WbJ--Plz#xGNy\T(nn;Ǖ;я":N@|>h=#0J/Ņ%y 8�A!ӻ!*qWT7{ɣrO~]ϻqS{=&ƝqV;BC_S9/3cEµ8$W|%Fp|8]f7M̵U;=4m4Y=G!nsJ>9Mm[Lp?Z_K$yzsqsD/ޫ>蔋LsuOmҌ"Ɠ*U40}Ձmfq�L&14}Y Q~}RF1ޗ,VQ|U&ڦwij'ZAX:6]PqQFj;^D!.q[+2nx{<]+Gԫޯdfl"}VCC!FA1ntPu8@*{ݶS%b%tVy{<Lb 'ɋ Lqy[m%̏^UUNi< 02y3(WxHwL!fǹ2+qfw-,Eq`PKɑ>}?# 9<Ö9b;4]#d~+2*1S!ḃ FSVIdp}iq/DP^5.1g?K)`ɩ<C,qxiJ1It}<Բ&w/qA=T5X?l&qMt0oj 2(ι %d3ưI>a (OeA-9*̸_' Z-dA-AW3x[>Zt>q5fqs> [)(wqT q>vupLv 2Q]զOU={*D~zV{q%h2(n5=YX|mC͝G޸ .ˇNMOa}𧣽%Qz[ ^.R{s;V₋d:XF1U+2]R-f把q}MtNy_ 悥>zz*M }>v13n"%N9{C p2<[XWo| Ƈ{ ۻ#}]7N|fw-Ls 1QO nEoukNOhxʧe6dz<NV`د^ h/rs@3#]Թz +燘PURoEk5+0wrɴΨe tSjy;ѓD_.X )Fq.%npJ-6q>=mcx7blb# yb1D9r#&?]F3 sӿcYb+1.U69LC1>;(>F-+7S>\7KpUNY (F VC`"(B1Ŭ_]W1Wzunzi UC%>>e ~s!uVΌy|{I=hm |MsM c ߅TcO/Iy/.xo*]!E'~>91lNkٟΣy._R%5^.}w:ĸ]AqN.㣞GDU셊𧅪eac@DpOmƂT1v[ԣSAڟW7#.*);D[܉ZvH'3v1ӛ8߼7RO!ĸRΕ͑1Q-g3.gi/FNyLS<W'7W`iME 14"vq<nrĪɟ6W MkCq}BN>9gwQm.:":od<At5& 1Wi h4!O֣>?Ffw'&C(1�&/+R:]G_K #6hEO'!<ybƉ+ez4;ZGwkS;k*NěLj9}:4xyz7;+ a.g5\~T)WEĕX_pUt]>n7r"bYGs1vF!+qP\MD7?󅢴T{oX5B7rDA.]N!#1񶌈$>XQ L/7a[ZA|)R)|ßjpg|9ڻuGM sܽ3nsEqs).dLJ>2=m冘_ \nJӎ>ϵOΕױΉVEo)ըvA=ܙ3;xZN!/!~Fqi1"F%zH?x#wgSqEzN FIlUj#nNj)F6Nw/ZQx gPב$޵q.oQ-qwZ26ΩNUrCk/Z邃ebA;Ě^&C|^]#KR 1{|^b E=?zwYǻm{c9bm3nVFtɆj^,9o'Ļ6K`}z:{COQ-R\cDAs#4詄pjt.A5ZbT$](u*~~,oĘJOYy\OD7^bdf3bB>B];1FFaY+rDuLo-ή52myjG Vr+USܮq^/l> ׈Ӛ>`nxv^U c$CNVq ѧs%Y7t:j擫aƂ*7CG#NbUN<rJx+Ĩ@q[xƩnz=P˼OLQb|u¹b\,Fg Q΂N.<E=c"Lo/b bdŨڝ#r";D)Wv-miďXܸϯG1BLQ^:"T#D1SjEgwUA3؏P\QN=|MN1~W`Jl/ժri,*/M68bBQcZd[j9HF-ݸm|%iY5F蓍qvz&g?3?{G#Ɖ?S˝ =n ŅS~Ű ^2\F-ps3~/̆U Ÿ]Fٍ|Kd6Z({}Q t݋'s._8 S:Fm2]pZmsS*Ĺs~Tӷ89v]ퟦbno9ʚ<:`i9wBoqʕ LDCYgO?>@5bTnccʣ_?a:Vd<.틚l3m#FI169e<8e9cfiyʘ6c ȴut޸(_d4]C\ Q_ȟ}}^&:&{* [} #K Ak(߭y9DZӟxBmqgw-=GGywC=~Fb_Oi_oX~ƪ\pB*">tbao!Nq<izLz*Nᔎ^)v3@F@+)!SFt>eӷbF4r؏ÆU /U(nSLVZ( qSb yJﴰUR+c~ߜcLtV, ݣLBğjqJET 1~qI;im#A.qp҆NT.tU~9ʻ-}]@-irW}\j_c4p<_ q+޾%Dyr-e*6xaTr#FX?b @8Y2&NM!;7mᆳ0:(nS@' d@tpN@fW)[D4pp}N)`p SӃ&kixۦQOGXKPKBwh&&vq/ j kEN qW L'WCnh$LsG2 cO3=Zެ6B4Q-]<˵03鎨ںq1>WŰ#sVԸç|2tri"FJ2;`iwO[B A;"1z﷓mc,=;83꺕.'1 b7,Z=.vJ949[wADq렧g|iEqe|7 ZGNY|,vr[);!" V\ c[8-؁& 9;tfq>3TOPـNJ].)n{̖1HmÆn;Y0~D4-lS1@qZk-k@3;0Y7LRmCT %DRPs @4hQN<&3c&NiUmt7D [G+?az)9崘Bk%iON 1QmTFGU^(ZA1dbl-"Fq \ 70wDKy4haZN ΑI˱e *Acbd6Z~8:K5ݮrD)jAxJqn3Iq!˴w}2 )% Z SCy&91Ibdal@DLrNMoä8.YNYO$~SxS?ߜe9v#1 b<zpJq&IJoݚ83v~@4lQsezdz8ƨb 2&,-cLЁ fD,NuL?'*?ܶaD$Ǵ8:'h8-Mr-' Vj?ASj97 k&^S&3ɴz\$ʅ!D[GG}y*өرBS;eqZBd(:ΰM/txz?pY/'^#BT6.3sJ:.SDn4$vQ f9eU4<.>i;OVA (nZc,GvoU]5û]aUf/J6RGrۆ~ɴzDIwG@7Ep/N j9HON){Tgd:w%}DM)0YSp 13rA}ksL8ez`Zv7CUGv\ӼJoui&~}!'<,-zx޸8|vBi35]*wcSQ"3v@;П>Nݥw㴼T{wǕVruݥĘci^{3٤08߱w,鉨ښeE8z"qޥLqmb<sg94=ZB]9%N|1E3cvG~"Sq.wLqwǞH6eDD)Yi!FQdX9^3`VD:п8hT~`jr<(lg\$躞S[cq<cЁG-1cۆLD-jyÜ8cSGp bgt@ct<ȣKSˡfE-0rD4NٗcNܞVci@TgҴp0]OݥkP'*k)(.8iXbi;.wY':FG=1t=/y(.QE'NbS98X1u }o^|7SB.$1KEQ-9!jE%bӈn; #+y0 0!WwFVWNvub;TRYG`rSbqJ9q_"ˢ{zsĘ/]n[]F-#Âܶbtz)K >'dY9֏~^*N{W)q_VT17 ]ln8%D4gǢ/qC7Tyx z2#FATpml#8X^/Z#}5y7_w#)d r0UY~'WS' 9׮wY-z#QסbPT <.f:{C\*n[⼨2&0=#x~ȴW-!Q;NQg˺85 #̿Oa_5zzqҪ'N%1#L'dL#7IbեPLLf#[O#" w9F-ŨkaL. -ZrXBbYg Ea Q<#R ؁cUrE]Uǵs&Wy9NZ'_WsB`X45#Lȡ׉I~ pٮcDm؏ai[EN.}xJU427t_D4 .ύvJQ<Pmwɣ`~zPe1rŝt3߬0W5<΍D5O=8A '*΃Z9NL7'tTlq|[ÿsۃ,2R+N7(N{ezCMr"tlrICM4wXˣlaRonm>[vcnfT{Oӊ!;DOq~mq%= zC]*#zKet QQZq,Pe B)vELJ ]-֣)VT=VGo ri guX%> * 1» (YMw#L룻,%K ۬m8k&0x <V;R>6R]+OF џ´,3 LK\8电\{i}Dfq=k}8"vSK^Twe<EDFnb#"bnPDۉB!DMSj94tӥ~6V\鈨A-GXcSTVǢcKDrJ ~VWto.F'V"ƒö`i6+(KU}A-yݡrqk}LxvҲTifAPPjQ&ثcy AL/;PMUc_wJOݡjD\pQ03Za;c,"Oy^S~["8IX=O<NYa;%qKsFS*y7n?!Ӎ2=U[#"ް4l] Q\5T8'"6-}vJnZ̸7@#boDa%1%P<*@C},溑"_4";|4w[ܟrZrřTeSsibhq B?c2gFG_ӪgQ T) "SXء.ZQ)8)[ +e-]TT\XmWƝ#[N [-#<l["f D]W5+?a2;8,_:d.Vl#?Ņfe%h!8iigR:O|sWƽHnD?ՒZv3t,ή]OuэWa,C9ko=c^58ScswDWsirOci>Y&hAOޱ9nG9TP)2M}twJ,BE9+x8 2be_/SybldZ4zGȰ`#'BQO=&nAc4wbc<cu_Bd*V*n6Y3]YN <Do ^)n }D+-liaXO Z-1F>9 D񈨪}<M~@s!*Ow 醨Ec=+KA ; &0A ن#bCJN"tv ޟyʟF䋊~:uQ-ٓe٣oz[0,s%"ppVOG?vS"̝GuΦ0(K))N,{T~娩GU0A-(JT8q 5 /]4tq0;N#ᔵ7Όo_ 5?+ AQ0,OVw ):Yd̴\‰4<mmZN!BK)XQyiabklqn K+]FQr^e%^1J`zmfGyq {a1 _6ΥE48ic7jpBvN#vDo LX>!F4aa[H8#z:OÎ\[2J9n8<8[创麗wS}?Qq7ozɢ|sf䶸;-S^Y!2LoSTӆ IW FPayl,<>|dY-a݊?E ]?((TO[7D|Q vSD-dcL7߸7 ;]w뾜8 $�x�R$"& bfdq휋u_׭Uۙ8q]]UW_5_|QJ(5򸉧?!~ٶY* k1x'&z⚞TxwT[wG?.dkrʧѮ[HRO͎OyS+vX ZBy]!^؊6<gP9v(ʻ4,KOy*,'g@Ծ{Z*+==T0ᆏGKk!yb>#{HT^4+.Z9O@YBXV?_AK)#%ӥ >\:0)Eg}¥ ;SaOAU)w4_ī/>M<wy b"|||oT0QF+;wwTkT1ն`[M̰*fDu*xk{\3P?6(MI8}rw;>yìa^ ]c`h7m<Yz+a)7|=vE)BT0Y-\Etgfh'oԖɸ􊂸%=P{-oj5υO"y|\D:咷K zLo=Y1 $ {rH!X(w/a6bAon`oɰ1t⚸;}\!PS8]Kr-xI4VA_o_쐷ث0vx~*Z'%XQߑw`pCPNK/Zp("qoG璾xK"'hi8%y"-S�Y~Lo'oc 13;XzG}Rz>ݢ^ߠ61sn),w}..:2|Dt%{A\,~z)R.M;E~s&8?oQ@=ȗx׋y?yC-t?cuAΰ 9%6XI95qΌp~=#ӻ Uw'WԞk u\*]1G A|OXѲ}K쯨>h*=AVѾVTK߷Dg NkXrWQ R}jPKf2kzOհL puVܳbϽ-K2L&=!w}'=fҜ=yL+, >ɛp+e0!/>}YjNLo;.^@0d_/a=|-J-Rۏ'y<~G0 0y 6YSkk8 &=**K<rʷE_cנE* %xOHK%JI3yVxP&kd)i[E4SX=i^?$ӥ;_E;D#)R^ X3];ԸrZV#Lp}AyxFǟpd]ddpI푎BtcSR6r1s:KR&t?0cyDނ�7<#?Ψ W[DVxˊMRYsN<nZ,%nC0yJԤϛQ'ԯ;*؜ϙWVTV\rpF/<ͱ%9(J TV\`L_ys%<8>ݠNQqQ'Yelo{F┞i;j*uKX2➚a57}Gۡ+QW=آ;eR 2K?Ê̳=ዷdEfdQ<Z KnjR/`sرsf?]<rm+JwCR9_=x0[dVpwrE|zw Deߍ{@ N:Dw>y;7GJzgp>^Q7ϥ1U SgV}V]Q/7ii +QQR' MWo2\ r2KlKhG`ZN;E\ҡ 9ڤTs{̑=E'rNcd38joX(rrV~k"! ]{쐮TrBgL"g9!i]ԅ <=GLtP7XNP 5xwʚST7g;SrSS'R %9UPtíEv[ Z4 T{)O_r3$Hݗ,cOCtT.5�K {<;&M3AvK,yV)3$+9E3=PO.uh ]S <b1HWS5h:xf _.qԕ rP1y -SxE<zL0v}cnQ[<5N-y܁CvxN{p}]gmN-P7pqS "O\PiT0aSMn HEgPGCMdE8SD xET)? ,A9@c EA3yZrcSAJ+8rHO๬,(:Ǝ,mP}֜r?޳OQ3YRnP)VOG YLsnyF-37dXcgF_K(hdT";*u}ŮɁKbP){8̓e؆j|d8O>`�<j NO9gYErSXa ΒҎ>VS#?z�A|~li 5s | +R-S qF~.¥9tOX+(xVT'įOOT;cpH <$bͼ�xwrZGzxO2_O(:Aj舘 y %Pi tO-Vadh~DNygM)'Gy-5qZ;qq ł=+ZR719߮T;1DwTK3;OwR?*: <з&=Y*bX!g2IjK +.(өyLte;Xst7e) q=<k2ܢvWazD-[ ,vwYpG:9GO,{L`aKv]å!Fn]D�jl<F5Lq+<.ؠ;t'ԇT W:tiqY'y7ts&+T,ݒ2,QzN#wƥ2pĂ [R[ ,=jʄTZ)G[V`ad",qsoA_%RqwżSNqD%l<M9di N2p;b߀?.9za+tdiZ^޳ʼNj{*{`4,)?Y(hOig!79Bgd#h9,3celSvj-Yl8M� 'D= NH�7dN4'>p[Opz'X$G$oK,8Gi�G7G.+QGfs-U8r㐾%X]炛6Q\KurHdgM5 \+=*˱)Z-xb"58<ʶqd;O*۔ԸSM8}Xd>'vGm1`fF?ϴ; pf홇;OKVlGo<#n'p Ɏ5z"T&77SXMH5uBe8`if]k^:t?+>Y*>XpfX]V6;7ЁAtZ kM%ސH)X1#DU6daȟcɌ[՘Ǻ5%6]䔙|B4 ""e.oBDCwVUVWD@ˌ¶b azJ'pG Z҅qΓc~',ҕuG鶇d0h@KF1nHwaذG~9>ar+SQ%=&z%oz>em)k9E nJǒۮ,U{<:% s0eebXxn GxNuEQhtء{0Q |un'5<_mSb2oԨGzޥf&&o6a)WNY-<Dts"W}`E͉]A}5vʔ52hGŷuP/θAWlҒZH‚%r $(gxaί x<-11hR_s[ł"ק;jGmz k|dӍaS - j](9^+ +ؠPqsJXpK'v_Eytkׂ p&-toszLɱ vL#EV 3ydeţeΙ Y"[S*`oX8]O-ӌ,J4h=3< &\|)u3n[fZ;Nczqd>r Dの@BcPU[`2rCņbGfuݣjZ*8j #kt/9p:L/)VXE_qgpi|fCf<=t3Xs*GM'#ҐqVW-)Z[CgfТ*ic98)!9]>3 -2k3x QZ+n2甞ӗ25oƻ0-.bҵ 冕Rkg 9DW9&V9z[r-^5P9:uL!m<a*RR7رFL}:k[J@Y"GRih Q≈O {[zgϧ>r۵}aLl*XيT/RUȵ" r}_dQa5vرȵ( rI*j91XpG'Gixjɏ%dITtq9Zt`+O=>_s,Suh5-0LuÜ@T\C2]ԯ' Ok2ݛGn{9gb bۃ' zOKEJ:Vp]:շezTϵTZ={![_}J vvk0q|_D_ ͝GM6zI"[j;2am\xf.NЌE=SU\XTtEC'P)%as5 E%Z}sĜL׮G[ڰGST3vCTu۫Im- 8]EEɻgEC05O;;2PY*<L8As7 qsBҊYᾣM8{l~N4&{V /%Nށ۶#tE+T%ğVʩ[NI+q0o4 h2Lq6dn+ܤħ *ك v sW?-+YmC œCu(B Guavx5sNTݩvh 쨂ji3žta$9}^u5X`:D 64عzG 1ݱ%E2Bڣ!;jc*`Y%-ma+z5fzf9<V4ĨtLJ1TGS6$)2]OΩ~ə(ZlvD.NNUD+GVhsf⩥\yV|ݣ)B ]*b/- ueGgO{d)8cs $TdS?zy?W/+r{mЍu-Dyck!=9SjWK5.]aSRT%:r^lE+z^sZ2<@h 1Փ[sh8eXi͎EV)ڜs Ҟ975wvV+=(Gaէ[vڒY*^3O +KsWlٿTe{ˎ`vTᏎMc+STVl-2X5*Fi7Whm<ꐍmS<y7rj{ua>9фz׆,#Ck(o;a>vdMaq˭&A~3*"ۍ je񦡻<UMX蹥M{o/ʭˍ >}P(ƕڥQ~)-WiCoqLCTX{^{&MEBtYEmg;Vxv*q&qq=2 LJp ՞L|>LfDqay1WK69UkȥCpAWY٩50QgwO. ]:MkL,24a _)% [ܴ>Vt`,;J Vo {du1tz=y3Lf<#)2=5_焁SZ]qv.".7ytgݱ\0,>4A\gnK=t٣]I]RdS7fsZqV+=t#JTLl`]B𣥊x_o3T 2J2=QKe^ -1s?^KoK|]FPx[u,8>UA]Qb`wt zFW]vq)k24)sY*(&3;K1cYT+\aE?}ۋJBҒSD% ,tX.aE۱B}/6Kr2'ʕYl{, q*iWD2.,bwR=:CKo #^)-wS< p„[-Üs_%aak3]_3] aAoGNWܹaKn@h gXkv8W&XNђvDӏHLQh֊~t:KһfVki?v "^Wnȍ|cE͍tStoWfi.BNԟzSzsySPMՎrAz˱aS\ +Ӧe֣wB192#z▙FX.ʸ}YeU=e?ڡ3NZ93LO*wdc4;2";o7?YfffEqyJZUo/2Uxd;S6Ze1;a?eN1xٝힻȦ\iy47z,M,K^=e&(x8J'--7KOrC=̣)Ocu-I% +[G!߂ZY* B⠤IZSr Oz[cnRΔ~7Kew{c@] Q)$f#/ K7IUROnAYYdw{8S~?v~\w,K}raTqEүd_[ڼ@jxMץ޴Ҕ· 3SS?`i3 L !$S JFmZﬞBTf ole|Sz˴G1f�JBs]},7?RI\75)(;oxH+qOa qWι[v=7vqrHx=i( -vY1iA Vg7^иz+|7PT;;!Z'| x+Y0CcY<e|zސz؋JbٳăN*כ%kMyj\T 7KYFtc鶃ݍFT>5ar㧪`j5=2)O3˟ꠞ$ŏ8}imLkR;wI{%3Oy!t?}`si=i0:bg<ǥ ̒!$U0hG%O{;Iw,y/agIKfȌrΔ#yk`nDS@%֩F:̍qS՛I>ߏȹqoݧ!9={yUL=;]XO,|˟T_3;8TB2Vf1>)I<!a%$ 2,. e)KS47 ˋ#̏t䱤^eUREiy7F76cwAډNN<SmW`O{6NYY~$|%oXn2dmogx%a6r.?wq>#)lMo?)Vd[ n;;&K5f)xWͥ82%yA_@nkRݗi C=?.u%tw)no? iX#>٪\Uoi1B dSf޷3ծtd.,gȦzc-nu6M؋l{!RN_h3?8cx-o'wb<Nkkw9Gv5x:-g2HsvoqIKJ؋M0<y^:ǟ)=Ocṻ{>?.Ѡ~i=?/- yg_?~I__7}q/4˟OWY/o>9g/ W?g} ϝoE_~_8w{Ux340075UHJ,ΈO,-O-I-I+`/olʬ7+B'g&g$$gė%4;Թ^n\cPi+2?)cCن} t2s!FGq*>lns>aX'Ԋ"KuGf{j%*=h^f^ !HϞ2>{#)#5�ԧK4䇭ϟϜU]R2^<Ow-\ U RpgoNf'Dڡ rA J_3eqG&k19�z[x<y ?xZRQIFtF� ,x<yHRuņ:"5'챿)}sA:#� BxUk0~_u=dl[}({reIӏ8>űgϣ ;]r. 幁Pi.ǟncqOw_OKqua2õ#"xYcu}͙k1,D4:0#Șy"nV+pow)B!?1Bk/Jk0m!mp%`øR^vUG6x63%n{m*"u54R瑲Sx^ܛu@@ҡũrŪ'UW%i4\ZGhY:8o 9 Bϐhvq<KJ9ڢ]R\R*%0Ͼ L޷UdX;+Hm`Fa ; CN?%WKb#OSq1n2.qS?#Uq@*A1"' JﯳKI`)C7%Rd!xMOJAbN !bv) {dvMWK/{@?@SKRd`7<f~7;o Y`8ꁢ</s/_}b EWA_CJrrJ90P5*Z#(p h]A!meBMa9윶r)M(0 X69Dm8BѸT&$]@\Ax/ )9?N쬘c;%g1qϕs m?'kZ^&$5:ld5C;_}7HəIg Yuap3AM!\sC9x}j@q._{,ۇXBiB1lUdkUcw%}K{'"u+в|Gz[]3u:~{]RL"tYƕ딩ڙ:@znV?=~yH � ;ϙO?NFcSlWŪ x*Ykh|ZWʄD޶vRg).H:27Wx̜4\ds"db%Ct6јz~SPk H}kRƭX4>@Qw 3fXBW s,vVk<a& `KE]�XΉIû|H QE`b4fJ";3dr:BJgl,' Ҋefa3bs%l7wo~՘@OWk^f{z{jIז2-ҭ,H׻dٮ{wys]"x)ɭXy c# �Gm!xϱAQ04D!7_4*l � Oo&x9>KN~QGs7/xmRQo0|ϯ8Rxe(4m2Xe; N7| QYz$9EHQoV*@[)4.W>ne3[{XmB:6IZm}#O峧H!z%c 1Iy N镋]"G%!^cI*@ЪGrESq$�iwN eh )N>5g4)ݧZ;49ۢH˫ms?(s:^;3#,v,~, y|{v2F2k>Q8 dbW⦪dKdoKό7$G[ӢL3l Y|`-`,De&:Lnfn ďzkS"xU1N1E)4(@H4x5z,{$U8\q̂h|_XLB']' q&җ]WfNb8f7vă(C \RsQM!<[XdjakFP C=I5ض詁v 2Z8(ID<עp%CsiNB|u4[.6麿 +h¿L37O%~rqoyx1cC.I�'x1C\OA(98($ $C?<3?f�G +xqcBqbJkccd[fɍiA*% *i9\\ @bh`kP@7, ҕU�QxVkOH_qkHq"nV""}QV+Y:#iZ8q16s0H4ѩIjfjXZZb,+ 7请WI=_buYrvar>"nN?9a r. T0v?hrSp R l5f`$BnU + غj#*r3tl!P< �BL@t⟒8?Yx-p�9ѻhH{&6{xj(uHQhY; XͶ#K_xS%B4Ɠ4+҂2uOR גWf t_y˕L~״8)(T=O k=ȕd1~MB,m깳n^%IcSo XAVLiT sW p3s^R4BZ eof'DWe5d\ajڎ)5UJ4OĈ_j tp;)l' 5ڋI8+*b\0!z{jSitL|x Ɇ>53M*4VUprDViߌ3׷L7~|Nݙo�K50dTVٚ�ӮNnJ38 (nkCAg.!<d z7d>*Θȝ?טּ%BG#dܚM4K0j5+rAx+!YZ}+mFļjΧ*r {W4g|Dj'A;fN?AQ)!QBXlCQ4X\/�iޱt /1a*˒ ݭ˫T d羑Hu,/%ۍx$^`C;sjIv)F�7wxVo6~_qU:)";ޒͰf@!}h;N1aH*vH&v{ IwAnM9K7] 7WR ֔Xhլ FJIֿeJU-l^�fBݪI`&Tՠ7CA//5(l�1Z68kGH ˹Y[|Y dIZ+<!1竩T։~w4$5dJdf0rrʁ ˍAQ꘰cdӀ~Dcd;Ъ M0p cXZbkjH`n[fX+p.xFw(q tIzt<C.+m,\jȗ(KEIZ{7\a((:z"3@`|( Mp, >�]捪nؕI~hNb6A**curNiRy̆.<p~�Ϡ!O}?}ǹԋe#nN$+8`Yg<538߮n[-;.s߹bx\@ ̾Jg{w#տ Kxa>f1}'N;ݖolN|(|,|FvI*;ߐd)Ft{m׫v_({i5cb˙N/.cn"yҡp}wςKl I}Uau۫7PP&8Gy1qZg/n2er%] YE㤠CgD!ubѣ6 G*@dI:؎`2bgD9'qEd/)#GE>X^D? sOݯ^\P<0 yu)AIzp*"73J+\5&ZڰB6>Laph1ŋ�l:ZDo->|1 fcu]k=< '醱¦9͵ysP@7J{+.>aٺ]EW %oEcdW6 W¢aϟw OK)?R3udhCe.JD-w�D#y:u7rdNz~ ,c71~]t53ok'c;м=B '>qI~+\G.C</.7{<RjJuiQ7'{˚д?xn0WY�@¢qEsh2 K;7x<{Π^~�P�Bs{V�ڍKJr1$VA "ZZ3:`C҆<|GWY H\z{S~gD7c;]gL-.b3+k[uOn?k)z $FQ|h ʤRI^BzzZDO 's6mgLOOnøP<N":qƴ,;a܈ʪ*5;w! U=O*$[&2z�#Bu1lΠ cT ji`OvSY#;TaR~7%qu_7U(`)N (IF]nkH9Z5bfk6IxeAj0EYK|CRujC.2`-P,Wr!z*+!m!aϛW_5biUҺ[K+H$#[ A.Ֆ5҆n fQ .mZKJp4$jmodϲM)Nu Cc0}^qb�וJe TF+tv3^E0%9Gi4cc=L|t^4*-Rטv=_PN4Ob;Gsi|.0x!A93@6e?b?x{Y\OA(98($ $C?<3rBF� ±xXmo6_qQb{4lM6JKY R )Ki—=w5_0PwYczb0*ːEzSq)XT `),㄃ NUj2w2s͂I\[f+\] <̄<�[i"#B%`Iհ0�G%} |[a).�XfΪg _/uh!t毓A Oj!ʔr$EUitII,Y8-tl}[ePuW`(ཾ~g^wѓw0keS<!nR>y_y ׾%;[OŀK0^ ?_fc#fvq;0]fp0=\zlw2s7a _0SƯK(Ep-pA!Uu|#HXpRfaFCie$ (rK|$n@`iT8P>V|TC5VbC PNF:I"q* @`cF*ɒ X`@% 㪖^Y#: MIn91B<Udm̞'Iwց(A2WZ X!tqς-d]b% :?7{/UӳkE';˫W7sMg^ 'wϦWׯlT^PWuFеp5aGk:eLY.25ċ)XQH 6W�€eF͚2�0WK4&)DuN[3xQ j�u+=1tƈsB,e0(SaD*UD EE11sa.%Z ՘%ey=rF,QxFVӽ\ i:ԨNY969l044]'܊tk~WY󷐜mZq\-I^Hys07ȸ:E$@nIaR$p"6U^t{h@R$L>,sD|t[&%#4 ( Y5i钩cra* CQ5%-ve-º8pԛ Okg1 hƋW:xϰC>L'^/xkYa7_Th5xRm>纆 J\Zd/v I{z&-k2O+6YC =R ٺ Jl TY!ct=dcY"z QzdDGk#H&K97 3zkQ'`/[*OjK|Cq)Q%[<-Up QB$ +(%"y0;zҒn RjwvvNXu>SMnt][eyF.Yyq'Veof٥PWP-5<ooTl|A!doFxBƫS0(|um|!XDc^Q: cW.3B _iH8_8*Lq*QuO" AMn4%sRhF^M>?¡f#hY%qdZgM'$ v0*7i-k.m#H4tf'\" Q?H@rZ4UFjśg3,М2Y6DܶK<چS(aye+ۀ<hM;(V։vcj$M‰F&PhdQGrj೒M/gE$a`c[/")CymEo*AuK^HڙBQYF tBƷ!Ctxboxr@}̡phlRpnpw'Rk.iQ6uj:jbuXk?RG243 ztmZPߩ͖-_Ts:x¾c9fԊTT]Ģ "pQjqqf~g(+�%R2RK*'d6� NxqsK=BjrFnRL^vBr~^ZfBnb^bzjULB PP"[XSSNOfq ̜bҼ"ksSJfpr�͖3޿=xSj0}Wu֗MV"SC[hInZeay˽{N Џ@ x{O`Աgw;unݺOn&3f[>&geyg7zmY0)yd GTBb )J!HL Kd@X�KBlR[*BOۚ"Z$$Pq>4w5HzÚJ1B!e-Ltaކogz &e:՚@,yN}ئN~.3UHqS3?oߝq8Ul,Y+`$q]Bp|,cBY` 7iD! ɕe)<\0xmMJ@I6B.^']Q*xW14LH&T( 0<[xW$Pl{ynk3)"΃*F 󬊛7<k2$29Ē, T2S\ *-Ib41 TYZY唧\l ^dO ;Vt=͏ui;nk19J MLGckD< ,@|AǷPF"f:<6cIh.,->$[ 5;$sNr.ZCzУU=�Ho<,xAk0)줝vᡘkSB\[)Hrh3]Xˉݒ0l#{=9z2<05˥nJ,+q' uLd+KK%͎;c\)vz&WW$-[TK=\i*9o.)eZv,lᚫ7xKJܙ#MtஈXKW%jM&[\\mβHB>|8Bbr3WAVv~W 00& ((]$\ @uyF)g P&-nGA1!_x< q&/B7B@yt"Ƀ8 7l]!N99rp| +VF#t^I_ 3 ;)ik)Ț;˧K?T:;4dׂmpP#fX =z/R4x=Pn@lR$Z"PH2a ι=YyP|Vۙ=^\/%F<zJrKXUzr9\Ng!B֔& _1IkH/Y�IBk)G0{4=A2搼{WhOYSpT{4hAPx2_&"t$8  Ň� Ȣzџ Y)A;HT߬bh&w"AX9!)luq|ۄ^P\ieJ|?d'wuxTao6_qt]K{Q;bC,鑔`ߑHK/6E{<{wEWFñk# ]F�~  H[pVW*EG;#p™=pO$NiLۣX;cEeƮ 1F{Z:â@d2_g4<I2{�,VtNҟbl{eQnMxN D?SMIm*y6C`_gp䕒ܓV i6}d u<�'t &X$2P׬Rg;ݰ" 5_A/!ru69qQO^垏A!DP5Z5Wnp(e;A7:<d E1h23@`$<<:O۟ZB\ظB0֢ۿb_f8]Gw-THi_Z DA.h&Jw^\ 5t=;pOc/2e*^Fu e! l$DB)&PޕH dЄDM4D4"{rz}նN޾t-b9jMkpjc a/vTbu| _=;@2F-r;hfHyZ"|\`@1Ha$ L{ bۅkkI Jۊxf{G?[ x4pUHaMߴy<4bnuIXE<2Fx}kAI$=HA&MTH$6)('ٙef7i`؋^7<7xlTimx~onUj͈a iQ̈́FX:'Bd3"0%'|jp%խ0[B;6:I1lyA;$^{5CYޛGdZ \ |p�hewfpL>R*Y(׬UT&GǙU Q 5H M'+fdr1^GZ~쐃Qsw߱7|?׫0ETbUcHBMWYcvͶw"( ^Fz|os4c)'<sAZ| VKۇ�wbM Ϛ\K^eIaOqp)Z -1B8G <Tad 3W@;މ%ξ_;ːqv돘Qi-#e)d[C]K.~~yx*B`yiE%yѹy%y%&fW«J?)?d_k7aV`Q�#'MexTQo0~Wܢ<ej51hE-=t(2XqbvlNZbbD2*E]H�u"]A !"M55ߺo{I47VFzy*)$z d :cCPVSm64=X =xӁS{09Rr(Ybԅq` mƛIachRfI}??_wU ̄0%y\kf<Z*((Ӥuw?Dy"~ٯ~I2}FUB['L< 9 Uiiǘtt{:*jb1T5sMH:&9~Am&wHL&3A4*g )>c]՜*bEELx),CfN#C0j5,`%B\m{"6֗e@{XKbvsKL6Ŵ "E8,Qpf 2XaB GLNW):w/rrTTE9{piJjڿzɺa@I.9!rXkp5Emǿ޵V:[](\mc9RPиZ9 $jC',XU\,N%*>F`NNTǟzw<=9w6V]g QxsW[OA(98($ $C?9?77?X8CAW8(9U7?/rfى)gRKJ 'g(/+᪞Ȭ:9q>Hf^5L@,Oss@jl &/dmׅhU2STKR Aj�:9>@*"xinvJfnJur~^ZfziQbIf~^qtn~i^I|A~f^Il-Bqb/Htɱ, 1@qP#`Ȉn"#)PI5*M`@5~̓8-%Jă><PdLY')?h'ڲ̢Ĝ̪ԢZ݌x1-<Ej F&djĒO"XCK�v E%V J.-.�%g�N5sXcUy1.#��y\x340075UHHM.H,IΈ//J,(H-/I-.+`8PYiY;_~*+?77?t{&r湺+ŨbԊT+6q6ȴh/ UZW@wiw_z>ӓ3բ8ΌԜ 6'e%U𿷠Dj/*6KxuiL @81 'ӷ5ܒXUɨfAd9%9 wqS u߳r�;� xiH7K.ڤǬc'&4L`i]tX:g]J&640075U.̏/I-.+`x3mB=%pOmQkL @81 '!w =?_/-s,ԤҒ̜bW,]qQLJ[?�cD-xtYT!><>%8C/8/-0asslg-1X(GyǜyK3@Rj Д˂>e<>bMLa�f1rzxG�J`"l7{ ߻^2$configm_test.sh�<_1xT7 nYDMUx�5p;M\ $xSVOOI,.WPSOI-+�c 7Lx_k0).J-$qR 1ւCb_gQM6:)]hwmZӓn'ZkB`K4T>WN%0R\šm<EkCo.Q< hn+es6Y(g%ߗΜ+ x rZ F`rH J'El<hs䊘>&q(5s�d3AqL~k8A *g>gU 2hS$$ՏS9#Er+s:zGCZ|79S]/j>0b$+d##:G190>e S%T�X]rڪ^Ue,q|%>LR=i1[\&Tٗ+m`h [,@(3c/z峄}e|Byxomۆ.$H9T}1ڧZ:v/e<2HrGM^h)qEyڋ "x;5Ţ~%y]|GL4SJBJS'f֔QPVP)J-VSPV vV1UUrP$4/$3?O$jdf<[/YINa[bfsFjrvAbIrBqF~iNPYW ֪bwI~IbVZ.̼Ҽ.�kJ:xVKoFWi mH{I#Y V\ܥ!5;Ih}*$米|-OO"0 jckx!*H!r+Rå�m1.aY txb7)r~q6Ty#3[62eնvh_5@]f\A@ݩ$u-Nܫ`; Sr#XUCo<GǡUwNu8886UYTr#UWr3mm�5*YYrFf`$Te@ 6r= 8`3,= 5_6` N[`вg#ӕ]9ĦH6r>"[s2Lѯ V+`TZ,o;kXV?Qkm)"9Dž1×]]*7>*6lo4E(ت¨\3xZ"]7@p~6Zh#Bn,M!7ܤͻw3"|ľ(7TG 4 gJuۼC33ICr ii <8 \7qAb>K.PdgrS2RL& Nd!{,(tTn!ʧi UNg@76Im'�YeC@G <!Mρ}L8q } WiYeq{gSLeTWNkz27FR/g;9S'տ?$X ~|cv hM�?A:<- CqqS&Isl .gs1y_q#-1b-KLta7_ڬ x+Zr9zĜԢX[<%.0./K'&�  r+<C}|C< j rRKRƔe&`_V[ਜ਼_[`h� 1J1J@J!bT}}\ \)1JO�DrFԵxYn8}WLUn:n"h"Ҡh (.^J.߾C]lJHH\ C 7D,;c88 ID%"NKq|M$R Q{jMEBY~c*\VőOs>?uWmGM'gӱsry:4 /Ft8% 'sr_akVҩG3˞XаeYfOCCyrGP5k곦<G {: {DU>BCRˆ߱0)hW0"d:iO@Ľg1EE>?\%D$݁!gG`&8Pg~a(ύmKisF&vzֹ3^NFcK~e0@AԒ_J;ө!6i ]#rzL&L+Isd5JGirKsH}E2|18)܄s\IQzY5 o=ơ҇\.]]/f䔤´X+J9Br-JC b578GA,F/#ROrٲqΊS= U13єzq9ݑ M󙵹TeJPMSu/ i5=JJz\otxA$͵+_p2Q?@p{Xf Mv@˝f{)f[r9\p".H{&q"A뙠(k)On^E7Oi4oť05$<5ÝPa'1#1ߧ + '*L5x^cK.I^φ܎Gi̺m{6HBM'tAMwjʗ"&}Q`&%uo@ =e!MAh%xumP(Sû'YPIսT˗^P\`2_7c _*v`ۡ#xDr&w ^ x28t۟Tւ)\2Uu.* nBvv$4PKF)l`/)*sodȘ"HW@&?+%G[GEi~كTH2n+_[DaV\+U6Ga/Y >oe㮛]7uks�yckY_.Ȩz~ߍH6DI<bSX`,K 'o? ӸkN\«ZhApMx._6Ytŵ ]cOk@[_}Fj2N*?,Aqt%v5GtT\Z)nÃNZ*hK.X&δtW1xuR]O0}߯%smG ,@hxBCVXζoNsNOьqB#ˌ5Qe0FU:ebEN,4+Z$[;|Mi% 3QJ3lZb;[~<|ޏquϊ\U#> g4@¥06tX| m+6A7 RYȸ)]sTiR+! .6P)pثM7~7Hn9R\rKd49◊ *ˀJ`Z+ Kf,1O{ƚ$>9PtwZfppc<BKpBWx҂xq(,xă`A7h~S._U&pfxe1{jEAN~QD ˉ=2�z P&x{eC4#n(FvF�6WἮxWo6_qU.bic֬Im磋qh8S@RqaK8[C2#ww7ጉpFtyVq8& _"EAU3,UL{R;wPmtXڮ�r@oi\� 7TA.ť祥 t ZE$I ETy8=.M& > g/(o'R~FņCԌlҾ3>J咉9ȌS ܴ/G U(JQ#ɒ'6aQsvߖϞMY{Y)F;""ق%eBP0 x2|NF׋!'W^-�>L@R'Ib`.o'TUё3Byu&~r?ac}ّ,2>9zg&gw"FYU&/\~Gܚ.φZ;WG畛[ ?L@ߒ}rB[l߬XzdRS+f(Ag70#x*`p dB/&4Kh7MF s#(5cb3 ` TZHt UH 7a9%QsS;z=!6H֌^QuJgdbd?ο6)|zՠ>+Oη65i2<~K˜6-Ma"eBDa$z5J U4fm+p ziet|epr,yT#VN`(Q@Wr詴6릛c2&0knהv?=V=f)|WƇT&vLDœ.x C0si@UL)v'NS*qp-v)s->Ƃݦ 3)J<j$>[/i/'Qs^(h/[pu AJU%e:/t>] 7�`#BVwj|M*j9fu**n >eWnT? چp%vua+ޮNܦ7&-_(HA]LW'w5V=U{m-M֩[- ]6cSt_}:|Dzc_GV7.y`gF.h3Ex]Mk0 Z6îeA\GM],yYo_R( =W7΅j @UTev@J91D)3Sda(;F%<)9{X+=]^^[SzYCLAIo;'wʇ/4x~P>&u\2}29:z=p�SB~Ts.|[984`n]x[ʴi1KFjND�$t xM 0D1zM݃?HI. 0nޖf;IP* )`2R(T^4U>*^~^z` vGzLX\Ae7�Ɉ[*:H|sTDM7F$xOO@C4mP/I@LͶ ݺjT $&oU'(3J 5*B)SJ/8{o@tgex lRRO:'rRc:_ȓ-z>]tMqLGSKZ"l4JN؉سPz=0Ovn awКަS4>P{T) +U:p[(5/03" >G[!eR9K$XB:%2Dn~؊Z1UT;_1ҺAx;renq~iQrn~^N~Jj~^iNB'&�` &x͖]o0'j DST.!-.9`f vM=9sߍ%B#MVє)%LH 8VLՆP;^J%`3k*lO22FFX%EUJ fJ갭 O A4Y J8aD‘)ɰaD^VR)Cޟ& _ Dz^TBP@W+vmծB%b0I?OQv_aoV,b\C n\+jڶ:.cݪ:yهx/q z\Mϟ9;5bQ%TJg@\A@8nHi5l\Tq8UybA|sZN>y|TН!<8w k/|='?ÿǺoK_�ع3 I4Ihve\\]M&H 7h{_{ ` iK(@߰xɈʅaeJՖ<XXSkx340031QHOI-.IOHMKfnFWn^ 1&�l=ͱ^PsBRztV EEE@~k<=h%%;'P\XT>ɛ0ٗmh{-(eħe'dŗ�uǧd1nZ7;/z-z|u#�=d"Jx6�,100644 kworkflow.config�gq5~'_5T$ExtID/]~Szضמ+b$#� x]0Sl܉1X"<^< [Mvvg6DE?'CX튓b5VpKi醗7:EbGk#b�d8TipՀps.#:[(Ӡў%&80+-2?u%!E)xEAK@_I&'1K ,AELwF(wr73{3e}fII0;<ny1e.CEΟ:*dhdi'#]fnnlZe;B#! %z_\R+ֲabSB|VOY;Jc1:ޥɋ&B=hdǡfFQ۽ӵE2JTd&C'3RFqY<0s&Fbq[E%[<?lZ x{i:F&3�?�m*x{i##dvT�Bx{i#W5gf^BdAh�O Dx-LI0I=FVdqחH9{YܦKpFSsl+H&dAٰ :v2TYXѻg:6}-u,:x340031QHOI5Kfgyi!BPI3gJˤaΈų�u4xEQ[K0~^~š"sObP7qdC7(] tB廜$ .&oR.4=2. <,fA'I@d\CcR_pW p'0JKY jdܚR*l 7MvdA*Ty]s2>$e0q9"C"\?A"OMqD)& }-sm-LI]DZT"\C?aSON G^Ƴ7V S<'}vZN/BpcnFns*6#�"gI Tx|e?W~FK~ș?qlTҼ̒J= NG918&FS䯠T^PZi䛙1;73A7\ �?Q xPMO0 W�W4& qИuՈ[@a7^Y+,[*zK .�Z0 e.6w@-׏Od<Olr7}_ܡbSe Ue_{;ElZiZ~6Ti{W+4 ְX:)+ry T?-wPCw=MNڈ IJ1Cm_ZL>| ,K99o*cߏ9@p.Cm=V# x5 0E;6zE a�9yRb##XX(f ˑ#*58Ij>0:q#w5YHdeGr );8ɮ$㉺*MAyr zK�e4 x8�Zf?Sܓƞ~Hncڢ2U5iݦĸ8 W"ex�Zf?Sܓƞ~HnӉx�zZfR1Ew nt 4 0gvj]&l f^^`~;xNJͽ+4YzL06Ӄ3u㣍40000 tests�>Fmw<^<xkeiepdnۆ^詋~-z<;(3dָU#QpY=c�Ix�zZ@SuN&|.%*BȉÑn#*a hwaS9Ca&lS7XgיZ;Wa-+4;\Z<'K̳|40000 tests�w͑|yWa(5 ;x340075UHHM.H,IΈ//J,(H-+`H2Џ]ʳs̶dt=!?77?JqwˋyJT2wJnLԊT*i)gEiij 5/JO-M+"dHYlQx9O (? ՔS�2׼kdg[ '+3$<3DgˇVEpGJrA )aR@;TAY.HAcL};hV~-&�Tz;x6�Č+S;.~2\jm@6 ` FP)E\BExT!)8#>$?9? '$U8{ )z\Od+3ۯX�7Dx{4yB|Ly5t6[kh``njZWPũ,3bls&g=]b_=%?l]{|<! SNUSt2pٌ>TI2wx;y  +Bv?]&΍.�AoqxlOa' n+�O,x{ii N{15>;卉�9jx|y„m-x``pѤK5~ư*銉(3*ؽcB6_i!F_d�5i=x][sHv~_⋥*XdǩT2=fVIo\D3[ssN_�d*$s!ISzv7Jn?_&94l4oɿM~_I.)]rvyοL7&eM}g&jy붿zjWuL2{;E6fSt͓NzUym =6ca[ԫ[ӛeUk^iB'uV=cRtX$+zg smc͢xamkMV&vKtGZ7KVt!.Ьƴ8Jݭm|+軺^M%#nlK_NܶcesCXo.'o�ڭh8$=A_uMvE*{z&xGs#!Wrgt6/_B ]Wc7YAOaC`]-D!ӤGO ̙< *dmIF;5ΕU{ @-mD~g[ ׺OY+oXou͔emdG<<)5veMSpmL -CIY4IH$"KG!Za+,v}- K[<Yb&t@ԣiE#WLD~{zM-:,R%3pUίXiY.;r{-Fe>�r[qG8)/άb,y t5.R6#,:\-XJ} $z~CDŽ�32fZ{ٖsr8PXO]aNVVYK� #. Z"򉲍5 W{@Xr/4"qz{LMDz-OΔծ\PHoI pdxzGQ[BI1"I#՜>'!ױ .}9D2y,ݕkݖu4AZKG%5z{IG\lHݸhg tɞIH xA'75~Ӗ8l*X+%hѯֈ0SE`LfWAju<!LKݷt,hqP~zH+G0+ɖ�s ᩃʣs7}e1bnPL[dYI�k~dUbƨkk2lLO!]u7[bN€"-�/QD'HfeI'RКKC+TA4,r700d3u/;1z"{R9aR0!!!ZKcW<CѺe�!a`zM"RdZcV&rs='!w Ҫ+jK g9Ȋ@E=YyK&Z]O&NвrJHQ^T/M, t'nM@ٌ|mO[rᆪ}= QQcQ԰ _ mlqp'aӊDS*3fͧȅ$ID 1Cb/qZ.ߒlds.kj)% w螺qP[6U],SP"WWMLѱ<�)BkFrY)cɖ1=8 =>'wpAlUT#?ytDS_E?y>:iBޫ뻗eAWPf;bRFCʰgh!H"ք2#mcD`{f,a뫏FԩTA$6G3sUL2!;&m'|%`L=!q/YUOMd6Ll(9 *϶va5ceγv+ `az Xq!p)VJz:w_~` zY x& }P8AdSi2Yִ=MP*^v<nԎ?{$GbC<L&%~d<ގe !8 ւ4I;ЏeߩV "QӒwD@b;t]< q+ ) wv!/{R^9rz$*)adOYQ2b-sDx-l! / Ib-K';&w)x^ [÷�J=PR f]rE(>R&j`avd9!ƴ~Œly,4 M6t+Wuu :wW//iTZhST5lVʽS, w ~S,=oԫ$=SUڈ/j"Cf 8۲nN첑:*N/�84m+m+!>$�Yӹ-k2Cۧ b+me'6 t$G'*HHџ79-a˘Y蠔neYc[=dgj!-!RQr#&.VaSdJf`t ^LDQ+KzA/3m� %Y}`H%Dʽc٦炇fɪ-"EAMD;TfW[׭HܘJgٹD_!!Crn-{!1/B%aq,A*6M84TAZ%UM�:ʃ}Dj_�GVuR{PQ(KBx@LFPLlr5mRR%1c /o"I +!4w %c%,d?FRm*v /J8@爋 {XlB/F|9A3'pM&*ERYQ`,r(7J ge1}΀ax3.*$Yep. v]z5:k+x-5cve̮?B *;mԛN*!J^@{1GUdHx?-Y%[UmFυ]6WK܎K2I91EdUAbܛVkG 7G4lNM! ɳcWΉewWHa‚L2k5`b,a11J?!oPnr@  9opvF{!gH�#2NE6kI2zD)l~,^~ĀbtvFb6[x0@:S-N儮M۹c`fd5 a*M51l'[>uNi!]nXY؇dU^`-XJiHF<$mrUNJG w?Z9qi9`i2?RsP}B`88 %q8D}]7øCtJS1pNAFhΔ$#ru$LGB]-KEٷKtŐ!H2JU8(I'#L+؉�SzG.[M!jQE9 b@.Q%5!&%vT%1"@IlaKL{ǰy88QKI 'fKuDo2^ziٗE7`*E@#eC'G3I\[b#~P1V' o ہP<r.�r=>IC;a@ϔKq`zx].Hd=Mn>,&bXLȷ8pU_6/n<!2^v*&fNn-ܒH6 z3xʴ$xRq ֑#U s$q3APVJ.x8,أ _C paȄ-"Plm#ꑉgk3fQQ_Ƞ$\DөbEjbPlr ]ى$;6q6I%׾Pd<6.&_.".%k Q ;b\% XY~s\LW~Ir~8hנlx֙=zcYō!ʝI*s1M0Ař'O>g-uLqAR �lAҊ㑙ܷ|x ]4{ )=؆k@WU2 h/qu>B P<jBvj##Z /ibu"o"144 _h+_%C*Q?(%!l!T2u$'Xwe5?v~s'3bM- *x_^!ǎ4�!&'g]!gò xO8E?%9C9؊_mk[WIh0\Q4ǑBh#TxfK`cVQ7=fM^1%!E.8.,yQdל}qV DjqWj�y\+Is^YL0JgI~*'/o/ x'=LkY۝]Dg| `LJmq)ߑ8 0~sU0+I4;:,߇+` 눹AfGS8pv~~#Z$Mot3se&#yAPć(KTBn\UL3VRE� `ZlDPѯWW*vَ]g܉BLsIaĒCrVp 1k2VT9K#cE[@_O*(!$yB(yG#b&Seb%K(Ά=mVz߲ e^YOGO6 W)q<W|k%K[] FH�,hC9 aE j=s&B^&,#=LW{5ş1mH`&22%$A 2'ACLUucJ3\+ⶢu29#C2lR Q#bDnORqNCf1SJCYQ?LUXH s$]e|uZ]!=jFpYR֌͋uA% eֲe&(R` Q+%ryb ğ.: Ƙ8=Siٸf_\LK`RG셫G% @6t)3*P(*o'c0h3t7#4II/'0ܒCQnzOػ�9D%d&!,ٟ,<Tصh!W8p P?DQ7Et6U]!)Ó% k07H#˘%jYmx-(YlkI9.y/RKy@^T/DݑL07%B@zyaEڮXa5iHڑՕ Q|�$E(4xqs $=.|";fSDaT`<0 ihl8st|+ʧkaG%ފ fPiU0lC7EѺߝU47+2Lb稂D zVnQ)!3o=Z78lj_tz6djIʞj.[d#{t6qnk+=i2 jPWmmZ舼|6jHGa 7}ohD q{E(=j 㠔+g伕L�m&ReǀțG>]V v(5-Bo /Ͷ�~Ci"g ؚ�qPSfV Y~.u; YR]yPbQUm XTb=f^|EX <ju #m[ W7�dKOh{ڢ2mRE;V3l슪0+j2XqR .j ɹ4S n0Yei|5HU2:^\nZqcڠڗ-|Sa涊8Q+FVqt44 0MheuiU[EvKUΎ7'G 9C*6{)C ~ 8#=1TpU- ;n}[#Ԧk=_nS ӝ.(/[SG?h erΥ.{oB0xh-yJz<5(w2|5saVI(*[|!KgeVX[c>n#婨KnqgDuJq˖MݶBZ /T8y\<<ҙ/زnah~$ .69]yw9vhC`Bi3BZPjzZ_.i<XPD 56.kAxӵfG:* ++M?uj/.q dL3Pkres6#IH͈4vc2&.VYZ . '<5]vv#oW{6@6C>8&Z[UG&<$sP9Q@Op FUJcpLH+ M2Ƿq%9 /h38;A%<5 u/w 'NgVsUz_dX !'T(;ָ{LÜ԰Ӈn{}ݴn5r'+}sy\?8 Ce\X#�[.52 0<]@ŭ})B$7/B΋d gD+gvqC+ ?ax%!|)-͓W_' ?K͗HjT'2-d[y͸^s<2q.@<7{ t0cQy6Ь:nǪpY Eq^E}F�p.G/O: IT%.0�LmYMx6(#,HFUu 9381i(8j 2~ڰ*4$7ՠ.$`L#as;8nrlGר7…2k<`j1rs9d躾٘ +5\"wMXg#<ADCƗy+'"~rD6؝r�\Nڋד8V)T[&΢38AV=+` 4: &тlYH!�P,-1rx()Fyq jm\xOZs 8F{�3X(XL) 4p@:JN,.Ac`({zPO=TZr<9ƽH �$5G ;(E%|H59mf [2=%P-tC.'f)p$r.N`S\k@q.ǭPV",lez ^KCT;e!GMN-wBc0>7F9FJyԎtUUYacOf2F UWy3{Vg:xf6 Ǖ1P!٪Yuz܏I#5c}Єh"$Fg:8{OR6:㳤r AeKaWn*khi>=~&ê?5ZAl,@Ip/dž \ y&CW'rḅ•o 8!7_88"ε:4j{K'Kk?!VW`T/Úvѿ-.PcTӇm.j'.JR�%]~8$73)RK9&f!2"\$MƒM,=uA5pül`P\ I-9,?>A|Ԇi[<Gh)zG.a8I8?cGZ ] +eܐR:ͧ1Ec|1+|x8<'zYvur C;6Zފ z=^Rl ;NZYڞ/`-\KoC3ƦU2ASL3B>$H Gr 6QRuK.{+8\ccGx˷Sjt1]VN%IɐKB8X|H sy $" Șsa8I^ \H\0Loq\K}'u< `bmޮV(:0߆9B.m>9jɇS`4:&?p,6>+5SVG%tҽ`qj>>1MQf&jœXz)mr\?s-=B%H=:'D>v h%+R5FǞ:xMaP]%__$n9WIԱn&fd2|D{#% L 8MQ~004B1ڏ=$'0횥|ڐy4#ʧF hR(R1oS)0<ӂэM\s׷Ò՘88\(=Қ#%5ʨA2rԓ q %Zz-m+( sI"r ^9;^N3 $d#u*TH{Τ3@a5L=lSy)3s.w$Dxa\iuYKetvg.c_d*3&?Erݟ!bdxHޅG =j5:%8V%WVDzwˉ3?vr+:ؽ#=*FNXCqy"=y.cm'|?}x\ օ3ץViH#nfuU9WQ!+:�UN1,#yL0&]_t-Imόi6<x%UxIb0O"8g3 Ⱥy(TE2QYpAha+H>:"?=eg?X"?!|l7zڔ= \#3Iy B�#Jt JTlb4b�&z+M>aK= sn4IQ $N.d>P\" dLǬ`L*k9,#=--;컡w=pz:s:!6 `۪zl7h!Was Şҁ7]_|0+t Ïᜩ `C[M0)X͞;cȓ< ECR/}ۺ C¼ 3*OK(AB.NX94kpy$`TP@,H-" 's�C mpS `*qU|+}~6KHs/CU$p ܖXtC04_D;gR?Wh܇d?~}.I[ijʏmY?BLצ:# f9FL% ֌o,dy9 Q%5t[f/Znl<L}OTd@Ocs>L3+)$ۼr҇L;z[}`+7~Esʒ38'H:#V!/,mq,wPdžN{Ol4C:Ŧ/}'F*&s BnDC^Sr? aOơ"'Z뮓oW%#T&oOij MͨSTsu hJC,y L,ՙFm<O3z*RLA}T J$8O8m4֧Ƴ'N&6 s9¬xsSq`!k\]>4Ro?q=6R ^w V]% ܟmQxh:-BldB1.s>B3s�8/8$PaBҶh ͫU> "BoLx Q#(ȓp#Qx�5tt܋{1XW~_\5%°k+3DúhQO]GJjE1QT9P>1QB9,6 ;MB|l]-'9_DN\ Q|a7e|<̞!},Kh52,&U⒏(FԝWwo8?V#W|�V5fWKM5qT?TՃ7"Cad.kY #.lK pz^p!/Z."nnz5ys?$w7M? <!}?<%orj\MI>$_>̮,e~?Kxa~|?̯/on`>\^br;{Y S2ؓͧyO|M>~&9/4� q~}y&oi뛇jN'nRY:?.?Џӷ9 z?-wS~]$BZ~7{B'Pǧ_Kk|^_ΰWtfCׄ&_o>AEй D͒wˇY'iOgZL%;>/wX*7BF?_HqOx\eנgǧ+`n謠dH%X݌ф2'p{0!_?J$v|y7kQ¹<zobN�1o 9C�Kwӏfe`ON=\ 鬸Z.L鎱S|"F�^;¡س!Q&W7@n0Mb߷3<}7&D1M//? A"_mw1ݘ K2F7!OܟVڒ+M>Ucw̎9WxţP/m|SAJ1xr(C>6|O ưi^Z߬Rv))60 N=F/g8eYK'([7Z֢Kd1?`OE~$f`t Β=(?KŤc]Gt| ])Hʹ\iWk2V6 w}؅rfHؒ5ҷT3#m'3P戺/ռXљ᧳m"4*ߓ~}Y痜o>5b)3 յNy9f+ 7aۂ2{^K;"aKTPb^σ36βEmNUgla*q݌/Zn'ҥMaWȠd~8/~שD:<OtD~}{lcpݿ.?):Q|Jځ ?mԹ1PG!GgvC89H/&Ų딩G L74x- JڮƖ!ފ'] Cd75 }e:W.Ep) ;*lnxy|=^4En&""qy8_SWod[TbEP.`KꤜJ|4Qϸa;(Nぽ\-}Q,IN�7~H29}{sav5amE&ݞH?[a1'RܖGB};![!#ohDa?cJy;qpHgܬ) -f ѾQۧy{p`z2$2"TE%eHumι - 0Hf9B $$@wV_xCo:G Pڳ5Mi=%fqDŽxGfmڨK"JÚLk Np'#C3 $aKwQD k9d \N nW\�9C}#y ^ s#g^v]]oW%e-/ݦ_5z3kx]R0UH?=҈J$Ա+ )@B38GL["f|{{_L%Ԩh!#p8u5#*S#:{Yp]ĠvD5Ӗ2>ᨎFr.f0:nn~:6'e]W!-hgbB8 8WmQҒIK)CK҈F[mAK$ځj&9DO|δZA5!'^iUqtC2jSvֹhCxO1PԒDLs{6Qٙxy]zIC{y}!v! H4.z)sp>ۯs9lmПJd2)8_ppϐʄ҅V�[!w'w5\e{|d>Jbӥc@%/ӊ5z^Dћ{o1T<}z_%0x)M~6o[{.(HI-*O-I-SP.WH*IQRPR1T++-SPғ9&fؕ}I1( (yT9\W\CTKdORLK-p&xLN,5�ǫ|x,AY8c\f.4h%{X�� [ 0xm=O@ǃƥOFnB E -\,wBɏ_/"/4ts?<l~un5^h@BvUHX i *v弐^,hĥ�ŢxأRxy<`]NPdfQą@ސ�>8$i8$KKTVv*ͦRr?)BRk;GXO^#гe 2 츾N'@R) ؉`XjÈpť@fV=8RG;fbu<,˴TbPYT64Z}[�y6xŴii N{15>;卆� y<xișF%ɵrZWsnf�J Vx�z[Vs <t!n�t 4 0gvj])l f^^`~;xNJͽ+4~T ?[Pwjg40000 tests�jG(xa&"lך۞�c48 xeJAIW�2x AED{wr7]noݻ">RqffO~hw s~[;h ]K6`=1`*�J tX6$?ϲ)T1%.zn34BqK lkwXD3Kn;C&̲n?\|BH6^^03h{4fȳԠà D(Ttqmg\x340031QK,L/Jeتr ̭W.+/ؕaΛWX\}鍳ynl~$U/7!l٢aG&l4RXSSp{"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&Ԓd%N ݱJ APSRstKK3f\LinUoGꆛ4`JA /X}I ~i/<(;-'\/9?/-3]/"1 'J;.R9l] žC -*͋/I-X.}ˊh%?o=r,.T]qjIi~UT<]>q 1=FSyOLo |[Cd0LsB-�0e Dx�j&100644 .gitignore� xoZOo|& N Z`Gב& Ó)H z]ld0ѓ.4tzerx|aei}Yz40000 tests�`<dUf5A$x7�6 ^^\kNݸ(C歐W 2v>x340031Q./N/KKLgxdԬӞl3wM^2�{7&sx~},}.e{ǒԼ<<̼t%=Ԓ L%+J݉u OG�̜TԂJrb̼D\AbIfL�ě%0x?/q7^l�8?xŴi<#=2?{v[\Ȟ:�)7*x"�Mم1a խJd2qxa<C3̬x340031Q./N/KKLg~ %ݎO7>w�d;px5� N Z`Gב& Ó)R `~O6,nBx;]e1KvyfB!�*4xV[o8~ϯ)tP#V-V{ayX*2V;R}ǎ v=77i&:U4IIjX0RΉ8ֲR) JIb$9T'2+t�?4 XmbJdL,9ߧ$ߟ3 1@ BJJS)A}�((}f`-+zR F+(*nءMgӠtDjՕ$R,Zo,B{OHDGSljƐaȫW̆g [21nuYQr'B\%ʬ5WSÚqf+p\/t?uUո]f9<?CAR֜mb-+d2hsӸAi34wjےŃ'DӒ(bkZv᠟o^>;A{q[*ZB,'vr\ �t~C<pp1">ù^py;kN f͘$g0ʶ&M>I:o@tʌjca[M)hfh(-+֤4 M$ؔض8=L~ :%Dlc]Aö,/zBf ׋t*Ƿ?cL_](GC"|Iǵ|[ pzɢkdM4vzAd_ҀQUיmޮ#D+9�_ys 3bLo n|CEq uG/)\×/Ѓ&a/!G?RmR۔'sQz5^xƨ_,E0!&ç\? ڵd6qu&~4A#ᖱarO1Hg1`;xk^#AS^A7/U@!Z$#5KRKJT쁼ɪ�(C u7x[#XX\OA(98($ $C?<3B'�a ,x3�\#p0&٫/}BIw^Z "e8[Alx{zwBJi^fBIjqBZ~BjEjriIj|zjI|nbf^ M\9q^."l|ye٩ \�`MGx{yeFIzn>V(!BC�I žsxTr0}Wl<4এ:@tCd<^Z#12+! MRi_l]]j{+Oɣ 4M\HK urbirh4r:ņ][4Ί¬F0w-pRX8* x<wES'S+>,z2&jb͕>lSpWh-}h'ZA!Xxx2%Ix`0r Kpgy$Y2| JH؉!ɄjZl#J ip ͂,k:أ`;&Ar~SΟ>g=8j_T.ߨ)O|kR.q4\44Xy9X==T8hOd_-PiV9>='RRWABT9iQwMNkA<N )x Qv*SW@Sx3 :}`3 C\z ,8`L5Gc6Lr3ƌ,Za-:-Wr2 "j^6Oa]{Yym^̛|=/K)Hxȷ a]_ϔ\iKOV{SHk~�"R8x{yB݀9x;.xT<QmmiƼJF�/ Qg\xޮ]� 9wx{|yBː!E{9r0caĂ'޵1kmބ˂KuLrɘD ,BNkK2>=kb� E {KNS,n,kȖ30UG=ۘz~{h�>lx).qsc3�*x %<ƻw'G1ټ+�\_ 8MxT�C?[ݳ"ÅyW5 i&M|U)AN!N~100755 vm.sh�dmTpwD %|Gxm]o0+\\hn6mXC,BL &gЕ,7`ksݙ{NbQn r}?u;n]+($`Aȏ9~t/?PSӒBbʬs3唡 :V+hKb~vo'Zǹ]<٦NTH[E q:w_{N'E,WD@CL$2d x94Bew>rqvN�Q F@ jxtK ) cpucv0M f*ݼE #&ȩcg[ՀWd {pFvW5յ+vlm|&rn!Ȱ�Im\wPv! W>P;3Sdnz8mle)p,<se.&aD�dƩ0-]? -pxpm2I)�uY"kR j*-U)̮|3:L_hU +݂s*lS$OxmQj@&zhLmADikR(,!I3LI;X3܋A|WĊ7c~?|Y 2MtZJ Z9)JjAU],PRyއ`8ݢ;W._vvv^nqD6E4|l_h /B*l{V5=y%;*pJE3-Yq}{3L?GNCmT9�ڌqJ!f U2adt SZTkҮgc~8ff +4d\NaSX+[Ooݷ獖%m%6|\[KfC_m~sVfܼtw~Iq/_`)^,uxûW\OA(98($ $C?<36� ex7�M %'T0#fra8x�P$!L&6!+YpBs~^Zf[fN_~[~i^~q~(Dn+t'1L^,Xͥ�х%yű*!(*RKJ`rE%@-.n>!ApmH`aM..ܜ `^rFjrv|N~rbN|2ͥE +)82M΋MRS+ *K)M5; (j5B5+!S\� |drdL�P-x6�,100644 kworkflow.config�OQ3t<hn&bː5.!BxN4-K)M5N4@lcۘ � 4x' a#sMnD&ɷkJslG&暤͉LnL5e@1gXj'K1N^TgͥPZRZ`8{jqb2W-�}d jxk|.!%#5`D& *9E57Cy Y([AIAir %juY3p��mx340031QK,L/Je8ܫu,x(F/ؕaΛWX\}鍳ynl~$U/7eȇ~vij90bAO"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&٩Ey9%%z 3.s&4kw#uM0 OHxKsܹt\r2R+s rRN~d!2!6Yص 9ТҼb嵭,oraNxȸmrPuũ% ZiMzn䥵nC\\ {u']ҷM%,ںosY% TF|t;j}�C~*xd�&100644 .gitignore�!5C Ն$V&o4<~J 21)Rd40000 tests�eȝ>,L5.N -n+e sx;|yw"W_w >4ѣLrJzYP]CsSSԒ %ar^3^p吙,Y P(.Jf`-[pƯ7~d٨pcy_3D$::$wKE�=!xT� jvqI cx= 4QҞd].{tA[40000 tests�eȝ>,L5.N aw&5]xk a ;gjEAN~QjM lx" J*JY&/a�J6x \pCKvyfLғp��W&Tx2�^5@!644 utils.sh�m<Q<:pJDAГ!kx{{IԒҢgYUQ x{[\OA(98($ $C?<3)V� <x340075UHHM.H,IΈ//J,(H-/I-.+`8PYiY;_~*+=$>713:u>}6]âszr&Zՙ]W%R{QAm^›>e O{fb� ʼn9 ץ75}l0w9%9 wqS u߳r vyOJUt/z=Zf�Api?[xF�=$commons_test.sh� %'T0#fr6n8x�P$!L&Jx340075UHHM.H,IΈ//J,(H-+`h]tӧYE4>sXWNu7j+`0g;ArTUzjI|nbf^ !-S@Oxy\6Kj,NNIK/[3C+W|"8 0 y2~򕩯 )yOѯD$3lGO_na\ jHY.HMsaHAΞ\�r}x6�x*&J${Eݬt]Od0=WfR6"9!tXKx �L>b`Γ &/x �L`U'@in<M qx4iBHa/7d'_tf[롒=� }xl�Zi^E| ϑnfw<eURfOGp 4F )"xI)40000 tests�vJg6ҷ {.63l>x{ԩ!{5+� ]x�֘zqUx}{!T:xkbjbN쉑 <gP^i� D:xuSj@&MEBOe 4Eizˡ`衇BZj-!Ү؝l( z{H}ή$$[W_<T~*Oء.P.I>wV;6PR- \#ZiU4Pc++Ɔ٤4Mcz'7IV_:.|Z;6x/]}?bH.`,602W{M|-a#2lZŔFƽCJ K{=+a*E"/,soh\9 b3�2h{r:!rApߍ$lgYtC0n*s7UE\27WXM$WnҀb"0Rϲ,9 */b&N&R&};.hGW#)<q=>>̀KHph`GT"))}X J"sh)Ԧ4\9?i$krN-4m_Ph2}*#dt8Lߢ*ӟ'Kk(@Ғh](ТH7L:nTV2{SѰ(.1Df`ǴqxoO0SB$`"T46uq\bձ wih\D9>~2ʹĔQŴf ׬9ќ䂙h||7;_e?.nAJϦB-43Tf5%&EO~_GT)%CUGpg@U`˒J4%ؒ.$kˌ*% Q,UR<7 A$S'y5V{LK"VbϟMʈ8Q4m$\L[Kh eVYZqG'复LZ0Mvh /X(Ap%Ȫ!E%~aYpVՊ.}w#8E�̅J z;41rڊ2mS͈eޣeHLMXSa\TG¹D[ʼ2.rmmC J٠&pU8G*s6#^Od#F ?áCzodyW~^__(@SOIډ/Cg}zx= htS;em yC-}5>BKӾ`'p ֽ뙋eo:ʠy禽Q:tu请›&>s"xv /0C(z?[xUM;JAe]`=C1, DL 4)nkVО#h<`,8/}]~,$>. F#D8sF7[@z #+xu-VPn䤆W(7kSrM* V}o|vxk"ޙ  ?aґXNcCFyAAF˽(7V=I@>!źz~�> k^f8x{˸q� Txm� \t8Xdg8t TeV H=;>8!~g.4U 7a�;H#40000 tests�p;,Ѫr 9..Exk|/!cr /{jqb2W-�@l9x;Qe{xX';i0xK�I>8J%h%(a1GRxo !{1vJ~pKt,h$Oxk#a*Nos,�9#xijW[OA(98($ $C?9?77?X8CAW8(9U7?/rfى)`] f^5L@, WxkbjbpTs6~K~3hP4&� 'xaƴ!Q8KKRK3J2Ki\\� dxP�Z) @^qT Oqڔڑ;#nt0N8= �؂'}AR4{ %x{^qd'{949&_dv q  e+VL~a.SRZPPVZ0ىss/,ɚ&y:7] �:$9x4iKoһ" S[މ  x{}d&uLVw1Nfdv̼%#5`/� x340075UHHM.H,IΈ//J,(H-+`|]; / U5^H4j+`0g;ArTUzjI|nbf^ !u/x+%s$ԜļRXrO=Z]FRi7ajA.xΓL}MM~~u@f&& %9`C5Ԏ^'w^k<PCrA9W%׾~_3�esk~x�+!Q0/xdf['xmQK0)aʆ¤""lkXMnmBrwhthe S:#N+"{q�dq$}$hmWYY \u]pmB8" W 6s^0EJ}a6.QקB=& Z;AI [sa�. 2SUsX"š+jR`a`K(z}۫} ZZ女lۤ%uaǰčmqd5rgCtQ p#z\:<;I/d6M68N⻶?:obULx˲XOA(98($ $C?7895''1/5X8CAW8(9U7?/kC-� x340075UHHM.H,IΈ//J,(H-/I-.+`8PYiY;_~*+Jbڼ7/}L]�s rRLb4ۻdfug)C)-)f(o}1񜦾<́ߒ Z:!+f}[3|V4�R"x;|yC0O͙V弓9ct$� Qx;HeyWgO.(TQpsQR�?y 'M^'0y&6>ͻژ^{x�ϸҨs8x]8x�zZޅo, 7Ti/Znt0N8= H/a7ljqg.4Mp2;U?7;^:Y40000 tests�ϸҨs8b?x;|yTFU1iN|Pժ,/&|JF�ۮ =[x�,yD5_f {xM; 1EQlL/ZNp ,-3Ka&oGrEp .Vpܵ9kO8HR4LYNR R JO0F=8&5r.%r\9zؿR|E..7:Pc.k6I71xOk1Rыm '!ݝuv%Rb)<4yy% Ź4e8`qj͛VvW $~t0ۚ]7VJB(Z$(ZUGelTX+pd)Ky3/%)HÆ]XĂ-o"&RY GJv$PV~SR҇k>=3/ < Qni8[)=2Fˠ~/b]du ꣞6xcBXRqDy2'a^e72A4Nh �w1 'xgB+cĉʼnrSRs3Ksr'p U t O/ZY474+4/$3?O(Z_XZ_U5فI\Âa7Y+(MN`U�7ax{soʉ9}CB='s>'?91G!1'?5֐KA!3M!ZABAIE#9?771/EAL!(?YSI!VZ$#5P]XnbN&PEjNq*vE q E ~rAif^Z>H{Z&=z5TP45A+rStU:z+qI((`WفI�zZOwx;|yVF8McMɸW{S� iDxkb*X6q�V4x;|yVF+w}io� x340075U(-)f(o}1񜦾<́ߒ Z:�  x;|iH^[?ծuלhWȤ01<Fk� xx340031Qtv vey/,W_zC1( rutuMa}*fEPÆ徊iMMJ3sRtSrus3L6Rsc2Ñ#�RR r+JsR߹TRjϸULT:k50;(/5G$X8ae΄ߚfV}nI`(O,[sOW <(;-'\/9?/-3]/"1 'J;.R9l] žC -N-)-�;u^|1?D=.W|;S[&mp !�x@Mx�~4Z0}UA&֋|ɑ>{%PH=k>�$,OCkL8t0N8=D2S1:*Rnu=c}W40000 src�WqٛYk$-<x3� |u5`:NSN 9bpuqD'钾0< H|.Bxti;H֌gWjjtl«F� C'x]RMkSA%y,\$*, !X q BIynL 3AU CH{%/ {9=?埝g8vhFhjv}髃M|{qS)yh<Gif.0]4{053ޠ1+8 *B:ЩuQS읲I {zJqGg raL ⎐'Z7HZ lDA$ r $΅]n't1eE)TGϏKSjŸj_Rlcq|P7KeZ];8ǫ@ U-3( Jdh>4<Q3SO׍c0gGdZ AJ\hH"x{' Y8cGF06kY. (�ћ5\!x340075UHHM.H,IΈ//J,(H-+`0y@`vQQ os6|6j+LVGLDVCsSKs3J8hE/ =$*TN{,TSnfqrjNNb^j~)؂U,z[D-._)v촛0 IHh;CǠ rA (ۨ̏iSx[I)N_[x�C< AjbRƑWqq!xmQJ@%q\n< -hk JiQ(vbEpgڍ;?Opxgw^p}fvfRkVz\mZ={`![,n7a5uVsGZ‰|D ڑS&Cz ₺1 7!W{9dU 6Zla� )H3 xOAvE?w*<{#f؍Z'-+ߴ}7d?qݾ^Ol@ri NyE8J,h*i^v/u=Idux,mQM'4rڼGاrG/j]y.ɴ?D|dT�^Ȧ x5AR?/$>/VU@?74dJMW7PtP(q<l ppu[ hX$q%PA~Q H]Asc#cILwtA*6q)AtfgLfvF�o2&+xtiB{q>;?Tt:x6#?ę� +xti&ݲf.hǣSD�BqQ2C+Ϣ zRgis~䧻�%.-x ( BfB ,Y�`px340075UHHM.H,IΈ//J,(H-b0y@`vQQ os6|6+fH8.u)wʲ[Oמ{ $=$>713S/j<|Q!4=7UrRc:r3SsrRKVzmQ`~nf3|$t_ݸI/d6\ʖ2xI1fN0zOh��Ff\Vx{q6;Zn;G5%Sr�ِ Un-xcCcIL.c x{sAMW7P�[%# P₉y*� JJHJ@ Xf1F_&]hx \ `Y$9�M'zxm1 @q& ZACj #ۢβNO&}B^[j[V ɨ̝q0aWׁ8 ôLnA.H\2 }< i}Bؕay°V/ QòsFRQi-:. FBPWԝx` Wϑ48R ?xR]k0}?Ƹqi6RFغMuYmYRm)i'۱2={t\eVÕuJeAJPoԖ*h!HeYLrW~拯^ܣKoy٩ڡՕJȔBƕI&}6lz!u!=y҉ co'κ戞[q!>9RݔV‚>:|ێsp*fh6姻/W>LF7J_%Y k$r5[S<RQV%</.a5{5 HNY5*Tm M ;4{#p,6s8a敋#̵ 5#W.3k-3f5E?#BK*)Y!xn+ܐ&#a2[pSLw?Tlmgof_ ?}'o>R yPNx} &g ?xuAk@=b5kC!\JKPlevD=RM$$܆}p{XV `[&l�,o8=MjME|ط_l{G}a�9FkoZvNxl'u%++V#2''PXMBD3iE%C6>g@-\'#\^/.(4NYi]@Qk*2ISJvă-' ^e"#{y WR�֛z5x�G~4FWv1~x31�<S7(lK >r9\ XAqFbQjJ|r~^Zf:C/y'Kg]~yk7D]iqjQ1ӓ66{ʞ9�)<x31�bsUd^mj_s�å x340031QHIMLӫaޙ75鑺/iQ Q3~Յ܏:k ^JS~=�L2eTx[0�x31�b I:ZǓݷI@Ss rKR$z6=3yͭW7<�x340031QHIMLӫaH{țza/|y}6xkQ Qѓ^UYY>9IU�)CxK�3,:ϛ!/ޏ쑙8;:'o݂ $ _bÙ'|DŽޢJݧ/ə&+ex{qYE'vGd� $x31�<yFY??j{;{L 3RS2;l\8+rw[!JSpXНPTa�Y+x31�b~%{g\v㗝BB�J Bx340031QHIMLӫa0qQ{¿Us9W^(2M̄W?BGWH)?�nx2aį0}x{'4Ch&촜ۙ0nnae�; Y,x�YG' :t(crx7{B+cĉʼneYX  cX=�+ xti݅g649L;"C� ;xx'q,ƍlEi9!<:}tr}0,, Py5{| #y 4ɉlb=,` 0!3;&)i csÜfŕr"LN8c`L_.}�D,U]CxT�r8MA~b|ܤUu0D26_8?j hɟ40000 src�*W]_i,Vki'+x!]p28L'װo>�pG7&xKAǩ.(hz lTNaŽDPKN)4X(#{}3T-Wf[|6rmft<"ufa׬՜ GXqjIjT+.H(CK__(e >G)%BS@ÊL٥s QPT>PFaό!U]ppE1 $]}"+Az(QvR*IFqk@,S}e 2p}5`Bl`)$΄tj˥ƝaP. A+V~?e q-xx#9yz")]x-pkss3SsrRKtuKSur*7db�fl=x;ʵk!cF[V�BxRAj@]4Pв'*$PKiWE TBRPFE6 ۞UstHZn>[}"'!I`$a1q%A<ķFcEÙ@yt]'֕p<q:҅6$w%E ' }8tIh/`d Z sk_%V`MFUDT1\iɻZ_, ̦plVL`E*#V0M44K+$j%e}Q+"͊pbcoz2*qV>vTbYAϣI)kwhUEXzNY`3apkLkv\^T¨gfaa6};lf]&طgzg�pDO;aZCN~^^zx*t\hٍX6cIg�I#:.x{q[Gu0GOkMj4g�= qgOx[=s� ,Jx3�cO(9Dh wޑby^$,D%Yf!t)x.I`2fwE͝z�76sxQ�=Sn|ھKʑQe2YG' :t(100755 vm�Gclb #cj>hWw[&Ax�w4fLwﳰ}Xl~H*.8ckworkflow.sh�v"6+Dv7 .100755 setup.sh�`hpX>40000 src�IyEOn+ 7<xu�4q4AtmgRVHVO@/5\S100755 setup.sh�BmMCۂ:{.40000 src�y^$,D%Yfu1LlxG`:ԊԢĜ̂Ē [jRc8{3Rʒ3ˋ R&~PKO-M+"tFIʜT]ǂJ y )E%E E i91yJ 1\ @S0?((O$#UY"1/&Y\3er5`brIf~!P8#3d34)(V&#P*gm f ً 5:'Oak��R$x�4fLwﳰ}Xl~Hcx{'z[OY!5R7;(/5Gw"*BL<Ȃ͙3P0K dA`cQUD(/N/GQe₪ E`!ٌJt'/fSA<fj_uh@a*`ȩ*i*0T7P?TX��bX %x-:WYY{"5;촜rļb"ԢpffFQ&*R0 y\ uzyiٓ0�rEX\X7a,fwج2 P"}HBHr$vpOv@҆TaWBBW\jpa0�DI x3�Na[N�zk"ݏm|.W2^L Dƣ%r�* Gx#p;f{&gY&sq�Ryidx{qBĮ8�xxʹi:jOD/ rwm\ � t x{qHloA.$#woD=]q�I nxĺu[ckD3bnn ?ِhV`S&�}Fx � d¯h]÷Lҍjx^�declareDcF(aret=$(wget $CHECKPATCH_URL -P < checkpatch1o' (x340075UH+fXıHy'k̾)CԜļboy-b֟)fx??]}J?ޔhc替Pٲ\{s/Yh^ �Y:sx340031Qtv vey/,W_zC1( rutuMa~يWO,{Ϥ`/ë TdnjTRY`Z&O۵ϖ1 PR+uSRstr2R+s rRN~d!2!6Yص 9"ڋ3:46.wƇu7ZKKAJg\LinUoGꆛ4JSKJ @j:ƺX-Μ&c*7 P(.JfгR7ZT>1yCGG�|q-xti9/P'gFμOrvxoBOjbqnvjQ^j(ԉk?L^*pQE`WƹL"YQE&gsA�K02VjRx{o®�lQx340075UH+fihqBƙ!0woSʏPu3CԜļboy-b֟)fh~{BL'Jx-epO7'IA99!v�5Z~xȷ{#sqbf!FYV CAirV�rjoxȴiFo6F�;xQ� ѠEtU;2bfAy1^h140000 src�ݲZ^M8 ù Vd%{{' x{7o*Ɠ71Ld��Nx340075UH+fihqBƙ!0woSʏPu3ClWl1g<wjCge ngr5~*awz �9"gxȷ{V� x340031Qtv vey/,W_zC140075UH*IM),Nf0-O'KUgGCaŕ٩Ey9Ei9zyiz9 '?Vqg,ZjV |nrXE%4Re ꓡZKKAJg\LinUoGꆛ4JSKJ @j>9測ry݆q M @(AOF=0gm^p:!�+xC$xwC&VXS: x-rWsI� I!xþmCJonFJJgB J5H8? $(0|1F"L&3gpU&g+*('Z)(D$*$(q!sMK)S[�-/+A)/.HLVv(RIjAS�.C2g.x � &x[qBNu,{<ܗ_< ,5?�x340075UH+fsU;m<E~=_bQ-,QY-]q?T,ӯ(1 zsA땅�))+kdx1e�x%x3�l.̞Fw7efgYq:oaY/H"e'hx7w;VXLĖ�Jnx340075UH+fq:ڑ/^o=/bϞ$7u[ Y;5ϝZlY.é7>_Q8b҃+ '�?)ifBxq� eR~x3�l̈ 4+!/}ȑY/Sd,}@6 Yxλc%͹,B]B2*2Rs  59#_AIWWW!7[H)As㱪*EVU?9MZU5HM�!x340075UH+fq:ڑ/^o=/bϞ$7/iK?&cxj6[lY.Þy[6Y}jԉoo�'~x?�P/5mk�>iDH~>(100755 vm�:US*lYZxUmoFSǪ{ҋ*%A ! t9Yw~&ήb*;̬Og2gL- ԟ r<˴вB�]ɧEx1Y%cNks0w痁,<5}IEճ*EB$pH,tN$.:.b8 \%,Ek.c=umqIZzSiK%JyFRX'aUif1⨊g`,@3,oe93 𶻑o$k$y3 ۄ9+Ժ0E#X޶[XS�{$wּGɩ'e;4|XymW2Y}5U,T(SUj !V̂%x'l6:@YV7i:/2xcw8S"~0+Q"#e]m-,kSe N#%Pw 1@m8u5 ߫gEq6Rg &H9c`$WuZ@*EPϓު\!Hޛ]9ESy(ZL'Q}u^bP%1  Xy$[\`1{Ej-�fۥ:(h ݃hި50ޚƉ&Z\)qsXd93mb@ŢCn k&Lvf YvQa|U .q2PIl1wiF CmoT"5 ^a/k Q~(.i@R@TWUgE)8xԴ P(KPhd!$1a^iγ$a)W Ma0Ԛ5,d-D-pK-su~/q;DFABN~=@&xmՕŒ KBNF�+P[v E5Z.0_-x2 ǣ5h:mR"k6W}5ޣ�G!vkF<ֱz#\xz3d_g:~{EX-Wi}oiA1+o1xw[-k܍uְ.j?l@̢M']xQ=K1EkAqCTtsQ*]"I(i^KJkuOppU8Us)ɛ+OfgnK]+EOBaYc` RRI:O0@S@"XCv.dq\Ne¨DCd".UBM#'e&=Ffd|ko/4?T!AkQ S)sPAe8Ӧ)N%}jY~ICߣUylK3 mR ץ0 JNKDJ˕bhV0H2ߵ?VJ䶦keݝL=Χ~ ˻;^}:>l{j jx;$QpFn�Ƕ_xTMs0=Gb1�Uä3 BrGYR-9M#)n!}WQV(#z0 //x!%6c6+܌>gSʡoË< ҃CIpmX5iO/�3A2|Q֥p ^l|?]Jh&K)B+uA =>nj]|[^)L>+ 6�fMjB Xi)kaR)<�T;r2ے8?kzKV!*1,SE*6ioK"] mXX6DQTojGy9ݚ}pi!qGdZ߱a|li#TGzF�gZbv!M)C*XEN(6$y+Q<;Ӽ7O.sV !\?(\MnD|zQkT){RLP*H4%},K%g1׽ߎ,*~K[N&,ʼn"5vfR=ML}Ã8\-mh!=`9EQY'TXŎ v~U<w<NGԜoXXʍ {ĔԾʭ8eIՃ[ nV\o;[S89Ѷ (jo, `Su;dN7$׼e: m jз[i#Bۡ]x{V^_W̢ʍYx: Q$x{˽s'(eY2'e ��OXgx¸qBHg,wH{Pު+l�6dx[iڭa2#Ɍq{xT]mT 8CC<# 3(42'{@Rr ^0$)39F.�jx¸qBdgȡ՟K\ky �ɤx[iRzY'fUQHJPHlr @FV.NN+d#]һb K:2M֑QR�"ix8AkbH�d@x340031Qtv vey/,W_zC140075UN-K-.I,)+`А 9S{I݁krs-O*fX3 Tx'lY.Cq4Nj*67�;~xbbP&Zk6ӯJrO$nڸK�q (xbb!rEK}ߩBWL̑� l:x;$Jprٙ!jAxbb`%ҤtT;sRLgD?�@ x{)B|06el: JJ\\ײE4&fsB.69{r4H"ٕ'+rȢH$($+*qM.ERC^)=$>/17XAPA)$$5E7R deNK$9'qrOAU|ID Yޝmr \°I*RзYhabZZv>P�rFn9q'[rOVI%h0{0c2Rss3Kp�m/&ss J+xb̙!KYAvܲ\2A9�@ x340031Qtv vey/,W_zC140075UN-K-.I,)+`v[,R+{gXGm*fhyᬠ;nY.à�-lx{!Pt=O%? xə!n!rU1HQ+j1x;#Lp惬̓93"Mxə!rNy6uHE-�= sx;#tPpB~F~n~AbJ~Yb~~ajnJuohcGnq~ZI.Ppbn KbQrL, eKB7l>ɳτ0CnF=GdANk�@,jrx;(8]pBZ�yxə!ҺfYΜXϪ[|� xx340031Qtv vey/,W_zC140075UN-K-.I,)+`hK>j~繩˝:#UкfYΜXϪ[|�.<x{!E[YQ?)3O?)8cci0ӌ%?q.b� Qx340031Qtv vey/,W_zC140075UN-K-.I,)+`~0M,2+Ot*fh]RˬggNg->�n. x9� S+ W\\\na-[0-9]\?p 9? 5 s'oHx;{wf͟o0�4Wx340031Qtv vey/,W_zC140075UN-K-.I,)+`#ڻ3l,?us܆*fh]RˬggNg->�.xA�100644 LICENSE�f,' ز100755 mk�|6l];{?8yu6x#�100644 LICENSE�f,' زWixAN!@= ) 'ƸugdiHLܾ�fx9gcF,##IݸaΧqD{!$5 mD^oKM.}Hi G_Z׍.49?k„Q}Vzhק3!`Gl֕u4՜yO}(n7x=n!S~X+Ҧ"50d̆H`}7:3$ʉ3ITIFh\؛`%-nQXC�/u,YGhM :rjp,W.=˟*R gf023#>?@ J]{庝XN<qeОx1N1ާ l4ήwB(]:D =N\8I@_?U-1my\^pyd\e�[Ny 3HYg–7r᭥^N 㮥 <W^Ml[iD0hZόy?`/koZ_nij9Ok Xdx1N0ާ d5g-b jzE8ޞp�DoUEc Nqv2ְ#FmT4pG,%"o"R8JHV*X%풫9ʋ)@c CܚsF} /nG[ymR|]$v%nzrԪix=0@ާ Ċ"CKA=lj`W*H;HAPzt)WDN郊D쎕FvT:EIJ$&&-p#íͥO5OQo9y(I}tɭїv;_vpa ̸N3vJ+)ud~0eDx1n!@ўSXf(;.R08H^ \I JGWr,)8Dh+E41Fomlg^ޥ$(Ϛq_\N21>ZS˽^Ck#_y[ޥ%fFkaBhuc?3pI6ޯi̹^nVʴ>/ aQx1N0@ާ d5vlG^v-g<Eu n�ѾU9fWf6-33JN.%,1 dv ,KbzK XXaPl5tIqhO?rgZzbhq0G4ߺ1v}9ñ CDZm]IV5VJhx;!�ОS4,[;5a%"{Mxt 1ƪ!O*D Dpk<:b48s孏R` \DsK[+\sW^?8\֡N{Jk%V9gr]-ܩT ϯJaoSxAn @= ` Tۤ,rVj/P۷tڐg}K(Kf &Ce1IͼМZ#)u5N'\ȩxqksKNGn^=) `Buc3\mC6`nԹJ'Ym0'xQMo +F5ka;eUr}wF1g}f՞yCIDZI ;(Rzq Ec+& t7U\~%V`r1h"_r )} xZɣ[h,(Ds*])\=^ũ#<'BA&LWƾo0cu zh֢Xc�Epd`t[KNuF~.Ç2qgʩJ-Rj|@Xbo71ne>@Ac*LKejvr}=�Suށ%&:*0LdM!Z{P? }Ÿ'xO[!~ @a0EDԌgyIw .5"Pm\}]uX)7,!^wR)jN%(%6F4}91|o^f>F2)ܔx, eo s3m岬JuQZ.\=`#L# &~/չ&2Փ{`"9NM3V "$ń�.pw5 ^<~L9AziN,$q uȭd_b_ FL�f}[\{m‡Nl\y8s^)S؛;R3L\6Ye!xAN0E>H,$]! 88!H 7_?ψ S5JsQ*eQA7mc b!&;c n2xm[ˠ[UgSWEJ#4{3u /qH/hi84>CQ׺)Ypb#wJVY ]{!Fm FL1`#zXosp8vNFrf2il'vK)nat=1l%{ab^Ok!1J+u1plo?o&~�겡$xN0 y K\ٔ&mV1\6^M6Rی$uibe$VEpTs|K# V:S;!B2"U"EɫL .sQ\jօ4e8y;m`_G_=uvk{HLI!`%lr{#.rqz;0Z7>JB'^ZzFa!!vgܤgk>= :}`'?8,5ٳ®; sے;,LC03r5c TMȍb`:~4[nx ˻ @ �P!EBb&;%BQabwN{,V &1RAIxNֺ{ݏ*6݌u`NLu A^Wވ�f!lxN0~}FNbqT��k{Xqd;H=-w8ηDFrZ;¶QFvmkymmѰM4B! 'iy Ra)!ETG cej)VKna[Jou-%dw}Ъ�yqsL/XC Rm|Dg?? hFw'Ӓ)励O65 .xKj0Vq7ࢗ!$Z +G$ ]AVHgka&q[j"."FBJ>IoȓZHc2)r/= % Oq^0^B] o0p9tɽӿFX# k#hΥ2CMy>s8Ԕ{[f֒!xAN0E>!M\!WUnOB+DJZJ6R]u2mtD%؈Bg[*UVRFVj> p5'9OL`>>w~oB)% ^qt9XBw9}#X e`!/qOph<1eqmi c/0,\}>]Ql\~̀}<8Vj߻|�o .q3v] [Dv9_ C!x=O0wS�qP'$`Gv|N&q~{Gya.+<S h$cTIz#`3 R\LcdW k9yxsz B ػ];Ho7<-U)`,#6FKTTвHGlO0o1C-q e!A0;+0%ҹ#'j4n5$,Nzd%O<Nl0\sDjǓM !Q1kuyP xPAn }@6DUHͱvPWK\j5;;39!Zi F1ۚ5JPq#2c5m9W+ޙNFP uJ*+$zɗmrC\% Ow /CoM ShM))hp9$]hPqArÌfot+,21zK iμp7ЧȴOu1;?ä͇p{5vWb0/!_2ygtFGq:^ߎ;[BnVnW ű$xAO0P g/siؖ] Oz7{4(5b.;QR([%֘ʺŚ絖MʣPJP:R"Y:;dj茧f$گJ؄ȄYyY.Ӕ-H1YuZHX1ir>Btp Sք=M1004P (caItxm7 ^uD'nlh,]үů2x~`د˯\0*=ߘ 0ޢٹ۵χf1"x340031QK,L/JePe0ûeKb+4tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,c`it~V wnSlQZ0eK7u_n:uVvjQ^jn1Мb 9v|k[;& r{My=Ei9zyiz9 '?Vqg,ZjbQi^|Ij1f:ʊM{9SKJ @˞0q_ 56=NnN=fq~i^J1õ&~60U/ lj-fRuzuy `W08YXPl˱1;�� x[˲eOFK>2T jy�9xu; 0B܀g뺘`~"x`aeQ1Ҋo9b<YQτ#0AQ^[MQIdqxwk0<xMk09v1BIBz(ڣ`{c)dPM|^.v߻Afc.NR4殣�#xb,aH<�C@>#Xns49жCd"ޗzCr62N-9>7[LbrAB{%!m骀hFE\A?綣ء.؃JyX` >kYdh!cߢgu7jQH6K8r ڟ4);U FTc}"6R+"M)sAV=(^U}HhR O_A|Ek5\A f]qAv>1lR-tw .7(ڬM >qFSG|Eo8K UIo,uxiv5U]F ]| \ /JcaGJG6EȑG'G%j~y~l֟O_ Tک x340031QHK+dp땱ޔyZg=]'hb� %y% nq|Bx[wyDEfnbzj1B9,sOm̃<Y\5ؒZWT\`)Gv~پL"Ĕ<s7ֻ^e_3�nG')x�1YNOi^ܜEdYxXmoܸ_A$=pZނ&w!0\ZD}fHjwm_8F$<3KqթmͅB{'Z)^/[;z39Du"tJ|;=܉SO'm*촏2U^`G ʨl {F$t1hJ#8҅0^mʳo8RY9SY/}P8}z*~0K~H߻VO~f2wbaRNbe!S,.Dn>4tMeuF""F)Tn&GYbnuUrY'zy5SPKm" Ͽ"{V+N^-?)\,�g=3�cRZ7۲szׯ+V|vr)>#5yq)o _LA 9\wqH2MK\6UfZyj K'~Pr҈;;{)1(xTeTgs9^FU,5rzŨ+]V1WE*1LzBzhv$B{PLk')=!%( ʅ@nWŁS!s(\>jP><C,ɍzdKxέV[cBQv!TL`NQG 1 f슫ys{j[}w8Z1sw;qjD?GE)26)H_pDet-ʪol}+QwfBljD W@>sVWղ:NDii$lVI-Qm#4ƃ7�oD4vOҠq(zx=?5M9=RGckxG%zߎb!{Ï[ uΤ7EGvj*Z qJ M2m EЛQcfҭx8kTğjsR3O69cC�D`-qgOU*.g"Ώ ;q Mg{t]GeF@D$&1aD�i$d!4rՑ pJעAB5iT+r!2thUǬVjOӣ#]ikhUZ?"Q?&w `5fJh\Be@2⇖mإ^4 ƪfj[:Rtt*Tt\$6]U7j-ݾ,AĈZF-12~ e&&xS&IA zTMq)71Ƅys 9"z/Sil- z@E@QawC^^IKQz%]ݭ]\>H1/.P�9qicʚ9#;|(YenMkF}//o% VFcO'1'F9<QIim9^*i+7EE`ɫ$T^#eqEgF ?>=Pl5|LLМuib~FxFdb0-{h(at!Z.iz&&ƔRQɵ/^gR=IDbAK3 `D|,gދOx f%Jo;޼ZT)3~ZO "U!)+hޕ |fw9eY )=u|4Lp,Saaض )Z(];z\?&kTJZ^+S=1 oyThs<Ow`H:xyTQm_ڣaWän_4ZkIbj턿wbtC7<N@F@$&*}|~h M?tW\IVe|b={{ nD;A|g'ӈ3]C:t!?"Xf_h7# sMy8_ )Tgz\ e<ϛy><VZ%t9x340031Q//O+)L*-I+*.ax]|ҷOJВ)dvhQW\Re%] Weyy"k.TKIjqI1XQޝK;^:q}Q r �6hxW]oF}$u/R5A $'23x?s{lB(R=s?=ܻϞ=)UtM1D:,\8D6 ժ>6+X>mz^r +e%ژi7Vl&ϯ䷆l9dRnԯ-JJ2wn&7*/IY{WRz|F7[Zp7T-{"G*5ۮ\9tKVICO5^/OH\lh՚[RyHcVggPv928pv(:5~cP8{?Ϳϲؕ0^{m+QX(R1ЉSwMU=iӕzOh+mF.` "],-$֑wRBd�7D|tt~qmy6Vj0˵ڹ;5j˷3B� 3a[O~MepC xwpa΄늸LRШ!|>)[‘$ w21! G-Nm7Sv`zs@b!Qv:ܿStbGG4d-քktoq9;;Dq}8;IKSMXA7їh YX5A%L~ g8!m- ۸R/ߟ^U1xJ^ Z)A,qsv L�fib.#CԤ ZY%`;a6$Eăqz6Pt QLY\oĹQ]_^U]fSpqNW<;U+uĂJP � D% kע1 `P~@N]iݢkf|?ڷŻ(Qc=& $ёI YQ�nQ$퉞& %3'9L !^- k[y7 g^%JG:ݶvBġ4=o= u#Nၧ0ᨙӤVj"$E66$N50s.BYp $O9Dž*]:d*ד]8~haa=E JMUST)b@X^,NVGtwhv/Z9!Pu\ dwn('Y�ش]%4/p=dAˠ ֔<XI<u{@pIzYhktפ bagkV?-+`Nx{#?mI泷�c MFPZJiX!L+޷^@XKW ֑MAM9KՓm}.OB%S7$N 8YRELIblJkDp\p!x�,I@w?) 6\D C˻x?hա@b/aCrұe;HM`3% {R{y^NN*WD~]HPUMӆsj[n EޙX>bɔK] {nG=oVh \zO_Rr,?#:1:dÅoViSd|$CbǴɊ&]/=QG"9أ[gW úC"*+ae.Ehv{6(*"[)eЋTO7%;UGjs8 (<5ӴѶ1A@n'')x?cіuU­<�_޴*g@{3/NBxVr6+WERrNNؕ-[XrD9KCJ tA5i[ 7iV˛2ʝ l_.aZҳP\Zح_ula3x l aoJ4cr}P1uј s}GZUv*\*uAYozxxM ^wWlLv*g`jԛRNA g隻@~7t&i�2; zT;NDY4kpZpc]0nvcR-q9K["Z(RP Ӗ {z8ńٸ1}P%?y.&o6;tH j%2zٱL:n! uۘJ#wnyA5XjXE>-EzVꛌ^d8쾻6`r9-7އ,,TS-ixh&֜MBu/ECypӖ;u:}5#%?vQص qnT+~^J}&"&b습@\}Zd*Y,N v�:4,LU6y|7o_|x}T/kxсq 9C(ḿ^8 }THB,Bײ6$�;E$VJ>Dl*yHFȀC^9ߒ)#&#I&Ѓ'{XqV:`> iX߽ XCm(5$DUΛ(9wb� FC+H@z7:ߡג>`|IuՓ$appv'&s8l<!ZtW!g{qF-Ωp8MFf~XI$%4SG>+eZ8Tڼ=l>nRTO$*R]-hL' )x Ĥ$lr/ g]f Z<b}P#NwdNj _F(.R6[Nwx7(R6@Xs] SkdEAԚBVne~uI 8%f(tL.b$f{t kc{fxL}Pρ~L@RNGoYA* wCghONT);x/Bu19 *{A'D$PXTt%j<9-~{q:O-26UMܔ&&>ŦĐC]Q&Vw}WӼWп]t\8_DdP4cY{NRIBOP@ڝґ技k㧚rZHXx}O޼ܠq5E#ui8&URzwF2bWX>_l{ͷw r`͟LIշq9V@7:Lr(B.7뫧`Gz8p/].#wSk'=cN;4 uAF?nGdL Թ}{oc(4ȴA4C!vxkސȪPX9Q�5:?xuSn0 +x pl�9a t|iQl:*D %E->~(ÉCڿU8A@wp}?5=1$T!6 &1 mcZdl Vx}?_ˑ1Y؂e4O1xaDFJ1z3!)FҠTCny]Acmg}:醆lB]>j f@fW 8\v#_ԃ\jd3' �pRc(=oddE0宾QZjY]sK6񺼀 vY4{GV=2gtQ_L(5\' tw&Lj 8f: W>3zkn (up*f hHf_X-$ϫLckUsO WKx[l?Mvr)gcHb 9Esk$J6mWj ~D -g)\Q>F2p0^&1P1V-_x340031QHI-OLI+Kgx.LJIe\5?GN4DWX\pqjo6lg��!xuUP\M6:w !@-{�=CepoY/c>@%A��d4� $ �RVіwQ_l lqpp�(((tÊ?gW1?_?UUU/Wo?R?&/!?S%%%YOs} Mo[(䬶mfwdu� ka uyg_ܠYFox^sww7(($p{hbnkiivARlftT eEEŏDb2_+EblOOO4ss?s6|yyy S.cUlll-'S]ydYx2H)))zzz1:::!!N}w?[�5մ�ρ/(7p8M3@<M^C»zۗJϒ}́OkgYtUB'}]ڠS!i@_Ez9 i?~&z[�le$Nޱ&�XXC O�%pϯ6-%X�pVDĒnVE̥%(GrE$I}:1M(hu&I'\^2yp1}iSu* A=\<*q9d9Ly5+ "?`}4x/IH9 C"t)Nj{T*O-eyK *-検3ێaK"KmCZ9z]ίu#C;؂˔ߥH<E(N Ώ_WkOڋFWfa.yfk_.wя:dLZYyQuIv~Q}~ v!wo,(x? Kl5҃;ugOlef}'w!xDL-+ltἫbaUn9#9yJ8:yk[̗P[>+̤DVs>3l?! P3!Hq3Ҕj1|lzGg81[j΃ GU>CtwLMk ضVn A(3X,'^ *J�"_ ie8XgnN;%i!64!E9FPFRH?e/-sYG3#&~ph_[)N@_h`h Jg ;leEZHEeq?􅿅Jv)E].V&&=f֣ Ƀ N?]Q*hRxwgE7w}SL: RD"*5QҎ+*Q/M`56J(*ʔTu[|I}ݥ_ުogh`�r|j? 5l>MKiYQ9)_rO@v;@�ڜ84]w87F$;$!w8I߽C)Wl $3aVI/vc) RDįIb6 %/I|cbqz̨?b4KjG׏Zr֭ң^UfӰ -nέQV0AmLE:,Cs"e3NHPekL ;G 3`uI+'x~ҁW:A]swy s²MPХ�kʇFF(+7RE @%1`[q8.d8X:!$Coo] C"T%܃īv햝`*#Z7Z*%iؐ66:L6*)fԧƋKG|{B?pEZ v l.ZQ #g3/#Av >F 7.ű@*)A|̱jQ!<!mOgH?݆aH45IҤ~PD}5ɶe~# =}N'3bBW?C#u%ﳗcg_:�˂ 9>:?fj{$Ft_5]\e sjƓ V%S^n89 [w3$,J>\E'Wm\Wk GەLŔ9ܪoKNF3'D)ɝU! В {{L"KVGCʸq%;Rn7Bj ݀t+;䦽aJsԚ`n=KC՛zSLj1yо,*e5.Wd{7Tlmݼ0°:#G/?YgYIP e;)uhW>+(ty߭Ti(VŢd|,uQ@t-kA?%&P<2Vbq፠F4n>\WgC͍.%'1ߟi�M;üymk>’F収W[";Hy#G*vgn$v8lmNDfUM-ΪRz꾀k1@IyhHZjn<vq0rYt|kij5"^X(+xJ|)ف'h0dQ0{N"xͳsJ?W"Wz8Ff<Z>l ۽wּl4F:3HgeF*|jZg3L֠!Rۖl<z.cGοq'ـ#&<YQiCm|~e_#O}f&d?ERf\ ]F,S sZ+n'~$ O<m+o#Fe�'rU3TڙO?{]X(3|[wsqf(sJ]8Է K9ʳҁ=%I!$i͉T0Y4#;xAXg߯)/-Sc6I57#D� qJ/Ӓz"a;B%1tUǿ;b|6et 'Tw@pGzo`@RZǕpZSה Z~ P15Y%dsS'E1Tw:DZyDuJaӗOW7 ߰$@n=Q]u Ӡ`f[0|hrPIV<.xO}/06=V2S?z 0݉:nZ$__>UiMHsd&PX6N卲||moXۻ,9t jVς!-*ݭJgʂMu oXy+w✃n(*8eK}L`l\5%YE Yc/ =B?x ؓ2|:*aa?* S(BPYLL?dv.OH+"?/>jP4cg;oh]u#hgaA;FIoj/T6h\r83A Ӎd}iQt@7(&8H!ZsAŷ3v)]_~ b@=t60>+^EN>{UkG;ø@{<5ztwP;,+Ivf`3[3 7$"FUKbcH9H-l=g;;|J& :nzoEr( m}֪G ҩJRH_׾+"t2LGl~ir5}T i=|BqY}saHm rd[lvTT5s H"[NPCl9[ |΂4hѿ~!U < ԃ'u $ вز [FEQ#c7d�|)qP'�ՠѸSdKcؽK`֭-y(RN`hkE?MҬr*oE;lc"C4*o>ӪQ sb}Y;qImLe*%ʭ^A{ϻK'I=A?+/9h#zBl=1{@ʕa@]Cq/II)SGd*C7tZw. ndoA0s<'ew3*mIC֥ ]tHdz*h,1ܕUE }l,[heC C5|mg5`~zj `9GfILǐu WHQ^= Ան ŶI)iCE&5TP.܃t+l9]ee6[\\̿<rXJ jC 77j]^Ĭkɉk ^F>RN j1S"o0&$JnSK̄)boDmce/�!xO {=818-]w9ON\E#AHzWI^X{:_G~p{A"j}6<Uk\qlBx$3pz3ҡZ;/ZXE p ?Tl͛mcs*ǡ[x81JI2kM]I2Gb.ޒw6$ /`O5mC7 Yݸ_f4+x"J0}jSR6CA6M+{p28᷊aUE؇OiYk_ף ɪ}Vϔ᎔zZ)6fىڢm3wvZ11augs5 ៨} HNBKÿtz;9L7%zKD|tҜ߾xx7F&9N $ /jH`Q_Pvg󻆃i\O;U*`ٖtsJTL7ĚiW{{?'zeʑΈۿ'|ZNvN Sj?ovꓚ[Oa16a}St9{eGgҮ|g{U>akO;b.OO3L1ZvU-"F=Elqy6J86!Wa ~UNԂwѡs@ӥ>iƫ ֽy1Gl /:C9U 0١V$8z\#EI况WIGU#$U`,xz]hOMԈeP>@R r5αVX!Rγ1SVs $ZJqo *`3W6`NM9Rw5k8Qj&[D%_)nb~(m;ɉ$�_ɚAG\+!NT q9__4IQp?JB-FȻW`gUאs]3Pl%Y%á[> W/{F]�B@׾!^3Wf=_{)>Y%#a'1X&Ȏ9:7VNfc%i^6)|_SXe3 .@\9:6#xtL1VxA<|n)35G?[7Gթfn{cǦͯ[k/,gIyJ?YkVA'#cߩ6y2pyguZ�t2lDBcCol)B- <־_yCIn z_7-/Ic/` )cy%5.FY"{yi"G/\ꂶp(ٷ\I.ZL]5e/ERi2O Ttj55ݷ:O%O/(yUK<hK}Z{$qm2 2i谫[gNsɗH9-hieX"% r6?!K]>Kax5#7q|*+lr#L(F<NdC&hP.QTn^^{ۄJYKU0vG7#G3�rзۺ!p\3p?6LٷoD P;0.-Me{XLm'`q �s,eOZpJ}$Ic7ϭ߇,Gt#'4R x,I_(kVUm8%b'bd}%q"Y6 M(b<l|Q @RI >}%OA6y~*n<,sYTlq [;,"DlWJ|ߔrXy< e!̆2R3e;zR}},E/ELL 2# FD ½]LYL/]'UhXʖ˹ q@m3̴B&$Ō#ך7̉$ eJ{OAjsbu"J RQ%)ĵV Blv4e]{F _f0<5 ~( Xb Q=\t*a }Q䢈}'Rco-q:3}] !c,ː)BN?OeP9} |vD7u #Bb"=T$.Q�eC(ڣ q–%[US<6Kڵ"x !2 I I_aIL@k99nVsF><;OMjL<|q<1PVdX1> wȂ%Ą�G FS+EDx4R,Vg7.ϑ0+ 0>.Zl}8PtKx tٹEdY5 XR"Eۮ VkTG!\1iM)>g$uJs󧕳v#mZg n4|*$ܱ .1I7.q}v a#cuK_NT!zŔ(Az'i<S.Hb G/_pyIjWȝl'0QõFsO."D9w7 دwSޖ`JsQkiO "ei}Vo$Zsnҧe K&k7}: VF[X|r7xe^V8q},QO0`%e0s ?8`pXbOjII Co䚆l˥ʱ}-udWT7>Sü=(plo= Ճf;;)/�XSwd|,jo77 硞ݜu>xuny˅oVXc<[vH9AL<.W>" /j>IZT\VldhK[^CY^-I>D1Yq]CSyӠP_wz9z)6oi'GCy5E fŵ8 j%b2ؼJ~QB&Sy7D3;{3v,ObY<컺燽eESeJpޞKKHsfHW_yzkf^)˃9m ג d^(\(@HG}3ãQI^qm5ڼb"[b1<y΅[_WaI.lblJk#mbj=v7@J Y e{Sg?7W$z۫Y2;uycKݞ9KVzq{M߆wU@/xw}q<Q+s1_$hH?mKɁ:1*vFm`Qܕ% 'Kn{W;PHtufPz }e+(-&#-^r.C':qmJCK&/rSүZmkM޳06AmSڳwχ8~(O?GYf=.{Vͽ{LrX_p\ymvEؐx%kI5W{dJ:Ѯ;"vZٳd%W?3n L!>5{%#2X4SØ]UM.s3!͊ތ6 AE۬v_߷*b-uyY&BeN?u,5^UOL,ݣʪ*1RMeyE8̩q1E_+iB(Hx|';beu%͗ EQ-4ep6WҼ@}zwRihUX_Ƅ{ v? 1Ow$))�בTGGpuj#[@8VlyqJK:ZA+]L/Pd\*'xr]1 wi褳y},2]2M u,G%Zޒ}!"ȿ1׺6xI/Tg V _KfAɡzb;H*g3||F:_!*<@8BxB4&P" e7ESPv_rx?fccnSaQ5P) =B(#TMÒƆ= ǠZ:/p]IQo蛽WC3kO,'b2/�sBJsf}ɽ~guYs>[P948S(働pT1T`L3`Ћ>-uϹsK.>n+bBȆHl&h4<Ȼd X"14ï+3?[B^;?6KMzpE%',<t}`>}<kː_kBt_- C2V*tA3qT$=]iVz39Ur0"Ehz2>E3U1gK]ښ:jQ5f{d*׍>V1e=Ch|AXlv h:g~DLUg("baˮYB g<mmzĪ,W 3# k]TVI6^{3rv4D@*Q!QEg>X6ًy+܇EvGg AjRa:&d͎Yv!j[eIR=Zwfa.!bnk7V%cY0Tm2Qvz2ߌߒ+#:gIsS(e1{Her}X;aVö,V/F@N !(Jol+007mG8P[~0N#SQC8NY JPp|Dz b͢CҨAE~z'2}p-9EpWxqH?׾+=/} uI @$ GUEȏT a'x$4vfU'Bʇ~3کE!^32]HD^C䔋ڂ +R@}JF'_~'b}f/]Z 9&>IQ=C9P"OJx1(Eؚ<@:~+R`ML̄Dd?DWʨScaHjN`-[p](f1܊f?pQWNm ~V{kU<o+/)/[.o^kWyTzo1ENyyzL7kiҼf55cyjCp H8}p3kPs~N]"` r}h@}Uk7.~_=QfE{V]HʑOvňǗOm9w2~S/"rDifO%AO_^mV%QҠ^7h?ݹ?qݒVd%dJx_Ł_z.#'XYJ2\uy{{G͹$EvnbRsi$&P&&go϶`BkT}~�ɀx"S= =0iDk篹/zg*k=)?m=43 sx?w필Mj$JH"Of…D=a_0DְE&m>8?sb4l1o8=-:SIaکV#AU52{yxs<3Kd'M`03D9:\~IU ː`78a"aJu}8Ľ ߪiY_=V)،ٓ}/ýV*%nQ$=a\Gˋ)-}.7-l/k"QB$>\CcvUtFCGBƅFN/듮kivxrtxD 6' `i,L`Æ^ 'p0 )F;;.%1ο+;ˏ]SEnA[_k juIήO^F^iiUE [g.*h�!X= . wmR.II_kU+8~Zsuy[!CguKp|b2R/]HБy|)qZ |u'_G'ZE4co"I&ҽ/&ڼsT^55?8;yf9y)oiUOsj7q׋FpÓe.$mLM9I@ H3V)zIlo5_ U/. UgE:g?##Mw87 eA Mn]hܼ\NV$6+!#<-<G1͑y[xH#N62R)F*y@˭ %~{Žp^3W:rE9*<ϋp{:m%�@t: (i�P _PIf'#km7Zj*x'D_@X/ɾ}Ю։:\tm2bEq6M`Tu@  AP ok[ E;)“ĆƴE]yڸ|*1(BEJn97d qn OF8> ndW/b>MeMƭ>?'XJE `pG;ĸH+L�:6",hF�w?GϨ}t2X"1wxI׳*&HxOXHOHHvOi#<Ni>YSHϟ;Hpjq*Tu, 7aJL.@^rE=C0xJڟFx33"�G2"!v,TRt)Ѧا0M޽W]KO L\G t<<~v0GDMeO5^V["b%/#fZP=R }s=x].~ƹ"$p6$Nդ+G zʺ20up۲g"7U3K$y?F}I(^,42\ׇ~E*ZL&ج?..Vxc}3:FJTUxWP%P} /#{:7znc 9>7G-$,G:LR3y4C3L ^~igC?<% 5 ^+%3{{ͿhoX:zGٕuWF(&/P]Adw/[;jmB >y[r+702$\Jao~.5k8| Xڝ=�OF >Ga;hh #,r~'}d\qVDaqpwF[8eնPɢ=Ga <sJё>\^6ef�|hz<$V!SdNaG�zj4Ɣ�،5&ϣF C,-7WxԽ`LY: x\Ys6~_<$S+R&*٭Q{h H,;~)'c{<45%h�_P[g_l"ڤY졉c Y|O_jd/($N&_\::_ه6kyf B/IW7^zu]^9|O]`f"1qͰgV<h;zxmdIhg;bH[mZ"3B\p8o~Sq)A͠|<n#^xYKvƋM>{ӻE"_tgߘl&E}ƹFr)&\ %\0Z_fers>ArܣDc<%+I-pY[ ?ojtI`gr>Y_ 2^mЦ_sM])egdcfY΄?{D?my`}^-d?[T�$xx$( \,3+\Z>6~zeҲ['[&{K4ؗM wyf0tgW9a 7Y~p:L BIL<u-ۑ86 v鵟RUTǶ%LNqx6}p@vq"mɕiGy( c$ivm=@Ij<D8.Di>EaXbSDH*'p\IƙrQI@(10 ʩa:uTS?΀%6y|@<ęUn_}w> 4X; `jȗzikyT'|}�W)/ _6`b%f'|}\H^,0? {?P>} �C�`և*QN}= R@0sy;}Jc,EtAU5*X,^ $V6e>w=ʓ.&[@`JGAE0k*Zu>Xz8>*EDž0 XV : *YP*?6$(|8+?)_ ” jsB'}x;(~ 7։Cφg3?P|j&lfnjƻG[e`WUU\&¤u(^j2evЫʶצ gk'$V2¨ć iSShJ*!rTU'v83Q]Zȿ50>['Uj|M}l*kr4JέvVݎWmpf@ÞλpaJtȧ%ߺ�~&\lrC,*1b@ĤI<$ A?]'",@eu1s]7utrû~ ]VLv0dâ6'["Ȧfm*zִݦL̔[6}ki4#*kZL8z:Z_|]/z]n7jEMZVX'#?7+)<(7. \ G-Hv� 8o#XcrCi]Cr7e[0#Y6Y~Q8[+ le/~s?5f15GIus0aEkaۜnlؼu V0V֍z?I�I#|!Z[)MstbߖQх;W[on} c%,kK`QI6hz*>W=-J4W/Wj<XˀTz|{ڨspC[Z-M?Ώ`>{qˎ&aP2#];0^k _F t1X) z8p.Ϗ|_{|yrޖ]Ѐ_IzR5rM߷EnACiba٩-@q؝vZC�]&|qiXI+OMFTu 灱a*u�M.7@),}D$NSE!14Ӥ8MhS86y"ps ɥ*¡ Xc~W0("4Rα}յ K.Ƃn3s9#D '@U0"NjGj|ީG:W0II{_,&ЀRRWڳi&;;^P;2 Gu:@^D�<։h܍ǒugziqY  j; {Z0<#~b#"\ L$0A$^(>J 9eokG Q?;C?M L.~ܿ,BCL"9u!f\iUPJ/PBGK4p0.A#Q-b!K8 Oy<cHTA  h{/-ex~+=k/Y$W|  kpW}"�~tD&6Q%zV*Xxo49xD*ݯ)l<8sqlxŏ̀@)^9sK`0>sy]:םN߁7d}/cC}})Ȇg7~R@J4)]ҞpzΣ0xdBc"K=Mz k?_r+\.=۷k ê#J{umtq7V//wYˬ aK`{%;?aԃy.)0ؿgo[OZJ,)=#.n y] ҕܐI#?_w&y!_QڝMg,[R$Kf+)HpaE4lZ!M:pLP0b́ z |$3d:ΐSrLsKa1)U#k Uui EnvAu`()t,OqG" > !*e!q)a~+%J-@DՅ@RI�RT:k&YaN9 [ZU-ԭV k�ENLm'!Hqi$n *3 L ,$[cRi1U3RM]QVZ 3(+P2Y9)lթQIn 8m  ^;͠kǭn\�s1$ -;5$viNʻ|XukJFAGUy¶{p=Rڛ։c( jP +aZ "`Tf䆈`4 ሪhm!)JǴ,Qm ޢmج`s~Ƶ(͎ )G=`:lū /xRM1 WvKHZh~RŖ3f<`yf@Z,zzIm JGL5Ǵ~<,!'ǘ} $bs@ qcQ2ْ@ צ*<P B1MO-{x~ TLI.xO]8 ܘI.=Z%ֈ16 ;*##U ."[y|rkvڒ�@7⛣ܷTߒqL}`weN>Aǹmb䟑u2<I3ЅS06-i5*8iŔRe ]UQkeuQՅ+m@sGy~9V}aUB]ԘeA/ ]x340031Q.+*.a;}-KST/9+\�X ᴁxZms~6JRv2Lթ"1'z+E'q]IT�ٽENIL}y=G8Ob~4[%Me.2Hotbr]ȭ)Jq^&YOrmWFĿT:.kX ņ_*NFI֮PZCڨB[=-*83l>ZXZz,_}WFL>r,>߼_R:,cѪ0U>?8+.˫3/Y8A ׁ\]ϧWFRדٔ5:+c+T(YֶZr6-ZVQjbU$ ༑ZٲP, --_wIDqsix8>z;䴔sEҮMD/B˰I_b'uЙ  3e 2N@*+b"(} Nz7h$7CӛR` f@ܤPBRvJ(YsXiRXo,QI\\0ؑ0gYiRUIi;z7W3fzc"{,y/0)BDγ&m:ą"*.$孬I\2es|P+Zg度ܙaÈب]D,-&wNPK?;Loﭬ&m3Ҕq'uEQ%亢s$5 O#.w^ě)}U+5\(SݡJ;XF=-MNǹ(+[S 0[`MU@ӏ5Ѻs3:h$3 M2{]#~0d7KCS!t =3GKCPqHHk;[+nV§ sE _R>d: ځv-? ? '<g4 O|vqc ;=yGrN՛R9mlpM%HTpy;r/)yƑ)D<%뽩{d%vDR>"jmL"0 ]TZ ~De,v/=?a(an5T<|=M/&PCDz0)ItK MsNLXU/"~).߹!vi !#.&'f,ˑ<"wZ$^?)&UT𽭳Htj6NC_9x{\YM8͐Ha ѼaUPAMv/Xyf-P0@%<z= +}6#b3M}0C <ʂ,f둦n+$G䍥VDE(a:C]'bXUq57s)FC&O5 "q5hYUoBzN7HWu9!8/bX?h Alr6fz> >Ԃa2:U@&41YcԔR-zEC K~m!rոS:U6BZV�m+�z(U:ZC \CTW͔i8M-]CjPs׶`gHVѰX0jO�&77Ԡa~?xioqĭ�M/a*5 = Y#%i"BjBCHg#Uj*Xш!eJ� u`?*Z3N ڐ M&uC/.xO:}?GWum''$|8ɠ֌g@»[J]˿<Üշ;FoVX0H4B`S]*ReAz:>}otV s\'B؜Zsv = zORWr<3T $O2('mZDžYVX"ʃP5*^ UW0\_%j$LS�]8:zd_nEMEM9 >{A p">\/n8ݛZ47dF-I'r@.O/&~Ew2?pvH{WL"4}IF<cә%ꙕ|;# Fu䚬2�(# e,VLmJ&av z&s/sXܰ-X\Tl &4WUӐ8#01jQ[]?IQ!;7h͜}*, J|;-Ѽ-" c'7eYR鴍k(!Zc+"`]r  |sBfyC iDb},%{. nc+K;E#09U] c4c(ykfCå_qi</IM{ �#}Z{H6p= F!$kZS* ~].!sM9譎FD FiJ/*1 VF-4,b'ㆃٟ).>ٴu,>e'% $&B=in*Ey!Ov3 {j'<P X;CQm<"uhJDї1Zw cvmjfvw(|3;YU"[pAp IwYL(tS/f;"AxۑHwId|MΗhg4w/weliX%988^t.P �` ʹrk\h7HMudw3O;K%>^އ~Ќ9#LlH[NZ1礲8%MlN[TB-n;Eؿ#:2b,|@tlL! .O-)7TSfEnW^mJ@{.OxH;j6Sv'@KJ}#}Իف835l <$%.xWjkqQ_uqt6wz>dkd' cI$̵":{u%;Zn> q19VCH{ xW'iMU .LqG$^*m%sUS^x\M]I#{?^dvr؞Ns9t'"x 06_~a@328YmWrʗ_bz/ToM,'zà̀kN0)7g72[iJ$9Y'49|Jv~(w_B}E{@Sv{0\BқځoƟ/xÃ,9P|Tz h;V3?5Lg,ѝ OX]%IS6f~z~Uc/Ej#@pTue톨ߑƒǵ QKd~&X_Gc~w$_ҝ|'}4 LTN]%Yu0L*Lr B!O !&?^\Ojv$I= ̌V60.5h.U⮡jB [rl:Ţ(5[E6#ꮀ�K?mXl[!&Frr~xA`Ƹ9({wҸ .}~@օ=н �k9 뛖≕v;csUi;~|}FӞk ~L`P m2o"j4O&|4 VT*yYwh~H#l O�n^nb[fژBdzրV_2Dr? /L@n\R" iNx340031Q.+(J-N-a.v6uMY<tMC촜rtVL: Qiٽ۬V'AՖ$fge$dlvpYy|3cؖ��59~xkglgP,'].j]ğh5�r x0 E|t``c@)XIuAz_OˣezBt}|3HZC"`À07`9cvÏSSŕbwY{Ԏyxh}?Ƽ ocXVq,%"&?LR?m q;Tzz![|_+$_?z(|EA'Z=?ղaxuT{k0ߟ▎= v2FnkA(%#^w>7btOw�'fAzF&XѰ87L% BoMg md fQ-|!s S8 Col 5Z+,GBߠ"椘| @.& B녔䎜uq$׻-A >_^->Oss]|C!VˑoeDWJÙlU:c}RVԸ쐋W=j3`1B8EyQun]2 2o$9wEj P);Bsmy*n< TΈP K:}Kt~M=%YPbׇ4XfI^%rónR!;X1'xJP"bUWQļ*kF<ԑŹSB'j�MWwt�MM42aץ|ԩՃD3b]K+nsI~_xH n ۂ dyZ$3!MP\(tMt2tԑ*:I=K*+>X'fIFs,zHY'Jrq~gqy`S1K:5Yq ) a=J57wH)x]ߐ{"-&csC>GMb1ʰq3~Le[UIRig -ŒƓ)'gxi_Nf^iBAbrvbzD{ wא0֋d(k/�(8x<AIU] 19;1=KY-3'U!=5/($5E!R;\$??g OYnNf^i.HĬL0}3LOvb4��xV[o0~WxUuU!Ӧv>T{B8؞mF}C )|C3ؤwE. Zbp̩f_~E74x&!))lSޒb, R" B4ŋA~fG,inI4gP7[P@[%-_aiE󰱫;=)-rt EFJl X5 Ig޳ߧ%<ͭ#&@P. a\ow.P5I20)L,4)Bne`sHN!Tۈ\qZ Sć."Z�̅xuU &"wwޠmc)mS kGTYS@iKvDZC'2|<j#B?js!m1%!z!B<BB2y"'ʣ<CshC;DNZC0&-͠>k�RW@wLt½6\ gR:լ":$2Ʈ9-,9R"iX)OFδs̄Qgu@4o wF\lWwl(/դAm3rUBT4c×&b&%,:agqN$nz;89�~jjcb9KTQs١.3^E*Y]. `x1+?lpxڐ¾9}9+�2xXmoHί1eg8#f2ACG9 0n݆p/۷mHrm>@쮪קiCzIpX( KN b6q0ZyqhoR4j9.(b6-Pg1+2~ *cC4?Mj"&+4e&|n=¬ohi4?Y>fj.bϒyuDOx(x]>Z'>?,f]LJI֑u;?=L}ڳ\2ՉEYK/lRtD J xP3]jBtlU3jg [owL+pC1٩TyDC%-}=�r422�8)~Ma9TyÅ<<_:;9%0tڤe%R@DIiʓaZ02 i#ͷຮfg< 3%fal_?jZ͡w>Q`2P%XLڋoJ=Bt}0[g ˑ`�\m`+AdU#>lRRU_EhoJtGI!3j@/D«,c_]v-ʳ͔S0%ɔX? އs% whbrB]OhrPbӼb t@s=\mbk6U+afxUZl܊IIWSBVm*Bf9ƍc *5[^V_<EDHهO' #eHz�̺*3!ܰ+y~CdBeboX֖`lЪ>xAFkwWۮ{Oy<OmwwTo"F3`'/{exCQCʄ8,v* ^JG8-)~ RJuE$vyS;ؖXdXi:@1V x@Xp×/o Pêu:t`)#82A-H%/OnR6Tf%Խ x_skDp"*ӂ0B_ HpWAU=Az L*ԣcUxuw5k'B _7za 9c?3K)àFiK00k߾p yQǰ댑i�A,T!bj5o_˫,TD75qn;ddVjQuŃ@�Qy M[=.4A٫bej.&,4G _0{L̏y8lzZhvO3�3-n6R@ie?[n?w0t=9z�Vp.#b)̉NL\cLqA3ГB\7}@[yextJ՚Z(1K=(be8<{PwyQ¢6(q \!^ kv+4/߉C0U$jd6>~7ו֙囨+yP8g_.gHg-N|Y"Wp:6P>φT N?M ^F ̺ RW-bi)$%85Qc! TDlbػئiür( 쏨iBZ i3ƤAL^|(0@ђU#ǽ_I2#-+y%`͢K7RvhcZ \5q�ݺ5j $D3%4> x֝z+ ; h 8HX([U64,T+_t5eMΎTo>wd쁅&S |H3}$$͟ubz9kHuز&74GLcȫM ˭c4`j?*LQÖlx{z_uC`^&�$["x340075UHJ,ΈO,-O-I-I+`N9?oӴq+3jM8>9#59 $9#( ]νr}2LC~nn~^1HUЊ2u?+�\U^Zfz|nb^b:H,33̃//Q*N(/T{{tZmFFZZB KSKe�qjk]g |ɷ'rџ#^PM9 f;K١O69$\/-ı{KrXXhjV0\If>Ȕh+h0?OZWRUZYݜRN*Bf[w $U}Ǫ~ab� 9y UZn--RAԈ|H>k?׺UudSPEe {%Wjd:wݞ�݌Vx[ʲeCcKl^G6fUKsM=ںFtBn^qÆ/}U;z<=+(䔦g3R?75xھ8sjDQjn~I*Ș<'">pU龻kہ&3�*|8BIx}Tj@|WLm?$`'kڤBCZ%];13˗$NJi"Hs<<Hz.7 SV<&|( `-i?ץ*K+i{~hWW]L~\|{D`l#f~;9q=jqW F% WX! ReHJ&KP 2P TȈdp@?J s1B %V:*,LFoakee=Þ K!瓸DABKjX_9"(?D/p)a<f,f3|/H?k蘁ItxI[ ]9;E`’V}M˽_vϝA1bdK9KA2kyP( (Cpe+ S1oK;÷>X&"㳙P'rcB kC! [ejнD+[I۰DTPsyt~z8kxZ+qBܨl[sZ 3<<ċWⒽX"}p@vه+o8?zj4x9s—_0�xVmsF_5u<cFKƭgNB&z4+'z/wH0>Ͼ=ViS+T˖!*XbWn߮ڂsl>ۇnlE{ 8+y ɨgԽ?7?;x:Vd0A09BSf FіY_חrgV1ed vQ5Lmg1#ۥZ4р KS!` wdgY5�2er1Jw;dç umb)Q}B= 3sܹlxo\Bc>L�I_FT~ӷWTJ4@ w+c_-5N 7lMehQ?(g\Ϗ]^:ܷC*dY]2٩Ҩ@NIb pӂ4%JUl"9B}NM- hSl/ S#ժE)*VAy~L W7͑ 03ٛI.ǎ ۳팾qS]@>?km!BUh*NOp[.Hnп1]殕ʹTtgQH^E;g) .[;EBxm�ֹaStiԥxA'FǎXӳ5+FkƧ e9˸f\ ׽27;1DwWV@nɑ>I-ω_^D\;r3!'[iѕ,lw<9Ga!K\hznr-;)]] ϐ ,}_>BA:*n�SwOV`x , R'RGKDYpؑ:xXk6_q`ddei4]X.hH-X4fKR2e4 P [$/s5tnRoFԫzYQT&*vQ&BhIR"gE(ܒj/D]Mֹh%$#%.d1648cZ䅜ЫҕL׆="?6V$vԘZΡ)}畩EQXM3,?_(Noap�#k{ߜ6Z˪J7Zlgo.!j6݉m^y& `2 ŘLE.38VTcRN(ttH^ =Ǜhi`HS܅ ^IP|ow]p%zmЪMP}9w|bP(X=!lfuMOGo2ˌY_ΩzK8̸*<q~}Aɂi~aV#sM!򊢷+%R̃2E< 'tF/o--&(pmx>+|%\֡.(tgk-V]_-<�6{FתIWǶaUNR@]sa-EN~_ @2(2cSG s+~'89(2]ۜJ@N/Ed O\SVn,S߽yD=}i&U}!QeDA$BW+dOyE86T!3<1J1G̉zޏ $K7b׃Zt 媳&N"}}}'z|KX=:̟^><")qVE j�%>4ʹ@g7YLUcuFem9?:B5YI kV5҈LEc$3ΦK1yv{Q䙕m(rq,ac|szH94σ ߹dciK-vP*Zޱ'VN9>ЋԪY+apY 5]OⴗV;W meQ\*pv{8>U Ʃ ҹ0xYFg-=z+EM{m?OAAkq �;rqAy{vͯ0;2ќ(U8FT!3ƈSMH8P&:<EXjo'(uF ;l!bnnq6i9z) 2>Rj0Tj=,`߆X}3Dhh$X@ؾj?Ru>v`^= >lx˗O|i ls#[$ g)v_d" @r^uAc㣎su"';_^`"4`b-=wڑ8/!wl,-r|ÖzƦzKN~":<'3Tks=WG+W\�t9:˃뜴66cS%Tt22F{~ %)7p{+sRnm]u 'zAӺL^)wCW>.lν%{>- 2Aළvb2-#\RxP}2mU-c˼6,\I_q<$*Y0bb"1'pkF%IQ_xY@5*9o]ɃR�ݎ[<8i1_~Qs6 ߫$n{bo_ Щ \S׎ûaE>4ys=_[]Txtߕ٧ןDG)gPm]ZҽyJǭKUJm+rozY)҈xD+:Oxkh#IAQf^IABSRPKMR.E%yJ\ 9ZpkTɃܬ)hT܃ � ~xWmO:_qhI}d44t@~�ZMv؎Ӹ/h %89&X<Sd+s\ R5$Q9M/_:b]ɮdn%ZS @L=SSVR>0XAim|g݌1KrV-)J{#(Os- :ӊ +Bf]du ^w9)e}c0BO ) n$Q�`ZYRP+ؙBlEֈqص{h_ )rcp0NK˜CSM~,%]I~))5ANч/OoMB0$]A"F{s}^v3nz؋_Lݏ$=^#|z,گL䜜w&?g'j*w/4nC"/ߍn/7. Σ&hYp�Cw'DQNյw$j{Qѷf 9IJ#fTgK/fznbaP8+&ޠ/'&$|D"0Iـ}R+PR'E0-] 83mB;/V̪敔ZmQĚ )r,3\pZ!{P)1)t# Ь\3ECiQK ֨A. 5TʅjZkEiѯ])hxTrZbP?c in\pZ1hH/~S,g$S~tQe.LKJ\#Hpgѥ2jݤ!gXS33A/H|d3#յΰFNkm"2-ȦR,-8s7[(( B<�6__͡9C B VݧNI'j`~õb8g@BDCF]ꔼyW4a73)Y}ܷ4m7Us5ߘt)-+!-JJJ`֝Đv1GaeĆ|3a :j ELqۮFRԦst %F=uh;[rQ؂w<, 3__Ƚcv&H?2͠},~#\c)A}σ5lvJl߲Sòµ9Cy%C[.Jz5QshSډBSZZМqc[ X-_0tNx%uHuoͺy|x>쩚j+ܡ\h<׾٩5 kF2!k}qUnn%_�.tjrxUas8_ =X(7eΑ@9>4"obMdhwVӫC\&e{F )pP-RB^pll YX_΍[ MEOr o$x /0LAeLUhPla¤OT&_0?i/a{ľ3WҖtOfQ1]_-` Ԯi�ז4Lf.cJm<6L060]ilԖB{<Z\-@\vцf;`ݖ~Cպ+bNJoMyWSbʭﴜ?6E*wD AT)l AMc6*TKӪVQj*8aުBjr+r ;o!SYwl]a 9Ar?My~jW:6O?%cD ]�-w ]p05Fn;z1HiwafXqGP"řbuH}G.O%zŧ˃$C<Gu7MgP%ԎY!m$IuwkVȭO>ӇѪ"[NOy Ͳpyo ޛN$M%R"+D 2l\iHw=]6~]s[C$uNݴNu y N!kxJ\=g/_' q yonU/rа ~ ضs ? ߢ!<l+_0k;&x.-;P?nZn?Ϳ2dPx[÷w[XSK}]t܁Dt̜T\ R5y#vQ.PuPjn~Y*LyNbRjPUyfITiLB,L�Jd$`xTK0 Wa48vQSk"N̿i,Ze?6v#Cwxl |FN@8*è8w͐N8ߛAph 9lߡ}.'Zxqjl(OĔW]4ͬ5 J/4+"`p8,%]XnC'ѫ-l]&C'BYѡTlە8)c*EO.+a�CĠ"B?CD;Nl|]!ZKVp-$\!o\xɮE> 7+,I:Τ4Oy~-tV//pQ%i'99p>~QP}MD\M{G2m zD} *wOu >λ`u$ %)=pi-d .IF %"sJ`g׈& "q0,lkLxVo"7_1K}i;ZUʅ:89^n Eo,k=f<ofv0 gF<s)=IR:LHFxΔX%шd,,tf8Ϻq;ƣ-^O-^_F^]`ֽ 'Ҧ8}BG\$2UFSj1I8Ȱl.uJnf*0ZpVaJᠩLIT %LהBvJRL$m(<Qњϡѱfq(8" H7%A I(#QiHjy^@fIKA@T<ەV+haqCR,.h%&DE{NT15ϫEPrby@iJzfP/&K&F g^]+9\;-NO8L;n_k¦bfS+2Ԧ+TIV%Qd<4[8AG2:kX"K7V�a;囀t]Y9.dZ6^Xfw\FF\:'M%QqT�OTY`X^(ZZq!z26RI ܢBX1f [w`ZJf^Kax]D2V*?[d A)Lq]H?]}  Bv d pr,=iU)2跼ZRsYF!x& I,9Z( D0/(bUmJHwc[TzͱBuKNG83ځx<ju㪋Hhα)Wq9.f^G/^h~ ˏ'r<> KW ay1, ,=w_)&e@N.HE"#^H^+T G&OZ[9Ag` ֤-bHv}W8<&XBO<!rlY'zZ"Yᦠ,e?%Z e: t |T4˥|ן&c9+9�(+`Trא? 1_# 9+Uho(R,x{*:Sl#qJjrNbQnK|kccFAQf^IABAfƥ�  xXs;ةk 3@.LcM.-: +P7y+!NeXhw߾/&-vCݪt̆i))NädҒMlh'bUa2_.B(QH:N׽721^] 7?),rjGtKU{RnL$9%N>Ģ4V咶"ĩ\\]cwu4 o +HM yFA]>o3gV_/VZ 1:ՕJfJQ7@{2Z^}@@>~|,X& Ud2WE~sI^Lɕ(>IUNI+vƒ|a+҉R+{)X+:ok[JП ގx~HJ]m�Mt>< iȁ4bD�P@VXGbQe�l {k@u??vSY v(\-"%j}il}7t]hw8{'-|BoF 0~|?Oh8tG0짇 g4_ߏh6y64u;A-aQ-F>l?VG@[:f(b%bf?$z L$G"I7YL+jhv8ܐJ=xƢ57` ,'LzU$6Z,[ڀYXgGU"PgY9-4=oh0|?Џ F h6_O#P;}Gn)(㉴=fHvbolԮ.9D[ U*F [pn&yaJ--|^#BaؔJC 칌KGh7h y^g|*'Ny>?Z"֝AoT1oLҘ5}pyg y1=d-krNکLqJQ64:mFl=G;>D(.OГԩL(uE)ak&1N@9uI4A+�L.6x$ca7>zV .D8!q2ڂm[p"%qZ|t*a-o_v9(eoL:[biBޑ$a]|^{A져CWTX�腌`!Rh-|%ǟԝ,k}ѴL/'Ӯ-OG|vn/"N*{}:hzxB$Jd?5Wꂡ 8Ipsnͷ# pjsnyuv%F9w*sKVxynɄ:r(kk!xˬ:8y2B,✿Ro3}= Ĺ!8K& ]ڗ xK c)Ѩ!y.%R,ߗ6@+@ç4E¨GjHMBMʦ%, v]XF>1]td)q);t5'<@hyNˮjǂZັ~'j3MW}ӣ<uFʲ࠴VRE7 DK-œQY5J>>@s Y)_>tx΄ba8^fʄ.|eGbE&os4{Ȍupph(4 j$'T9wZ/sK:)sͧ'ܛ$EBalKo'*PރohG mJm Mb`>B6"9zWFDjEݽ_QC &Hs;lzzr#nH0�\x#s/pXEQ^P_PjiX�`J'S*pQpHsԄ@BkHB �!3{E�f!nq+K$Z߬a0o葿P1 uvҠd\:soJߨ(k|�Vg˃F74 !IC?rd!PqS*M`<CAP%Ng*8ONJ÷{ͣKkRcݖ;ur4 (;"xk '3$b%&*" _,N'N̸{q P ~QMרBq!Ƭ`'Qoc5E# 2NЛC\:]|JX0bŌaȣ<<:He[DYXURЮM }N,E�x~ذ=T)V E2Pрu�:+a9Hek]U~D{QUux[]p::qqVC .O]=`^FK}S+f*P5t]({مoC\"=K/܂Ӓeſ K$x{cxAsŽn5Bf V 9Ey% ũ )@vIBI~JBRizbJBkkŒi *)%E u JIy%7JAg$�&xZieŻWjDk)%Q{ɉ"SC`H 0R౎S`,@OOOOo>gl&(OUh>E&2JurPL)Nt%-t6euYOIeNDYB (84k[OiV>rb PC]>M 69iM*KOM"I 0H8i UNEf|/)(RMBTDK6p`#5H (Cd0DV2Vy1*-h*s ˜>8n\@-8OoΙ RCNi9 3g[a&a_e]pi<Ţ$l,x?v.\UA8(BHs5Ѱ°?8Ρ87Y&Q%%>Ǝ+6on ]B4U՚;'kD$a WqC^f6:W)t,C\탃5f~j||^̑nyڋ#y(;a`H9bϖ'i׸+ K9~WY9E^ ; ATՌS%mmh?_(4bZ v+Nn:BLq/mG{#yR6f}pFq.gЍ:VjG?%1} mDe͛glT*_Q1ZzN΅4E2JN�^ zx16<osR??!Ww`xy}1i.[.qzyg{Y!uWKWXa;*T-1|�A?NZ`%MSgj3E(UGHrwh>og^^@ПjÉ'E \DϭgS=?q46v<q$6Q[ y>΢u'*UsͅAʦ!><AE+a!ʡ=66 K-?\\_7ԥA[7 k62ܻuTl 㟙<?e25_sVڈ8O޽<r1& w%zL$xew9NӘYՆYm)I5Cȡ%>9]O& 43.qYB yj_Z*\\*ϩs~s}{uM& i<Bt& ?9 nOȜU2zKpj<֩ SjΖ,ڶNXc01[rLJt&:b35k''3;!Ri Z0EfpϡݳڪJdWm.gB1o7F |GYn=΀-'J8L*Hs(4R`KhT׈P,FsU5ʪ6,vi e +NMINߡ Pj@x9͵HUL4U@kq-L _D(||}ڪ`J`OQ eBňy, #�w۾ D1c�AsFᝆ링448R_Ldr?1q^~{Ԧtw:;kMöjC3,*l5-ޮaʤ@$GDb"&3X[sTuac7E[k֓ y Ȧfj TP% g {Q; Tcv{\k{<1*P_hG :V.5+ W;[r4W,lH3\26k(!d@}o#-Ta�_C9>.N:03lD{K+F@Z\՜kfI54 0P{k7Y=Am Gaw4,v&dP?m7on>|أ g'O:\gPB qJk6nx'H$>+vżg-crdy.3c-#Î d9ytX*9:(|wއ&L#D3 3A>?mmЇ$,p2-Q>8϶eqA Tdʲ ҁiK"%?+�5sBGef3L<.!TJJ25~qf<:H;&e NWr2+ݷhng]�DKڈZ]5$B$QutD;V *P=MiP?ÑYcL_\ws%V»9ŋ;n5H(Ax`\σ @u�Q}{3NL516ifvˁч(f.J-z\+^e̬NW@ + QW}3uʢrpaG+g3XaQxE.: If~,Cqs8%¦ <tA`?x݋ j> 5f{ 7uJy=G%Y-(BabHaF#L MkO cm#jn>/9k=meMox}sCNϿ%dϐ_""(E\)寄;CZO!@SGH;#M({!えJ7ǭV[\>}}t Z.89@9_b[42/fJdIb:zPNiX9-j0"d6bif&{zd?!P<)][kO+uzp ]yIٻB3~d.^;;ib+6.|GȾ o4?He.7˹vUFH^W})`_AI g2! eӛo}i]oMS`}M(I"8�yWܺ: Ufì*cqkXs'm!BCf{xgW bVYɄڗa_W݁?N.wri�[�1J^q72d�18{Ra4Z >-54^1hHd*qyeYttzttvl VҪ("Y_EM$Lsvxb"Qў'8i[n�划O?tuowIK<.EڑܦW{mE{(2`C`k8$_p ={ЦMw1Y6<C% <BYsP NJ*rSPEk2!p߳R9W&n%zvV.E/D͢Z̢F$wbA߮�Ǫs~<<^~ 3lu8wx!AM 6'I(e+M᫳ -HI,IUKMR(JIM,NUVHL,R�۪h&f*d@hnn �x31�ԢԜ̼Ĝ-?f+q:&L[|f~MAM�/Lx340031QH,J+`ji`t|>B&e&i~9H~+ҿ; r+AJz+*Q@9P'jx˝8!WD44T8adm^ 7.|1qKqFN�S|;x}RMk0Wxn-KICK )aC!<eH~wlG6 =ؖf޼fܭ mDҩ6@x+AaAhLqCkܑ3a]4AcNOeMy�ӑdRe ,%¨W(,f,i|Ka$x"#9nS_C5TЈ| Y S*rtd}+s NTNۮѿb/҈ycpתȠ9DR/Alp"'\ yE<=x~{4 ;)8^Hniv&l 2Eg[|Tө"-tn>&8!~ႷVƣo5N|Nc0uaQ\R [ZUÿ]S=VIqAЃ6ʨ [eL:Qw$-t|?ISKk U"; }xx(Ǻ3~?/ 9sx}CƟv9ɉ9 y*\\ i U J* Q%Xk<DRv5I^I?)?D,7'3J,@k-S G-7TY! %$U!7;3/$ 3n�XdSfmV+ْ �Ro#x~cD&AԤ[b@ffBt DBlBIFjPT?U�Tx+N-QN*.MWuUMNU qp UNKL/-J,+/+/+O/*JIM,NU�N-Ḱ jr�#7>x}A0ԥ\ZەZbű!wVph$4gfuvu̲)M@@IvNZrA):Op,m'gSLkIxg٠ (\ZTc=zHW7FK;R/ /*Z0-kh]ӪwΓ<1"PPi Zrຐ؅6#,GCoH}z`:KG2Ս¸JкuJ6R>eJs_ 9l[xZH~l^Y@9|+WUE%Ai~}]dٌ6BR>β ,OB;.jc?Nu k4 a3:^ fEMQg^nc֗"p?(G~#ˤݪz8J3q7KVYRm=28<|);U׌!np>z`^xwM'7w DtZvN.ֽJBxRn0+&E$790 '#= D"#EKvl@z wfvg50nI:u ;H/E<4FےqKk<d|2AŽWwmME�Qב ZJ+ _Y8}e\I%#AͺJ [ף51} UI[*tb+qӠe쿻fÄWY:܍%EoUξH$qJ_%p)$?=!} <?Z.™̧_/twZ@)p*ȅl9oWL}0S?R-uMn?&x~ݒwW1ٽOiQHV6t9N,Xw@ZpvgȒT YԞjq9_6!}l~T!1rIiS+g ]"u;L9y!nfa�!T7xU]kH}ׯ -[؇"ZH mj㸔HyFMMhp,%̽g9ǫb=/NV0ՖE^?{$V>1f7Ŝb{]KCӎ;=XAHVޚCI,du\#kwWREW&f-m˶B>-к=mvR+ wlÄzh wh#[钩ge5JѶx/8o<&DFښG}=]b,UKK/qq*md6\]&R(𵧪rC_3֔bM߾q)+ldhV28<0 {mĿ'Gg`a=Ń3kN\a aZadGgK*|Ioli0r#2E%nն.BL4 +A?#B#^(Rmt>Vmn�rk`$r{d`DsPZvDJogeNauLƒ/$'d3X_|^4pqB vJ'ḗ(!V(8]#̃ґOȡ|^b8b/;Cہ Ft:w-18|t6-Aqy뤥p1Fmus684 FFoŮG8R喏8t[V1rJ c<}}w1 D.gBv:=~=چƔ2f'{;>�iKgz/MO(=Djs0,Y[AA1kۣ4g9_#+ \l{6P#ew% x[-pX` f~[әU2 T@B0q!YX&ge&+W*'e($+$*p)($g旤*L< 7YUJZh\ 5YU/0ld]�3;7{IxTMk@ArŃ Tv[/- BՃ ,`2f&uD /ѓ$۴"agvy?|ZZVVLI5F"Q)⇡B;BT$=l[i,@+SЍp[ٚ X>Lu],WBg;J '(Q:?(@E{F+ SFFF H nR[JG\g;dCF!7|ib_B/6hK2 ΤӠ2sRʒ*wxY_Hiwʸz6mՄߎ34vpN|0"ތf-F= �~JL>^o#.,2 +F॑c!2ZmfIr6Ym+<hʑ2u5É;Ypvk7,il'[Tӣ\7MS>}l3;̅f՞+%~ #N^|[jI *XBCJ)S[#Y댾qk>`lD|m~q! /wnoTxVn6}WLd=l�N(U7i66C4KJRvM, _,s33삯d4TL'HdUW%J2@ya 3QMc.!(|'dFJZa!x[$s)7f `36gH<a3'%*m!`;8Wp>[p�tD)`+Nx>9R8s)'ɁceC;�aLIԥcz^\JMmȆa pTj$CjҌK]?$_A &( (sLftx:']LxX<OY؋qS1;G儰ϕH1zqu:lx9jy>J8QGt'RP:bG!E0)ʠx"2,`IG?:/tŊWA" ̹N`Q"pd=gogWG|Z{kM:"|S WP㟱(J RR1$lTFLsV}G^skQi !6<4Kr42#TDZvZ1+c%mi. '4 &uigE^qMeYBPw :f"Z0hEb|Ƶa/XZ54265WW:"(\a=3DcZcVh6+XkCm8 V\ !u ՝ _兛m8hrg9GgŃav<*3"Wc̵/bJuQ/O 4UO͖[.Rg(p6|э*[La@ݙ =\y p]؞6'O@!*ti'݆fUUi9/{GoKM/2J,}zwWk8@ .} ;=2՝Gu?Bae/VؚKy 'ql#Z<lYmŽSv*;"b:Q 3jm#oz]tNsHb(U։\ oƒeԧVپhX‰sq}vm*ʔ hN=!V=27 9b]d4|В3&x7Wgƚ PmFݪb>JΤ)d%x340075U.OI,K)`K 6L؜\1Yr vB%g&g$$gė%ŗuI`T\ y5++|fߚEU}5\i^Zfz.\e OK6Lέ@V•:(g^u3GEL*M,ΈO-I-σka\UJoEɞOZSKs3JKt6L`i]tX:g]J͠:3Rs 6pGTڜ_WsT ނ90(5ouwiwfH!TB沠O968"Xs7pUp;L69POɨ#/|[@ P(NA1CăY^==_aYLP!p*'Xxȥ2|Pe%9 NX<㢸R-?~� >Xx�xlx6G6ni^nBXcY.cQĠQU<hLK100755 kwlib_test.sh�T|vɀ]Hcs+40000 samples�fxE>UQF{ H6BxkoH;bꢣB(o)Ң6Ҩj+kc/ uH~~`.}Jz3;]?ֺu-vv'-̖{Sgf#3N &fҦͿpr[p<nlLw6$.$>&s=]\ {q=|; ;ڵwKٻA8z=;6 \5pdoA6L90j }j5F%Eq>"|[[/#x  'ᤣMl h#W.FIS#ET>է돻W`44&: T!71 n)hֈ$&j*h`ļDAgJhTG5>IJ&h.SabH͵M1fto #PFopNFW*K{�DUT|=Da� 'ד"eDFɍ#s3d7&bl:GW 0q8!Կj(S,r0IdvayD M00D@˛^ 2MB&h.e�JLWԴ}9N'SRJPzI+z,҇Pj\0Ǜh|`\׫6{ȔpN,#Zh/"iǕK5iS硣j'E'I(IST,ٔedNJqa+;$S$S렚<KV"`W-Ęd:-4UMJ1+fILe\}꿔vx.!m*+R"D.L�Ճ)𰲂9N:1UQdPOhhTz?gWD0VBi?e:VؑAVqpKMp uuV_b9M3by +?PZ('3G`*Gޮ۰g(Fצ8S y86%i! AKLpi ($c`(Dj#h ?ʼW0U+ACw94"n,v2sD - WåXDPr'Mq˓[J^ȧf)`7Jn<*Ճr- |XcRߦ%JoFGB[ BFrHx%)fJ2zuZe2.&=ڍο0L3*4*IDv$gAg=*vrQVrv e,Sr{s%6~@/4>oDnҪ돈3_tbQ-/1zߔ82ʞ4ejÍ=huy�G%I86FQ0JDh|X]lus&"Jl(WnaB >aAU0\زQU6rYÚq߽Q-[7ǀh{FZXbk #NQUnWwH_z񤔢*1lviADSAE{7ٛ+rhV4jh_fɑp[ciK{ʜ1^e垝IܼcO)_DRȜbVZoyo r"q®L9g5ך]*n_*mK{;ߓؖ[&C0ޞ= z9/|gbqɓhXМ01K?ٲqh.}~53UG= 9x3?g ){XvyС 2م>V#z`d-){;jp;j[C x=dS}IjqkEjriIs~^Zfob^bzjQckZbfNBqifIj|bJJPHOpbT[fNw;I&_bQ%Jd~fzG.wϐxチ|_G49'Zu9aQZ_ZXY_PkY%pHM*K257,nw, ͷYH0? xn$%3'[ULnu$bf"% B)WE3:'x%7 �]pJK"nt9bviW�&J nĎ?lR,aę*`p, ͷFVxo(%,1 �!xmQn0 +RNSsRC#Ҥ BMXg;OV|˩ !9ʽ Mx+05Zt,YwŌꇆhph /FUɫj|]܋Eb@t:eW𱚖MvCid�iX:8ZW|zg Xh1c宆%@ģ~ŗKmTUG}:oZ $t7 @T?~;03gbUb w 8:@rj+ēs%8RK}FЫGxuR]o0|b"qH=TJ}Լ%2`댍}4JkYBٝrd\&U,H F'p1ke͕ۜAPZ$#;-ERA<IՍ`Mϓ 3TkXqP9`r6Tkx[uC:ɶ[3P]I``uQ?zk-CuG?_GӸ=OQDD`{@- \~F.|tƒm7gMF!\Ȑqp MH-'�jeZƎ;uY8Y!E@]Sc.FDj \˕g,c0ٌ|y$^aڷb2I~j#vQ<*%^^WigQ0 b2,Yd|iTz<xU<vBJXn6Ώ* ~kqMk*ã&2n*KNmY++ Gh6xWmo6_qU,b GْK[ׁ~Bř" ;JJ"9Jnهv@yϽ=c߾ \ f2 %(g\Z֚d0UJEcMXZ.Ʈt9[! ƥŨ �burv f2\I0%AXI|p <*m }臿O=E;wU\BPk.p4g 2%龂4 V1ʜR$Sm:C K~M; v䜊[o d 0V ĕ}h B 6xg?tϦˡטI)w*Qx</%~ۇcL\8c(3ycPegZqn@Y:߇}ri0j`6omؼ3L>sk>9>C$VH΋:M+!76Pzwl\N=v,5N=vЖET=ՕS(3]rAm�F %kV4x pixmXڴFPjTPVHK%/TP{IDQ"jVVLK⦩ T8T35w*eNra K>'Jʏ<i[2-EELht iDh2;.T\H޻vX vK[MMn7$Eԅ_t&ּ.M [0HR܍9}dzo7ƒSL=Lzo| ݀ ptvkU}QP 3AZ{7nϏUy _C>9۷_]'t ޸ITh &_n奠ׅY* sVJ;? aA;+ș+m8Τ]"]R kh ^,ϔyP5^_1zfM>iݯ6,2S '5?�UtBsZqzО]9% W'|%wB4ZJ[Mp5,C|Ϧ"xFHSE h[|2`zdLNU~emSm}nEz/%j\^F&sMx]+xXmo6_qU "!h{(0hqIEw$e[%يKNwϽyz"qϘ{ bt0jT,Q tJ/E/ >kmPWzm/Db+nSzҜ--eJ%d4\^GO2/FWN?OϮ/o.NϯNoί~?; &fȵQ 3y댋#*SHj`lsI< %l ̢Yc*ɏSq&hJJgf@K[n(~/W(;9C Pԡ> J+:X轄I5$ 6asӹ2AQp ;nXe؄&g6s1 Lx+' JQ%O udJpqT9 3f`_m':LӤ܎qqV"m.)/A/GQ`P&z-ĐERT)T{T:$fz[-JFc1$Dl bKCݎE o !XTF)lL RmS6P ,LqSbwXU@4ٮ/_ :zx_«W1^@Nu�FT!t'UTHQJ gE7mvkO B{5*FB XͲ)WEP@:Eku͂CI!r 5uԪwx DZ;W=Dg=g쥰&)cJ}-)]tr,ʷҿ DbKbezsOm22T(%Ҡغ[4"W1Xu$u}Hd!0aT 3{4i[ +< d1MUko=u-Zw0KJu/zx-ij J;+ .bU߷Fxg{C7ЮuerYM;2 } X{1\l]l'ejyl#n>Dfˆn[3|=:j=zj:^g 0>D{7h#| 8ȪLXic`c1:nΦn)_=K]!h >cO"=~(Ns3v{NĠ6Ȫjo 8*\@AZv?&uި֙Ɉ[YA ׻њy-^u5 X6-;W6DŖ̷w-֡ 5֪=WOɩ8k6I|{m? <^Ru^ nzaUx340031Qu bנ`_ʼ>0(KOI-.IOHMKfnFWn^0&�l=ͱ^PsBRztV EEE@~k<=h%%;'P\XT>ɛ0ٗmh{-)TyJnjq:E9ٕ5]k%ĩg<*./N/KKLgx.OӺ+{^0yu6� 2J2XZ__ "M&x>ppEEn�XL2xJ�2os�}[)օ5bX,5&100644 test.patch�m*><01Y7z wxLSVPRQVRM/Q0PV(HRPHM-NWPqJ)N {(&٪''V[ser�x31�Ģ 7%Y+TKԋtJjRfbci4]*F(m53d�3^x340031Q)N-JIM,NecT-|R']{.x,}ҪzisO<ͱq�.1;x vs 53r  ttu,J΀\}\]msr2.A! J  >yJ\�:xmA �;C +6pIJ6OEǷ'pEx7JScnN$#FPXƉ[S.`Q3WJ.5UVYl5|Yl[wW6DC@di+* 6L!UJj-fL`a/N?v)�Rx340031Q/-JIM,NexvCm_ſZ9z�"x r suUrIMLSp +PT(.)J-IT®F+5(/V5%S:<}]C|l2JJ zEJ\A!xU(q9bO*M/F5�vJxWms8_u&);zahh3&BwC2T"blƒCoWh:$ kzf8E}<j++xu^ J Ѩ!mWm?]c]4ӄ7<L{Cy;A:}^r%p'6z wPr]]D0xw^C+W+WЍ@M;qk=߃(3A 1Su,6Dc ȥ9ZL,0PkI+<K #9BP83M @ ̢[,/ٴ|{3eD733!M;ֳ> Ys>߽3*7ei&m-3ñgQ)%BJ?>n$ͱ wzcaXLaLL[sˁvF*J#˜V#E Y ZQ D9 fr!iMqXsIX -& XǿXTb pLd P~h=(h I@j$ZE{!Z*#EFEjX4CtEQvX8p`tXnZgaߵ~| %߷= 'yP "ȕTV8Р=}s2< _'?3$xO_:4t>uDj]:`rU#2)ЋŊFpqk{)0D8Dx)IL$:VyLRcC�@+,2_+wXkP,=A(8Лm.V@2wh|ctS4'&.= G,QGGM>jĀeTFe)]Y=",R`ZC|B=c[CYEE<$EYG45iulrp(i:5AͲ@Ȅ{3JNjZ5ڨL.g7^8@lLg@а)д3AiNoY9N:ۋW-맛VCwvzzа7l$mk4s!vD#WX9(lå9kqUk~(#^z@ZUVb s]{25i* d#NbK`aYA' *oA 9g2Q: k&§'à]}Ag`Lʍ )sKh^&:dQeBOH0Xg k.Ǐ{$aM -kxŨnPDɘ.n,9?\1"DW3jfoDBPF $OW6;縌>$x͖[o0+\nRG0 -^VVRE1$##ہNw4PʘUKsw. 636&"dAچ2eJcl6`LB)B0MTRs }&4т&<ϨB ,^ʜk 'fEJ:ݯGGvO̬{gSvBD0II>vh4z':N/P>.2Wl%Az xY3G^NP$;I'tJgJ"Gy (4BkLIs ANQ4"n1v//1T2<ittySlO&-Tɪp.Q< *]TJB5~W]{:UsH%<tfizt^;nԶ t ARXw1Z+!=Qaa.aCJa3`!r3uv.wN2ik|ޒnJP Z{,a~xCG=|;tNĿ dhtPPs2w7&`O-oc.?8+gDv[^- .p=WcR7tŐb9=<{LMe`"- nGx31�ԢԜ̼Ĝvg-PÅ| >`e�x9�E1eiPNB y8ݳk{+ړgZks6K'  #9x[ʲeCcթ??Ycj&8\T!7[8򂕮ݛ;n3E8y(䔦g3ܶ*Jj_7</*- Q_ 2fc7/TVѰ?h2;�5 x{c8`YJS&_g|1MıUQVJE%JyY'g`1g~Bd-.JU1RPONQH).U1q<9e.u]D * U*E%V*@Ctu JlA 7�n9Oxa+\J<ʼn *E9ũ_2q$تN᫙d5.Ɏ\Wrp(4Le<Y;W "TM* >#Ĩ(57$UA IW{B\ `G%dnɳPlVVwRI)KR(NJTM/RHIͬH,RW(JMTW(N.,(QH-.HMLL· 66 lBlBrnJ<aR9@@zp/307wpLP(|Y�tx31�ԢԜ̼Ĝ?Mʏ8%u9,1}&�/Mڭx340031QH,J+`PSʯ{aTɞ%)Iy E,w=_+uJ3 fT<pNu�x'/'x[˲eOFSn;i2/�[m x[ʲeCcx\yӿ[y}`yT!7[8a{-_|YYn$Px P()M+fY~ƫ#5T0| �6d%px[ʲeJF3y'V-\g6K`ͫrggT�BANizf^1Çv>kvK೟y �6xj0Y'fAEŕy > *E *ũE*E%V*)%Yv � M`xmTnG aUPIH!m(!I[@"bUƻީwfY+>!Ao$({=3Q[P`m7*-p\c VA V>HP:F\$A8O�1tQKL p%}t-%\2M&Ԋ|TJ"Ky� 2X OgbY3?لp1cYOX| Ai҄$LǑ 7S_?6ݍKn??÷oU888Xo 1"JLjkZuu)�X1ERaA["=}z I=AFPijm4~Yw3s>oޖ3%kTO4]pQP2& %>$[1Z;Q1 x#XcFh JYJqYkb'>^qSф^iCKh2% c\vHP﷑N8<PHB*6'UʩfQx&"r,ZVkNřgÿg)Nrm3 .meΘMV}WMqFܹ`TPufoBO'yH:ʱ1YD ;ΥݻW[}2V$*YY*[PAeh6`(_>?&T/\�_ia}xWx>HK)<, JOkkụ;+D>~nLFâie]5AxRO@x": cBKòiddںZ7Cу~^?3I`1{?G/٣psQ}GC8B NmioW{i.%B@JH`%ϡI~ge@lĚ-]KG $ge)*@k+ŧ0JBЍf<j@,TxP8;^Ŗ YK)[46:OgJxu=X7{Wr@31<ACՏ%M/%c ƣ>iwk #K%:b'y�=θ'JC;ptw%FBax%ٛ?nΩ7O&%`2m)`~?KaѪȶ •-ۥRkѕ%r^  -ڬޡ4Y[>&%"FC Ga1X"lܯ \\\ R ũx31�ԢԜ̼Ĝr1gPZ�86!x͝)=cΥM[LZvk7X� kx{2ML�~x8�=E�W^?$LQ^+'[6O~  d_x31�ԢԜ̼Ĝo >_cwwUFQp/�NIx340031QH,J+`&)@~,rߙw$%5)31N9xE^єWT_ Rw=fv2i/fz �.* x{~yɛ &;3e$gL^l� 8!xQ�vhJ\2 5Z;)>`-BZDߓN@hg#RH53  p&x340031QHIMK,),I.+(J-N-avpYy|3cؖB4ee%e3?bԱN3ulf: �E'i !x[ʲeC c}1']vAd.Ι̧f*dd&g0t73a1Ӻ:uVlF9P5 0Vxl0M\#FqVE} P()M+f/uϽ i^=d"ЌT9s:%w<A r¤�F xJg1dG ĒTĢBf^qfJXfm&eŒ[c.$ݶ*&w3Z+( '0KK(FM^,Y\נRZZQ`7yRB\C}]\'j*$+$s+6eʾwrhd-1ɫ^�I\7xUJ@!BV0 тwE[\b:m3a2;HA%B]�[>&(nWFZc=Z(%Oԓ&3S9@ E0Щ)@p1M׬)?5+.2Eﴔid@Q@pD>V\ ˷T%Jʓ230.Bj M{PAjUQ�;"Jpvqپ~JpraGx{ᐨ+<vYaNgE a{^5a.fB`QowPRS{ʚ+xD(O#lcwXFx31�ԢԜ̼Ĝ5S=,P5^P�(x340031QH,J+`hh^l>{ z !JRR2@X4z^W$ M�4xVo6]TVvEhP) hdD?()6%#wyd!(Q嘆"׆@*#B3xBJܬ&xE.LT۪onh@oL+ x؞8'D@{8P_/+0+@$""6è4H[B1�B* W8|nzAOE Մ<�߿76\ҽఫuyd.J?__4]`$]>v<:W.qES*^՝/2&a<\ήU$osG򴾜6Roez~ ޶qڔ#0!h16z4B`a^JMם:8f/wm/NwwϮ_d 9bllivE,#̶#-Fpn3{rEmb{Aoj檥*ҏ w]k4[- &;pzUhJÉS?Jm 4 fCݺƧ/Ѻ,d!�_X?� wCVq(̿UpEyheF]W`= a#w~֍"pDOndH7{Zx XnӔ-KJq6t\'ȱs^v M&"E]Ę2uj M= F|An>8~kFG>ۯs0oQ7 u'8HE^Kz`ۿ&eNkTo Yl94~K|Y$\XEx[-{BWS2Ngn|Ixs'"&� KFx[˲eOF?5,֖;f$OeR��% 6*xu�iI,TOI5E|*=0C7 qnGA(:-@v-5kL\hCt9100755 mk.sh�Ly|Rkk8iVԽ) r/x*�remote.sh�oF0_D鲷E!}k5x;\u̱B�,x{&3Y1ps7 fu:FT%Ģ%<. /.ќ͂IKsr'싹�s}^xi�o{O//aIԎ\S V@tc F;X֫}7Nl*4j+Xp1rO+ {c|ȡ<B)  0 x340031Q//O+)L*-I+*.ax]|ҷOJВ)dvhQW\Re]YaTAyCu_ާ0(��p\8_Ox fn&Wl93Ksr&c6,9}9+�' ~x{Nefcͷ=NLxj� yQd”[]Y5>*ࣳA'ýNl �2Feu3Y+d&? 9fi:$(  Ni0�yxQ�vhJ\2 5H#>li H"ٜfܝNb= /qx  c&,x yCrgf^qIbNNM,uer㡂' 6gaD1�D=7x{Vefcͷ+X6 2�c@)xZ�G~QofӚ? C0y6֜t-aДX40000 plugins�QVn?Қ ;y!'S-x9df^qIbNBBAQjAbQBB^jBfAf� '2xȑZ_�F:xm1K@) *<N, %D-X*iA49]):ts2::uA#l0XN1+\dBK#\o'99f%A@p<QBkIp[WOURt6f|De[Pn<*6Z@\NKI=N?qF@Gz?􆧻2n(k6'-_x31�ԢԜ̼Ĝk;f;5$I#q�3x340031QH,J+`tx͙Mמ 3X]>:g!DIJjRfbHKFsd7)�2x$Xx1f+F%ɉL's32K 2|^+�c Kxj|X&pfg$Lv0f1楖MT|UV,7(_XZ_ af3,�s'yxQ�;"tg!e#}`öG04%_ it6Zpx10%c1mM;9`P!r!gxx{*, � xuOKAѬÂ.6$ :% l&hz"i]?;cV붗c_ݵ40<<yg> Q9Sd {w/8=Ā#}JBArʄ2!JD(Wa#Cy_m6\qZmotRP'MY" vqDUE?,g[afbÕAwqѲaL@] ){\B_֭>&$`:\A�'#Hvkgf| n׳kVѴLݙ:lfPqÕ݉_W<*w&RI'B]9u[!qf͇OdJSx[˲eOF-˺(TʦW�JRK&VG*o:-F�κsHx[˲eOFۿr{oVԛy�0 8x>�Č+S;.~pmk.sh� Llr;9.2!pMxżyC+k}nZܲ\:?!@fLFE�q @x�S&100644 .gitignore� xoZOo|&4TG[. Bdne_slg}2{4H2g,ۓ+4X3mQѪ Jqv940000 tests� {b K[`88xTG]O;xw�&100644 .gitignore�%=}p�>wI&4FXR8s<7ϵƑneo{O//aIԎ\ �2Feu3Y_f3<:xO�"{xk~(r g?ّ0pGG<4iU a쑴jzI՛@+whV{52uq$>3x�!J[^\k_~Nxm�Zn?\AqVŐnLK!`d#D%|j+4 F<$SC 6׾؍j40000 tests�+R] [ۋ1rmT .o|x[˲eOF Yr757oYK�JRKtDNpҰ~V[QG�DѿxYioG>!K7~#8B$k9l49ΕR\UU )agmӭeMgr>I.ԇ:WRwrjK*m3ՙόQtѹZ_$^v|ַjtƔM[ڧ}t^dZk̃.ߩj]eUpΚuh[NtW[]HᔔTWeGզTG)ze+Ӛ:7uf#*[TvEZ~A3WmZE -0;MM N^&#$*b_eoP%쳫& ;1Mn/ɰu;MN`4_h['{M2YӉp.]jcr"ok,YV;|o$`=RB<h*Q<\?iM(L&ATe0oקegKV&x5J2)KmݙϪSuc86L`tbK^ mRxd_t6ۅ d=Y eE@ZK2Չr(W3rJCAծ50|>OI]6Si٬l͏#N8φPvfiH~(:?rKik!4˄ 7O%Ag$?Eg[c8\Fuٌҽo ? E! NkW@ s铸&`{XaG&S}A,NϡvMMA\Mdkel`V }SW뭂mT{[82 bgvICeT6Rldb2 %Ҭt$ɽK";e\}S6 $X9E\B#jC84c8%˂ʌh?fH:}((ߘ/2Q$C=%Y ش&^ "W0maWE^甍f5z{&̆Pjy+ƣ);07Ў+jJupI0vGs�;vTȡ+ @9A)JmB)1Ffuf}}\]5%m85/#?R+Xb9I(�a4R'DTD+3kՌaeL(eoo.BS&_0P)+4@ #P!Tl?SS*MכJMsQi*5uUKqdm7!P?RUxR4iڳ3U~y-4,rʯv˳ +r9@GaMSF S(]x-h`1.0()Uuz7upB-A2$'l¨y[b+v Baa(N$\>*cS3YHkt햔{bE&^x/*+vom~Dp*=]r:<?qhz|AM03C^|5�*BME Zd wB()0D3|d|Or`NtD/8thF=\n|5HN?LW>(j> !0Ώ^\}hZ$4A}B JO959F]i2_~}'bWׯECL#jPm:w@/,\?L蹊s%ΆPb_Cn`j EDn5 cb#yOꦞBs5#R+`f)#]a�3K/z49"PtYLSopYF'cI)lΤTDJxyI7ZzlUwFwZ5le%,xl%׿{ Ʌ!fU7rBKک4Sn{/,Jc^T�8RBi'LwaJCd,7{B0u.\hEk"~ܱ1irBenE[c{"; B& IKSU'x9Uoo]~K^5V270)4h2 Pr0 $ޒv @ej5:24*IO AlSɼ: `@SFm]f4F7))a .r]_ N! )['A"ҝJ$ qɛ7A ¦4Iv2.=aK#z265wj<21Nyq )Oug6m& SuL&H:LRcZo,03w 4ESZ_ȹ}:.(FQcj(Jj/p 7h 1=lG?V{T}0;:\7&m xܟմNBnǡHQR.Gu2:bN %ؐi,HFkٟpDئw4**" $b5宅kn^8?,?2|(E( D8cEp(�Vx [J{ +jӐγN'w]Zb56=adRy&N2Bz Mhis0!D"ı30#~Xb:I{.X#-OzGpt<͏IR7 ece6e4P/ty,]R:6FNK7hk[͡(}@D"Ҡ<hs'O'RW̩5l6 *H K0Jvd'hX"dɻP.OlضBy30͛mMǒbsl cYq"2b[�fs=1:"=v]|+l[ a_姞-o 8Cz:࣊EyxqnZ\NG;]X4l*]pq$h~ ESJy)K5/і;%]J�uX�?ڥF TXu0cMBb5]gLûPf.5"+)2}X!ked"]!*JX! v&IeqV{z<ߓ5J x1 0F\7o+H7pLl I_?N^I%6@x<=[oqe`u&1.Nٴx9!kgx=*"E}+:h±h[4=Ԕy(p CQs}WcAWZ5Uz?x31�<s7ֻ^e_3� akx{NeKB� x[[~FLwY6p,gڜ} �n*kmx<y58�xA�WEr_Y2% Y[JMkwlib.sh�kL\hCt9UBr4ktx2e³͒�x�xlx6G6ni^nBXc&.cQĠQU<hK100755 kwlib_test.sh�N k>Pɥ% 40000 samples�fxE>UQF{H6}~xQgWN(,E��f"~2x=1k0 8BZlJglT /<5?(sB%'xy<hMwvCikm T 7VgA?26I1al],Ხ#Rac8hhPYU |xp}Vc,)ԇT zwTAD) ISxP8^aZ?>8U{\x�ZUc;A $z\ɱn>i,xpXf.3�C#Bxl�Zn?\AqVŐneZ" x?d @L!�B4{ Æù40000 tests�Wj|k;3߹$e/x31�<%ZZNs:FT� x340031Q.+*.a00W_ .H &`C* <x0gnqbYBnksg@VlnZll P\7X+kr)L ��w>Jx<y(Ngm'5d3qK8�J Wx#�<_1xT7 nY29W�x[˲eOF2^FDn,Qvݽ6kd^&�ڠ x<y#Ȕ{?ݵ r=:n6zPF'�׭ Fx�wZ<]ɔXŧ nWMzkC݇4+넿NlS7XgיZ;Wa-+4�Y_--%^40000 tests�Wj|k;3߹$4?Buxk<'{}nɛY3'/䖞“ � mx<yȢ~S:僊J]S m4x[÷k()F�'D) Nuz_f/�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015103� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0c/332323dd42675b732042ee111714d80a15ac1e����������������������������������0000444�0001750�0001750�00000001011�13574463525�021666� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,c`it~V wnSlQZ0eK7u_n:uVvjQ^jn1Мb 9v|k[;& r{My=Ei9zyiz9 '?Vqg,ZjbQi^|Ij1f:ʊM{9SKJ @˞0q_ 56=NnN=fq~i^J1õ&~60U/ տLqwG i&;~Dzlf\y!�ۮ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0c/adb375dba40c384eb394900e066a7b434c50c9����������������������������������0000444�0001750�0001750�00000000512�13574463525�022216� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQN0 圯𭧍IeB;�&M*'  `ɲ{~6a\FU7"uV)etk4JUmF+32J(Uc71VʚziS2ɺrZt xD~/<'tڄ+laUʲy&4l 3&sx]x Ű b:T@ pDnNB<7>^X(.x-B8*ŏ-Y|.\@oE~OWY*ӁވO`I!wϞr>",=UVigד!>� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f3/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f3/fd386709d97e0ef3d116b4fad893e0834be456����������������������������������0000444�0001750�0001750�00000001616�13574463526�022273� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xuUo6WgX7`6`$6N$m0LIg0%$eU{I3)xΕٯwBrTf+wNꆶRqtBWN3,;'%]`CyCTI3\ ]^S-X8SktF II+̩!͒|wmb+lohT U`BEg �f4n_ZupBzȖoFd*]Ui^iq_xۖ * STq:>履~;~e6P:H:dNk}$h't>f�dҍZs~=I?rvyj!PJ v8P2ulR_@΃Q|GzKޯtQc"D +@tF>=x).]ۺSkz7m؅|4#4`Dom_hK_s[珈<kk,l>D |cQ!QΉ6w@F;'| 5 2b}%mYRYfz) i>u-&A*`h %$nףuCo9Wӷb2<Ek~~^.zȢzvʽn|zԐ& �VNj4  U<Ē}?Qpxhg4;3fǐ<r, f/ZJbjqCj lDZ 5?6PavȩJN6zCbĞnͽ"! /rnDB6ƓC9lB2������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f3/eab52d37e0a001d39894f3829964bf58fa44fb����������������������������������0000444�0001750�0001750�00000000425�13574463526�022257� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0 `y KWMBH9 8âIդC}{ Ӵ3|O~)hy( 3tlX;F}Z֍Ii7bƅc%vdI{%[]3rս6hY \)-k@麨,/ 1y I8H%pa L}c%N{z,!# E |' 3Gg!!2 2unyP_xLO)KxSy!gd:$v;@ -�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f3/b5cd5b98559ae9b9b83a1970cae274ef54f5fa����������������������������������0000444�0001750�0001750�00000001344�13574463526�022512� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVQo09dѴ!u'P`0d9Xulc;ʼn[V.-%RrweBeWGӌ4#6#t2g 1dh}ۻ7S _5[jvX/߆Ur'iBGnj$b 71:熾&/[?D@>je tWZlsec)(:$FOB?_&o|"2'ͻq 6 UJW?!t#tkh04 fpKP(]&F"qB ihbCƷJ#Q-!_e>SU١_m蒮C5HwІibXc%]'ɏ__L|{=pi"Aܵ+y�6L0i{ ֐~11%2k/ݲA}j/pFJ-Ms 6%U#fB7!oGsFnhh1 XzAtcЁ'ք9ہSTl8[SI&U 6șUޓDeIiP;v!)b=S[` B%_u.�{ӕC̽K4X3")] PZ ?[jW Z}W`,h`|Uq��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f3/65407c9f77cced9bc122ed1e3d1d588d3c8634����������������������������������0000444�0001750�0001750�00000001011�13574463526�022332� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3,[}86bɯ�{t[ .:x<�^u�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f3/4cf6c3cf8250c91db95d4e0e538680c3d95319����������������������������������0000444�0001750�0001750�00000000634�13574463526�022204� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KuGf{j%*=h^f^ !6ܵ(~|{"9ՔS�ronJjd~?J2Jn$e]oÕdL9{T5^ifQg8>0d&ۗǰ.šӳr섪){@/yM\_k[K'@K;"u¡$M=�" j����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/38/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015033� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/38/323f12d16efe51058faee59528aadb7ef13c87����������������������������������0000444�0001750�0001750�00000000416�13574463525�022331� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN09)6I]BH.Z^'I?oOZT.ǝ43& ϰ.Eବamu˪(R[kKÊ(򘡮QlаZ"h+Ub%B#h]66-7�W[ɚv _0\C!U7Q +DfQ"si 1!qY g? )G? +!:`ldpK3h0S"vϏppKꙅ8vd έO-{߰#�%[��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d9/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015116� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/d9/749a82669b72286e4c3ff10b10816e65b09656����������������������������������0000444�0001750�0001750�00000000710�13574463526�021705� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xɎ09)J!!B/॒qbvT#8lgK;:BGylTme,RLVǺ˘UٷBQժjʲ@^漒-&YW5qzL>s%3&v y}Su 2FU"%M{`#g#p Y!ZجM D B^/c` yܮwYA 5bvd$գGsBXp 0dw1v;=|dW'7 tc)q)EAXCA#Z ~Tڣ֟>�lp `x N|&xɾgSp(ӝŮiXb׹۞ /I }۽3-N%i⥭_+˳'gqwI25yB~qAup?hڿ_y4��������������������������������������������������������kw-20191112/.git/objects/d9/877fe0101f0d2d8c99e7d6f166f454f3b060db����������������������������������0000444�0001750�0001750�00000000771�13574463526�022266� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗuI`T\ y5++|fߚEU}5\i^Zfz.\e OK6Lέ@V•Te >- dҴ܂Ԓ<6_|_$$ %=$>713D^r# Nʴ~,&3#5�nwDuu<whI -:Xn9_V;|~gVB,o. ?o#?7}Wʹns :=ͷU DL+quG?in*PX0�AaU̐Vj'|%S@7iK@*)edW>1/O«W/8F.*+-)fpzYͤj�U�������kw-20191112/.git/objects/79/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015041� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/79/b53ff50008a2ea7be2a3f898788131c432364e����������������������������������0000444�0001750�0001750�00000001011�13574463526�022023� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒ$UHo=YԺ|7KR}4Ka' x)UP̰wwfڜ~b鷵Y+,y,Y(Yi6؊_�[�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/79/3e7674c4e4dbc4c4078ad36234ed6bbf651b80����������������������������������0000444�0001750�0001750�00000001012�13574463526�022244� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)do^)^4SwEȂ]p<n>} !6�z����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/17/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015031� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/17/cbd8c384c2e1fc3b630154f09f328109d3a5a0����������������������������������0000444�0001750�0001750�00000001053�13574463526�022141� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04c040031QK,L/JePe0ûeKb+*)J,,֫aw9~45*tv ve)6W n>i1 J\]|]rS]]|AdvGoZ*$ff'3'l*ve #Gl(W3gcXCEg33@'$d1 |17*Aԥ$3`Te349?M:+;(/5GhN^q̘ ;5ڭHpLi9ggzsdG%CBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒf%VMrl/L__7KR}4Ka' x)UPxښ f\對,D I?n2)KK0)��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/36/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015031� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/36/51a762e992213da34f08f1273cbf9adf2da4c0����������������������������������0000444�0001750�0001750�00000001011�13574463525�022221� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$BO.ϹnphY٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3|bf86)ߵCd`;-$gSt/= �qk�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/36/1774e2ea4fce482035c18db576af693c23d379����������������������������������0000444�0001750�0001750�00000000510�13574463525�022111� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0 9),q46M!8rO&-G2?7's<Z鋒@vQlZc9YMk76G8`Xw 0QIeU _k}?%Kq ^1nW}<AEJnMa%Pk ,p>RΘNXMPx#\`Q.@Wdʰ)>}BfJ}~O@o3CER]^ *!~ɭxVpGobC{ٿ,uLBD����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1a/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015103� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1a/bc3e279c3b520ac6e3a573a1393a0303965157����������������������������������0000444�0001750�0001750�00000000257�13574463526�022000� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dmBUV'lZob� %y% -y5J>I}{w2DEfnbzj1B9,sOm̃<Y\ڒZWT\`)Gv~پL"Ĕ<iTbYwe?�DI�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1a/5a57a56bc93b849e36d27e553d3f930a1f8841����������������������������������0000444�0001750�0001750�00000000734�13574463526�022120� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU05d040075UHJ,ΈO,-O-I-I+`N9?oӴq+3jM8>9#59 $9#( ]νr}2LC~nn~^1HUЊ2u?+�\U^Zfz|nb^b:5*,dFg1"Pũ9E`~oNK9(HKSK!x TUzj м̼ N-BvmkQL/?D5sD72 )#5�lGݔ~=;F7<~Bde8voI SM + |S?f޼IJr2@j\b=21Zk-5{jrA 6(xs*i?YL @ 4=3ScGL6Ym^+hE8 ` tcUW<w*TQY.ȞczYN8Do�X������������������������������������kw-20191112/.git/objects/b7/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b7/ee6f42cf3da2d5fdeb31d4299c30814e232a2c����������������������������������0000444�0001750�0001750�00000001012�13574463526�022442� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ</#uwxLFEgD]jI2ʦ[(6r5<SRstg0̸̙[Ӭݪ1>޾ 7i3lrM0^&9ݶA!<(;-'\/9?/-3]/"1 'J;.R9l] žCM,*͋/I-ج0uwUWY)Sc/|b"T]qjIiu{,:{� ש6:Xfq~i^J1õ&~60U/ q_6/LoB/>" v=e> %+ͦ[C �+����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b7/3b2cbd155a437b9009878620e3cb1fb28053ee����������������������������������0000444�0001750�0001750�00000000260�13574463526�022147� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dp땱ޔyZg=]'hb� %y% cl=tx~lS 1` *2sS a{_o{fp*Ԗ̼ #7La<Ee!&1\s=W4ߧ.w�GJ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/b7/cbd582e62bc098bf4e25e139fa7d6d5a177c46����������������������������������0000444�0001750�0001750�00000000134�13574463526�022413� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU0`01�Ԓ ޹K^=Gz{ne٩Ey9y%99 [~VuL�g!.������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/00/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015020� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/00/cfa1f2a30486926aa9ccbaa50ed28fa2c67c30����������������������������������0000444�0001750�0001750�00000000547�13574463525�022434� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xQMk0Yb_D%%9-4lEG-ZKmx3>x&̳PHJ] kkyJTR ɮBh*d"luHBi aE)FmiWז-zrC� 7ìtk�Eݖh s4s`+ a mnQtz>}?~9?1AB@i@p&ѥw,6dI/nYL BoNik^Ѓ0 q$TJOx.2ȥLޡe>w5σFGnFu���������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/00/543d39f3baf8965f401278a076657f26f08615����������������������������������0000444�0001750�0001750�00000001673�13574463525�021625� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUmo"7g~Ŕ[^tT]N4T隮=ص9 Ah!S�ƞg<3iipZx'3/^l!B^V-_@z[;5k#UVYU3m|e�xаHv B(!X"V(TʭB{عmE1Gdg Y ϴ10_Y7K�cM�\'0ee'*vC*Kla pNr,|XC.\m{TBߏ;"oO.y<>l .J<RHA:ϓٴ֥JQmwDUQyߠHu }fr"mU ]Y8+Op\vCpON)D5sŏ. Eףּ6/rQk[F9199d~38=ec.z3!|h]\v޾Йp|$(]?RZ@CS*bҥdџ@Maa]�f<]NSJ!$-ҙSgC.bnnhޔ V5̟ZhQXv{}+g ɬ-;Hӆf  sg( @ڨKKF$5- )xTFeЛ% H'ē󬚑SjmƳ%82XYϽ,z*vGik[C@h!Ep]J k!9(~߅Cu j;\j\m0Q%҄wF cl`5! af_G|$J!Rqzap)=3D|:uavs|dppMrJqS˸*tUzi&|l,-~WdwKsy(0ңz Mg!նn0e7wۻI' F]RiJ\i=ѿ���������������������������������������������������������������������kw-20191112/.git/objects/f7/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015116� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f7/7e971084099bb4f6fc51deee5b53a34e3e2b9e����������������������������������0000444�0001750�0001750�00000000772�13574463526�022433� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗu.q§n>H_%hBLbG/n]IYE^Õe•]8dTPaÄ{z1 TijEAN~Q*\iNY^θ pH*M,ΈO-I-σka\UJoEɞOZSKs3JKt:<8zөq-k*lgx�ՙS�;:ljT,ȁaGyǜyK3@R 7}y|쟷J̇fl9zJFy*d&;dK-&@P b W;;/z M^f10Ha. cJyy*^z1r Ғ̜bM'7*Ky �z������kw-20191112/.git/objects/85/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015036� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/85/7a184b3a21e4d792157a9939623b8f1102c2b9����������������������������������0000444�0001750�0001750�00000001501�13574463526�021663� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xTM6왿9xزlyI Rz(z'XTag}w!77of:;M:n3porߔ^횾iám]5'>ZUbMtmjUSߟdە{uej)d u GO�MAѲ3)mu?Ү>XJڔe)6OV9}wn9񷃉G<I=a#j`JQp<[ǧS`ou ,hQn0')yjF>hnjQ}G¡f+CM.v!Zȧ;>g>G92R9}!>\ O0$In ww?bc_"])͆DP PjI{tfW2o]t)8 <'qSlI5q ON\Ye ļkcfL~qT2ٰYYӥ)X xaσ6_6>9ZN zB°F&f:mQ!v\{! $=Fsk8 rp%k}%GtM2+ޫKXCL9 is)캍aD-?csj; :!$EHL^U9a"+I E״rIm5KM`K_BGAUL3-6fm^s&u{@h�_1: t69pG7Jfݞub~*'+G9I!B<a}i'>Eũ{p+�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0d/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015105� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0d/685d9fce4f4163d2dd289847c30477dd360eaa����������������������������������0000444�0001750�0001750�00000000634�13574463526�022262� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8mwzaשso6F_gǠ ӐW Re~h_!S;z +] Ue&%C4x<2s9ú++<qmUԊ"KExaKk{dqij9PU%@2J8ٵE3Uh/ԜSuSP'  U] TX|t۽%G,,cO5}z+$3d٣O3K={�$'3 &[§7&yS ǁ‹o\{ U Rpj_򲛆2,O*()8\wECIߛv{�����������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0d/0636328664f027d0707ab4859b4c9724cf9bc3����������������������������������0000444�0001750�0001750�00000001011�13574463526�021741� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<:{E'p)<>-!D]jI2ʦ[(6r5<SRstg0̸̙[Ӭݪ1>޾ 7i3lrM0^&9ݶA!<(;-'\/9?/-3]/"1 'J;.R9l] žCM,*͋/I-ج0uwUWY)Sc/|b"T]qjIiu? *]aqﵬ`^7KR}4Ka' x)UP̰wwfڜ~b鷵Y+,y,Y(Yi6؊_������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0d/9da4e92fff399323f3ef06086aaf3f0b1cdf6f����������������������������������0000444�0001750�0001750�00000000123�13574463526�022547� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU07b040031QH,J+`x6M9{wk+qIODҤҼR"CБ*'�v!F���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0d/27e3db93c6c8d6e1e80f9d4750761942a0cbed����������������������������������0000444�0001750�0001750�00000002015�13574463526�022326� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xVO6/Ke:&N݆iq7āC[En+mlC{\PĦOs_~O<rD3&1y7Ad&,J'4/{eRbWs KzSqOM0RR[8bzJ3Rq[{\&Z=VMUE4 lD&vSUGK> B)<8m;0&C986dǿ.ڐRqjb!uqV6�1j{+ dMJ@@ d{ư!0 60hvq`^VG :[(pP #|+|8| BlXS%G=eYN!<zh,^?*3zN(}s7smE8j\e 7 R+e%h岤ˏ_#Hm"6wT7B*ȌӰ#SBBS*@K~ jW#@TȲw46[#!ߙr6Z--ʘ<f k;%'󥬄d-Fō֔p=v5L=ND(N/WWEи~ľt s 3gGH˲ehH!d4)fBPIP,&`#L'|t~NӦ;MTq-7n^&ok>%IW%<w낁e4c7c tLl㷏I 3 ;kReƿLʆRп߰–N{؜6"n5_< ͨ|.cENǃ/$',dst=e) [lb'g� Ԡ|hj+-`NxE;za&驎*s6s6)SVnV=Ry84NZjCxv_vmL7-ܓ'R:DŹgJoծURk!|ZUuFb/Jܿ(11M^ f{KV�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/2b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015105� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/2b/d4c042afa4335b4df21997718e75e3964227df����������������������������������0000444�0001750�0001750�00000000770�13574463526�022116� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU036e040075U.OI,K)`K 6L؜\1Yr v@%g&g$$gė%ŗu͞RSJ/mE:|>bG/n]IYE^Õe•]8dTPaÄ{z1 TijEAN~Q*\iNY^θ pH*M,ΈO-I-σka\UJoEɞOZSKs3JKt:<8zөq-k*lgx�ՙS�;:ljT,ȁaGyǜyK3@R 7}y|쟷J̇fl9zJFy*d&;dK-&@P b W;;/z M^f10Ha. cJyy*^z1r ,KK2s.7`ԗΧW,57�#��������kw-20191112/.git/objects/26/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015030� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/26/9de9c1320c7e0d7767d449aae62ff0d7d05416����������������������������������0000444�0001750�0001750�00000000507�13574463525�022173� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xJAE]W"K#gQĕ~T4==vqWU}߻9g1 Ԧg(uQ<V(PRL֌sdD&1֊Ң Y3Q0JQJYDNxa/e릗оTV1K*(%iH#WYAƠWoW0]f 2:?/20FkyCTa}1h݀F3BRr0uR#inn!QDL!Eq H&י: [9vk[T)SɓO&=�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/fe/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015174� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/fe/5c6e9cf9b28dcf5540a46c9b43fdef9794ccd0����������������������������������0000444�0001750�0001750�00000001731�13574463526�022657� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUn6bM&h_i >A@Qc0E1{\hXxp̅9\]~W[ß,7vO5spz`K2i%+VhZHJE�RC|lo 3#Hzʁuf\%0'RKJmdJab +Ox LE"}UTa\s/dD%74 %*]x e2Do'qy�4vZI&Ro!gVp@F*))ǨM<}�|uʥFa t1ʨnC m?d!tMI7@oǒ: | �ZrԵ/y T0ȝ6[BË́rHyWjc7 2E[!1DB-A 0O26OIڐ6F@ҸaL)b[KMӄPaQxZz&iӮLJc0>נ!$tEJ@ p>BKw^bd<%NٶXv-r)"E̵Z%K^; *]7T3ݽ܎?M?>=v:$IK"N%?& 4at6~M >ВZ sV77ډp0ژ%Q~$΂h8֌.I#L,+4oF..B{z]Sq-4A#guWS,L4-Yj,t4gau##ߨSܘGHe]: _yC奄w^<P3Ȟ!韷b@Guc  R�vLB֚% 9}EiCSZ3[#`Be[gRO[>g=_���������������������������������������kw-20191112/.git/objects/ae/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015166� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/ae/ab25498858ad2f028905107f725ca994ba4f24����������������������������������0000444�0001750�0001750�00000001010�13574463525�022100� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dͳZe"/1wi"rY+Ҟ2-e4c>'iI�rڽ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/63/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015032� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/63/2c82132d2d9b45c2ede1973d943c9f6e7a49a1����������������������������������0000444�0001750�0001750�00000002001�13574463526�022165� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xUmo6g:kC3#bo5q]'b-I1v9 |p({}n^9]V>/z Hg+11t:yWFêJ+5%TiEYv>u�^{,fH!b J#2KwrW *fb H,Ax@^(^a6vfM2"hߡ=DY/3|SkzrK4DC4 KЇ/|M0tEX OPlh2S؜C< &j^f'it2gZpA�% ((\X.ٞ@O *;۵[#]HFmOi\;pa]MOͪA8Qe𥑢0WM=/;Ѡ:dFGm E@$`ph'>ZX!E猅{n yb'p|HFEJXY* )&Jps1z +QLxT2PF M?G3!:H2z+Onn`ɨI)7IuJ7wB7 dzMRn-D?V $~8= q~/ꂧ=ɨ>SNHKeliBc Bn ZP. 5kZIBF $-JEYPR %ad\LyWsٌyXРcB/~@zt϶ �70y6]Q-(=l)5MiĬgqpÉ*6Zhm<@,^{9v!A*Zy ̞y$(yDf7 -n/8p2$s rIe\ ,ɀzGOf,:Arķz] M, Zn8]>`PѮv<WY?~ ޾s%j) I qK/E�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4e/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015112� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/4e/548a9ff0ce9b5c890f486599726c1091731b50����������������������������������0000444�0001750�0001750�00000001011�13574463526�021764� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3,]l_6߄_|m-D ̯|"z3bͮ |C@�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015102� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0b/24bf2714af5ba7e5eb5a6e93875f0e1442d06d����������������������������������0000444�0001750�0001750�00000001011�13574463525�022303� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIAY~H]Bvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)dͳZe"/1wi"rY+jK9o}_9Ug2r_�!:�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0b/3d0866140e6805168d0bbbcd984df6397f54bf����������������������������������0000444�0001750�0001750�00000000577�13574463525�022202� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xr {)b YL&鱽45 ,c @qEuo00M.Cۊo9lk! u'=[l4g'3ئD˷Z8ם6[ٕKjim\Q <nfr!J 0;V:L ]E/6\rΊZgHs^$xVR=F|xөRE#+p8/Y1!00{؟D<b.&7h8kirRgDq>Hg+ i3Pe~clYs]H[`ZXa�AzL{q' ne? ^����������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/0b/c5f2511782b5bf865d108643b594391a5e3e6d����������������������������������0000444�0001750�0001750�00000000055�13574463525�022024� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU06`01�d[gW}X7mNjG*f� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/08/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015031� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/08/9edacfa4df29f4a766f6bda4e2ea8945fe1e25����������������������������������0000444�0001750�0001750�00000000610�13574463526�022640� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xR=0 _WvieѱY4$9j+;E]$O||4M.8"hkdMrFVc@WݩAĂlbղ²Z}YLW}SV"/R0&Z=|["<?$g)mLHLuٷթC^vF(-^ׁW! KqDŽ&]_4[.:L <?<zhv7Rߋ|Uu{՚Sh_CI`K|4[8iC Da"GO`vnL0$ aN۴b\e·$@э /dxY&v<ꇬL S?YZ]GHbID~~G������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/08/ef25e94d65b9df59b0a8395e8fbd7b977826ce����������������������������������0000444�0001750�0001750�00000000257�13574463526�022400� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dp땱ޔyZg=]'hb� %y% ezQڧu]L|4Yo1DEfnbzj1B9,sOm̃<Y\ڒZWT\`)Gv~پL"Ĕ<iTbYwe?�qH�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/da/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015165� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/da/e73e26449931ae57a92c49a3412674ab82c94e����������������������������������0000444�0001750�0001750�00000001011�13574463525�022104� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSVp{x6m*275UH*IM),Nf0-O'KUgG PHI-ɯ/*I-f`>gǰ򇊎Qfdg*O.M+I,cXƒ_ߣ/bWb!RK8V6,84eBYAZ[ 4X8ae΄ߚfV}nIDovrBvy~QvZN~^r~^Zf^jEbnAN*ɏ3,w\&r3 =XT_Z YaίbS^z;`EԒx^u*-o‘AY_Rp탠_ 7=>qUK)d0YFEnMjXDzlf\y!�Z�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/da/5ae1716ef8f38786f8f050bbb142e3782f832d����������������������������������0000444�0001750�0001750�00000001540�13574463525�022256� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x}Un8gDnӢ)E7IF&p! T٬iR :wceN83gfg_z'K/jBوx%jeI̬ћрrs4[#e K/#�m~񼼘giy"=u|uqvql@ @ }ZC4`l�zVXP#ؚbniC|(IjX#Ha@TJ@п>@m޺%!6{]jZ-ԕXo+1W$dپ:#cwplIQef!%z-62#II?K7"8FCu!KBtֆ"?3ѯ[RH/)ϙy%|ZUkik8` 6C۷L9FjP`c�pZg8[+א̼O 䜖"I_8g B:`|Q?N2&Lݔ tesnZ6 }eNҞw}c3!'Onlnrr9캿Ft筩<Of#yb@'A[+v �iI�HHUDMAL )*-kmMPBBx&_&6rq&\XO ik A,bid`U48(|~nbZ+[ЄyC+K|őݑs{I>q}{ꬔDC͓#X`LPm$mt!4HA;aX;h{pӿᨀ?^y58=e����������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a3/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a3/7a17dac5be99210941355bdfebaea5f5d644a8����������������������������������0000444�0001750�0001750�00000000531�13574463525�022454� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xN0EY+FbK+iBdC=I,%b;ʎ5{1.B7MTsS1TE.QjZ!be2]-z"2S&2(Bc* .0scl+[{y{J9ǦG dNR:LS:GekkF.2Ueyff'%m% 3B'!ZT=(Lo5Ė 5czzyȀ}`'0v/v.&;wŮt56?0ϮB;$b㚁zV>[a�����������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/a3/755572bf28275fc48de7a5430c83d92be201b8����������������������������������0000444�0001750�0001750�00000001011�13574463525�022077� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3,]l_6߄_|m-D '{˲}JVMs9"u�߆�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1b/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/1b/7a8147fb7bd5a2d78b5df81f87234b0ab58e52����������������������������������0000444�0001750�0001750�00000000257�13574463526�022332� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04d040031QHK+dp땱ޔyZg=]'hb� %y% ezQڧu]L|4Yo1DEfnbzj1B9,sOm̃<Y\ڒZWT\`)Gv~پL"Ĕ<s7ֻ^e_3�IH�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3c/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�015106� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/3c/02561d3015933218d64eae584db5628478a72c����������������������������������0000444�0001750�0001750�00000000633�13574463525�021662� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01`040075UHJ,ΈO,-O-I-I+`V*I)rUfOHM.H,IΈ//J,(H-i8פ)fk3a0 y U2广sװu(۰o.\U^Zfz|nb^b:H,33̃//Q*N(/T{{tZmFFZZB KSKe�qjk]g |ɷ'rџ#^PM9 f;K١O69$\/-ı{KrXXhjV0\If>ȔGUf5{.s\INfHMOoL ߸&75վe7 s}enY. UP Rp,bWT# 67<�������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f8/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015117� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f8/01207a4c6c2d06313792f36dd6d9b8f960c290����������������������������������0000444�0001750�0001750�00000000075�13574463526�022030� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU01a040031Q./N/KKLg؛l/nڲei&/ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/f8/14a47f8d81dbaeb5042ccbc0f50b5f5c3925c5����������������������������������0000444�0001750�0001750�00000001011�13574463526�022443� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU055g040031QK,L/JePe0ûeKb+tv ve)6W n>i1 J\]|]rSU?eا\Ruon;"sSS̜ݔ\d2\خ}pm01�ԂҜb|v +ulF&ԼĒ<FW]!߮͵/.$neS`ʂCSvߌ-U~Y٩Ey9@s3f\LinUoGꆛ4`J69䉦Zr/[zӜn۠]__Z[po%  }®aϡ&ŗClVsN1X8�YɯUmK~4WҼbkMR?mXa,^JA%3,]l_6߄_|m-D }[337|ʗo:iw������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c0/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015104� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/objects/c0/2d031dfbc62d047ca52985b79c9d7efb9ef2e0����������������������������������0000444�0001750�0001750�00000000275�13574463526�022472� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x+)JMU04f040031QH,J+`ji`t|>B&e&i~9H~+ҿ; r+AJz+*Q@9סJJJJAOpWYg4*275U(+.IN-K)t] '*J~z,�ngN �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/COMMIT_EDITMSG���������������������������������������������������������������������0000644�0001750�0001750�00000000235�13574466123�015234� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch debian �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/info/������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463525�014103� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/info/exclude�����������������������������������������������������������������������0000644�0001750�0001750�00000000360�13574463525�015456� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/FETCH_HEAD�������������������������������������������������������������������������0000644�0001750�0001750�00000000344�13574463525�014506� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ba74396dbbff1184ac2369eb6c5bc172df1f4d62 not-for-merge branch 'master' of https://github.com/kworkflow/kworkflow 9d9f09e616eaf15999de222b065ae12cbb7e993c not-for-merge branch 'unstable' of https://github.com/kworkflow/kworkflow ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/config�����������������������������������������������������������������������������0000644�0001750�0001750�00000000602�13574463525�014336� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = https://github.com/rodrigorsdc/kworkflow.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [remote "upstream"] url = https://github.com/kworkflow/kworkflow.git fetch = +refs/heads/*:refs/remotes/upstream/* ������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�014115� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�015054� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/heads/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�016140� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/heads/master�������������������������������������������������������������0000644�0001750�0001750�00000000642�13574463526�017360� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570331499 -0300 clone: from https://github.com/rodrigorsdc/kworkflow.git 7c838ed49e43ff37fec31e18243610258b00019e ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576166295 -0300 rebase finished: refs/heads/master onto ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ����������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/heads/debian�������������������������������������������������������������0000644�0001750�0001750�00000000246�13574463526�017307� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576166447 -0300 branch: Created from HEAD ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/heads/unstable�����������������������������������������������������������0000644�0001750�0001750�00000004671�13574463526�017710� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570331513 -0300 branch: Created from master 7c838ed49e43ff37fec31e18243610258b00019e eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389684 -0300 merge upstream/unstable: Merge made by the 'recursive' strategy. eac92ca51b04aa88440764adc92ca22ebd49cba9 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189712 -0300 rebase finished: returning to refs/heads/unstable 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189752 -0300 rebase finished: refs/heads/unstable onto 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 361774e2ea4fce482035c18db576af693c23d379 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953350 -0300 commit (amend): setup: disable unnecessary download of checkpatch script 361774e2ea4fce482035c18db576af693c23d379 e629dcaa512305895926b4ef5e8663fb8e0088bb Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953412 -0300 commit (amend): setup: disable unnecessary download of checkpatch script e629dcaa512305895926b4ef5e8663fb8e0088bb 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953444 -0300 commit (amend): setup: disable unnecessary download of checkpatch script 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 8e74a69ee45ac1f68510fbfa7f21927192777edd Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434174 -0300 pull origin unstable: Merge made by the 'recursive' strategy. 8e74a69ee45ac1f68510fbfa7f21927192777edd 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434320 -0300 rebase -i (finish): refs/heads/unstable onto 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434374 -0300 rebase finished: returning to refs/heads/unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434490 -0300 rebase finished: refs/heads/unstable onto d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 9d9f09e616eaf15999de222b065ae12cbb7e993c Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575859311 -0300 rebase finished: refs/heads/unstable onto 9d9f09e616eaf15999de222b065ae12cbb7e993c �����������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/�����������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�016532� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/upstream/��������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�020372� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/upstream/KernelInstall�������������������������������������������0000644�0001750�0001750�00000000251�13574463526�023062� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 8e67c6cd53fcb4dd1221abbae6d8bb2c242c10b5 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189748 -0300 fetch upstream: storing head �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/upstream/kernel_install2�����������������������������������������0000644�0001750�0001750�00000000522�13574463526�023404� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 2868d546a05990430edcc3a0138fd37160fdf4fa Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389601 -0300 fetch upstream: storing head 2868d546a05990430edcc3a0138fd37160fdf4fa 04671e4b78cba6fbefb3c34bcdcb1c1c9a729e1d Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189748 -0300 fetch upstream: fast-forward ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/upstream/master��������������������������������������������������0000644�0001750�0001750�00000000522�13574463526�021607� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389601 -0300 fetch upstream: storing head 7c838ed49e43ff37fec31e18243610258b00019e ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434472 -0300 fetch upstream: fast-forward ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/upstream/unstable������������������������������������������������0000644�0001750�0001750�00000001244�13574463526�022133� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389601 -0300 fetch upstream: storing head 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189748 -0300 fetch upstream: fast-forward 6e7b469b6f19c9cfb413f3299bebc3c76d04005f d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434472 -0300 fetch upstream: fast-forward d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 9d9f09e616eaf15999de222b065ae12cbb7e993c Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575859300 -0300 fetch upstream: fast-forward ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/upstream/kwlib���������������������������������������������������0000644�0001750�0001750�00000000251�13574463526�021423� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 4eadf59d6705d977a3c991b6cebe6eef9c5b768a Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389601 -0300 fetch upstream: storing head �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/origin/����������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�020021� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/origin/explore���������������������������������������������������0000644�0001750�0001750�00000001154�13574463526�021423� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 cdd7358202cf5c87470d0814b4eca75a10d2f32d Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571966464 -0300 update by push cdd7358202cf5c87470d0814b4eca75a10d2f32d 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571967447 -0300 update by push 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 5f576b3f07d47f98444f6a4499e042e9abeed1e0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573963304 -0300 update by push 5f576b3f07d47f98444f6a4499e042e9abeed1e0 38323f12d16efe51058faee59528aadb7ef13c87 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573964106 -0300 update by push ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/origin/checkpatch������������������������������������������������0000644�0001750�0001750�00000000721�13574463526�022041� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 09d520454c5286081fb5bf001e323fad1aaf10c0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393338 -0300 update by push 09d520454c5286081fb5bf001e323fad1aaf10c0 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393583 -0300 update by push 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571585032 -0300 update by push �����������������������������������������������kw-20191112/.git/logs/refs/remotes/origin/num-proc��������������������������������������������������0000644�0001750�0001750�00000000466�13574463526�021512� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 00cfa1f2a30486926aa9ccbaa50ed28fa2c67c30 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572190831 -0300 update by push 00cfa1f2a30486926aa9ccbaa50ed28fa2c67c30 ec88cd9934324cbbab31d4370f6bb403bd012f97 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572190940 -0300 update by push ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/origin/arch������������������������������������������������������0000644�0001750�0001750�00000001647�13574463526�020671� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570332235 -0300 update by push 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 b47680364694c7a4929cabe8bb55c9feb89a2a5e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570374301 -0300 update by push b47680364694c7a4929cabe8bb55c9feb89a2a5e eaada05fd239ddd82359fd15e0f6da587389170b Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570375193 -0300 update by push eaada05fd239ddd82359fd15e0f6da587389170b 07f91252c20ff34dbb1f88e1cab0977b78c322e3 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573946630 -0300 update by push 07f91252c20ff34dbb1f88e1cab0977b78c322e3 bbb084af6aeddef5d867762927bfe66ef631aa61 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434361 -0300 fetch: fast-forward bbb084af6aeddef5d867762927bfe66ef631aa61 164938621c64296d324ef9ede0eb2cdbbae745d8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575438277 -0300 update by push �����������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/origin/unstable��������������������������������������������������0000644�0001750�0001750�00000000233�13574463526�021557� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4397c4eb45d845cd332ebaf9c1a4ca73261b0846 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570375065 -0300 update by push ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/refs/remotes/origin/HEAD������������������������������������������������������0000644�0001750�0001750�00000000305�13574463526�020443� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570331499 -0300 clone: from https://github.com/rodrigorsdc/kworkflow.git ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/logs/HEAD��������������������������������������������������������������������������0000644�0001750�0001750�00000072673�13574464344�014557� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000000000000000000000000000000000000 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570331499 -0300 clone: from https://github.com/rodrigorsdc/kworkflow.git 7c838ed49e43ff37fec31e18243610258b00019e 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570331522 -0300 checkout: moving from master to unstable 7c838ed49e43ff37fec31e18243610258b00019e 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570331753 -0300 checkout: moving from unstable to arch 7c838ed49e43ff37fec31e18243610258b00019e db2cc90dd5ff40f855546bfdad6f42124c4d9a35 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570331813 -0300 commit: src: mk: use of ${configurations[arch]} instead of $MAKE_OPTS db2cc90dd5ff40f855546bfdad6f42124c4d9a35 c5e289db8f590a2f8682bf4927ebb2fc61feb8a2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570332049 -0300 commit (amend): src: mk: use of ${configurations[arch]} instead of $MAKE_OPTS c5e289db8f590a2f8682bf4927ebb2fc61feb8a2 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570332056 -0300 commit (amend): src: mk: use of ${configurations[arch]} instead of $MAKE_OPTS 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570332669 -0300 checkout: moving from arch to checkpatch 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570372358 -0300 commit (amend): src: mk: use of ${configurations[arch]} instead of $MAKE_OPTS 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570372817 -0300 checkout: moving from checkpatch to arch 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570373171 -0300 checkout: moving from arch to checkpatch 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570373183 -0300 checkout: moving from checkpatch to arch 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570373238 -0300 checkout: moving from arch to checkpatch 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570373277 -0300 checkout: moving from checkpatch to arch 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570373318 -0300 rebase -i (start): checkout HEAD^ 7c838ed49e43ff37fec31e18243610258b00019e 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570373318 -0300 rebase -i: fast-forward 304e03c4be9d2d347ab8d2244d43f77ea2b509f8 269de9c1320c7e0d7767d449aae62ff0d7d05416 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570373453 -0300 commit (amend): src: mk: use of ${configurations[arch]} instead of $MAKE_OPTS 269de9c1320c7e0d7767d449aae62ff0d7d05416 b47680364694c7a4929cabe8bb55c9feb89a2a5e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570374002 -0300 commit (amend): src: mk: use of ${configurations[arch]} instead of $MAKE_OPTS b47680364694c7a4929cabe8bb55c9feb89a2a5e b47680364694c7a4929cabe8bb55c9feb89a2a5e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570374013 -0300 rebase -i (finish): returning to refs/heads/arch b47680364694c7a4929cabe8bb55c9feb89a2a5e 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570375014 -0300 rebase: checkout origin/unstable 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 eaada05fd239ddd82359fd15e0f6da587389170b Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570375014 -0300 rebase: src: mk: use of ${configurations[arch]} instead of $MAKE_OPTS eaada05fd239ddd82359fd15e0f6da587389170b eaada05fd239ddd82359fd15e0f6da587389170b Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570375014 -0300 rebase finished: returning to refs/heads/arch eaada05fd239ddd82359fd15e0f6da587389170b 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570376210 -0300 checkout: moving from arch to checkpatch 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570376244 -0300 rebase -i (start): checkout HEAD^ 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570376244 -0300 rebase -i (finish): returning to refs/heads/checkpatch 80a7d6241fe1a507c195e7cce5eb8dec4cd997f2 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570388302 -0300 rebase -i (start): checkout HEAD^ 7c838ed49e43ff37fec31e18243610258b00019e 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570388302 -0300 rebase -i (finish): returning to refs/heads/checkpatch 7c838ed49e43ff37fec31e18243610258b00019e 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570388768 -0300 checkout: moving from checkpatch to unstable 7c838ed49e43ff37fec31e18243610258b00019e 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570388922 -0300 checkout: moving from unstable to master 7c838ed49e43ff37fec31e18243610258b00019e 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389670 -0300 checkout: moving from master to unstable 7c838ed49e43ff37fec31e18243610258b00019e eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389684 -0300 merge upstream/unstable: Merge made by the 'recursive' strategy. eac92ca51b04aa88440764adc92ca22ebd49cba9 eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570389920 -0300 checkout: moving from unstable to checkpatch eac92ca51b04aa88440764adc92ca22ebd49cba9 5fb036ff7142f08da2a83ec2c2006121225b1448 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570391936 -0300 commit: src: checkpatch_wrapper: make 'kw codestyle' to use kernel tree script 5fb036ff7142f08da2a83ec2c2006121225b1448 ebd0fca49ad34c813fb648760fc8dde40fe5cf8d Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570392845 -0300 commit: setup: disable unnecessary download of checkpatch script ebd0fca49ad34c813fb648760fc8dde40fe5cf8d eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393112 -0300 rebase -i (start): checkout HEAD~2 eac92ca51b04aa88440764adc92ca22ebd49cba9 5fb036ff7142f08da2a83ec2c2006121225b1448 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393112 -0300 rebase -i: fast-forward 5fb036ff7142f08da2a83ec2c2006121225b1448 d71cbe9015c884c21e1ee3f84010e82ff9dc75f0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393146 -0300 commit (amend): src: checkpatch_wrapper: make 'kw codestyle' to use kernel tree script d71cbe9015c884c21e1ee3f84010e82ff9dc75f0 f0b3a8e8e36e14d406aa8b538c06c1601a7cdab5 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393172 -0300 commit (amend): src: checkpatch_wrapper: make 'kw codestyle' to use kernel tree script f0b3a8e8e36e14d406aa8b538c06c1601a7cdab5 eb9e1085e01d4de8872715edb6b06db755b89dd2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393184 -0300 rebase -i (pick): setup: disable unnecessary download of checkpatch script eb9e1085e01d4de8872715edb6b06db755b89dd2 eb9e1085e01d4de8872715edb6b06db755b89dd2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393184 -0300 rebase -i (finish): returning to refs/heads/checkpatch eb9e1085e01d4de8872715edb6b06db755b89dd2 568baf851f57afe09c2bd237acb52cb0318a51ec Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393197 -0300 commit (amend): setup: disable unnecessary download of checkpatch script 568baf851f57afe09c2bd237acb52cb0318a51ec 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: checkout origin/unstable 7c838ed49e43ff37fec31e18243610258b00019e df45e50df69d139dba4599a7ca0fa0ad31951f53 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: src: vm: Add support to execute commands/scripts via ssh df45e50df69d139dba4599a7ca0fa0ad31951f53 4f0735f9fa64df84360219e4fb816d1140dab76f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: documentation: man: Add man documentation 4f0735f9fa64df84360219e4fb816d1140dab76f 0482e053fec104f511afba4446ee7c53895da30f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: src: kwio: Fix uncompleted message problem 0482e053fec104f511afba4446ee7c53895da30f 750227a585828aeda9630a04ac085c670f3a929d Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: src: config_manager: Add get and remove operation 750227a585828aeda9630a04ac085c670f3a929d 0a1953099db9a3b7afb62654d75e6751401cb855 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: readme: restore beginning of README 0a1953099db9a3b7afb62654d75e6751401cb855 695296eeda1cfbb5012eacd2288ab4168a7074a7 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: src: autocomplete: add fish shell support 695296eeda1cfbb5012eacd2288ab4168a7074a7 a37a17dac5be99210941355bdfebaea5f5d644a8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: documentation: sphinx: Add basic sphinx structure a37a17dac5be99210941355bdfebaea5f5d644a8 68449e0b875f77db5f26ca3076cdab1bf6a97201 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: config: Add a set of small fixes 68449e0b875f77db5f26ca3076cdab1bf6a97201 e054065ecbd2af3e5ea1a06418fc3997fde969b3 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: src: mk: Add check for the case that mount fails e054065ecbd2af3e5ea1a06418fc3997fde969b3 5183320a453ad5e34233b8b7beb372f70d081d06 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: kwlib: Create kw library 5183320a453ad5e34233b8b7beb372f70d081d06 f427beecad0d5e5f1707133120bfdf4867dbff96 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: src: checkpatch_wrapper: make 'kw codestyle' to use kernel tree script f427beecad0d5e5f1707133120bfdf4867dbff96 09d520454c5286081fb5bf001e323fad1aaf10c0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase: setup: disable unnecessary download of checkpatch script 09d520454c5286081fb5bf001e323fad1aaf10c0 09d520454c5286081fb5bf001e323fad1aaf10c0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393299 -0300 rebase finished: returning to refs/heads/checkpatch 09d520454c5286081fb5bf001e323fad1aaf10c0 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393558 -0300 rebase: checkout upstream/unstable 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 0cadb375dba40c384eb394900e066a7b434c50c9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393558 -0300 rebase: src: checkpatch_wrapper: make 'kw codestyle' to use kernel tree script 0cadb375dba40c384eb394900e066a7b434c50c9 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393558 -0300 rebase: setup: disable unnecessary download of checkpatch script 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1570393558 -0300 rebase finished: returning to refs/heads/checkpatch 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f eaada05fd239ddd82359fd15e0f6da587389170b Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571584115 -0300 checkout: moving from checkpatch to arch eaada05fd239ddd82359fd15e0f6da587389170b 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571584133 -0300 checkout: moving from arch to checkpatch 516ec273c15c0246c7a4a4e6a267ec63fbfc7b1f 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571584292 -0300 rebase -i (start): checkout 0cadb375dba40c384eb394900e066a7b434c50c9^ 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 0cadb375dba40c384eb394900e066a7b434c50c9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571584292 -0300 rebase -i: fast-forward 0cadb375dba40c384eb394900e066a7b434c50c9 df9ac836931d82b2bf2acecde89feebf3db8cbd2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571584680 -0300 commit (amend): src: checkpatch_wrapper: make 'kw codestyle' to use kernel tree script df9ac836931d82b2bf2acecde89feebf3db8cbd2 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571584690 -0300 rebase -i (pick): setup: disable unnecessary download of checkpatch script 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571584690 -0300 rebase -i (finish): returning to refs/heads/checkpatch 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571585208 -0300 rebase -i (start): checkout df9ac836931d82b2bf2acecde89feebf3db8cbd2^ 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 df9ac836931d82b2bf2acecde89feebf3db8cbd2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571585208 -0300 rebase -i: fast-forward df9ac836931d82b2bf2acecde89feebf3db8cbd2 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571585463 -0300 rebase -i: fast-forward 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571585463 -0300 rebase -i (finish): returning to refs/heads/checkpatch 42dbabbe202598d41a6b0a26bdf0e1d15c91a758 eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571958092 -0300 checkout: moving from checkpatch to unstable eac92ca51b04aa88440764adc92ca22ebd49cba9 eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571959367 -0300 checkout: moving from unstable to explore eac92ca51b04aa88440764adc92ca22ebd49cba9 fda354d1d0bff375231bf5b92523f584b5f957b6 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571964953 -0300 commit: src: explore: add support to work with multiple strings fda354d1d0bff375231bf5b92523f584b5f957b6 cdd7358202cf5c87470d0814b4eca75a10d2f32d Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571966406 -0300 commit (amend): src: explore: add support to work with multiple strings cdd7358202cf5c87470d0814b4eca75a10d2f32d eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571967218 -0300 checkout: moving from explore to unstable eac92ca51b04aa88440764adc92ca22ebd49cba9 cdd7358202cf5c87470d0814b4eca75a10d2f32d Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571967276 -0300 checkout: moving from unstable to explore cdd7358202cf5c87470d0814b4eca75a10d2f32d 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571967394 -0300 rebase: checkout upstream/unstable 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571967394 -0300 rebase: src: explore: add support to work with multiple strings 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1571967394 -0300 rebase finished: returning to refs/heads/explore 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 eac92ca51b04aa88440764adc92ca22ebd49cba9 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189702 -0300 checkout: moving from explore to unstable eac92ca51b04aa88440764adc92ca22ebd49cba9 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189712 -0300 rebase: checkout upstream/unstable 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189712 -0300 rebase finished: returning to refs/heads/unstable 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189752 -0300 rebase: checkout upstream/unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189752 -0300 rebase finished: refs/heads/unstable onto 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572189877 -0300 checkout: moving from unstable to num-proc 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 4526c3270661523010d12c08db8a5094886d3a2b Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572190436 -0300 commit: src: mk: remove unnecessary multiplication of PARALLEL_CORES 4526c3270661523010d12c08db8a5094886d3a2b 58b447951b132416436e3928348c6097c39567f8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572190705 -0300 commit (amend): src: mk: remove unnecessary multiplication of PARALLEL_CORES 58b447951b132416436e3928348c6097c39567f8 00cfa1f2a30486926aa9ccbaa50ed28fa2c67c30 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572190790 -0300 commit (amend): src: mk: remove unnecessary multiplication of PARALLEL_CORES 00cfa1f2a30486926aa9ccbaa50ed28fa2c67c30 ec88cd9934324cbbab31d4370f6bb403bd012f97 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1572190921 -0300 commit (amend): src: mk: remove unnecessary multiplication of PARALLEL_CORES ec88cd9934324cbbab31d4370f6bb403bd012f97 eaada05fd239ddd82359fd15e0f6da587389170b Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573944797 -0300 checkout: moving from num-proc to arch eaada05fd239ddd82359fd15e0f6da587389170b 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573945359 -0300 checkout: moving from arch to unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f eaada05fd239ddd82359fd15e0f6da587389170b Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573945419 -0300 checkout: moving from unstable to arch eaada05fd239ddd82359fd15e0f6da587389170b 6eca057c8313cb188d8bc2601b0c7cce88a98719 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573945618 -0300 commit (amend): src: mk: use ${configurations[arch]} instead of $MAKE_OPTS 6eca057c8313cb188d8bc2601b0c7cce88a98719 970df8c3496790eb997478acb2278b64f75804fd Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573945760 -0300 commit (amend): src: mk: use ${configurations[arch]} instead of $MAKE_OPTS 970df8c3496790eb997478acb2278b64f75804fd 07f91252c20ff34dbb1f88e1cab0977b78c322e3 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573946464 -0300 commit (amend): src: mk: use ${configurations[arch]} instead of $MAKE_OPTS 07f91252c20ff34dbb1f88e1cab0977b78c322e3 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573946779 -0300 checkout: moving from arch to explore 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573947414 -0300 checkout: moving from explore to unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573947601 -0300 checkout: moving from unstable to explore 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573947761 -0300 checkout: moving from explore to unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 361774e2ea4fce482035c18db576af693c23d379 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953350 -0300 commit (amend): setup: disable unnecessary download of checkpatch script 361774e2ea4fce482035c18db576af693c23d379 e629dcaa512305895926b4ef5e8663fb8e0088bb Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953412 -0300 commit (amend): setup: disable unnecessary download of checkpatch script e629dcaa512305895926b4ef5e8663fb8e0088bb 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953444 -0300 commit (amend): setup: disable unnecessary download of checkpatch script 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953449 -0300 checkout: moving from unstable to explore 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953508 -0300 checkout: moving from explore to unstable 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953521 -0300 checkout: moving from unstable to explore 3ac2ea97cd126d347386e50b0fdaa2b0ca059864 d9749a82669b72286e4c3ff10b10816e65b09656 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573953567 -0300 commit (amend): src: explore: add support to work with multiple strings d9749a82669b72286e4c3ff10b10816e65b09656 8e09d4632c8083a5225b94f1922b6255e15a0d1c Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573954109 -0300 commit (amend): src: explore: add support to work with multiple strings 8e09d4632c8083a5225b94f1922b6255e15a0d1c 89fed0ad665f18bd66b6e94a1a312a437bbe4877 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573954284 -0300 commit (amend): src: explore: add support to work with multiple strings 89fed0ad665f18bd66b6e94a1a312a437bbe4877 a26a95d3137a48fe885bb4bdd22277299bc53e3d Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573960907 -0300 commit: tests: explore_test: add multiple strings test a26a95d3137a48fe885bb4bdd22277299bc53e3d c830da5cb8c6138060fa7cf2cb734073d23206e2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573961228 -0300 commit (amend): tests: explore_test: add multiple strings test c830da5cb8c6138060fa7cf2cb734073d23206e2 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573961702 -0300 rebase -i (start): checkout HEAD~2 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 89fed0ad665f18bd66b6e94a1a312a437bbe4877 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573961702 -0300 rebase -i: fast-forward 89fed0ad665f18bd66b6e94a1a312a437bbe4877 ecd850fcb0570d1c59e44d4cdc16b61deb434be0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573962493 -0300 commit (amend): src: explore: add support to work with multiple strings ecd850fcb0570d1c59e44d4cdc16b61deb434be0 9c6964427f15d7a4782fc4812b7689773764bac5 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573962629 -0300 rebase -i (pick): tests: explore_test: add multiple strings test 9c6964427f15d7a4782fc4812b7689773764bac5 9c6964427f15d7a4782fc4812b7689773764bac5 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573962629 -0300 rebase -i (finish): returning to refs/heads/explore 9c6964427f15d7a4782fc4812b7689773764bac5 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573962941 -0300 rebase -i (start): checkout HEAD~2 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 ecd850fcb0570d1c59e44d4cdc16b61deb434be0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573962941 -0300 rebase -i: fast-forward ecd850fcb0570d1c59e44d4cdc16b61deb434be0 c8eb5b64ee1db5bd4286ddd53b5dec5b01105b11 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573963177 -0300 commit (amend): src: explore: add support to work with multiple strings c8eb5b64ee1db5bd4286ddd53b5dec5b01105b11 5f576b3f07d47f98444f6a4499e042e9abeed1e0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573963241 -0300 rebase -i (pick): tests: explore_test: add multiple strings test 5f576b3f07d47f98444f6a4499e042e9abeed1e0 5f576b3f07d47f98444f6a4499e042e9abeed1e0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573963241 -0300 rebase -i (finish): returning to refs/heads/explore 5f576b3f07d47f98444f6a4499e042e9abeed1e0 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573963839 -0300 checkout: moving from explore to unstable 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 5f576b3f07d47f98444f6a4499e042e9abeed1e0 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573963960 -0300 checkout: moving from unstable to explore 5f576b3f07d47f98444f6a4499e042e9abeed1e0 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573964035 -0300 rebase -i (start): checkout HEAD~2 4397c4eb45d845cd332ebaf9c1a4ca73261b0846 c8eb5b64ee1db5bd4286ddd53b5dec5b01105b11 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573964035 -0300 rebase -i: fast-forward c8eb5b64ee1db5bd4286ddd53b5dec5b01105b11 8805e5b0cefe850a1ae0d3700faf317e995ae70c Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573964071 -0300 commit (amend): src: explore: add support to work with multiple strings 8805e5b0cefe850a1ae0d3700faf317e995ae70c 38323f12d16efe51058faee59528aadb7ef13c87 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573964077 -0300 rebase -i (pick): tests: explore_test: add multiple strings test 38323f12d16efe51058faee59528aadb7ef13c87 38323f12d16efe51058faee59528aadb7ef13c87 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1573964077 -0300 rebase -i (finish): returning to refs/heads/explore 38323f12d16efe51058faee59528aadb7ef13c87 ec88cd9934324cbbab31d4370f6bb403bd012f97 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434024 -0300 checkout: moving from explore to num-proc ec88cd9934324cbbab31d4370f6bb403bd012f97 07f91252c20ff34dbb1f88e1cab0977b78c322e3 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434085 -0300 checkout: moving from num-proc to arch 07f91252c20ff34dbb1f88e1cab0977b78c322e3 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434158 -0300 checkout: moving from arch to unstable 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 8e74a69ee45ac1f68510fbfa7f21927192777edd Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434174 -0300 pull origin unstable: Merge made by the 'recursive' strategy. 8e74a69ee45ac1f68510fbfa7f21927192777edd 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434320 -0300 rebase -i (start): checkout HEAD~1 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434320 -0300 rebase -i (finish): returning to refs/heads/unstable 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434324 -0300 rebase -i (start): checkout HEAD~2 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434324 -0300 rebase -i (finish): returning to refs/heads/unstable 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434337 -0300 rebase -i (start): checkout HEAD~2 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434337 -0300 rebase -i (finish): returning to refs/heads/unstable 30b5433274ed7e5d348c47d4ac10b5fdb93d2d60 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434374 -0300 rebase: checkout upstream/unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434374 -0300 rebase finished: returning to refs/heads/unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434427 -0300 rebase: checkout unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434427 -0300 rebase: checkout unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434453 -0300 checkout: moving from unstable to upstream/unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f 6e7b469b6f19c9cfb413f3299bebc3c76d04005f Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434479 -0300 checkout: moving from 6e7b469b6f19c9cfb413f3299bebc3c76d04005f to unstable 6e7b469b6f19c9cfb413f3299bebc3c76d04005f d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434490 -0300 rebase: checkout upstream/unstable d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575434490 -0300 rebase finished: refs/heads/unstable onto d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 07f91252c20ff34dbb1f88e1cab0977b78c322e3 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575438083 -0300 checkout: moving from unstable to arch 07f91252c20ff34dbb1f88e1cab0977b78c322e3 d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575438106 -0300 rebase: checkout unstable d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 164938621c64296d324ef9ede0eb2cdbbae745d8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575438236 -0300 rebase: src: mk: use ${configurations[arch]} instead of $MAKE_OPTS 164938621c64296d324ef9ede0eb2cdbbae745d8 164938621c64296d324ef9ede0eb2cdbbae745d8 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575438236 -0300 rebase finished: returning to refs/heads/arch 164938621c64296d324ef9ede0eb2cdbbae745d8 d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575859249 -0300 checkout: moving from arch to unstable d4b1d33bbcec62a8b0caf7717a5f9499bb2f9bf2 9d9f09e616eaf15999de222b065ae12cbb7e993c Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575859311 -0300 rebase: checkout upstream/unstable 9d9f09e616eaf15999de222b065ae12cbb7e993c 9d9f09e616eaf15999de222b065ae12cbb7e993c Rodrigo Carvalho <rodrigorsdc@gmail.com> 1575859311 -0300 rebase finished: refs/heads/unstable onto 9d9f09e616eaf15999de222b065ae12cbb7e993c 9d9f09e616eaf15999de222b065ae12cbb7e993c 7c838ed49e43ff37fec31e18243610258b00019e Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576166278 -0300 checkout: moving from unstable to master 7c838ed49e43ff37fec31e18243610258b00019e ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576166295 -0300 rebase: checkout upstream/master ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576166295 -0300 rebase finished: refs/heads/master onto ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576166447 -0300 checkout: moving from master to debian ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576166511 -0300 checkout: moving from debian to master ba74396dbbff1184ac2369eb6c5bc172df1f4d62 ba74396dbbff1184ac2369eb6c5bc172df1f4d62 Rodrigo Carvalho <rodrigorsdc@gmail.com> 1576167652 -0300 checkout: moving from master to debian ���������������������������������������������������������������������kw-20191112/.git/description������������������������������������������������������������������������0000644�0001750�0001750�00000000111�13574463525�015407� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Unnamed repository; edit this file 'description' to name the repository. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/.git/HEAD�������������������������������������������������������������������������������0000644�0001750�0001750�00000000027�13574464344�013573� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ref: refs/heads/debian ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/������������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�13574463526�013077� 5����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/help.sh�����������������������������������������������������������������������������0000755�0001750�0001750�00000003665�13574463526�014400� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/kwio.sh --source-only function kworkflow-help() { echo -e "Usage: kw [target] cmd" echo -e "\nThe current supported targets are:\n" \ "\t host - this machine\n" \ "\t qemu - qemu machine\n" \ "\t arm - arm machine" echo -e "\nCommands:\n" \ "\tbuild,b - Build Kernel and modules\n" \ "\tinstall,i - Install modules\n" \ "\tbi - Build and install modules\n" \ "\tprepare,p - Deploy basic environment in the VM\n" \ "\tnew,n - Install new Kernel image\n" \ "\tmount,mo - Mount partition with qemu-nbd\n" \ "\tumount,um - Umount partition created with qemu-nbd\n" \ "\tvars,v - Show variables\n" \ "\tup,u - Wake up vm\n" \ "\tcodestyle,c - Apply checkpatch on directory or file\n" \ "\tmaintainers,m [-a|--authors] - Return the maintainers and\n" \ "\t the mailing list. \"-a\" also\n" \ "\t prints files authors\n" \ "\texplore,e - Search for expression on git log or directory\n" \ "\thelp,h - displays this help mesage\n" \ "\tman - Show manual" echo -e "\nkw config manager:\n" \ "\tconfigm,g --save NAME [-d 'DESCRIPTION']\n" \ "\tconfigm,g --ls - List config files under kw management\n" \ "\tconfigm,g --get NAME - Get a config file based named *NAME*\n" \ "\tconfigm,g --rm - Remove config labeled with *NAME*\n" \ echo -e "kw ssh|s options:\n" \ "\tssh|s [--script|-s="SCRIPT PATH"]\n" \ "\tssh|s [--command|-c="COMMAND"]\n" } # Display the man documentation using rst2man, or man kw if it is already # installed to the system function kworkflow-man() { doc="$config_files_path/documentation/man" ret=0 if ! man kw > /dev/null 2>&1; then if [ -x "$(command -v rst2man)" ]; then rst2man < $doc/kw.rst | man -l - ret=$? else complain "There's no man support" ret=1 fi exit $ret fi man kw } ���������������������������������������������������������������������������kw-20191112/src/checkpatch_wrapper.sh���������������������������������������������������������������0000755�0001750�0001750�00000003356�13574463526�017302� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/commons.sh --source-only . $src_script_path/kwlib.sh --source-only function execute_checkpatch() { local FILE_OR_DIR_CHECK=$1 #TODO: Note that codespell file is not specified yet because of the poluted # output. It could be nice if we can add another option just for this sort # of check. Follow the line that makes the magic: # --codespell $external_script_path/spelling.txt local -r options="--terse --no-tree --color=always -strict --file " local -r script="scripts/checkpatch.pl $options" local -r original_working_dir=$PWD local kernel_root="" if [[ -z $FILE_OR_DIR_CHECK ]]; then FILE_OR_DIR_CHECK="." fi FILE_OR_DIR_CHECK="$(realpath $FILE_OR_DIR_CHECK)" # Check if is a valid path if [[ ! -d $FILE_OR_DIR_CHECK && ! -f $FILE_OR_DIR_CHECK ]]; then complain "Invalid path" return 1 fi # try to find kernel root at given path kernel_root="$(find_kernel_root $FILE_OR_DIR_CHECK)" if [[ -z "$kernel_root" ]]; then # fallback: try to find kernel root at working path kernel_root="$(find_kernel_root $original_working_dir)" fi # Check if kernel root was found. if [[ -z "$kernel_root" ]]; then complain "Neither the given path nor the working path is in a kernel tree." return 1 fi # Build a list of file to apply check patch FLIST=`find $FILE_OR_DIR_CHECK -type f ! -name '*\.mod\.c' | grep "\.[ch]$" ` say "Running checkpatch.pl on: $FILE_OR_DIR_CHECK" say $SEPARATOR for current_file in $FLIST do file=$current_file if [ ! -e "$file" ] then echo "$file does not exist."; echo continue fi cd $kernel_root eval perl $script $file cd $original_working_dir if [ $? != 0 ]; then say $SEPARATOR fi done } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/kwio.sh�����������������������������������������������������������������������������0000755�0001750�0001750�00000005203�13574463526�014407� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# NOTE: src/commons.sh must be included before this file declare -r BLUECOLOR="\033[1;34;49m%s\033[m" declare -r REDCOLOR="\033[1;31;49m%s\033[m" declare -r YELLOWCOLOR="\033[1;33;49m%s\033[m" declare -r GREENCOLOR="\033[1;32;49m%s\033[m" declare -r SEPARATOR="=========================================================" # Alerts command completion to the user. # # @COMMAND First argument should be the kw command string which the user wants # to get notified about. It can be printed in visual notification if # ${configurations[visual_alert_command]} uses it. # @ALERT_OPT Second argument is the string with the "--alert=" option or "" if # no alert option was given by the user. function alert_completion() { local COMMAND=$1 local ALERT_OPT=$2 local opts if [[ $# -gt 1 && "$ALERT_OPT" =~ ^--alert= ]]; then opts="$(echo $ALERT_OPT | sed s/--alert=// )" else opts="${configurations[alert]}" fi grep -o . <<< "$opts" | while read option; do if [ "$option" == "v" ]; then eval "${configurations[visual_alert_command]}" elif [ "$option" == "s" ]; then eval "${configurations[sound_alert_command]}" fi done } # Print colored message. This function verifies if stdout # is open and print it with color, otherwise print it without color. # # @param $1 [${@:2}] [-n ${@:3}] it receives the variable defining # the color to be used and two optional params: # - the option '-n', to not output the trailing newline # - text message to be printed # function colored_print() { local message="${@:2}" if [[ $# -ge 2 && $2 = "-n" ]]; then message="${@:3}" if [ -t 1 ]; then printf ${!1} "$message" else echo -n "$message" fi else if [ -t 1 ]; then printf "${!1}\n" "$message" else echo "$message" fi fi } # Print normal message (e.g info messages). function say() { colored_print BLUECOLOR "$@" } # Print error message. function complain() { colored_print REDCOLOR "$@" } # Warning error message. function warning() { colored_print YELLOWCOLOR "$@" } # Print success message. function success() { colored_print GREENCOLOR "$@" } # Ask for yes or no # # @message A string with the message to be displayed for the user. # # Returns: # Return "1" if the user accept the question, otherwise, return "0" # # Note: ask_yN return the string '1' and '0', you have to handle it by # yourself in the code. function ask_yN() { local message=$@ read -r -p "$message [y/N] " response if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then echo "1" else echo "0" fi } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/config_manager.sh�������������������������������������������������������������������0000755�0001750�0001750�00000014570�13574463526�016404� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/kwio.sh --source-only declare -r metadata_dir="metadata" declare -r configs_dir="configs" # This function handles the save operation of kernel's '.config' file. It # checks if the '.config' exists and saves it using git (dir.: # <kw_install_path>/configs) # # @force Force option. If it is set and the current name was already saved, # this option will override the '.config' file under the 'name' # specified by '-n' without any message. # @name This option specifies a name for a target .config file. This name # represents the access key for .config. # @description Description for a config file, de descrition from '-d' flag. function save_config_file() { local ret=0 local -r force=$1 local -r name=$2 local -r description=$3 local -r original_path=$PWD local -r dot_configs_dir="$config_files_path/configs" if [[ ! -f $original_path/.config ]]; then complain "There's no .config file in the current directory" exit 2 # ENOENT fi if [[ ! -d $dot_configs_dir ]]; then mkdir $dot_configs_dir cd $dot_configs_dir git init --quiet mkdir $metadata_dir $configs_dir fi cd $dot_configs_dir # Check if the metadata related to .config file already exists if [[ ! -f $metadata_dir/$name ]]; then touch $metadata_dir/$name elif [[ $force != 1 ]]; then if [[ $(ask_yN "$name already exists. Update?") =~ "0" ]]; then complain "Save operation aborted" cd $original_path exit 0 fi fi if [[ ! -z $description ]]; then echo $description > $metadata_dir/$name fi cp $original_path/.config $dot_configs_dir/$configs_dir/$name git add $configs_dir/$name $metadata_dir/$name git commit -m "New config file added: $USER - $(date)" > /dev/null 2>&1 if [[ "$?" == 1 ]]; then warning "Warning: $name: there's nothing new in this file" else success "Saved $name" fi cd $original_path } function list_configs() { local -r dot_configs_dir="$config_files_path/configs" if [[ ! -d $dot_configs_dir ]]; then say "There's no tracked .config file" exit 0 fi printf "%-30s | %-30s\n" "Name" "Description" echo for filename in $dot_configs_dir/$metadata_dir/*; do local name=$(basename $filename) local content=$(cat $filename) printf "%-30s | %-30s\n" "$name" "$content" done } # Remove and Get operation in the configm has similar criteria for working, # because of this, basic_config_validations centralize the basic requirement # validation. # # @target File name of the target config file # @force Force option. If set, it will ignores the warning message. # @operation You can specify the operation name here # @message Customized message to be showed to the users # # Returns: # Return 0 if everything ends well, otherwise return an errno code. function basic_config_validations() { local target=$1 local force=$2 local operation=$3 && shift 3 local message=$@ local -r dot_configs_dir="$config_files_path/configs/configs" if [[ ! -f $dot_configs_dir/$target ]]; then complain "No such file or directory: $target" exit 2 # ENOENT fi if [[ $force != 1 ]]; then warning $message if [[ $(ask_yN "Are you sure that you want to proceed?") =~ "0" ]]; then complain "$operation operation aborted" exit 0 fi fi } # This function retrieves from one of the config files under the control of kw # and put it in the current directory. This operation can be dangerous since it # will override the existing .config file; because of this, it has a warning # message. # # @target File name of the target config file # @force Force option. If it is set and the current name was already saved, # this option will override the '.config' file under the 'name' # specified by '-n' without any message. # # Returns: # Exit with 0 if everything ends well, otherwise exit an errno code. function get_config() { local target=$1 local force=$2 local -r dot_configs_dir="$config_files_path/configs/configs" local -r msg="This operation will override the current .config file" # If we does not have a local config, there's no reason to warn the user if [[ -f $PWD/.config ]]; then force=1 fi basic_config_validations $target $force "Get" $msg cp $dot_configs_dir/$target .config say "Current config file updated based on $target" } # Remove a config file under kw management # # @target File name of the target config file # @force Force option. # # Returns: # Exit 0 if everything ends well, otherwise exit an errno code. function remove_config() { local target=$1 local force=$2 local original_path=$PWD local -r dot_configs_dir="$config_files_path/configs" local -r msg="This operation will remove $target from kw management" basic_config_validations $target $force "Remove" $msg cd $dot_configs_dir git rm $configs_dir/$target $dot_configs_dir/$metadata_dir/$target > /dev/null 2>&1 git commit -m "Removed $target config: $USER - $(date)" > /dev/null 2>&1 cd $original_path say "The $target config file was removed from kw management" # Without config file, there's no reason to keep config directory if [ ! "$(ls $dot_configs_dir)" ]; then rm -rf /tmp/$configs_dir mv $dot_configs_dir /tmp fi } # This function handles the options available in 'configm'. # # @* This parameter expects a list of parameters, such as '-n', '-d', and '-f'. # # Returns: # Return 0 if everything ends well, otherwise return an errno code. function execute_config_manager() { local name_config local description_config local force=0 [[ "$@" =~ "-f" ]] && force=1 case $1 in --save) shift # Skip '--save' option name_config=$1 # Validate string name if [[ "$name_config" =~ ^- || -z "${name_config// }" ]]; then complain "Invalid argument" exit 22 # EINVAL fi # Shift name and get '-d' shift 2 && description_config=$@ save_config_file $force $name_config "$description_config" ;; --ls) list_configs ;; --get) shift # Skip '--get' option if [[ -z "$1" ]]; then complain "Invalid argument" return 22 # EINVAL fi get_config $1 $force ;; --rm) shift # Skip '--rm' option if [[ -z "$1" ]]; then complain "Invalid argument" return 22 # EINVAL fi remove_config $1 $force ;; *) complain "Unknown option" exit 22 #EINVAL ;; esac } ����������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/vm.sh�������������������������������������������������������������������������������0000755�0001750�0001750�00000006233�13574463526�014064� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/commons.sh --source-only function vm_mount { mkdir -p ${configurations[mount_point]} say "Mount ${configurations[qemu_path_image]}" \ "in ${configurations[mount_point]}" guestmount -a ${configurations[qemu_path_image]} \ -i ${configurations[mount_point]} if [ "$?" != 0 ] ; then complain "Something went wrong when tried to mount" \ "${configurations[qemu_path_image]} in ${configurations[mount_point]}" return 1 fi } function vm_umount { say "Unmount ${configurations[mount_point]}" guestunmount ${configurations[mount_point]} if [ "$?" != 0 ] ; then complain "Something went wrong when tried to unmount" \ "${configurations[qemu_path_image]} in ${configurations[mount_point]}" return 1 fi } function vm_boot { ${configurations[virtualizer]} -hda ${configurations[qemu_path_image]} \ ${configurations[qemu_hw_options]} \ -kernel $BUILD_DIR/$TARGET/arch/x86/boot/bzImage \ -append "root=/dev/sda1 debug console=ttyS0 console=ttyS1 console=tty1" \ -net nic -net user,hostfwd=tcp::5555-:22 \ -serial stdio \ -device virtio-gpu-pci,virgl -display gtk,gl=on 2> /dev/null } function vm_up { say "Starting Qemu with: " echo "${configurations[virtualizer]} ${configurations[qemu_hw_options]}" \ "${configurations[qemu_net_options]}" \ "${configurations[qemu_path_image]}" ${configurations[virtualizer]} ${configurations[qemu_hw_options]} \ ${configurations[qemu_net_options]} \ ${configurations[qemu_path_image]} } # This function manages ssh operations. Currently, we have three basic actions: # connect to the VM, execute a command in the VM, and perform a local script # inside the VM. # # @opts Expects a parameter to be passed for the ssh command (it could be # --command, -c, --script, -s). If this parameter receives a null value # this function will make a simple ssh operation; otherwise, a command or # script will be attempted to execute. function vm_ssh { local opts=$@ local port=${configurations[ssh_port]} local target=${configurations[ssh_ip]} # Mandatory parameter if [ -z "$target" ]; then complain "Invalid argument: $@" complain "Take a look at the config file, something is wrong in the ssh_ip" exit 22 # EINVAL fi if [[ $# -gt 0 ]]; then if [[ "$opts" =~ ^(--command|-c)= ]]; then opts="$(echo $opts | cut -d = -f2)" elif [[ "$opts" =~ ^(--script|-s)= ]]; then local script_path=$(echo $opts | cut -d = -f2) if [[ ! -f $script_path ]]; then complain "No such file: \"$script_path\"" exit 2 # ENOENT fi opts="\"bash -s\" -- < $script_path" else complain "Invalid arguments: $@" exit 22 # EINVAL fi fi # Add port if [ ! -z "$port" ]; then port="-p $port" fi say "ssh $port $target $opts" eval "ssh $port $target $opts" } function vm_prepare { local path_ansible=$HOME/.config/kw/deploy_rules/ local current_path=$PWD local ret=0 say "Deploying with Ansible, this will take some time" cd $path_ansible ansible-playbook kworkflow.yml --extra-vars "user=$USER" ret=$? cd $current_path return $ret } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/mk.sh�������������������������������������������������������������������������������0000755�0001750�0001750�00000004153�13574463526�014050� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/vm.sh --source-only function vm_modules_install { # Attention: The vm code have to be loaded before this function. # Take a look at the beginning of kworkflow.sh. vm_mount if [ "$?" != 0 ] ; then complain "Did you check if your VM is running?" return 125 # ECANCELED fi set +e make INSTALL_MOD_PATH=${configurations[mount_point]} modules_install release=$(make kernelrelease) say $release vm_umount } function vm_kernel_install { vm_mount set +e sudo -E make INSTALL_PATH=${configurations[mount_point]}/boot release=$(make kernelrelease) vm_umount } function vm_new_release_deploy { vm_modules_install vm_kernel_install } function mk_build { local PARALLEL_CORES=1 if [ -x "$(command -v nproc)" ] ; then PARALLEL_CORES=$(nproc --all) else PARALLEL_CORES=$(grep -c ^processor /proc/cpuinfo) fi say "make -j$PARALLEL_CORES $MAKE_OPTS" make -j$PARALLEL_CORES $MAKE_OPTS } function mk_install { # FIXME: validate arch and action if [ $TARGET == "arm" ] ; then export ARCH=arm CROSS_COMPILE="ccache arm-linux-gnu-" fi case "$TARGET" in qemu) vm_modules_install ;; host) sudo -E make modules_install sudo -E make install ;; esac } # FIXME: Here is a legacy code, however it could be really nice if we fix it function mk_send_mail { echo -e " * checking git diff...\n" git diff git diff --cached echo -e " * Does it build? Did you test it?\n" read echo -e " * Are you using the correct subject prefix?\n" read echo -e " * Did you need/review the cover letter?\n" read echo -e " * Did you annotate version changes?\n" read echo -e " * Is git format-patch -M needed?\n" read echo -e " * Did you review --to --cc?\n" read echo -e " * dry-run it first!\n" SENDLINE="git send-email --dry-run " while read line do SENDLINE+="$line " done < emails echo $SENDLINE } # FIXME: Here we have a legacy code, check if we can remove it function mk_export_kbuild { say "export KBUILD_OUTPUT=$BUILD_DIR/$TARGET" export KBUILD_OUTPUT=$BUILD_DIR/$TARGET mkdir -p $KBUILD_OUTPUT } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/bash_autocomplete.sh����������������������������������������������������������������0000755�0001750�0001750�00000002212�13574463526�017131� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash _kw_autocomplete() { local current_command previous_command kw_options COMPREPLY=() current_command="${COMP_WORDS[COMP_CWORD]}" previous_command="${COMP_WORDS[COMP_CWORD-1]}" kw_options="explore e build b bi install i prepare p new n ssh s mount mo umount um vars v up u codestyle c configm g maintainers m help h" # By default, autocomplete with kw_options if [[ ${previous_command} == kw ]] ; then COMPREPLY=( $(compgen -W "${kw_options}" -- ${current_command}) ) return 0 fi # TODO: # Autocomplete in the bash terminal is a powerful tool which allows us to # make many interesting things. In the future, we could add an # autocompletion for subcommands, the code below illustrates an example # that tries to add this feature for the ‘maintainers’ options. # # For maintainers and m options, autocomplete with folder # if [ ${previous_command} == maintainers ] || [ ${previous_command} == m ] ; then # COMPREPLY=( $(compgen -d -- ${current_command}) ) # return 0 # fi } complete -o default -F _kw_autocomplete kw ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/kw.fish�����������������������������������������������������������������������������0000755�0001750�0001750�00000003013�13574463526�014373� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env fish # Test if the kw command has subcommands function __fish_kw_no_commands set cmd (commandline -opc) if [ "$cmd" = "kw" ] return 0 end return 1 end # Disable file completion when there's no specified command complete -c kw -n __fish_kw_no_commands -f # kw commands complete -c kw -n "__fish_kw_no_commands" -a "build b" -d "Build Kernel and modules" complete -c kw -n "__fish_kw_no_commands" -a "install i" -d "Install modules" complete -c kw -n "__fish_kw_no_commands" -a "bi" -d "Build and install modules" complete -c kw -n "__fish_kw_no_commands" -a "prepare p" -d "Deploy basic environment in the VM" complete -c kw -n "__fish_kw_no_commands" -a "new n" -d "Install new Kernel image" complete -c kw -n "__fish_kw_no_commands" -a "ssh s" -d "Enter in the vm" complete -c kw -n "__fish_kw_no_commands" -a "mount mo" -d "Mount partition with qemu-nbd" complete -c kw -n "__fish_kw_no_commands" -a "umount um" -d "Umount partition created with qemu-nbd" complete -c kw -n "__fish_kw_no_commands" -a "vars v" -d "Show variables" complete -c kw -n "__fish_kw_no_commands" -a "up u" -d "Wake up vm" complete -c kw -n "__fish_kw_no_commands" -a "codestyle c" -d "Apply checkpatch on directory or file" complete -c kw -n "__fish_kw_no_commands" -a "maintainers m" -d "Return the maintainers and the mailing list" complete -c kw -n "__fish_kw_no_commands" -a "explore e" -d "Search for expression on git log or directory" complete -c kw -n "__fish_kw_no_commands" -a "help h" -d "Display this help mesage" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/get_maintainer_wrapper.sh�����������������������������������������������������������0000755�0001750�0001750�00000007007�13574463526�020170� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/commons.sh --source-only . $src_script_path/kwlib.sh --source-only # Prints the authors of a given file or files inside a given dir. # # @FILE_OR_DIR The argument is a file or directory path function print_files_authors() { local FILE_OR_DIR=$1 local files=( ) if [[ -d $FILE_OR_DIR ]]; then for file in $FILE_OR_DIR/*; do if [[ -f $file ]]; then files+=($file) fi done elif [[ -f $FILE_OR_DIR ]]; then files+=($FILE_OR_DIR) fi local printed_authors_separator=false for file in ${files[@]}; do authors=$(grep -oE "MODULE_AUTHOR *\(.*\)" $file | sed -E "s/(MODULE_AUTHOR *\( *\"|\" *\))//g" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/, /g' ) if [[ ! -z $authors ]]; then if [[ $printed_authors_separator = false ]]; then say $SEPARATOR say "MODULE AUTHORS:" printed_authors_separator=true fi say -n "$(basename $file): " echo "$authors" fi done } # Executes get_maintainer with the given file or dir # # @1 First argument can be "--authors" or "a" to enable authors # printing. It is optional. # @2 Second argument is the given file/dir. It is optional and, if not # given, the current working directory will be used. # # Returns: # False uppon error and true otherwise. # # This function also handle the cases where: # - A patch file is given # - The working dir and/or given path is not the root of a linux kernel repo # - The working dir and/or given path is not inside a linux kernel repo function execute_get_maintainer() { local FILE_OR_DIR local print_authors local is_file_a_patch=true local is_file_inside_kernel_tree=true local -r script="scripts/get_maintainer.pl" local options="--separator , --nokeywords --nogit --nogit-fallback --norolestats " local -r original_working_dir=$PWD local kernel_root="" local path_from_kernel_root="" # Check function options if [[ $# -ge 1 && ( $1 = "--authors" || $1 = "-a" ) ]]; then FILE_OR_DIR=$2 print_authors=true else FILE_OR_DIR=$1 print_authors=false fi # If no file is given, assume "." if [[ -z $FILE_OR_DIR ]]; then FILE_OR_DIR="." fi # Check if is a valid path if [[ ! -d $FILE_OR_DIR && ! -f $FILE_OR_DIR ]]; then complain "Invalid path" return 1 fi FILE_OR_DIR="$(realpath $FILE_OR_DIR)" # if given path is not a patchfile, add -f to get_maintainer.pl options if ! is_a_patch "$FILE_OR_DIR"; then is_file_a_patch=false options="$options -f " fi # try to find kernel root at given path kernel_root="$(find_kernel_root $FILE_OR_DIR)" if [[ -z "$kernel_root" ]]; then is_file_inside_kernel_tree=false # fallback: try to find kernel root at working path kernel_root="$(find_kernel_root $original_working_dir)" fi # Check if kernel root was found. if [[ -z "$kernel_root" ]]; then complain "Neither the given path nor the working path is in a kernel tree." return 1 fi # If file is not a patch and outside a kernel tree, it must be an user's # mistake. Although get_maintainer.pl can handle this, it's better to abort # because it is most likely a user's mistake. So better let the user know. if ! $is_file_a_patch && ! $is_file_inside_kernel_tree; then complain "The given file is not a patch and is outside a kernel tree." return 1 fi say $SEPARATOR say "HERE:" cd $kernel_root eval perl $script $options "$FILE_OR_DIR" cd $original_working_dir if $print_authors; then print_files_authors $FILE_OR_DIR fi } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/commons.sh��������������������������������������������������������������������������0000755�0001750�0001750�00000004157�13574463526�015120� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/kwio.sh --source-only BASE=$HOME/p/linux-trees BUILD_DIR=$BASE/build-linux TARGET="qemu" # Default configuration declare -A configurations # This function is used to show the current set up used by kworkflow. function show_variables() { local has_local_config_path="No" if [ -f "$PWD/kworkflow.config" ] ; then has_local_config_path="Yes" else has_local_config_path="No" fi say "Variables:" echo -e "\tLocal config file: $has_local_config_path" echo -e "\tTarget arch: ${configurations[arch]}" echo -e "\tMount point: ${configurations[mount_point]}" echo -e "\tVirtualization tool: ${configurations[virtualizer]}" echo -e "\tQEMU options: ${configurations[qemu_hw_options]}" echo -e "\tQEMU Net options: ${configurations[qemu_net_options]}" echo -e "\tVdisk: ${configurations[qemu_path_image]}" } # This function read the configuration file and make the parser of the data on # it. For more information about the configuration file, take a look at # "etc/kworkflow.config" in the kworkflow directory. # @parameter: This function expects a path to the configuration file. function parse_configuration() { local config_path=$1 local filename=$(basename $config_path) if [ ! -f $1 ] || [ "$filename" != "kworkflow.config" ] ; then return 22 # 22 means Invalid argument - EINVAL fi while read line do if echo $line | grep -F = &>/dev/null then varname=$(echo $line | cut -d '=' -f 1 | tr -d '[:space:]') configurations[$varname]=$(echo "$line" | cut -d '=' -f 2-) fi done < $config_path } # This function check if the current directory has a configuration file, if so, # just use it. Otherwise, use the global configuration file. function load_configuration() { local local_config_path=$PWD/kworkflow.config # First, load the global configuration parse_configuration $etc_files_path/kworkflow.config # Second, check if has a local file and override values if [ -f $local_config_path ] ; then parse_configuration $local_config_path fi } # Every time that "commons.sh" is included, the configuration file has to be # loaded load_configuration �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kw-20191112/src/explore.sh��������������������������������������������������������������������������0000755�0001750�0001750�00000000644�13574463526�015120� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. $src_script_path/kwio.sh --source-only function explore() { if [[ "$#" -eq 0 ]]; then complain "Expected path or 'log'" exit 1 fi case "$1" in log) ( git log -S"$2" "${@:3}" );; *) ( local path=${@:2} local regex=$1 if [[ $# -eq 1 ]]; then path="." regex=$1 fi git grep -e $regex -nI $path );; esac } ��������������������������������������������������������������������������������������������kw-20191112/src/kwlib.sh����������������������������������������������������������������������������0000755�0001750�0001750�00000011247�13574463526�014553� 0����������������������������������������������������������������������������������������������������ustar �rodrigo�������������������������rodrigo����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# NOTE: src/commons.sh must be included before this file # This function executes any command and provides a mechanism to display the # command in the terminal. Additionally, there's a test mode which only # displays the commands, and it is useful for implementing unit tests. # # @flag: Expecting a flag, that could be SILENT, COMPLAIN, WARNING, SUCCESS, # and TEST_MODE. By default, cmd_manager does not expects flags and always # show the command. # @@: Target command # # Returns: # Return the exit status of the command defined by the string or 0 in the case # of TEST_MODE function cmd_manager() { local flag=$1 case "$flag" in SILENT) shift 1 ;; COMPLAIN) shift 1 complain "$@" ;; WARNING) shift 1 warning "$@" ;; SUCCESS) shift 1 success "$@" ;; TEST_MODE) shift 1 say "$@" return 0 ;; *) say "$@" ;; esac eval $@ } # Checks if a directory is a kernel tree root # # @DIR A directory path # # Returns: # True if given dir is a kernel tree root and false otherwise. function is_kernel_root() { local -r DIR="$@" # The following files are some of the files expected to be at a linux # tree root and not expected to change. Their presence (or abscense) # is used to tell if a directory is a linux tree root or not. (They # are the same ones used by get_maintainer.pl) if [[ -f "${DIR}/COPYING" && -f "${DIR}/CREDITS" && -f "${DIR}/Kbuild" && -e "${DIR}/MAINTAINERS" && -f "${DIR}/Makefile" && -f "${DIR}/README" && -d "${DIR}/Documentation" && -d "${DIR}/arch" && -d "${DIR}/include" && -d "${DIR}/drivers" && -d "${DIR}/fs" && -d "${DIR}/init" && -d "${DIR}/ipc" && -d "${DIR}/kernel" && -d "${DIR}/lib" && -d "${DIR}/scripts" ]]; then return 0 fi return 1 } # Finds the root of the linux kernel repo containing the given file # # @FILE_OR_DIR The argument is a directory of file path # # Returns: # The path of the kernel tree root (string) which the file or dir belongs to, or # an empty string if no root was found. function find_kernel_root { local -r FILE_OR_DIR="$@" local current_dir local kernel_root="" if [[ -f "$FILE_OR_DIR" ]]; then current_dir="$(dirname $FILE_OR_DIR)" else current_dir="$FILE_OR_DIR" fi if is_kernel_root "$current_dir"; then kernel_root="$current_dir" else while [[ "$current_dir" != "." && "$current_dir" != "/" ]]; do current_dir="$(dirname $current_dir)" if is_kernel_root "$current_dir"; then kernel_root="$current_dir" break fi done fi echo "$kernel_root" } # Checks if the given path is a patch file # # @FILE_PATH The argument is the path # # Returns: # True if given path is a patch file and false otherwise. function is_a_patch { local -r FILE_PATH="$@" if [[ ! -f "$FILE_PATH" ]]; then return 1 fi local file_content=`cat "$FILE_PATH"` # The following array stores strings that are expected to be present # in a patch file. The absence of any of these strings makes the # given file be considered NOT a patch local -ar PATCH_EXPECTED_STRINGS=( "diff --git" "Subject:" "Date:" "From:" "---" "@@" ) for expected_str in "${PATCH_EXPECTED_STRINGS[@]}"; do if [[ ! "$file_content" =~ "$expected_str" ]]; then return 1 fi done return 0 } # This function joins one path components intelligently. The return value is # the concatenation of path and any members. # # @target_path Path to join # @member Component to join the path # # Returns: # Return the concatenation of path and member function join_path() { local target_path=$1 local member=$2 # TODO: Extended pattern matching. We should consider to use it as a default # in this project. shopt -s extglob member=${member%%+(/)} member=${member##+(/)} echo "${target_path%%+(/)}/$member" } # This function tries to identify the OS distribution. In order to make it work # as expected, it is required to inform the root path. This function is useful # for plugins; because of this, we limited here the supported distributions # # @root_path Expects the root path wherein we can find the /etc # # Returns: # It returns the distro name in lowercase, otherwise return none. function detect_distro() { local root_path=$1 local etc_path=$(join_path $root_path /etc) local distro="none" if [[ -d $etc_path ]]; then distro=$(cat $etc_path/*-release | grep -w ID | cut -d = -f 2) fi if [[ $distro =~ "arch" ]]; then echo "arch" elif [[ $distro =~ "debian" ]]; then echo "debian" else echo "none" fi } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������